From 1421a74be5a7c964d4103db0157150a24f3e7c5a Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Tue, 1 Dec 2020 16:19:54 +0100 Subject: [PATCH 1/3] Add clang-format config --- .clang-format | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..b4abfa0 --- /dev/null +++ b/.clang-format @@ -0,0 +1,20 @@ +--- +BasedOnStyle: Google +IndentWidth: 4 +--- +Language: Cpp +ColumnLimit: 100 +PointerAlignment: Right +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: true +AllowAllParametersOfDeclarationOnNextLine: false +SortIncludes: false +SpaceAfterCStyleCast: true +AllowShortCaseLabelsOnASingleLine: false +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortFunctionsOnASingleLine: None +BinPackArguments: false +BinPackParameters: false +--- From 17bd07a3464bba1ac174ff6bafdf3770fd00cff6 Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Tue, 1 Dec 2020 16:20:13 +0100 Subject: [PATCH 2/3] Apply clang-format --- src/apdu_constants.h | 151 +- src/base64.c | 45 +- src/base64.h | 14 +- src/chainConfig.h | 96 +- src/eth_plugin_handler.c | 451 +- src/eth_plugin_handler.h | 22 +- src/eth_plugin_interface.h | 144 +- src/eth_plugin_internal.c | 172 +- src/eth_plugin_internal.h | 10 +- src/eth_plugin_ui.c | 159 +- src/handle_check_address.c | 40 +- src/handle_check_address.h | 5 +- src/handle_get_printable_amount.c | 20 +- src/handle_get_printable_amount.h | 5 +- src/handle_swap_sign_transaction.c | 46 +- src/handle_swap_sign_transaction.h | 5 +- src/main.c | 603 +- src/poorstream.c | 12 +- src/poorstream.h | 8 +- src/shared_context.h | 82 +- src/stark_crypto.c | 118 +- src/stark_crypto.h | 8 +- src/stark_utils.c | 93 +- src/stark_utils.h | 15 +- src/swap_lib_calls.h | 8 +- src/tokens.c | 5616 +++++++++++++---- src/tokens.h | 92 +- src/ui_callbacks.h | 5 +- src/ui_flow.c | 43 +- src/ui_flow.h | 49 +- src/utils.c | 97 +- src/utils.h | 45 +- src_common/ethUstream.c | 192 +- src_common/ethUstream.h | 43 +- src_common/ethUtils.c | 181 +- src_common/ethUtils.h | 85 +- src_common/uint256.c | 94 +- src_common/uint256.h | 48 +- .../erc20_approval/ui_flow_erc20_approval.c | 18 +- .../cmd_getAppConfiguration.c | 36 +- .../getEth2PublicKey/cmd_getEth2PublicKey.c | 124 +- .../feature_getEth2PublicKey.h | 1 - .../getEth2PublicKey/logic_getEth2PublicKey.c | 1 - .../ui_common_getEth2PublicKey.c | 2 +- .../ui_flow_getEth2PublicKey.c | 13 +- src_features/getPublicKey/cmd_getPublicKey.c | 112 +- .../getPublicKey/feature_getPublicKey.h | 1 - .../getPublicKey/logic_getPublicKey.c | 5 +- .../getPublicKey/ui_common_getPublicKey.c | 5 +- .../getPublicKey/ui_flow_getPublicKey.c | 11 +- .../cmd_provideTokenInfo.c | 314 +- .../cmd_setEth2WithdrawalIndex.c | 24 +- src_features/signMessage/cmd_signMessage.c | 179 +- .../signMessage/ui_common_signMessage.c | 29 +- .../signMessage/ui_flow_signMessage.c | 12 +- .../signMessageEIP712/cmd_signMessage712.c | 84 +- .../ui_common_signMessage712.c | 54 +- .../ui_flow_signMessage712.c | 18 +- src_features/signTx/cmd_signTx.c | 133 +- src_features/signTx/feature_signTx.h | 1 - src_features/signTx/logic_signTx.c | 547 +- src_features/signTx/ui_common_signTx.c | 83 +- src_features/signTx/ui_flow_signTx.c | 55 +- .../cmd_stark_getPublicKey.c | 98 +- .../feature_stark_getPublicKey.h | 1 - .../logic_stark_getPublicKey.c | 2 - .../ui_common_stark_getPublicKey.c | 3 +- .../ui_flow_stark_getPublicKey.c | 12 +- .../cmd_stark_provideQuantum.c | 101 +- src_features/stark_sign/cmd_stark_sign.c | 433 +- .../stark_sign/ui_common_stark_sign.c | 17 +- src_features/stark_sign/ui_flow_stark_sign.c | 110 +- .../stark_unsafe_sign/cmd_stark_unsafe_sign.c | 84 +- .../ui_common_stark_unsafe_sign.c | 16 +- .../ui_flow_stark_unsafe_sign.c | 17 +- src_plugins/compound/compound_plugin.c | 141 +- src_plugins/erc20/erc20_plugin.c | 382 +- src_plugins/erc721/erc721_plugin.c | 237 +- src_plugins/eth2/eth2_plugin.c | 269 +- src_plugins/starkware/starkware_plugin.c | 1243 ++-- 80 files changed, 8859 insertions(+), 5091 deletions(-) diff --git a/src/apdu_constants.h b/src/apdu_constants.h index 78e9f6e..7ead09c 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -1,76 +1,135 @@ #include "shared_context.h" -#define APP_FLAG_DATA_ALLOWED 0x01 +#define APP_FLAG_DATA_ALLOWED 0x01 #define APP_FLAG_EXTERNAL_TOKEN_NEEDED 0x02 -#define APP_FLAG_STARKWARE 0x04 -#define APP_FLAG_STARKWARE_V2 0x08 +#define APP_FLAG_STARKWARE 0x04 +#define APP_FLAG_STARKWARE_V2 0x08 -#define CLA 0xE0 -#define INS_GET_PUBLIC_KEY 0x02 -#define INS_SIGN 0x04 -#define INS_GET_APP_CONFIGURATION 0x06 -#define INS_SIGN_PERSONAL_MESSAGE 0x08 +#define CLA 0xE0 +#define INS_GET_PUBLIC_KEY 0x02 +#define INS_SIGN 0x04 +#define INS_GET_APP_CONFIGURATION 0x06 +#define INS_SIGN_PERSONAL_MESSAGE 0x08 #define INS_PROVIDE_ERC20_TOKEN_INFORMATION 0x0A -#define INS_SIGN_EIP_712_MESSAGE 0x0C -#define INS_GET_ETH2_PUBLIC_KEY 0x0E -#define INS_SET_ETH2_WITHDRAWAL_INDEX 0x10 -#define P1_CONFIRM 0x01 -#define P1_NON_CONFIRM 0x00 -#define P2_NO_CHAINCODE 0x00 -#define P2_CHAINCODE 0x01 -#define P1_FIRST 0x00 -#define P1_MORE 0x80 +#define INS_SIGN_EIP_712_MESSAGE 0x0C +#define INS_GET_ETH2_PUBLIC_KEY 0x0E +#define INS_SET_ETH2_WITHDRAWAL_INDEX 0x10 +#define P1_CONFIRM 0x01 +#define P1_NON_CONFIRM 0x00 +#define P2_NO_CHAINCODE 0x00 +#define P2_CHAINCODE 0x01 +#define P1_FIRST 0x00 +#define P1_MORE 0x80 -#define COMMON_CLA 0xB0 +#define COMMON_CLA 0xB0 #define COMMON_INS_GET_WALLET_ID 0x04 #ifdef HAVE_STARKWARE -#define STARKWARE_CLA 0xF0 -#define STARKWARE_INS_GET_PUBLIC_KEY 0x02 -#define STARKWARE_INS_SIGN_MESSAGE 0x04 +#define STARKWARE_CLA 0xF0 +#define STARKWARE_INS_GET_PUBLIC_KEY 0x02 +#define STARKWARE_INS_SIGN_MESSAGE 0x04 #define STARKWARE_INS_PROVIDE_QUANTUM 0x08 -#define STARKWARE_INS_UNSAFE_SIGN 0x0A +#define STARKWARE_INS_UNSAFE_SIGN 0x0A -#define P1_STARK_ORDER 0x01 -#define P1_STARK_TRANSFER 0x02 -#define P1_STARK_ORDER_V2 0x03 -#define P1_STARK_TRANSFER_V2 0x04 +#define P1_STARK_ORDER 0x01 +#define P1_STARK_TRANSFER 0x02 +#define P1_STARK_ORDER_V2 0x03 +#define P1_STARK_TRANSFER_V2 0x04 #define P1_STARK_CONDITIONAL_TRANSFER 0x05 -#define STARK_ORDER_TYPE 0 -#define STARK_TRANSFER_TYPE 1 +#define STARK_ORDER_TYPE 0 +#define STARK_TRANSFER_TYPE 1 #define STARK_CONDITIONAL_TRANSFER_TYPE 2 #endif -#define OFFSET_CLA 0 -#define OFFSET_INS 1 -#define OFFSET_P1 2 -#define OFFSET_P2 3 -#define OFFSET_LC 4 +#define OFFSET_CLA 0 +#define OFFSET_INS 1 +#define OFFSET_P1 2 +#define OFFSET_P2 3 +#define OFFSET_LC 4 #define OFFSET_CDATA 5 -void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleProvideErc20TokenInformation(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleSign(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleGetAppConfiguration(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleSignEIP712Message(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleProvideErc20TokenInformation(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleSign(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleGetAppConfiguration(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleSignPersonalMessage(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleSignEIP712Message(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); #ifdef HAVE_ETH2 -void handleGetEth2PublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleSetEth2WinthdrawalIndex(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); +void handleGetEth2PublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleSetEth2WinthdrawalIndex(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); #endif #ifdef HAVE_STARKWARE -void handleStarkwareGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleStarkwareSignMessage(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleStarkwareProvideQuantum(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); -void handleStarkwareUnsafeSign(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx); +void handleStarkwareGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleStarkwareSignMessage(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleStarkwareProvideQuantum(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); +void handleStarkwareUnsafeSign(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx); #endif - diff --git a/src/base64.c b/src/base64.c index 78bf86a..0344273 100644 --- a/src/base64.c +++ b/src/base64.c @@ -2,16 +2,16 @@ * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ - * + * * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -19,7 +19,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_LICENSE_HEADER_END@ */ /* ==================================================================== @@ -172,41 +172,34 @@ int Base64decode(char *bufplain, const char *bufcoded) #endif -static const char basis_64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const char basis_64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -int Base64encode_len(int len) -{ +int Base64encode_len(int len) { return ((len + 2) / 3 * 4) + 1; } -int Base64encode(char *encoded, const char *string, int len) -{ +int Base64encode(char *encoded, const char *string, int len) { int i; char *p; p = encoded; for (i = 0; i < len - 2; i += 3) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - *p++ = basis_64[((string[i] & 0x3) << 4) | - ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2) | - ((int) (string[i + 2] & 0xC0) >> 6)]; - *p++ = basis_64[string[i + 2] & 0x3F]; + *p++ = basis_64[(string[i] >> 2) & 0x3F]; + *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2) | ((int) (string[i + 2] & 0xC0) >> 6)]; + *p++ = basis_64[string[i + 2] & 0x3F]; } if (i < len) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - if (i == (len - 1)) { - *p++ = basis_64[((string[i] & 0x3) << 4)]; + *p++ = basis_64[(string[i] >> 2) & 0x3F]; + if (i == (len - 1)) { + *p++ = basis_64[((string[i] & 0x3) << 4)]; + *p++ = '='; + } else { + *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; + } *p++ = '='; } - else { - *p++ = basis_64[((string[i] & 0x3) << 4) | - ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; - } - *p++ = '='; - } *p++ = '\0'; return p - encoded; diff --git a/src/base64.h b/src/base64.h index c69b93b..fc5ba9a 100644 --- a/src/base64.h +++ b/src/base64.h @@ -2,16 +2,16 @@ * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ - * + * * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -19,7 +19,7 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_LICENSE_HEADER_END@ */ /* ==================================================================== @@ -79,8 +79,6 @@ * */ - - #ifndef _BASE64_H_ #define _BASE64_H_ @@ -89,7 +87,7 @@ extern "C" { #endif int Base64encode_len(int len); -int Base64encode(char * coded_dst, const char *plain_src,int len_plain_src); +int Base64encode(char *coded_dst, const char *plain_src, int len_plain_src); #if 0 @@ -102,4 +100,4 @@ int Base64decode(char * plain_dst, const char *coded_src); } #endif -#endif //_BASE64_H_ +#endif //_BASE64_H_ diff --git a/src/chainConfig.h b/src/chainConfig.h index ace48c2..db38a3e 100644 --- a/src/chainConfig.h +++ b/src/chainConfig.h @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ #ifndef _CHAIN_CONFIG_H_ #define _CHAIN_CONFIG_H_ @@ -23,42 +23,42 @@ #include "os.h" typedef enum chain_kind_e { - CHAIN_KIND_ETHEREUM, - CHAIN_KIND_ETHEREUM_CLASSIC, - CHAIN_KIND_EXPANSE, - CHAIN_KIND_POA, - CHAIN_KIND_RSK, - CHAIN_KIND_UBIQ, - CHAIN_KIND_WANCHAIN, - CHAIN_KIND_KUSD, - CHAIN_KIND_PIRL, - CHAIN_KIND_AKROMA, - CHAIN_KIND_MUSICOIN, - CHAIN_KIND_CALLISTO, - CHAIN_KIND_ETHERSOCIAL, - CHAIN_KIND_ELLAISM, - CHAIN_KIND_ETHER1, - CHAIN_KIND_ETHERGEM, - CHAIN_KIND_ATHEIOS, - CHAIN_KIND_GOCHAIN, - CHAIN_KIND_MIX, - CHAIN_KIND_REOSC, - CHAIN_KIND_HPB, - CHAIN_KIND_TOMOCHAIN, - CHAIN_KIND_TOBALABA, - CHAIN_KIND_DEXON, - CHAIN_KIND_VOLTA, - CHAIN_KIND_EWC, - CHAIN_KIND_ARTIS_SIGMA1, - CHAIN_KIND_ARTIS_TAU1, - CHAIN_KIND_WEBCHAIN, - CHAIN_KIND_THUNDERCORE + CHAIN_KIND_ETHEREUM, + CHAIN_KIND_ETHEREUM_CLASSIC, + CHAIN_KIND_EXPANSE, + CHAIN_KIND_POA, + CHAIN_KIND_RSK, + CHAIN_KIND_UBIQ, + CHAIN_KIND_WANCHAIN, + CHAIN_KIND_KUSD, + CHAIN_KIND_PIRL, + CHAIN_KIND_AKROMA, + CHAIN_KIND_MUSICOIN, + CHAIN_KIND_CALLISTO, + CHAIN_KIND_ETHERSOCIAL, + CHAIN_KIND_ELLAISM, + CHAIN_KIND_ETHER1, + CHAIN_KIND_ETHERGEM, + CHAIN_KIND_ATHEIOS, + CHAIN_KIND_GOCHAIN, + CHAIN_KIND_MIX, + CHAIN_KIND_REOSC, + CHAIN_KIND_HPB, + CHAIN_KIND_TOMOCHAIN, + CHAIN_KIND_TOBALABA, + CHAIN_KIND_DEXON, + CHAIN_KIND_VOLTA, + CHAIN_KIND_EWC, + CHAIN_KIND_ARTIS_SIGMA1, + CHAIN_KIND_ARTIS_TAU1, + CHAIN_KIND_WEBCHAIN, + CHAIN_KIND_THUNDERCORE } chain_kind_t; typedef struct chain_config_s { - char coinName[10]; // ticker - uint32_t chainId; - chain_kind_t kind; + char coinName[10]; // ticker + uint32_t chainId; + chain_kind_t kind; } chain_config_t; #endif /* _CHAIN_CONFIG_H_ */ diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index 4b98ebc..fe3c1e7 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -5,248 +5,267 @@ #include "base64.h" void eth_plugin_prepare_init(ethPluginInitContract_t *init, uint8_t *selector, uint32_t dataSize) { - memset((uint8_t*)init, 0, sizeof(ethPluginInitContract_t)); - init->selector = selector; - init->dataSize = dataSize; + memset((uint8_t *) init, 0, sizeof(ethPluginInitContract_t)); + init->selector = selector; + init->dataSize = dataSize; } -void eth_plugin_prepare_provide_parameter(ethPluginProvideParameter_t *provideParameter, uint8_t *parameter, uint32_t parameterOffset) { - memset((uint8_t*)provideParameter, 0, sizeof(ethPluginProvideParameter_t)); - provideParameter->parameter = parameter; - provideParameter->parameterOffset = parameterOffset; +void eth_plugin_prepare_provide_parameter(ethPluginProvideParameter_t *provideParameter, + uint8_t *parameter, + uint32_t parameterOffset) { + memset((uint8_t *) provideParameter, 0, sizeof(ethPluginProvideParameter_t)); + provideParameter->parameter = parameter; + provideParameter->parameterOffset = parameterOffset; } void eth_plugin_prepare_finalize(ethPluginFinalize_t *finalize) { - memset((uint8_t*)finalize, 0, sizeof(ethPluginFinalize_t)); + memset((uint8_t *) finalize, 0, sizeof(ethPluginFinalize_t)); } -void eth_plugin_prepare_provide_token(ethPluginProvideToken_t *provideToken, tokenDefinition_t *token1, tokenDefinition_t *token2) { - memset((uint8_t*)provideToken, 0, sizeof(ethPluginProvideToken_t)); - provideToken->token1 = token1; - provideToken->token2 = token2; +void eth_plugin_prepare_provide_token(ethPluginProvideToken_t *provideToken, + tokenDefinition_t *token1, + tokenDefinition_t *token2) { + memset((uint8_t *) provideToken, 0, sizeof(ethPluginProvideToken_t)); + provideToken->token1 = token1; + provideToken->token2 = token2; } -void eth_plugin_prepare_query_contract_ID(ethQueryContractID_t *queryContractID, char *name, uint32_t nameLength, char *version, uint32_t versionLength) { - memset((uint8_t*)queryContractID, 0, sizeof(ethQueryContractID_t)); - queryContractID->name = name; - queryContractID->nameLength = nameLength; - queryContractID->version = version; - queryContractID->versionLength = versionLength; +void eth_plugin_prepare_query_contract_ID(ethQueryContractID_t *queryContractID, + char *name, + uint32_t nameLength, + char *version, + uint32_t versionLength) { + memset((uint8_t *) queryContractID, 0, sizeof(ethQueryContractID_t)); + queryContractID->name = name; + queryContractID->nameLength = nameLength; + queryContractID->version = version; + queryContractID->versionLength = versionLength; } -void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, uint8_t screenIndex, char *title, uint32_t titleLength, char *msg, uint32_t msgLength) { - memset((uint8_t*)queryContractUI, 0, sizeof(ethQueryContractUI_t)); - queryContractUI->screenIndex = screenIndex; - queryContractUI->title = title; - queryContractUI->titleLength = titleLength; - queryContractUI->msg = msg; - queryContractUI->msgLength = msgLength; +void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, + uint8_t screenIndex, + char *title, + uint32_t titleLength, + char *msg, + uint32_t msgLength) { + memset((uint8_t *) queryContractUI, 0, sizeof(ethQueryContractUI_t)); + queryContractUI->screenIndex = screenIndex; + queryContractUI->title = title; + queryContractUI->titleLength = titleLength; + queryContractUI->msg = msg; + queryContractUI->msgLength = msgLength; } int eth_plugin_perform_init(uint8_t *contractAddress, ethPluginInitContract_t *init) { - uint8_t i; - const uint8_t **selectors; - dataContext.tokenContext.pluginAvailable = 0; - // Handle hardcoded plugin list - PRINTF("Selector %.*H\n", 4, init->selector); - for (i=0;; i++) { - uint8_t j; - selectors = PIC(INTERNAL_ETH_PLUGINS[i].selectors); - if (selectors == NULL) { - break; - } - for (j=0; ((jselector, PIC(selectors[j]), SELECTOR_SIZE) == 0) { - if ((INTERNAL_ETH_PLUGINS[i].availableCheck == NULL) || - ((PluginAvailableCheck)PIC(INTERNAL_ETH_PLUGINS[i].availableCheck))()) { - strcpy(dataContext.tokenContext.pluginName, INTERNAL_ETH_PLUGINS[i].alias); - dataContext.tokenContext.pluginAvailable = 1; - contractAddress = NULL; - break; - } - } - } - } + uint8_t i; + const uint8_t **selectors; + dataContext.tokenContext.pluginAvailable = 0; + // Handle hardcoded plugin list + PRINTF("Selector %.*H\n", 4, init->selector); + for (i = 0;; i++) { + uint8_t j; + selectors = PIC(INTERNAL_ETH_PLUGINS[i].selectors); + if (selectors == NULL) { + break; + } + for (j = 0; ((j < INTERNAL_ETH_PLUGINS[i].num_selectors) && (contractAddress != NULL)); + j++) { + if (memcmp(init->selector, PIC(selectors[j]), SELECTOR_SIZE) == 0) { + if ((INTERNAL_ETH_PLUGINS[i].availableCheck == NULL) || + ((PluginAvailableCheck) PIC(INTERNAL_ETH_PLUGINS[i].availableCheck))()) { + strcpy(dataContext.tokenContext.pluginName, INTERNAL_ETH_PLUGINS[i].alias); + dataContext.tokenContext.pluginAvailable = 1; + contractAddress = NULL; + break; + } + } + } + } - // Do not handle a plugin if running in swap mode - if (called_from_swap && (contractAddress != NULL)) { - PRINTF("eth_plug_init aborted in swap mode\n"); - return 0; - } - for (;;) { - PRINTF("eth_plugin_init\n"); - if (contractAddress != NULL) { - PRINTF("Trying address %.*H\n", 20, contractAddress); - } - else { - PRINTF("Trying alias %s\n", dataContext.tokenContext.pluginName); - } - int status = eth_plugin_call(contractAddress, ETH_PLUGIN_INIT_CONTRACT, (void*)init); - if (!status) { - return 0; - } - if (status == ETH_PLUGIN_RESULT_OK) { - break; - } - if (status == ETH_PLUGIN_RESULT_OK_ALIAS) { - contractAddress = NULL; - } - } - PRINTF("eth_plugin_init ok %s\n", dataContext.tokenContext.pluginName); - dataContext.tokenContext.pluginAvailable = 1; - return 1; + // Do not handle a plugin if running in swap mode + if (called_from_swap && (contractAddress != NULL)) { + PRINTF("eth_plug_init aborted in swap mode\n"); + return 0; + } + for (;;) { + PRINTF("eth_plugin_init\n"); + if (contractAddress != NULL) { + PRINTF("Trying address %.*H\n", 20, contractAddress); + } else { + PRINTF("Trying alias %s\n", dataContext.tokenContext.pluginName); + } + int status = eth_plugin_call(contractAddress, ETH_PLUGIN_INIT_CONTRACT, (void *) init); + if (!status) { + return 0; + } + if (status == ETH_PLUGIN_RESULT_OK) { + break; + } + if (status == ETH_PLUGIN_RESULT_OK_ALIAS) { + contractAddress = NULL; + } + } + PRINTF("eth_plugin_init ok %s\n", dataContext.tokenContext.pluginName); + dataContext.tokenContext.pluginAvailable = 1; + return 1; } int eth_plugin_call(uint8_t *contractAddress, int method, void *parameter) { - ethPluginSharedRW_t pluginRW; - ethPluginSharedRO_t pluginRO; - char tmp[PLUGIN_ID_LENGTH]; - char *alias; - uint8_t i; - uint8_t internalPlugin = 0; + ethPluginSharedRW_t pluginRW; + ethPluginSharedRO_t pluginRO; + char tmp[PLUGIN_ID_LENGTH]; + char *alias; + uint8_t i; + uint8_t internalPlugin = 0; - pluginRW.sha3 = &global_sha3; - pluginRO.txContent = &tmpContent.txContent; + pluginRW.sha3 = &global_sha3; + pluginRO.txContent = &tmpContent.txContent; - if (contractAddress == NULL) { - if (!dataContext.tokenContext.pluginAvailable) { - PRINTF("Cached plugin call but no plugin available\n"); - return 0; - } - alias = dataContext.tokenContext.pluginName; - } - else { - Base64encode(tmp, (char*)contractAddress, 20); - alias = tmp; - } + if (contractAddress == NULL) { + if (!dataContext.tokenContext.pluginAvailable) { + PRINTF("Cached plugin call but no plugin available\n"); + return 0; + } + alias = dataContext.tokenContext.pluginName; + } else { + Base64encode(tmp, (char *) contractAddress, 20); + alias = tmp; + } - // Prepare the call + // Prepare the call - switch(method) { - case ETH_PLUGIN_INIT_CONTRACT: - ((ethPluginInitContract_t*)parameter)->pluginSharedRW = &pluginRW; - ((ethPluginInitContract_t*)parameter)->pluginSharedRO = &pluginRO; - ((ethPluginInitContract_t*)parameter)->pluginContext = (uint8_t*)&dataContext.tokenContext.pluginContext; - ((ethPluginInitContract_t*)parameter)->pluginContextLength = sizeof(dataContext.tokenContext.pluginContext); - ((ethPluginInitContract_t*)parameter)->alias = dataContext.tokenContext.pluginName; - break; - case ETH_PLUGIN_PROVIDE_PARAMETER: - ((ethPluginProvideParameter_t*)parameter)->pluginSharedRW = &pluginRW; - ((ethPluginProvideParameter_t*)parameter)->pluginSharedRO = &pluginRO; - ((ethPluginProvideParameter_t*)parameter)->pluginContext = (uint8_t*)&dataContext.tokenContext.pluginContext; - break; - case ETH_PLUGIN_FINALIZE: - ((ethPluginFinalize_t*)parameter)->pluginSharedRW = &pluginRW; - ((ethPluginFinalize_t*)parameter)->pluginSharedRO = &pluginRO; - ((ethPluginFinalize_t*)parameter)->pluginContext = (uint8_t*)&dataContext.tokenContext.pluginContext; - break; - case ETH_PLUGIN_PROVIDE_TOKEN: - ((ethPluginProvideToken_t*)parameter)->pluginSharedRW = &pluginRW; - ((ethPluginProvideToken_t*)parameter)->pluginSharedRO = &pluginRO; - ((ethPluginProvideToken_t*)parameter)->pluginContext = (uint8_t*)&dataContext.tokenContext.pluginContext; - break; - case ETH_PLUGIN_QUERY_CONTRACT_ID: - ((ethQueryContractID_t*)parameter)->pluginSharedRW = &pluginRW; - ((ethQueryContractID_t*)parameter)->pluginSharedRO = &pluginRO; - ((ethQueryContractID_t*)parameter)->pluginContext = (uint8_t*)&dataContext.tokenContext.pluginContext; - break; - case ETH_PLUGIN_QUERY_CONTRACT_UI: - ((ethQueryContractUI_t*)parameter)->pluginSharedRW = &pluginRW; - ((ethQueryContractUI_t*)parameter)->pluginSharedRO = &pluginRO; - ((ethQueryContractUI_t*)parameter)->pluginContext = (uint8_t*)&dataContext.tokenContext.pluginContext; - break; - default: - PRINTF("Unknown plugin method %d\n", method); - return 0; - } + switch (method) { + case ETH_PLUGIN_INIT_CONTRACT: + ((ethPluginInitContract_t *) parameter)->pluginSharedRW = &pluginRW; + ((ethPluginInitContract_t *) parameter)->pluginSharedRO = &pluginRO; + ((ethPluginInitContract_t *) parameter)->pluginContext = + (uint8_t *) &dataContext.tokenContext.pluginContext; + ((ethPluginInitContract_t *) parameter)->pluginContextLength = + sizeof(dataContext.tokenContext.pluginContext); + ((ethPluginInitContract_t *) parameter)->alias = dataContext.tokenContext.pluginName; + break; + case ETH_PLUGIN_PROVIDE_PARAMETER: + ((ethPluginProvideParameter_t *) parameter)->pluginSharedRW = &pluginRW; + ((ethPluginProvideParameter_t *) parameter)->pluginSharedRO = &pluginRO; + ((ethPluginProvideParameter_t *) parameter)->pluginContext = + (uint8_t *) &dataContext.tokenContext.pluginContext; + break; + case ETH_PLUGIN_FINALIZE: + ((ethPluginFinalize_t *) parameter)->pluginSharedRW = &pluginRW; + ((ethPluginFinalize_t *) parameter)->pluginSharedRO = &pluginRO; + ((ethPluginFinalize_t *) parameter)->pluginContext = + (uint8_t *) &dataContext.tokenContext.pluginContext; + break; + case ETH_PLUGIN_PROVIDE_TOKEN: + ((ethPluginProvideToken_t *) parameter)->pluginSharedRW = &pluginRW; + ((ethPluginProvideToken_t *) parameter)->pluginSharedRO = &pluginRO; + ((ethPluginProvideToken_t *) parameter)->pluginContext = + (uint8_t *) &dataContext.tokenContext.pluginContext; + break; + case ETH_PLUGIN_QUERY_CONTRACT_ID: + ((ethQueryContractID_t *) parameter)->pluginSharedRW = &pluginRW; + ((ethQueryContractID_t *) parameter)->pluginSharedRO = &pluginRO; + ((ethQueryContractID_t *) parameter)->pluginContext = + (uint8_t *) &dataContext.tokenContext.pluginContext; + break; + case ETH_PLUGIN_QUERY_CONTRACT_UI: + ((ethQueryContractUI_t *) parameter)->pluginSharedRW = &pluginRW; + ((ethQueryContractUI_t *) parameter)->pluginSharedRO = &pluginRO; + ((ethQueryContractUI_t *) parameter)->pluginContext = + (uint8_t *) &dataContext.tokenContext.pluginContext; + break; + default: + PRINTF("Unknown plugin method %d\n", method); + return 0; + } - // Perform the call + // Perform the call - for (i=0;; i++) { - if (INTERNAL_ETH_PLUGINS[i].alias[0] == 0) { - break; - } - if (strcmp(alias, INTERNAL_ETH_PLUGINS[i].alias) == 0) { - internalPlugin = 1; - ((PluginCall)PIC(INTERNAL_ETH_PLUGINS[i].impl))(method, parameter); - break; - } - } + for (i = 0;; i++) { + if (INTERNAL_ETH_PLUGINS[i].alias[0] == 0) { + break; + } + if (strcmp(alias, INTERNAL_ETH_PLUGINS[i].alias) == 0) { + internalPlugin = 1; + ((PluginCall) PIC(INTERNAL_ETH_PLUGINS[i].impl))(method, parameter); + break; + } + } - if (!internalPlugin) { - uint32_t params[3]; - params[0] = (uint32_t)alias; - params[1] = method; - params[2] = (uint32_t)parameter; - BEGIN_TRY { - TRY { - os_lib_call(params); - } - CATCH_OTHER(e) { - PRINTF("Plugin call exception for %s\n", alias); - } - FINALLY { - } - } - END_TRY; - } + if (!internalPlugin) { + uint32_t params[3]; + params[0] = (uint32_t) alias; + params[1] = method; + params[2] = (uint32_t) parameter; + BEGIN_TRY { + TRY { + os_lib_call(params); + } + CATCH_OTHER(e) { + PRINTF("Plugin call exception for %s\n", alias); + } + FINALLY { + } + } + END_TRY; + } - // Check the call result + // Check the call result - switch(method) { - case ETH_PLUGIN_INIT_CONTRACT: - switch (((ethPluginInitContract_t*)parameter)->result) { - case ETH_PLUGIN_RESULT_OK: - if (contractAddress != NULL) { - strcpy(dataContext.tokenContext.pluginName, alias); - } - break; - case ETH_PLUGIN_RESULT_OK_ALIAS: - break; - default: - return 0; - } - break; - case ETH_PLUGIN_PROVIDE_PARAMETER: - switch (((ethPluginProvideParameter_t*)parameter)->result) { - case ETH_PLUGIN_RESULT_OK: - case ETH_PLUGIN_RESULT_FALLBACK: - break; - default: - return 0; - } - break; - case ETH_PLUGIN_FINALIZE: - switch (((ethPluginFinalize_t*)parameter)->result) { - case ETH_PLUGIN_RESULT_OK: - case ETH_PLUGIN_RESULT_FALLBACK: - break; - default: - return 0; - } - break; - case ETH_PLUGIN_PROVIDE_TOKEN: - switch (((ethPluginProvideToken_t*)parameter)->result) { - case ETH_PLUGIN_RESULT_OK: - case ETH_PLUGIN_RESULT_FALLBACK: - break; - default: - return 0; - } - break; - case ETH_PLUGIN_QUERY_CONTRACT_ID: - if (((ethQueryContractID_t*)parameter)->result != ETH_PLUGIN_RESULT_OK) { - return 0; - } - break; - case ETH_PLUGIN_QUERY_CONTRACT_UI: - if (((ethQueryContractUI_t*)parameter)->result != ETH_PLUGIN_RESULT_OK) { - return 0; - } - break; - default: - return 0; - } + switch (method) { + case ETH_PLUGIN_INIT_CONTRACT: + switch (((ethPluginInitContract_t *) parameter)->result) { + case ETH_PLUGIN_RESULT_OK: + if (contractAddress != NULL) { + strcpy(dataContext.tokenContext.pluginName, alias); + } + break; + case ETH_PLUGIN_RESULT_OK_ALIAS: + break; + default: + return 0; + } + break; + case ETH_PLUGIN_PROVIDE_PARAMETER: + switch (((ethPluginProvideParameter_t *) parameter)->result) { + case ETH_PLUGIN_RESULT_OK: + case ETH_PLUGIN_RESULT_FALLBACK: + break; + default: + return 0; + } + break; + case ETH_PLUGIN_FINALIZE: + switch (((ethPluginFinalize_t *) parameter)->result) { + case ETH_PLUGIN_RESULT_OK: + case ETH_PLUGIN_RESULT_FALLBACK: + break; + default: + return 0; + } + break; + case ETH_PLUGIN_PROVIDE_TOKEN: + switch (((ethPluginProvideToken_t *) parameter)->result) { + case ETH_PLUGIN_RESULT_OK: + case ETH_PLUGIN_RESULT_FALLBACK: + break; + default: + return 0; + } + break; + case ETH_PLUGIN_QUERY_CONTRACT_ID: + if (((ethQueryContractID_t *) parameter)->result != ETH_PLUGIN_RESULT_OK) { + return 0; + } + break; + case ETH_PLUGIN_QUERY_CONTRACT_UI: + if (((ethQueryContractUI_t *) parameter)->result != ETH_PLUGIN_RESULT_OK) { + return 0; + } + break; + default: + return 0; + } - return 1; + return 1; } diff --git a/src/eth_plugin_handler.h b/src/eth_plugin_handler.h index 338017b..9336ce9 100644 --- a/src/eth_plugin_handler.h +++ b/src/eth_plugin_handler.h @@ -3,11 +3,24 @@ #include "eth_plugin_interface.h" void eth_plugin_prepare_init(ethPluginInitContract_t *init, uint8_t *selector, uint32_t dataSize); -void eth_plugin_prepare_provide_parameter(ethPluginProvideParameter_t *provideParameter, uint8_t *parameter, uint32_t parameterOffset); +void eth_plugin_prepare_provide_parameter(ethPluginProvideParameter_t *provideParameter, + uint8_t *parameter, + uint32_t parameterOffset); void eth_plugin_prepare_finalize(ethPluginFinalize_t *finalize); -void eth_plugin_prepare_provide_token(ethPluginProvideToken_t *provideToken, tokenDefinition_t *token1, tokenDefinition_t *token2); -void eth_plugin_prepare_query_contract_ID(ethQueryContractID_t *queryContractID, char *name, uint32_t nameLength, char *version, uint32_t versionLength); -void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, uint8_t screenIndex, char *title, uint32_t titleLength, char *msg, uint32_t msgLength); +void eth_plugin_prepare_provide_token(ethPluginProvideToken_t *provideToken, + tokenDefinition_t *token1, + tokenDefinition_t *token2); +void eth_plugin_prepare_query_contract_ID(ethQueryContractID_t *queryContractID, + char *name, + uint32_t nameLength, + char *version, + uint32_t versionLength); +void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, + uint8_t screenIndex, + char *title, + uint32_t titleLength, + char *msg, + uint32_t msgLength); int eth_plugin_perform_init(uint8_t *contractAddress, ethPluginInitContract_t *init); // NULL for cached address, or base contract address @@ -17,4 +30,3 @@ int compound_plugin_call(uint8_t *contractAddress, int method, void *parameter); void plugin_ui_start(void); #endif - diff --git a/src/eth_plugin_interface.h b/src/eth_plugin_interface.h index ae51cbf..e5f8dd9 100644 --- a/src/eth_plugin_interface.h +++ b/src/eth_plugin_interface.h @@ -11,123 +11,116 @@ typedef enum { - ETH_PLUGIN_INIT_CONTRACT = 0x0101, - ETH_PLUGIN_PROVIDE_PARAMETER = 0x0102, - ETH_PLUGIN_FINALIZE = 0x0103, - ETH_PLUGIN_PROVIDE_TOKEN = 0x0104, - ETH_PLUGIN_QUERY_CONTRACT_ID = 0x0105, - ETH_PLUGIN_QUERY_CONTRACT_UI = 0x0106 + ETH_PLUGIN_INIT_CONTRACT = 0x0101, + ETH_PLUGIN_PROVIDE_PARAMETER = 0x0102, + ETH_PLUGIN_FINALIZE = 0x0103, + ETH_PLUGIN_PROVIDE_TOKEN = 0x0104, + ETH_PLUGIN_QUERY_CONTRACT_ID = 0x0105, + ETH_PLUGIN_QUERY_CONTRACT_UI = 0x0106 } eth_plugin_msg_t; typedef enum { - ETH_PLUGIN_RESULT_ERROR = 0x00, - ETH_PLUGIN_RESULT_OK = 0x01, - ETH_PLUGIN_RESULT_OK_ALIAS = 0x02, - ETH_PLUGIN_RESULT_FALLBACK = 0x03 + ETH_PLUGIN_RESULT_ERROR = 0x00, + ETH_PLUGIN_RESULT_OK = 0x01, + ETH_PLUGIN_RESULT_OK_ALIAS = 0x02, + ETH_PLUGIN_RESULT_FALLBACK = 0x03 } eth_plugin_result_t; typedef enum { - ETH_UI_TYPE_AMOUNT_ADDRESS = 0x01, - ETH_UI_TYPE_GENERIC = 0x02 + ETH_UI_TYPE_AMOUNT_ADDRESS = 0x01, + ETH_UI_TYPE_GENERIC = 0x02 } eth_ui_type_t; -typedef void (*PluginCall)(int, void*); +typedef void (*PluginCall)(int, void *); // Shared objects, read-write typedef struct ethPluginSharedRW_t { - - cx_sha3_t *sha3; + cx_sha3_t *sha3; } ethPluginSharedRW_t; // Shared objects, read-only typedef struct ethPluginSharedRO_t { - - txContent_t *txContent; + txContent_t *txContent; } ethPluginSharedRO_t; - // Init Contract typedef struct ethPluginInitContract_t { + // in - // in + ethPluginSharedRW_t *pluginSharedRW; + ethPluginSharedRO_t *pluginSharedRO; + uint8_t *pluginContext; + uint32_t pluginContextLength; + uint8_t *selector; // 4 bytes selector + uint32_t dataSize; - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; - uint32_t pluginContextLength; - uint8_t *selector; // 4 bytes selector - uint32_t dataSize; + char *alias; // 29 bytes alias if ETH_PLUGIN_RESULT_OK_ALIAS set - char *alias; // 29 bytes alias if ETH_PLUGIN_RESULT_OK_ALIAS set - - uint8_t result; + uint8_t result; } ethPluginInitContract_t; // Provide parameter typedef struct ethPluginProvideParameter_t { + ethPluginSharedRW_t *pluginSharedRW; + ethPluginSharedRO_t *pluginSharedRO; + uint8_t *pluginContext; + uint8_t *parameter; // 32 bytes parameter + uint32_t parameterOffset; - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; - uint8_t *parameter; // 32 bytes parameter - uint32_t parameterOffset; - - uint8_t result; + uint8_t result; } ethPluginProvideParameter_t; // Finalize typedef struct ethPluginFinalize_t { + ethPluginSharedRW_t *pluginSharedRW; + ethPluginSharedRO_t *pluginSharedRO; + uint8_t *pluginContext; - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; + uint8_t *tokenLookup1; // set by the plugin if a token should be looked up + uint8_t *tokenLookup2; - uint8_t *tokenLookup1; // set by the plugin if a token should be looked up - uint8_t *tokenLookup2; + uint8_t *amount; // set an uint256 pointer if uiType is UI_AMOUNT_ADDRESS + uint8_t *address; // set to a 20 bytes address pointer if uiType is UI_AMOUNT_ADDRESS - uint8_t *amount; // set an uint256 pointer if uiType is UI_AMOUNT_ADDRESS - uint8_t *address; // set to a 20 bytes address pointer if uiType is UI_AMOUNT_ADDRESS - - uint8_t uiType; - uint8_t numScreens; // ignored if uiType is UI_AMOUNT_ADDRESS - uint8_t result; + uint8_t uiType; + uint8_t numScreens; // ignored if uiType is UI_AMOUNT_ADDRESS + uint8_t result; } ethPluginFinalize_t; // If uiType is UI_AMOUNT_ADDRESS, the amount and address provided by the plugin will be used // If tokenLookup1 is set, the amount is provided for this token -// if uiType is UI_TYPE_GENERIC, the ETH application provides tokens if requested then prompts +// if uiType is UI_TYPE_GENERIC, the ETH application provides tokens if requested then prompts // for each UI field -// The first field is forced by the ETH app to be the name + version of the plugin handling the request -// The last field is the fee amount +// The first field is forced by the ETH app to be the name + version of the plugin handling the +// request The last field is the fee amount -// Provide token +// Provide token typedef struct ethPluginProvideToken_t { + ethPluginSharedRW_t *pluginSharedRW; + ethPluginSharedRO_t *pluginSharedRO; + uint8_t *pluginContext; - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; + tokenDefinition_t *token1; // set by the ETH application, to be saved by the plugin + tokenDefinition_t *token2; - tokenDefinition_t *token1; // set by the ETH application, to be saved by the plugin - tokenDefinition_t *token2; - - uint8_t result; + uint8_t result; } ethPluginProvideToken_t; @@ -136,36 +129,33 @@ typedef struct ethPluginProvideToken_t { // This is always called on the non aliased contract typedef struct ethQueryContractID_t { + ethPluginSharedRW_t *pluginSharedRW; + ethPluginSharedRO_t *pluginSharedRO; + uint8_t *pluginContext; - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; + char *name; + uint32_t nameLength; + char *version; + uint32_t versionLength; - char *name; - uint32_t nameLength; - char *version; - uint32_t versionLength; - - uint8_t result; + uint8_t result; } ethQueryContractID_t; // Query Contract UI typedef struct ethQueryContractUI_t { + ethPluginSharedRW_t *pluginSharedRW; + ethPluginSharedRO_t *pluginSharedRO; + uint8_t *pluginContext; + uint8_t screenIndex; + char *title; + uint32_t titleLength; + char *msg; + uint32_t msgLength; - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; - uint8_t screenIndex; - char *title; - uint32_t titleLength; - char *msg; - uint32_t msgLength; - - uint8_t result; + uint8_t result; } ethQueryContractUI_t; #endif - diff --git a/src/eth_plugin_internal.c b/src/eth_plugin_internal.c index 5be1fb3..659819c 100644 --- a/src/eth_plugin_internal.c +++ b/src/eth_plugin_internal.c @@ -3,138 +3,118 @@ bool erc20_plugin_available_check(void); bool erc721_plugin_available_check(void); -void erc20_plugin_call(int message, void *parameters); -void erc721_plugin_call(int message, void *parameters); -void compound_plugin_call(int message, void *parameters); +void erc20_plugin_call(int message, void* parameters); +void erc721_plugin_call(int message, void* parameters); +void compound_plugin_call(int message, void* parameters); #ifdef HAVE_STARKWARE -void starkware_plugin_call(int message, void *parameters); +void starkware_plugin_call(int message, void* parameters); #endif #ifdef HAVE_ETH2 -void eth2_plugin_call(int message, void *parameters); +void eth2_plugin_call(int message, void* parameters); #endif -static const uint8_t const ERC20_TRANSFER_SELECTOR[SELECTOR_SIZE] = { 0xa9, 0x05, 0x9c, 0xbb }; -static const uint8_t const ERC20_APPROVE_SELECTOR[SELECTOR_SIZE] = { 0x09, 0x5e, 0xa7, 0xb3 }; +static const uint8_t const ERC20_TRANSFER_SELECTOR[SELECTOR_SIZE] = {0xa9, 0x05, 0x9c, 0xbb}; +static const uint8_t const ERC20_APPROVE_SELECTOR[SELECTOR_SIZE] = {0x09, 0x5e, 0xa7, 0xb3}; -const uint8_t* const ERC20_SELECTORS[NUM_ERC20_SELECTORS] = { - ERC20_TRANSFER_SELECTOR, ERC20_APPROVE_SELECTOR -}; +const uint8_t* const ERC20_SELECTORS[NUM_ERC20_SELECTORS] = {ERC20_TRANSFER_SELECTOR, + ERC20_APPROVE_SELECTOR}; +static const uint8_t const ERC721_APPROVE_SELECTOR[SELECTOR_SIZE] = {0x09, 0x5e, 0xa7, 0xb3}; -static const uint8_t const ERC721_APPROVE_SELECTOR[SELECTOR_SIZE] = { 0x09, 0x5e, 0xa7, 0xb3 }; +const uint8_t* const ERC721_SELECTORS[NUM_ERC721_SELECTORS] = {ERC721_APPROVE_SELECTOR}; -const uint8_t* const ERC721_SELECTORS[NUM_ERC721_SELECTORS] = { - ERC721_APPROVE_SELECTOR -}; - -static const uint8_t const COMPOUND_REDEEM_UNDERLYING_SELECTOR[SELECTOR_SIZE] = { 0x85, 0x2a, 0x12, 0xe3 }; -static const uint8_t const COMPOUND_REDEEM_SELECTOR[SELECTOR_SIZE] = { 0xdb, 0x00, 0x6a, 0x75 }; -static const uint8_t const COMPOUND_MINT_SELECTOR[SELECTOR_SIZE] = { 0xa0, 0x71, 0x2d, 0x68 }; -static const uint8_t const CETH_MINT_SELECTOR[SELECTOR_SIZE] = { 0x12, 0x49, 0xc5, 0x8b }; +static const uint8_t const COMPOUND_REDEEM_UNDERLYING_SELECTOR[SELECTOR_SIZE] = {0x85, + 0x2a, + 0x12, + 0xe3}; +static const uint8_t const COMPOUND_REDEEM_SELECTOR[SELECTOR_SIZE] = {0xdb, 0x00, 0x6a, 0x75}; +static const uint8_t const COMPOUND_MINT_SELECTOR[SELECTOR_SIZE] = {0xa0, 0x71, 0x2d, 0x68}; +static const uint8_t const CETH_MINT_SELECTOR[SELECTOR_SIZE] = {0x12, 0x49, 0xc5, 0x8b}; const uint8_t* const COMPOUND_SELECTORS[NUM_COMPOUND_SELECTORS] = { - COMPOUND_REDEEM_UNDERLYING_SELECTOR, COMPOUND_REDEEM_SELECTOR, - COMPOUND_MINT_SELECTOR, CETH_MINT_SELECTOR -}; + COMPOUND_REDEEM_UNDERLYING_SELECTOR, + COMPOUND_REDEEM_SELECTOR, + COMPOUND_MINT_SELECTOR, + CETH_MINT_SELECTOR}; #ifdef HAVE_ETH2 -static const uint8_t const ETH2_DEPOSIT_SELECTOR[SELECTOR_SIZE] = { 0x22, 0x89, 0x51, 0x18 }; +static const uint8_t const ETH2_DEPOSIT_SELECTOR[SELECTOR_SIZE] = {0x22, 0x89, 0x51, 0x18}; -const uint8_t* const ETH2_SELECTORS[NUM_ETH2_SELECTORS] = { - ETH2_DEPOSIT_SELECTOR -}; +const uint8_t* const ETH2_SELECTORS[NUM_ETH2_SELECTORS] = {ETH2_DEPOSIT_SELECTOR}; #endif #ifdef HAVE_STARKWARE -static const uint8_t const STARKWARE_REGISTER_ID[SELECTOR_SIZE] = { 0xdd, 0x24, 0x14, 0xd4 }; -static const uint8_t const STARKWARE_DEPOSIT_TOKEN_ID[SELECTOR_SIZE] = { 0x25, 0x05, 0xc3, 0xd9 }; -static const uint8_t const STARKWARE_DEPOSIT_ETH_ID[SELECTOR_SIZE] = { 0x00, 0xae, 0xef, 0x8a }; -static const uint8_t const STARKWARE_DEPOSIT_CANCEL_ID[SELECTOR_SIZE] = { 0x7d, 0xf7, 0xdc, 0x04 }; -static const uint8_t const STARKWARE_DEPOSIT_RECLAIM_ID[SELECTOR_SIZE] = { 0xae, 0x87, 0x38, 0x16 }; -static const uint8_t const STARKWARE_WITHDRAW_ID[SELECTOR_SIZE] = { 0x44, 0x1a, 0x3e, 0x70 }; -static const uint8_t const STARKWARE_FULL_WITHDRAWAL_ID[SELECTOR_SIZE] = { 0xa9, 0x33, 0x10, 0xc4 }; -static const uint8_t const STARKWARE_FREEZE_ID[SELECTOR_SIZE] = { 0x93, 0xc1, 0xe4, 0x66 }; -static const uint8_t const STARKWARE_ESCAPE_ID[SELECTOR_SIZE] = { 0x9e, 0x3a, 0xda, 0xc4 }; -static const uint8_t const STARKWARE_VERIFY_ESCAPE_ID[SELECTOR_SIZE] = { 0x2d, 0xd5, 0x30, 0x06 }; - -static const uint8_t const STARKWARE_WITHDRAW_TO_ID[SELECTOR_SIZE] = { 0x14, 0xcd, 0x70, 0xe4 }; -static const uint8_t const STARKWARE_DEPOSIT_NFT_ID[SELECTOR_SIZE] = { 0xae, 0x1c, 0xdd, 0xe6 }; -static const uint8_t const STARKWARE_DEPOSIT_NFT_RECLAIM_ID[SELECTOR_SIZE] = { 0xfc, 0xb0, 0x58, 0x22 }; -static const uint8_t const STARKWARE_WITHDRAW_AND_MINT_ID[SELECTOR_SIZE] = { 0xd9, 0x14, 0x43, 0xb7 }; -static const uint8_t const STARKWARE_WITHDRAW_NFT_ID[SELECTOR_SIZE] = { 0x01, 0x9b, 0x41, 0x7a }; -static const uint8_t const STARKWARE_WITHDRAW_NFT_TO_ID[SELECTOR_SIZE] = { 0xeb, 0xef, 0x0f, 0xd0 }; +static const uint8_t const STARKWARE_REGISTER_ID[SELECTOR_SIZE] = {0xdd, 0x24, 0x14, 0xd4}; +static const uint8_t const STARKWARE_DEPOSIT_TOKEN_ID[SELECTOR_SIZE] = {0x25, 0x05, 0xc3, 0xd9}; +static const uint8_t const STARKWARE_DEPOSIT_ETH_ID[SELECTOR_SIZE] = {0x00, 0xae, 0xef, 0x8a}; +static const uint8_t const STARKWARE_DEPOSIT_CANCEL_ID[SELECTOR_SIZE] = {0x7d, 0xf7, 0xdc, 0x04}; +static const uint8_t const STARKWARE_DEPOSIT_RECLAIM_ID[SELECTOR_SIZE] = {0xae, 0x87, 0x38, 0x16}; +static const uint8_t const STARKWARE_WITHDRAW_ID[SELECTOR_SIZE] = {0x44, 0x1a, 0x3e, 0x70}; +static const uint8_t const STARKWARE_FULL_WITHDRAWAL_ID[SELECTOR_SIZE] = {0xa9, 0x33, 0x10, 0xc4}; +static const uint8_t const STARKWARE_FREEZE_ID[SELECTOR_SIZE] = {0x93, 0xc1, 0xe4, 0x66}; +static const uint8_t const STARKWARE_ESCAPE_ID[SELECTOR_SIZE] = {0x9e, 0x3a, 0xda, 0xc4}; +static const uint8_t const STARKWARE_VERIFY_ESCAPE_ID[SELECTOR_SIZE] = {0x2d, 0xd5, 0x30, 0x06}; +static const uint8_t const STARKWARE_WITHDRAW_TO_ID[SELECTOR_SIZE] = {0x14, 0xcd, 0x70, 0xe4}; +static const uint8_t const STARKWARE_DEPOSIT_NFT_ID[SELECTOR_SIZE] = {0xae, 0x1c, 0xdd, 0xe6}; +static const uint8_t const STARKWARE_DEPOSIT_NFT_RECLAIM_ID[SELECTOR_SIZE] = {0xfc, + 0xb0, + 0x58, + 0x22}; +static const uint8_t const STARKWARE_WITHDRAW_AND_MINT_ID[SELECTOR_SIZE] = {0xd9, 0x14, 0x43, 0xb7}; +static const uint8_t const STARKWARE_WITHDRAW_NFT_ID[SELECTOR_SIZE] = {0x01, 0x9b, 0x41, 0x7a}; +static const uint8_t const STARKWARE_WITHDRAW_NFT_TO_ID[SELECTOR_SIZE] = {0xeb, 0xef, 0x0f, 0xd0}; const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS] = { - STARKWARE_REGISTER_ID, STARKWARE_DEPOSIT_TOKEN_ID, STARKWARE_DEPOSIT_ETH_ID, - STARKWARE_DEPOSIT_CANCEL_ID, STARKWARE_DEPOSIT_RECLAIM_ID, STARKWARE_WITHDRAW_ID, - STARKWARE_FULL_WITHDRAWAL_ID, STARKWARE_FREEZE_ID, STARKWARE_ESCAPE_ID, - STARKWARE_VERIFY_ESCAPE_ID, STARKWARE_WITHDRAW_TO_ID, STARKWARE_DEPOSIT_NFT_ID, - STARKWARE_DEPOSIT_NFT_RECLAIM_ID, STARKWARE_WITHDRAW_AND_MINT_ID, STARKWARE_WITHDRAW_NFT_ID, - STARKWARE_WITHDRAW_NFT_TO_ID -}; + STARKWARE_REGISTER_ID, + STARKWARE_DEPOSIT_TOKEN_ID, + STARKWARE_DEPOSIT_ETH_ID, + STARKWARE_DEPOSIT_CANCEL_ID, + STARKWARE_DEPOSIT_RECLAIM_ID, + STARKWARE_WITHDRAW_ID, + STARKWARE_FULL_WITHDRAWAL_ID, + STARKWARE_FREEZE_ID, + STARKWARE_ESCAPE_ID, + STARKWARE_VERIFY_ESCAPE_ID, + STARKWARE_WITHDRAW_TO_ID, + STARKWARE_DEPOSIT_NFT_ID, + STARKWARE_DEPOSIT_NFT_RECLAIM_ID, + STARKWARE_WITHDRAW_AND_MINT_ID, + STARKWARE_WITHDRAW_NFT_ID, + STARKWARE_WITHDRAW_NFT_TO_ID}; #endif // All internal alias names start with 'minus' -const internalEthPlugin_t const INTERNAL_ETH_PLUGINS[] = { - { - erc20_plugin_available_check, - ERC20_SELECTORS, - NUM_ERC20_SELECTORS, - "-erc20", - erc20_plugin_call - }, +const internalEthPlugin_t const INTERNAL_ETH_PLUGINS[] = { + {erc20_plugin_available_check, + ERC20_SELECTORS, + NUM_ERC20_SELECTORS, + "-erc20", + erc20_plugin_call}, - { - erc721_plugin_available_check, - ERC721_SELECTORS, - NUM_ERC721_SELECTORS, - "-er721", - erc721_plugin_call - }, + {erc721_plugin_available_check, + ERC721_SELECTORS, + NUM_ERC721_SELECTORS, + "-er721", + erc721_plugin_call}, - { - NULL, - COMPOUND_SELECTORS, - NUM_COMPOUND_SELECTORS, - "-cmpd", - compound_plugin_call - }, + {NULL, COMPOUND_SELECTORS, NUM_COMPOUND_SELECTORS, "-cmpd", compound_plugin_call}, #ifdef HAVE_ETH2 - { - NULL, - ETH2_SELECTORS, - NUM_ETH2_SELECTORS, - "-eth2", - eth2_plugin_call - }, + {NULL, ETH2_SELECTORS, NUM_ETH2_SELECTORS, "-eth2", eth2_plugin_call}, -#endif +#endif #ifdef HAVE_STARKWARE - { - NULL, - STARKWARE_SELECTORS, - 10, - "-strk", - starkware_plugin_call - }, + {NULL, STARKWARE_SELECTORS, 10, "-strk", starkware_plugin_call}, -#endif +#endif - { - NULL, - NULL, - 0, - "", - NULL - } -}; + {NULL, NULL, 0, "", NULL}}; diff --git a/src/eth_plugin_internal.h b/src/eth_plugin_internal.h index 3a8c966..169efb2 100644 --- a/src/eth_plugin_internal.h +++ b/src/eth_plugin_internal.h @@ -7,11 +7,11 @@ typedef bool (*PluginAvailableCheck)(void); typedef struct internalEthPlugin_t { - PluginAvailableCheck availableCheck; - const uint8_t **selectors; - uint8_t num_selectors; - char alias[7]; - PluginCall impl; + PluginAvailableCheck availableCheck; + const uint8_t** selectors; + uint8_t num_selectors; + char alias[7]; + PluginCall impl; } internalEthPlugin_t; #define NUM_ERC20_SELECTORS 2 diff --git a/src/eth_plugin_ui.c b/src/eth_plugin_ui.c index 281de79..1d744fc 100644 --- a/src/eth_plugin_ui.c +++ b/src/eth_plugin_ui.c @@ -7,86 +7,94 @@ typedef enum { - PLUGIN_UI_INSIDE = 0, - PLUGIN_UI_OUTSIDE + PLUGIN_UI_INSIDE = 0, + PLUGIN_UI_OUTSIDE } plugin_ui_state_t; void computeFees(char *displayBuffer, uint32_t displayBufferSize); void plugin_ui_get_id() { - ethQueryContractID_t pluginQueryContractID; - eth_plugin_prepare_query_contract_ID(&pluginQueryContractID, strings.tmp.tmp, sizeof(strings.tmp.tmp), strings.tmp.tmp2, sizeof(strings.tmp.tmp2)); - // Query the original contract for ID if it's not an internal alias - if (!eth_plugin_call( - (dataContext.tokenContext.pluginName[0] == '-' ? NULL : tmpContent.txContent.destination), - ETH_PLUGIN_QUERY_CONTRACT_ID, (void*)&pluginQueryContractID)) { - PRINTF("Plugin query contract ID call failed\n"); - io_seproxyhal_touch_tx_cancel(NULL); - } + ethQueryContractID_t pluginQueryContractID; + eth_plugin_prepare_query_contract_ID(&pluginQueryContractID, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + strings.tmp.tmp2, + sizeof(strings.tmp.tmp2)); + // Query the original contract for ID if it's not an internal alias + if (!eth_plugin_call( + (dataContext.tokenContext.pluginName[0] == '-' ? NULL + : tmpContent.txContent.destination), + ETH_PLUGIN_QUERY_CONTRACT_ID, + (void *) &pluginQueryContractID)) { + PRINTF("Plugin query contract ID call failed\n"); + io_seproxyhal_touch_tx_cancel(NULL); + } } void plugin_ui_get_item() { - ethQueryContractUI_t pluginQueryContractUI; - eth_plugin_prepare_query_contract_UI(&pluginQueryContractUI, dataContext.tokenContext.pluginUiCurrentItem, strings.tmp.tmp, sizeof(strings.tmp.tmp), strings.tmp.tmp2, sizeof(strings.tmp.tmp2)); - if (!eth_plugin_call(NULL, ETH_PLUGIN_QUERY_CONTRACT_UI, (void*)&pluginQueryContractUI)) { - PRINTF("Plugin query contract UI call failed\n"); - io_seproxyhal_touch_tx_cancel(NULL); - } + ethQueryContractUI_t pluginQueryContractUI; + eth_plugin_prepare_query_contract_UI(&pluginQueryContractUI, + dataContext.tokenContext.pluginUiCurrentItem, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + strings.tmp.tmp2, + sizeof(strings.tmp.tmp2)); + if (!eth_plugin_call(NULL, ETH_PLUGIN_QUERY_CONTRACT_UI, (void *) &pluginQueryContractUI)) { + PRINTF("Plugin query contract UI call failed\n"); + io_seproxyhal_touch_tx_cancel(NULL); + } } void display_next_plugin_item(bool entering) { - if (entering) { - if (dataContext.tokenContext.pluginUiState == PLUGIN_UI_OUTSIDE) { - dataContext.tokenContext.pluginUiState = PLUGIN_UI_INSIDE; - dataContext.tokenContext.pluginUiCurrentItem = 0; - plugin_ui_get_item(); - ux_flow_next(); + if (entering) { + if (dataContext.tokenContext.pluginUiState == PLUGIN_UI_OUTSIDE) { + dataContext.tokenContext.pluginUiState = PLUGIN_UI_INSIDE; + dataContext.tokenContext.pluginUiCurrentItem = 0; + plugin_ui_get_item(); + ux_flow_next(); + } else { + if (dataContext.tokenContext.pluginUiCurrentItem > 0) { + dataContext.tokenContext.pluginUiCurrentItem--; + plugin_ui_get_item(); + ux_flow_next(); + } else { + dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; + dataContext.tokenContext.pluginUiCurrentItem = 0; + ux_flow_prev(); + } + } + } else { + if (dataContext.tokenContext.pluginUiState == PLUGIN_UI_OUTSIDE) { + dataContext.tokenContext.pluginUiState = PLUGIN_UI_INSIDE; + plugin_ui_get_item(); + ux_flow_prev(); + } else { + if (dataContext.tokenContext.pluginUiCurrentItem < + dataContext.tokenContext.pluginUiMaxItems - 1) { + dataContext.tokenContext.pluginUiCurrentItem++; + plugin_ui_get_item(); + ux_flow_prev(); + // Reset multi page layout to the first page + G_ux.layout_paging.current = 0; +#ifdef TARGET_NANOS + ux_layout_paging_redisplay(G_ux.stack_count - 1); +#else + ux_layout_bnnn_paging_redisplay(0); +#endif + } else { + dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; + ux_flow_next(); + } + } } - else { - if (dataContext.tokenContext.pluginUiCurrentItem > 0) { - dataContext.tokenContext.pluginUiCurrentItem--; - plugin_ui_get_item(); - ux_flow_next(); - } - else { - dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; - dataContext.tokenContext.pluginUiCurrentItem = 0; - ux_flow_prev(); - } - } - } - else { - if (dataContext.tokenContext.pluginUiState == PLUGIN_UI_OUTSIDE) { - dataContext.tokenContext.pluginUiState = PLUGIN_UI_INSIDE; - plugin_ui_get_item(); - ux_flow_prev(); - } - else { - if (dataContext.tokenContext.pluginUiCurrentItem < dataContext.tokenContext.pluginUiMaxItems - 1) { - dataContext.tokenContext.pluginUiCurrentItem++; - plugin_ui_get_item(); - ux_flow_prev(); - // Reset multi page layout to the first page - G_ux.layout_paging.current = 0; - #ifdef TARGET_NANOS - ux_layout_paging_redisplay(G_ux.stack_count-1); - #else - ux_layout_bnnn_paging_redisplay(0); - #endif - } - else { - dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; - ux_flow_next(); - } - } - } } void plugin_ui_compute_fees() { - computeFees(strings.common.maxFee, sizeof(strings.common.maxFee)); + computeFees(strings.common.maxFee, sizeof(strings.common.maxFee)); } +// clang-format off UX_FLOW_DEF_NOCB( ux_plugin_approval_intro_step, pnn, @@ -155,21 +163,20 @@ UX_FLOW_DEF_VALID( &C_icon_crossmark, "Reject", }); +// clang-format on -UX_FLOW( - ux_plugin_approval_flow, - &ux_plugin_approval_intro_step, - &ux_plugin_approval_id_step, - &ux_plugin_approval_before_step, - &ux_plugin_approval_display_step, - &ux_plugin_approval_after_step, - &ux_plugin_approval_fees_step, - &ux_plugin_approval_ok_step, - &ux_plugin_approval_cancel_step -); +UX_FLOW(ux_plugin_approval_flow, + &ux_plugin_approval_intro_step, + &ux_plugin_approval_id_step, + &ux_plugin_approval_before_step, + &ux_plugin_approval_display_step, + &ux_plugin_approval_after_step, + &ux_plugin_approval_fees_step, + &ux_plugin_approval_ok_step, + &ux_plugin_approval_cancel_step); void plugin_ui_start() { - dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; - dataContext.tokenContext.pluginUiCurrentItem = 0; - ux_flow_init(0, ux_plugin_approval_flow, NULL); + dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; + dataContext.tokenContext.pluginUiCurrentItem = 0; + ux_flow_init(0, ux_plugin_approval_flow, NULL); } diff --git a/src/handle_check_address.c b/src/handle_check_address.c index 703ebe2..41339b8 100644 --- a/src/handle_check_address.c +++ b/src/handle_check_address.c @@ -7,8 +7,8 @@ #define ZERO(x) memset(x, 0, sizeof(x)) void handle_check_address(check_address_parameters_t* params, chain_config_t* chain_config) { - PRINTF("Params on the address %d\n",(unsigned int)params); - PRINTF("Address to check %s\n",params->address_to_check); + PRINTF("Params on the address %d\n", (unsigned int) params); + PRINTF("Address to check %s\n", params->address_to_check); PRINTF("Inside handle_check_address\n"); params->result = 0; if (params->address_to_check == 0) { @@ -17,27 +17,23 @@ void handle_check_address(check_address_parameters_t* params, chain_config_t* ch } uint8_t i; - uint8_t *bip32_path_ptr = params->address_parameters; + uint8_t* bip32_path_ptr = params->address_parameters; uint8_t bip32PathLength = *(bip32_path_ptr++); cx_sha3_t local_sha3; // Common memory is used for locals that are not used concurrently - union group1 - { + union group1 { uint32_t bip32Path[MAX_BIP32_PATH]; cx_ecfp_private_key_t privateKey; char address[51]; } locals_union1; - union group2 - { + union group2 { uint8_t privateKeyData[32]; cx_ecfp_public_key_t publicKey; } locals_union2; - - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH) || - (bip32PathLength*4 != params->address_parameters_length - 1)) { + if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH) || + (bip32PathLength * 4 != params->address_parameters_length - 1)) { PRINTF("Invalid path\n"); return; } @@ -45,22 +41,34 @@ void handle_check_address(check_address_parameters_t* params, chain_config_t* ch locals_union1.bip32Path[i] = U4BE(bip32_path_ptr, 0); bip32_path_ptr += 4; } - os_perso_derive_node_bip32(CX_CURVE_256K1, locals_union1.bip32Path, bip32PathLength, locals_union2.privateKeyData, NULL); + os_perso_derive_node_bip32(CX_CURVE_256K1, + locals_union1.bip32Path, + bip32PathLength, + locals_union2.privateKeyData, + NULL); ZERO(&locals_union1); - cx_ecfp_init_private_key(CX_CURVE_256K1, locals_union2.privateKeyData, 32, &locals_union1.privateKey); + cx_ecfp_init_private_key(CX_CURVE_256K1, + locals_union2.privateKeyData, + 32, + &locals_union1.privateKey); ZERO(&locals_union2); cx_ecfp_generate_pair(CX_CURVE_256K1, &locals_union2.publicKey, &locals_union1.privateKey, 1); ZERO(&locals_union1); - getEthAddressStringFromKey(&locals_union2.publicKey, (uint8_t*)locals_union1.address, &local_sha3, chain_config); + getEthAddressStringFromKey(&locals_union2.publicKey, + (uint8_t*) locals_union1.address, + &local_sha3, + chain_config); ZERO(&locals_union2); uint8_t offset_0x = 0; - if(memcmp(params->address_to_check, "0x", 2) == 0){ + if (memcmp(params->address_to_check, "0x", 2) == 0) { offset_0x = 2; } if ((strlen(locals_union1.address) != strlen(params->address_to_check + offset_0x)) || - memcmp(locals_union1.address, params->address_to_check + offset_0x, strlen(locals_union1.address)) != 0) { + memcmp(locals_union1.address, + params->address_to_check + offset_0x, + strlen(locals_union1.address)) != 0) { PRINTF("Addresses doesn't match\n"); return; } diff --git a/src/handle_check_address.h b/src/handle_check_address.h index 7dc175e..b3ac25f 100644 --- a/src/handle_check_address.h +++ b/src/handle_check_address.h @@ -4,6 +4,7 @@ #include "swap_lib_calls.h" #include "chainConfig.h" -void handle_check_address(check_address_parameters_t* check_address_params, chain_config_t* chain_config); +void handle_check_address(check_address_parameters_t* check_address_params, + chain_config_t* chain_config); -#endif // _HANDLE_CHECK_ADDRESS_H_ \ No newline at end of file +#endif // _HANDLE_CHECK_ADDRESS_H_ \ No newline at end of file diff --git a/src/handle_get_printable_amount.c b/src/handle_get_printable_amount.c index 0d5e0dd..0ede372 100644 --- a/src/handle_get_printable_amount.c +++ b/src/handle_get_printable_amount.c @@ -6,8 +6,8 @@ #include "string.h" #include - -void handle_get_printable_amount( get_printable_amount_parameters_t* params, chain_config_t *config) { +void handle_get_printable_amount(get_printable_amount_parameters_t* params, + chain_config_t* config) { uint8_t decimals; char ticker[MAX_TICKER_LEN]; memset(params->printable_amount, 0, sizeof(params->printable_amount)); @@ -15,19 +15,27 @@ void handle_get_printable_amount( get_printable_amount_parameters_t* params, cha PRINTF("Amount is too big, 32 bytes max but buffer has %u bytes", params->amount_length); os_lib_end(); } - if(!parse_swap_config(params->coin_configuration, params->coin_configuration_length, ticker, &decimals)){ + if (!parse_swap_config(params->coin_configuration, + params->coin_configuration_length, + ticker, + &decimals)) { PRINTF("Error while parsing config\n"); os_lib_end(); } // If the amount is a fee, its value is nominated in ETH even if we're doing an ERC20 swap - if(params->is_fee){ + if (params->is_fee) { uint8_t ticker_len = strnlen(config->coinName, sizeof(config->coinName)); memcpy(ticker, config->coinName, ticker_len); ticker[ticker_len] = ' '; - ticker[ticker_len+1] = '\0'; + ticker[ticker_len + 1] = '\0'; decimals = WEI_TO_ETHER; } - amountToString(params->amount, params->amount_length, decimals, ticker, params->printable_amount, sizeof(params->printable_amount)); + amountToString(params->amount, + params->amount_length, + decimals, + ticker, + params->printable_amount, + sizeof(params->printable_amount)); } diff --git a/src/handle_get_printable_amount.h b/src/handle_get_printable_amount.h index d68f7e1..622e3fe 100644 --- a/src/handle_get_printable_amount.h +++ b/src/handle_get_printable_amount.h @@ -4,6 +4,7 @@ #include "swap_lib_calls.h" #include "chainConfig.h" -void handle_get_printable_amount(get_printable_amount_parameters_t* get_printable_amount_params, chain_config_t *config); +void handle_get_printable_amount(get_printable_amount_parameters_t* get_printable_amount_params, + chain_config_t* config); -#endif // _HANDLE_GET_PRINTABLE_AMOUNT_H_ \ No newline at end of file +#endif // _HANDLE_GET_PRINTABLE_AMOUNT_H_ \ No newline at end of file diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 3db3b93..244fa40 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -4,13 +4,15 @@ #include "shared_context.h" #include "utils.h" - -void copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, chain_config_t *config) { +void copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, + chain_config_t* config) { // first copy parameters to stack, and then to global data. // We need this "trick" as the input data position can overlap with app-ethereum globals txStringProperties_t stack_data; memset(&stack_data, 0, sizeof(stack_data)); - strncpy(stack_data.fullAddress, sign_transaction_params->destination_address, sizeof(stack_data.fullAddress)); + strncpy(stack_data.fullAddress, + sign_transaction_params->destination_address, + sizeof(stack_data.fullAddress)); if ((stack_data.fullAddress[sizeof(stack_data.fullAddress) - 1] != '\0') || (sign_transaction_params->amount_length > 32) || (sign_transaction_params->fee_amount_length > 8)) { @@ -19,21 +21,35 @@ void copy_transaction_parameters(create_transaction_parameters_t* sign_transacti uint8_t decimals; char ticker[MAX_TICKER_LEN]; - if(!parse_swap_config(sign_transaction_params->coin_configuration, sign_transaction_params->coin_configuration_length, ticker, &decimals)){ + if (!parse_swap_config(sign_transaction_params->coin_configuration, + sign_transaction_params->coin_configuration_length, + ticker, + &decimals)) { PRINTF("Error while parsing config\n"); os_lib_end(); } - amountToString(sign_transaction_params->amount, sign_transaction_params->amount_length, decimals, ticker, stack_data.fullAmount, sizeof(stack_data.fullAmount)); + amountToString(sign_transaction_params->amount, + sign_transaction_params->amount_length, + decimals, + ticker, + stack_data.fullAmount, + sizeof(stack_data.fullAmount)); // If the amount is a fee, its value is nominated in ETH even if we're doing an ERC20 swap strcpy(ticker, config->coinName); decimals = WEI_TO_ETHER; - amountToString(sign_transaction_params->fee_amount, sign_transaction_params->fee_amount_length, decimals, ticker, stack_data.maxFee, sizeof(stack_data.maxFee)); + amountToString(sign_transaction_params->fee_amount, + sign_transaction_params->fee_amount_length, + decimals, + ticker, + stack_data.maxFee, + sizeof(stack_data.maxFee)); memcpy(&strings.common, &stack_data, sizeof(stack_data)); } -void handle_swap_sign_transaction(create_transaction_parameters_t* sign_transaction_params, chain_config_t *config) { +void handle_swap_sign_transaction(create_transaction_parameters_t* sign_transaction_params, + chain_config_t* config) { copy_transaction_parameters(sign_transaction_params, config); chainConfig = config; reset_app_context(); @@ -41,25 +57,25 @@ void handle_swap_sign_transaction(create_transaction_parameters_t* sign_transact io_seproxyhal_init(); if (N_storage.initialized != 0x01) { - internalStorage_t storage; - storage.dataAllowed = 0x00; - storage.contractDetails = 0x00; - storage.initialized = 0x01; - nvm_write((void*)&N_storage, (void*)&storage, sizeof(internalStorage_t)); + internalStorage_t storage; + storage.dataAllowed = 0x00; + storage.contractDetails = 0x00; + storage.initialized = 0x01; + nvm_write((void*) &N_storage, (void*) &storage, sizeof(internalStorage_t)); } UX_INIT(); USB_power(0); USB_power(1); - //ui_idle(); + // ui_idle(); PRINTF("USB power ON/OFF\n"); #ifdef TARGET_NANOX // grab the current plane mode setting G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); -#endif // TARGET_NANOX +#endif // TARGET_NANOX #ifdef HAVE_BLE BLE_power(0, NULL); BLE_power(1, "Nano X"); -#endif // HAVE_BLE +#endif // HAVE_BLE app_main(); } \ No newline at end of file diff --git a/src/handle_swap_sign_transaction.h b/src/handle_swap_sign_transaction.h index 712a177..ddf2379 100644 --- a/src/handle_swap_sign_transaction.h +++ b/src/handle_swap_sign_transaction.h @@ -4,6 +4,7 @@ #include "swap_lib_calls.h" #include "chainConfig.h" -void handle_swap_sign_transaction(create_transaction_parameters_t* get_printable_amount_params, chain_config_t *config); +void handle_swap_sign_transaction(create_transaction_parameters_t* get_printable_amount_params, + chain_config_t* config); -#endif // _HANDLE_SWAP_SIGN_TRANSACTION_H_ \ No newline at end of file +#endif // _HANDLE_SWAP_SIGN_TRANSACTION_H_ \ No newline at end of file diff --git a/src/main.c b/src/main.c index f47fff6..ac5daf3 100644 --- a/src/main.c +++ b/src/main.c @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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 "shared_context.h" #include "apdu_constants.h" @@ -67,23 +67,23 @@ const internalStorage_t N_storage_real; chain_config_t *chainConfig; void reset_app_context() { - //PRINTF("!!RESET_APP_CONTEXT\n"); - appState = APP_STATE_IDLE; - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); - called_from_swap = false; + // PRINTF("!!RESET_APP_CONTEXT\n"); + appState = APP_STATE_IDLE; + memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); + called_from_swap = false; #ifdef HAVE_STARKWARE - quantumSet = false; + quantumSet = false; #endif #ifdef HAVE_ETH2 - eth2WithdrawalIndex = 0; + eth2WithdrawalIndex = 0; #endif - memset((uint8_t*)&txContext, 0, sizeof(txContext)); - memset((uint8_t*)&tmpContent, 0, sizeof(tmpContent)); + memset((uint8_t *) &txContext, 0, sizeof(txContext)); + memset((uint8_t *) &tmpContent, 0, sizeof(tmpContent)); } void ui_idle(void) { // reserve a display stack slot if none yet - if(G_ux.stack_count == 0) { + if (G_ux.stack_count == 0) { ux_stack_push(); } ux_flow_init(0, ux_idle_flow, NULL); @@ -92,24 +92,24 @@ void ui_idle(void) { 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 + return 0; // do not redraw the widget } #if defined(TARGET_NANOS) 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); + 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; + case BUTTON_EVT_RELEASED | BUTTON_RIGHT: { // OK + io_seproxyhal_touch_address_ok(NULL); + break; } } return 0; } -#endif // #if defined(TARGET_NANOS) +#endif // #if defined(TARGET_NANOS) void io_seproxyhal_send_status(uint32_t sw) { G_io_apdu_buffer[0] = ((sw >> 8) & 0xff); @@ -117,60 +117,59 @@ void io_seproxyhal_send_status(uint32_t sw) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } -void format_signature_out(const uint8_t* signature) { - memset(G_io_apdu_buffer + 1, 0x00, 64); - uint8_t offset = 1; - uint8_t xoffset = 4; //point to r value - //copy r - uint8_t xlength = signature[xoffset-1]; - if (xlength == 33) { - xlength = 32; - xoffset ++; - } - memmove(G_io_apdu_buffer+offset+32-xlength, signature+xoffset, xlength); - offset += 32; - xoffset += xlength +2; //move over rvalue and TagLEn - //copy s value - xlength = signature[xoffset-1]; - if (xlength == 33) { - xlength = 32; - xoffset ++; - } - memmove(G_io_apdu_buffer+offset+32-xlength, signature+xoffset, xlength); +void format_signature_out(const uint8_t *signature) { + memset(G_io_apdu_buffer + 1, 0x00, 64); + uint8_t offset = 1; + uint8_t xoffset = 4; // point to r value + // copy r + uint8_t xlength = signature[xoffset - 1]; + if (xlength == 33) { + xlength = 32; + xoffset++; + } + memmove(G_io_apdu_buffer + offset + 32 - xlength, signature + xoffset, xlength); + offset += 32; + xoffset += xlength + 2; // move over rvalue and TagLEn + // copy s value + xlength = signature[xoffset - 1]; + if (xlength == 33) { + xlength = 32; + xoffset++; + } + memmove(G_io_apdu_buffer + offset + 32 - xlength, signature + xoffset, xlength); } unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { switch (channel & ~(IO_FLAGS)) { - case CHANNEL_KEYBOARD: - break; + 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); + // 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(); + 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); } - 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); + default: + THROW(INVALID_PARAMETER); } return 0; } -tokenDefinition_t* getKnownToken(uint8_t *contractAddress) { +tokenDefinition_t *getKnownToken(uint8_t *contractAddress) { tokenDefinition_t *currentToken = NULL; #ifdef HAVE_TOKENS_LIST uint32_t numTokens = 0; uint32_t i; - switch(chainConfig->kind) { + switch (chainConfig->kind) { case CHAIN_KIND_AKROMA: numTokens = NUM_TOKENS_AKROMA; break; @@ -262,97 +261,97 @@ tokenDefinition_t* getKnownToken(uint8_t *contractAddress) { numTokens = NUM_TOKENS_THUNDERCORE; break; } - for (i=0; ikind) { + for (i = 0; i < numTokens; i++) { + switch (chainConfig->kind) { case CHAIN_KIND_AKROMA: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_AKROMA[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_AKROMA[i]); break; case CHAIN_KIND_ETHEREUM: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ETHEREUM[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ETHEREUM[i]); break; case CHAIN_KIND_ETHEREUM_CLASSIC: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ETHEREUM_CLASSIC[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ETHEREUM_CLASSIC[i]); break; case CHAIN_KIND_PIRL: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_PIRL[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_PIRL[i]); break; case CHAIN_KIND_POA: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_POA[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_POA[i]); break; case CHAIN_KIND_ARTIS_SIGMA1: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ARTIS_SIGMA1[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ARTIS_SIGMA1[i]); break; case CHAIN_KIND_ARTIS_TAU1: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ARTIS_TAU1[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ARTIS_TAU1[i]); break; case CHAIN_KIND_RSK: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_RSK[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_RSK[i]); break; case CHAIN_KIND_EXPANSE: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_EXPANSE[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_EXPANSE[i]); break; case CHAIN_KIND_UBIQ: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_UBIQ[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_UBIQ[i]); break; case CHAIN_KIND_WANCHAIN: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_WANCHAIN[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_WANCHAIN[i]); break; case CHAIN_KIND_KUSD: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_KUSD[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_KUSD[i]); break; case CHAIN_KIND_MUSICOIN: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_MUSICOIN[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_MUSICOIN[i]); break; case CHAIN_KIND_CALLISTO: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_CALLISTO[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_CALLISTO[i]); break; case CHAIN_KIND_ETHERSOCIAL: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ETHERSOCIAL[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ETHERSOCIAL[i]); break; case CHAIN_KIND_ELLAISM: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ELLAISM[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ELLAISM[i]); break; case CHAIN_KIND_ETHER1: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ETHER1[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ETHER1[i]); break; case CHAIN_KIND_ETHERGEM: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ETHERGEM[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ETHERGEM[i]); break; case CHAIN_KIND_ATHEIOS: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_ATHEIOS[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ATHEIOS[i]); break; case CHAIN_KIND_GOCHAIN: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_GOCHAIN[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_GOCHAIN[i]); break; case CHAIN_KIND_MIX: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_MIX[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_MIX[i]); break; case CHAIN_KIND_REOSC: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_REOSC[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_REOSC[i]); break; case CHAIN_KIND_HPB: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_HPB[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_HPB[i]); break; case CHAIN_KIND_TOMOCHAIN: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_TOMOCHAIN[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_TOMOCHAIN[i]); break; case CHAIN_KIND_TOBALABA: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_TOBALABA[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_TOBALABA[i]); break; case CHAIN_KIND_DEXON: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_DEXON[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_DEXON[i]); break; case CHAIN_KIND_VOLTA: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_VOLTA[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_VOLTA[i]); break; case CHAIN_KIND_EWC: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_EWC[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_EWC[i]); break; case CHAIN_KIND_WEBCHAIN: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_WEBCHAIN[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_WEBCHAIN[i]); break; case CHAIN_KIND_THUNDERCORE: - currentToken = (tokenDefinition_t *)PIC(&TOKENS_THUNDERCORE[i]); + currentToken = (tokenDefinition_t *) PIC(&TOKENS_THUNDERCORE[i]); break } if (memcmp(currentToken->address, tmpContent.txContent.destination, 20) == 0) { @@ -360,91 +359,151 @@ tokenDefinition_t* getKnownToken(uint8_t *contractAddress) { } } #endif - for(size_t i=0; iaddress, contractAddress, 20) == 0)) { - PRINTF("Token found at index %d\n", i); - return currentToken; - } + for (size_t i = 0; i < MAX_TOKEN; i++) { + currentToken = &tmpCtx.transactionContext.tokens[i]; + if (tmpCtx.transactionContext.tokenSet[i] && + (memcmp(currentToken->address, contractAddress, 20) == 0)) { + PRINTF("Token found at index %d\n", i); + return currentToken; + } } return NULL; } void handleApdu(unsigned int *flags, unsigned int *tx) { - unsigned short sw = 0; - - BEGIN_TRY { - TRY { + unsigned short sw = 0; + BEGIN_TRY { + TRY { #ifdef HAVE_STARKWARE - if (G_io_apdu_buffer[OFFSET_CLA] == STARKWARE_CLA) { - switch(G_io_apdu_buffer[OFFSET_INS]) { - case STARKWARE_INS_GET_PUBLIC_KEY: - handleStarkwareGetPublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; - case STARKWARE_INS_SIGN_MESSAGE: - handleStarkwareSignMessage(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; - case STARKWARE_INS_PROVIDE_QUANTUM: - handleStarkwareProvideQuantum(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; - case STARKWARE_INS_UNSAFE_SIGN: - handleStarkwareUnsafeSign(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; - default: - THROW(0x6D00); - break; - } - CLOSE_TRY; - return; - } + if (G_io_apdu_buffer[OFFSET_CLA] == STARKWARE_CLA) { + switch (G_io_apdu_buffer[OFFSET_INS]) { + case STARKWARE_INS_GET_PUBLIC_KEY: + handleStarkwareGetPublicKey(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; + case STARKWARE_INS_SIGN_MESSAGE: + handleStarkwareSignMessage(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; + case STARKWARE_INS_PROVIDE_QUANTUM: + handleStarkwareProvideQuantum(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; + case STARKWARE_INS_UNSAFE_SIGN: + handleStarkwareUnsafeSign(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; + default: + THROW(0x6D00); + break; + } + CLOSE_TRY; + return; + } #endif - if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { - THROW(0x6E00); - } + if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { + THROW(0x6E00); + } - switch (G_io_apdu_buffer[OFFSET_INS]) { - case INS_GET_PUBLIC_KEY: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); - handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + switch (G_io_apdu_buffer[OFFSET_INS]) { + case INS_GET_PUBLIC_KEY: + memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); + handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; - case INS_PROVIDE_ERC20_TOKEN_INFORMATION: - handleProvideErc20TokenInformation(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_PROVIDE_ERC20_TOKEN_INFORMATION: + handleProvideErc20TokenInformation(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; - case INS_SIGN: - handleSign(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_SIGN: + handleSign(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; - case INS_GET_APP_CONFIGURATION: - handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_GET_APP_CONFIGURATION: + handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; - case INS_SIGN_PERSONAL_MESSAGE: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); - handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_SIGN_PERSONAL_MESSAGE: + memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); + handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; - case INS_SIGN_EIP_712_MESSAGE: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); - handleSignEIP712Message(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_SIGN_EIP_712_MESSAGE: + memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); + handleSignEIP712Message(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; #ifdef HAVE_ETH2 - case INS_GET_ETH2_PUBLIC_KEY: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); - handleGetEth2PublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_GET_ETH2_PUBLIC_KEY: + memset(tmpCtx.transactionContext.tokenSet, 0, MAX_TOKEN); + handleGetEth2PublicKey(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; - case INS_SET_ETH2_WITHDRAWAL_INDEX: - handleSetEth2WithdrawalIndex(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); - break; + case INS_SET_ETH2_WITHDRAWAL_INDEX: + handleSetEth2WithdrawalIndex(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); + break; #endif @@ -453,40 +512,40 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { goto return_to_dashboard; #endif - default: - THROW(0x6D00); - break; - } - } - CATCH(EXCEPTION_IO_RESET) { - THROW(EXCEPTION_IO_RESET); - } - CATCH_OTHER(e) { - switch (e & 0xF000) { - case 0x6000: - // Wipe the transaction context and report the exception - sw = e; - reset_app_context(); - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - reset_app_context(); - break; + default: + THROW(0x6D00); + break; + } } - // Unexpected exception => report - G_io_apdu_buffer[*tx] = sw >> 8; - G_io_apdu_buffer[*tx + 1] = sw; - *tx += 2; - } - FINALLY { - } - } - END_TRY; + CATCH(EXCEPTION_IO_RESET) { + THROW(EXCEPTION_IO_RESET); + } + CATCH_OTHER(e) { + switch (e & 0xF000) { + case 0x6000: + // Wipe the transaction context and report the exception + sw = e; + reset_app_context(); + break; + case 0x9000: + // All is well + sw = e; + break; + default: + // Internal error + sw = 0x6800 | (e & 0x7FF); + reset_app_context(); + break; + } + // Unexpected exception => report + G_io_apdu_buffer[*tx] = sw >> 8; + G_io_apdu_buffer[*tx + 1] = sw; + *tx += 2; + } + FINALLY { + } + } + END_TRY; } void app_main(void) { @@ -506,8 +565,8 @@ void app_main(void) { BEGIN_TRY { TRY { rx = tx; - tx = 0; // ensure no race in catch_other if io_exchange throws - // an error + tx = 0; // ensure no race in catch_other if io_exchange throws + // an error rx = io_exchange(CHANNEL_APDU | flags, rx); flags = 0; @@ -525,20 +584,20 @@ void app_main(void) { } CATCH_OTHER(e) { switch (e & 0xF000) { - case 0x6000: - // Wipe the transaction context and report the exception - sw = e; - reset_app_context(); - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - reset_app_context(); - break; + case 0x6000: + // Wipe the transaction context and report the exception + sw = e; + reset_app_context(); + break; + case 0x9000: + // All is well + sw = e; + break; + default: + // Internal error + sw = 0x6800 | (e & 0x7FF); + reset_app_context(); + break; } if (e != 0x9000) { flags &= ~IO_ASYNCH_REPLY; @@ -554,13 +613,13 @@ void app_main(void) { END_TRY; } -//return_to_dashboard: + // return_to_dashboard: return; } // override point, but nothing more to do void io_seproxyhal_display(const bagl_element_t *element) { - io_seproxyhal_display_default((bagl_element_t *)element); + io_seproxyhal_display_default((bagl_element_t *) element); } unsigned char io_event(unsigned char channel) { @@ -569,26 +628,28 @@ unsigned char io_event(unsigned char channel) { // 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_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_BUTTON_PUSH_EVENT: + UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); + break; - case SEPROXYHAL_TAG_STATUS_EVENT: - if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && !(U4BE(G_io_seproxyhal_spi_buffer, 3) & SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { - THROW(EXCEPTION_IO_RESET); - } - // no break is intentional - default: - UX_DEFAULT_EVENT(); - break; + case SEPROXYHAL_TAG_STATUS_EVENT: + if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && + !(U4BE(G_io_seproxyhal_spi_buffer, 3) & + SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { + THROW(EXCEPTION_IO_RESET); + } + // no break is intentional + default: + UX_DEFAULT_EVENT(); + break; - case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: - UX_DISPLAYED_EVENT({}); - break; + case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: + UX_DISPLAYED_EVENT({}); + break; #if 0 case SEPROXYHAL_TAG_TICKER_EVENT: @@ -609,21 +670,17 @@ unsigned char io_event(unsigned char channel) { } void app_exit() { - BEGIN_TRY_L(exit) { TRY_L(exit) { os_sched_exit(-1); } FINALLY_L(exit) { - } } END_TRY_L(exit); } - void coin_main_with_config(chain_config_t *config) { - chainConfig = config; reset_app_context(); tmpCtx.transactionContext.currentTokenIndex = 0; @@ -638,14 +695,14 @@ void coin_main_with_config(chain_config_t *config) { #ifdef TARGET_NANOX // grab the current plane mode setting G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); -#endif // TARGET_NANOX +#endif // TARGET_NANOX if (N_storage.initialized != 0x01) { internalStorage_t storage; storage.dataAllowed = 0x00; storage.contractDetails = 0x00; storage.initialized = 0x01; - nvm_write((void*)&N_storage, (void*)&storage, sizeof(internalStorage_t)); + nvm_write((void *) &N_storage, (void *) &storage, sizeof(internalStorage_t)); } USB_power(0); @@ -656,7 +713,7 @@ void coin_main_with_config(chain_config_t *config) { #ifdef HAVE_BLE BLE_power(0, NULL); BLE_power(1, "Nano X"); -#endif // HAVE_BLE +#endif // HAVE_BLE app_main(); } @@ -690,30 +747,37 @@ void coin_main() { coin_main_with_config(&coin_config); } -void library_main_with_config(chain_config_t *config, unsigned int command, unsigned int* call_parameters) { +void library_main_with_config(chain_config_t *config, + unsigned int command, + unsigned int *call_parameters) { BEGIN_TRY { TRY { check_api_level(CX_COMPAT_APILEVEL); PRINTF("Inside a library \n"); switch (command) { case CHECK_ADDRESS: - handle_check_address((check_address_parameters_t*)call_parameters, config); - break; + handle_check_address((check_address_parameters_t *) call_parameters, config); + break; case SIGN_TRANSACTION: - handle_swap_sign_transaction((create_transaction_parameters_t*)call_parameters, config); - break; + handle_swap_sign_transaction( + (create_transaction_parameters_t *) call_parameters, + config); + break; case GET_PRINTABLE_AMOUNT: - handle_get_printable_amount((get_printable_amount_parameters_t*)call_parameters, config); - break; + handle_get_printable_amount( + (get_printable_amount_parameters_t *) call_parameters, + config); + break; } os_lib_end(); } - FINALLY {} + FINALLY { + } } END_TRY; } -void library_main(unsigned int call_id, unsigned int* call_parameters) { +void library_main(unsigned int call_id, unsigned int *call_parameters) { chain_config_t coin_config; init_coin_config(&coin_config); library_main_with_config(&coin_config, call_id, call_parameters); @@ -736,22 +800,22 @@ __attribute__((section(".boot"))) int main(int arg0) { libcall_params[4] = 0; if (arg0) { // call as a library - libcall_params[2] = ((unsigned int *)arg0)[1]; - libcall_params[4] = ((unsigned int *)arg0)[3]; // library arguments + libcall_params[2] = ((unsigned int *) arg0)[1]; + libcall_params[4] = ((unsigned int *) arg0)[3]; // library arguments os_lib_call(&libcall_params); - ((unsigned int *)arg0)[0] = libcall_params[1]; + ((unsigned int *) arg0)[0] = libcall_params[1]; os_lib_end(); - } - else { + } else { // launch coin application - libcall_params[1] = 0x100; // use the Init call, as we won't exit + libcall_params[1] = 0x100; // use the Init call, as we won't exit os_lib_call(&libcall_params); } } - FINALLY {} + FINALLY { + } } END_TRY; - // no return + // no return #else // exit critical section __asm volatile("cpsie i"); @@ -765,12 +829,12 @@ __attribute__((section(".boot"))) int main(int arg0) { return 0; } - if (((unsigned int *)arg0)[0] != 0x100) { + if (((unsigned int *) arg0)[0] != 0x100) { app_exit(); return 0; } - unsigned int command = ((unsigned int *)arg0)[1]; - chain_config_t * chain_config = ((unsigned int *)arg0)[2]; + unsigned int command = ((unsigned int *) arg0)[1]; + chain_config_t *chain_config = ((unsigned int *) arg0)[2]; switch (command) { case RUN_APPLICATION: // coin application launched from dashboard @@ -778,25 +842,18 @@ __attribute__((section(".boot"))) int main(int arg0) { app_exit(); else coin_main_with_config(chain_config); - break; + break; default: if (chain_config == NULL) // Called as standalone eth library - library_main(command, ((unsigned int *)arg0)[3]);// called as bitcoin library + library_main(command, ((unsigned int *) arg0)[3]); // called as bitcoin library else // Called as a library from an altcoin - library_main_with_config(chain_config, command, ((unsigned int *)arg0)[3]);// called as coin library - break; + library_main_with_config(chain_config, + command, + ((unsigned int *) arg0)[3]); // called as coin library + break; } #endif return 0; } - - - - - - - - - diff --git a/src/poorstream.c b/src/poorstream.c index 24e4d59..2dc2fa8 100644 --- a/src/poorstream.c +++ b/src/poorstream.c @@ -3,12 +3,12 @@ #include "poorstream.h" void poorstream_init(poorstream_t *stream, uint8_t *buffer) { - memset((void*)stream, 0, sizeof(poorstream_t)); - stream->pointer = buffer; + memset((void *) stream, 0, sizeof(poorstream_t)); + stream->pointer = buffer; } void poorstream_flush(poorstream_t *stream) { - //PRINTF("Flush\n"); + // PRINTF("Flush\n"); *(stream->pointer + 0) = (stream->accumulator >> 56); *(stream->pointer + 1) = (stream->accumulator >> 48); *(stream->pointer + 2) = (stream->accumulator >> 40); @@ -23,12 +23,12 @@ void poorstream_write_bits(poorstream_t *stream, uint64_t bits, uint32_t num_bit stream->offset += num_bits; if (stream->offset < 64) { stream->accumulator |= (bits << (64 - stream->offset)); - //PRINTF("ACC |= << %d\n", (64 - stream->offset)); + // PRINTF("ACC |= << %d\n", (64 - stream->offset)); } else { stream->offset -= 64; stream->mask = ((1 << (num_bits - stream->offset)) - 1); - //PRINTF("Mask %lx\n", stream->mask); - //PRINTF("Offset %d\n", stream->offset); + // PRINTF("Mask %lx\n", stream->mask); + // PRINTF("Offset %d\n", stream->offset); stream->accumulator |= ((bits >> stream->offset) & stream->mask); poorstream_flush(stream); stream->accumulator = 0; diff --git a/src/poorstream.h b/src/poorstream.h index 6539889..7890687 100644 --- a/src/poorstream.h +++ b/src/poorstream.h @@ -8,10 +8,10 @@ #include "os.h" typedef struct poorstream_t { - uint8_t *pointer; - uint32_t offset; - uint64_t mask; - uint64_t accumulator; + uint8_t *pointer; + uint32_t offset; + uint64_t mask; + uint64_t accumulator; } poorstream_t; void poorstream_init(poorstream_t *stream, uint8_t *buffer); diff --git a/src/shared_context.h b/src/shared_context.h index 5c6d151..a858227 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -22,24 +22,24 @@ #define WEI_TO_ETHER 18 -#define N_storage (*(volatile internalStorage_t*) PIC(&N_storage_real)) +#define N_storage (*(volatile internalStorage_t *) PIC(&N_storage_real)) typedef struct internalStorage_t { - unsigned char dataAllowed; - unsigned char contractDetails; - uint8_t initialized; + unsigned char dataAllowed; + unsigned char contractDetails; + uint8_t initialized; } internalStorage_t; #ifdef HAVE_STARKWARE typedef enum starkQuantumType_e { - STARK_QUANTUM_LEGACY = 0x00, - STARK_QUANTUM_ETH, - STARK_QUANTUM_ERC20, - STARK_QUANTUM_ERC721, - STARK_QUANTUM_MINTABLE_ERC20, - STARK_QUANTUM_MINTABLE_ERC721 + STARK_QUANTUM_LEGACY = 0x00, + STARK_QUANTUM_ETH, + STARK_QUANTUM_ERC20, + STARK_QUANTUM_ERC721, + STARK_QUANTUM_MINTABLE_ERC20, + STARK_QUANTUM_MINTABLE_ERC721 } starkQuantumType_e; @@ -47,11 +47,11 @@ typedef enum starkQuantumType_e { typedef struct tokenContext_t { char pluginName[PLUGIN_ID_LENGTH]; - uint8_t pluginAvailable; + uint8_t pluginAvailable; uint8_t data[32]; uint8_t fieldIndex; - uint8_t fieldOffset; + uint8_t fieldOffset; uint8_t pluginUiMaxItems; uint8_t pluginUiCurrentItem; @@ -98,7 +98,6 @@ typedef struct messageSigningContext712_t { uint8_t messageHash[32]; } messageSigningContext712_t; - typedef union { publicKeyContext_t publicKeyContext; transactionContext_t transactionContext; @@ -107,22 +106,22 @@ typedef union { } tmpCtx_t; typedef union { - txContent_t txContent; - cx_sha256_t sha2; - char tmp[100]; + txContent_t txContent; + cx_sha256_t sha2; + char tmp[100]; } tmpContent_t; #ifdef HAVE_STARKWARE typedef struct starkContext_t { - uint8_t w1[32]; - uint8_t w2[32]; - uint8_t w3[32]; - uint8_t w4[32]; - uint8_t conditional; - uint8_t transferDestination[32]; - uint8_t fact[32]; - uint8_t conditionAddress[20]; + uint8_t w1[32]; + uint8_t w2[32]; + uint8_t w3[32]; + uint8_t w4[32]; + uint8_t conditional; + uint8_t transferDestination[32]; + uint8_t fact[32]; + uint8_t conditionAddress[20]; } starkContext_t; #endif @@ -134,27 +133,23 @@ typedef union { #endif } dataContext_t; -typedef enum { - APP_STATE_IDLE, - APP_STATE_SIGNING_TX, - APP_STATE_SIGNING_MESSAGE -} app_state_t; +typedef enum { APP_STATE_IDLE, APP_STATE_SIGNING_TX, APP_STATE_SIGNING_MESSAGE } app_state_t; typedef enum { - CONTRACT_NONE, - CONTRACT_ERC20, - CONTRACT_ALLOWANCE, + CONTRACT_NONE, + CONTRACT_ERC20, + CONTRACT_ALLOWANCE, #ifdef HAVE_STARKWARE - CONTRACT_STARKWARE_REGISTER, - CONTRACT_STARKWARE_DEPOSIT_TOKEN, - CONTRACT_STARKWARE_DEPOSIT_ETH, - CONTRACT_STARKWARE_WITHDRAW, - CONTRACT_STARKWARE_DEPOSIT_CANCEL, - CONTRACT_STARKWARE_DEPOSIT_RECLAIM, - CONTRACT_STARKWARE_FULL_WITHDRAWAL, - CONTRACT_STARKWARE_FREEZE, - CONTRACT_STARKWARE_ESCAPE, - CONTRACT_STARKWARE_VERIFY_ESCAPE + CONTRACT_STARKWARE_REGISTER, + CONTRACT_STARKWARE_DEPOSIT_TOKEN, + CONTRACT_STARKWARE_DEPOSIT_ETH, + CONTRACT_STARKWARE_WITHDRAW, + CONTRACT_STARKWARE_DEPOSIT_CANCEL, + CONTRACT_STARKWARE_DEPOSIT_RECLAIM, + CONTRACT_STARKWARE_FULL_WITHDRAWAL, + CONTRACT_STARKWARE_FREEZE, + CONTRACT_STARKWARE_ESCAPE, + CONTRACT_STARKWARE_VERIFY_ESCAPE #endif } contract_call_t; @@ -196,5 +191,4 @@ extern uint32_t eth2WithdrawalIndex; void reset_app_context(void); -#endif // __SHARED_CONTEXT_H__ - +#endif // __SHARED_CONTEXT_H__ diff --git a/src/stark_crypto.c b/src/stark_crypto.c index eb1ccd2..9217567 100644 --- a/src/stark_crypto.c +++ b/src/stark_crypto.c @@ -5,18 +5,17 @@ #include "ui_callbacks.h" #include "utils.h" -static unsigned char const C_cx_Stark256_n[] = { - //n: 0x0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb7, 0x81, 0x12, 0x6d, 0xca, 0xe7, 0xb2, 0x32, 0x1e, 0x66, 0xa2, 0x41, 0xad, 0xc6, 0x4d, 0x2f}; - - // C_cx_secp256k1_n - (C_cx_secp256k1_n % C_cx_Stark256_n) -static unsigned char const STARK_DERIVE_BIAS[] = { - 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, - 0x38, 0xa1, 0x3b, 0x4b, 0x92, 0x0e, 0x94, 0x11, 0xae, 0x6d, 0xa5, 0xf4, 0x0b, 0x03, 0x58, 0xb1 -}; +static unsigned char const C_cx_Stark256_n[] = { + // n: 0x0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb7, 0x81, 0x12, 0x6d, 0xca, 0xe7, 0xb2, 0x32, 0x1e, 0x66, 0xa2, 0x41, 0xad, 0xc6, 0x4d, 0x2f}; -void starkDerivePrivateKey(uint32_t *bip32Path, uint32_t bip32PathLength, uint8_t *privateKeyData) { +// C_cx_secp256k1_n - (C_cx_secp256k1_n % C_cx_Stark256_n) +static unsigned char const STARK_DERIVE_BIAS[] = { + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x38, 0xa1, 0x3b, 0x4b, 0x92, 0x0e, 0x94, 0x11, 0xae, 0x6d, 0xa5, 0xf4, 0x0b, 0x03, 0x58, 0xb1}; + +void starkDerivePrivateKey(uint32_t *bip32Path, uint32_t bip32PathLength, uint8_t *privateKeyData) { #if 0 // Sanity check if (bip32Path[0] != STARK_BIP32_PATH_0) { @@ -29,59 +28,62 @@ void starkDerivePrivateKey(uint32_t *bip32Path, uint32_t bip32PathLength, uint8_ cx_math_modm(privateKeyData, 32, C_cx_Stark256_n, 32); PRINTF("Private key after processing %.*H\n", 32, privateKeyData); #else - uint8_t tmp[33]; - uint8_t index = 0; - // Sanity check - if ((bip32PathLength < 2) || (bip32Path[0] != STARK_BIP32_PATH_0) || (bip32Path[1] != STARK_BIP32_PATH_1)) { - PRINTF("Invalid Stark derivation path %d %d\n", bip32Path[0], bip32Path[1]); - THROW(0x6a80); - } - os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, tmp, NULL); - PRINTF("Private key before processing %.*H\n", 32, tmp); - for(;;) { - tmp[32] = index; - cx_hash_sha256(tmp, 33, privateKeyData, 32); - PRINTF("Key hash %.*H\n", 32, privateKeyData); - if (cx_math_cmp(privateKeyData, STARK_DERIVE_BIAS, 32) < 0) { - cx_math_modm(privateKeyData, 32, C_cx_Stark256_n, 32); - break; + uint8_t tmp[33]; + uint8_t index = 0; + // Sanity check + if ((bip32PathLength < 2) || (bip32Path[0] != STARK_BIP32_PATH_0) || + (bip32Path[1] != STARK_BIP32_PATH_1)) { + PRINTF("Invalid Stark derivation path %d %d\n", bip32Path[0], bip32Path[1]); + THROW(0x6a80); } - index++; - } - PRINTF("Key result %.*H\n", 32, privateKeyData); + os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, tmp, NULL); + PRINTF("Private key before processing %.*H\n", 32, tmp); + for (;;) { + tmp[32] = index; + cx_hash_sha256(tmp, 33, privateKeyData, 32); + PRINTF("Key hash %.*H\n", 32, privateKeyData); + if (cx_math_cmp(privateKeyData, STARK_DERIVE_BIAS, 32) < 0) { + cx_math_modm(privateKeyData, 32, C_cx_Stark256_n, 32); + break; + } + index++; + } + PRINTF("Key result %.*H\n", 32, privateKeyData); -#endif +#endif } -void stark_get_amount_string(uint8_t *contractAddress, uint8_t *quantum256, uint8_t *amount64, char *tmp100, char *target100) { - uint256_t amountPre, quantum, amount; - uint8_t decimals; - char *ticker = (char*)PIC(chainConfig->coinName); +void stark_get_amount_string(uint8_t *contractAddress, + uint8_t *quantum256, + uint8_t *amount64, + char *tmp100, + char *target100) { + uint256_t amountPre, quantum, amount; + uint8_t decimals; + char *ticker = (char *) PIC(chainConfig->coinName); - PRINTF("stark_get_amount_string %.*H\n", 20, contractAddress); + PRINTF("stark_get_amount_string %.*H\n", 20, contractAddress); - if (allzeroes(contractAddress, 20)) { - decimals = WEI_TO_ETHER; - PRINTF("stark_get_amount_string - ETH\n"); - } - else { - tokenDefinition_t *token = getKnownToken(contractAddress); - if (token == NULL) { // caught earlier - THROW(0x6A80); + if (allzeroes(contractAddress, 20)) { + decimals = WEI_TO_ETHER; + PRINTF("stark_get_amount_string - ETH\n"); + } else { + tokenDefinition_t *token = getKnownToken(contractAddress); + if (token == NULL) { // caught earlier + THROW(0x6A80); + } + decimals = token->decimals; + ticker = (char *) token->ticker; + PRINTF("stark_get_amount_string - decimals %d ticker %s\n", decimals, ticker); } - decimals = token->decimals; - ticker = (char*)token->ticker; - PRINTF("stark_get_amount_string - decimals %d ticker %s\n", decimals, ticker); - } - convertUint256BE(amount64, 8, &amountPre); - readu256BE(quantum256, &quantum); - mul256(&amountPre, &quantum, &amount); - tostring256(&amount, 10, tmp100, 100); - PRINTF("stark_get_amount_string - mul256 %s\n", tmp100); - strcpy(target100, ticker); - adjustDecimals(tmp100, strlen(tmp100), target100 + strlen(ticker), 100, decimals); - PRINTF("get_amount_string %s\n", target100); + convertUint256BE(amount64, 8, &amountPre); + readu256BE(quantum256, &quantum); + mul256(&amountPre, &quantum, &amount); + tostring256(&amount, 10, tmp100, 100); + PRINTF("stark_get_amount_string - mul256 %s\n", tmp100); + strcpy(target100, ticker); + adjustDecimals(tmp100, strlen(tmp100), target100 + strlen(ticker), 100, decimals); + PRINTF("get_amount_string %s\n", target100); } - -#endif // HAVE_STARK +#endif // HAVE_STARK diff --git a/src/stark_crypto.h b/src/stark_crypto.h index b4e58a9..635cb79 100644 --- a/src/stark_crypto.h +++ b/src/stark_crypto.h @@ -8,14 +8,14 @@ #include "os.h" #include "cx.h" - /* EC points */ #define FIELD_ELEMENT_SIZE (32) -#define EC_POINT_SIZE (2 * FIELD_ELEMENT_SIZE + 1) +#define EC_POINT_SIZE (2 * FIELD_ELEMENT_SIZE + 1) typedef unsigned char FieldElement[FIELD_ELEMENT_SIZE]; typedef unsigned char ECPoint[EC_POINT_SIZE]; void pedersen(FieldElement res, /* out */ - FieldElement a, FieldElement b); + FieldElement a, + FieldElement b); -#endif +#endif diff --git a/src/stark_utils.c b/src/stark_utils.c index 8b5673b..5e66288 100644 --- a/src/stark_utils.c +++ b/src/stark_utils.c @@ -8,16 +8,14 @@ #define SIGNATURE_MAX_LEN (72) -static const ECPoint PEDERSEN_SHIFT[] = { { +static const ECPoint PEDERSEN_SHIFT[] = {{ 0x04, - 0x04, 0x9e, 0xe3, 0xeb, 0xa8, 0xc1, 0x60, 0x07, 0x00, 0xee, 0x1b, - 0x87, 0xeb, 0x59, 0x9f, 0x16, 0x71, 0x6b, 0x0b, 0x10, 0x22, 0x94, - 0x77, 0x33, 0x55, 0x1f, 0xde, 0x40, 0x50, 0xca, 0x68, 0x04, + 0x04, 0x9e, 0xe3, 0xeb, 0xa8, 0xc1, 0x60, 0x07, 0x00, 0xee, 0x1b, 0x87, 0xeb, 0x59, 0x9f, 0x16, + 0x71, 0x6b, 0x0b, 0x10, 0x22, 0x94, 0x77, 0x33, 0x55, 0x1f, 0xde, 0x40, 0x50, 0xca, 0x68, 0x04, - 0x03, 0xca, 0x0c, 0xfe, 0x4b, 0x3b, 0xc6, 0xdd, 0xf3, 0x46, 0xd4, - 0x9d, 0x06, 0xea, 0x0e, 0xd3, 0x4e, 0x62, 0x10, 0x62, 0xc0, 0xe0, - 0x56, 0xc1, 0xd0, 0x40, 0x5d, 0x26, 0x6e, 0x10, 0x26, 0x8a, + 0x03, 0xca, 0x0c, 0xfe, 0x4b, 0x3b, 0xc6, 0xdd, 0xf3, 0x46, 0xd4, 0x9d, 0x06, 0xea, 0x0e, 0xd3, + 0x4e, 0x62, 0x10, 0x62, 0xc0, 0xe0, 0x56, 0xc1, 0xd0, 0x40, 0x5d, 0x26, 0x6e, 0x10, 0x26, 0x8a, }}; static const ECPoint PEDERSEN_POINTS[4] = { @@ -78,15 +76,16 @@ void accum_ec_mul(ECPoint *hash, uint8_t *buf, int len, int pedersen_idx) { } void pedersen(FieldElement res, /* out */ - FieldElement a, FieldElement b) { + FieldElement a, + FieldElement b) { ECPoint hash; memcpy(hash, PEDERSEN_SHIFT, sizeof(hash)); - + accum_ec_mul(&hash, a, 1, 1); - accum_ec_mul(&hash, a+1, FIELD_ELEMENT_SIZE-1, 0); + accum_ec_mul(&hash, a + 1, FIELD_ELEMENT_SIZE - 1, 0); accum_ec_mul(&hash, b, 1, 3); - accum_ec_mul(&hash, b+1, FIELD_ELEMENT_SIZE-1, 2); + accum_ec_mul(&hash, b + 1, FIELD_ELEMENT_SIZE - 1, 2); memcpy(res, hash + 1, FIELD_ELEMENT_SIZE); } @@ -116,31 +115,43 @@ int stark_sign(uint8_t *signature, /* out */ PRINTF("Pedersen hash 2 %.*H\n", 32, hash); cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); io_seproxyhal_io_heartbeat(); - int signatureLength = cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - hash, sizeof(hash), signature, SIGNATURE_MAX_LEN, &info); + int signatureLength = cx_ecdsa_sign(&privateKey, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + hash, + sizeof(hash), + signature, + SIGNATURE_MAX_LEN, + &info); PRINTF("Stark signature %.*H\n", signatureLength, signature); return signatureLength; } // ERC20Token(address) -static const uint8_t ERC20_SELECTOR[] = { 0xf4, 0x72, 0x61, 0xb0 }; +static const uint8_t ERC20_SELECTOR[] = {0xf4, 0x72, 0x61, 0xb0}; // ETH() -static const uint8_t ETH_SELECTOR[] = { 0x83, 0x22, 0xff, 0xf2 }; +static const uint8_t ETH_SELECTOR[] = {0x83, 0x22, 0xff, 0xf2}; // ERC721Token(address, uint256) -static const uint8_t ERC721_SELECTOR[] = { 0x02, 0x57, 0x17, 0x92 }; +static const uint8_t ERC721_SELECTOR[] = {0x02, 0x57, 0x17, 0x92}; // MintableERC20Token(address) -static const uint8_t MINTABLE_ERC20_SELECTOR[] = { 0x68, 0x64, 0x6e, 0x2d }; +static const uint8_t MINTABLE_ERC20_SELECTOR[] = {0x68, 0x64, 0x6e, 0x2d}; // MintableERC721Token(address,uint256) -static const uint8_t MINTABLE_ERC721_SELECTOR[] = { 0xb8, 0xb8, 0x66, 0x72 }; -static const char NFT_ASSET_ID_PREFIX[] = { 'N', 'F', 'T', ':', 0 }; -static const char MINTABLE_ASSET_ID_PREFIX[] = { 'M', 'I', 'N', 'T', 'A', 'B', 'L', 'E', ':', 0 }; +static const uint8_t MINTABLE_ERC721_SELECTOR[] = {0xb8, 0xb8, 0x66, 0x72}; +static const char NFT_ASSET_ID_PREFIX[] = {'N', 'F', 'T', ':', 0}; +static const char MINTABLE_ASSET_ID_PREFIX[] = {'M', 'I', 'N', 'T', 'A', 'B', 'L', 'E', ':', 0}; -void compute_token_id(cx_sha3_t *sha3, uint8_t *contractAddress, uint8_t quantumType, uint8_t *quantum, uint8_t *mintingBlob, bool assetTypeOnly, uint8_t *output) { +void compute_token_id(cx_sha3_t *sha3, + uint8_t *contractAddress, + uint8_t quantumType, + uint8_t *quantum, + uint8_t *mintingBlob, + bool assetTypeOnly, + uint8_t *output) { uint8_t tmp[36]; cx_keccak_init(sha3, 256); if ((contractAddress != NULL) && (!allzeroes(contractAddress, 20))) { const uint8_t *selector = NULL; - switch(quantumType) { + switch (quantumType) { case STARK_QUANTUM_ERC20: case STARK_QUANTUM_LEGACY: selector = ERC20_SELECTOR; @@ -162,29 +173,27 @@ void compute_token_id(cx_sha3_t *sha3, uint8_t *contractAddress, uint8_t quantum memset(tmp, 0, sizeof(tmp)); memmove(tmp, selector, 4); memmove(tmp + 16, contractAddress, 20); - cx_hash((cx_hash_t*)sha3, 0, tmp, sizeof(tmp), NULL, 0); - } - else { + cx_hash((cx_hash_t *) sha3, 0, tmp, sizeof(tmp), NULL, 0); + } else { PRINTF("compute_token_id for ETH\n"); - cx_hash((cx_hash_t*)sha3, 0, ETH_SELECTOR, sizeof(ETH_SELECTOR), NULL, 0); + cx_hash((cx_hash_t *) sha3, 0, ETH_SELECTOR, sizeof(ETH_SELECTOR), NULL, 0); } - if ((quantumType == STARK_QUANTUM_ERC721) || (quantumType == STARK_QUANTUM_MINTABLE_ERC721)) { + if ((quantumType == STARK_QUANTUM_ERC721) || (quantumType == STARK_QUANTUM_MINTABLE_ERC721)) { memset(tmp, 0, 32); tmp[31] = 1; PRINTF("compute_token_id quantum %.*H\n", 32, tmp); - cx_hash((cx_hash_t*)sha3, CX_LAST, tmp, 32, output, 32); - } - else { + cx_hash((cx_hash_t *) sha3, CX_LAST, tmp, 32, output, 32); + } else { PRINTF("compute_token_id quantum %.*H\n", 32, quantum); - cx_hash((cx_hash_t*)sha3, CX_LAST, quantum, 32, output, 32); + cx_hash((cx_hash_t *) sha3, CX_LAST, quantum, 32, output, 32); } - if (!assetTypeOnly && ((quantumType != STARK_QUANTUM_LEGACY) && - (quantumType != STARK_QUANTUM_ETH) && - (quantumType != STARK_QUANTUM_ERC20))) { + if (!assetTypeOnly && + ((quantumType != STARK_QUANTUM_LEGACY) && (quantumType != STARK_QUANTUM_ETH) && + (quantumType != STARK_QUANTUM_ERC20))) { const char *prefix = NULL; output[0] &= 0x03; cx_keccak_init(sha3, 256); - switch(quantumType) { + switch (quantumType) { case STARK_QUANTUM_ERC721: prefix = NFT_ASSET_ID_PREFIX; break; @@ -196,18 +205,18 @@ void compute_token_id(cx_sha3_t *sha3, uint8_t *contractAddress, uint8_t quantum PRINTF("Unsupported non default quantum type %d\n", quantumType); return; } - cx_hash((cx_hash_t*)sha3, 0, (const uint8_t*)prefix, strlen(prefix), NULL, 0); - cx_hash((cx_hash_t*)sha3, 0, output, 32, NULL, 0); - cx_hash((cx_hash_t*)sha3, CX_LAST, mintingBlob, 32, output, 32); + cx_hash((cx_hash_t *) sha3, 0, (const uint8_t *) prefix, strlen(prefix), NULL, 0); + cx_hash((cx_hash_t *) sha3, 0, output, 32, NULL, 0); + cx_hash((cx_hash_t *) sha3, CX_LAST, mintingBlob, 32, output, 32); } - if (!assetTypeOnly && ((quantumType == STARK_QUANTUM_MINTABLE_ERC20) || (quantumType == STARK_QUANTUM_MINTABLE_ERC721))) { + if (!assetTypeOnly && ((quantumType == STARK_QUANTUM_MINTABLE_ERC20) || + (quantumType == STARK_QUANTUM_MINTABLE_ERC721))) { output[0] = 0x04; output[1] = 0x00; - } - else { + } else { output[0] &= 0x03; } PRINTF("compute_token_id computed token %.*H\n", 32, output); } -#endif // HAVE_STARK +#endif // HAVE_STARK diff --git a/src/stark_utils.h b/src/stark_utils.h index c02ca76..aaf9d17 100644 --- a/src/stark_utils.h +++ b/src/stark_utils.h @@ -9,11 +9,21 @@ #include "cx.h" #include "stark_crypto.h" -void compute_token_id(cx_sha3_t *sha3, uint8_t *contractAddress, uint8_t quantumType, uint8_t *quantum, uint8_t *mintingBlob, bool assetTypeOnly, uint8_t *output); +void compute_token_id(cx_sha3_t *sha3, + uint8_t *contractAddress, + uint8_t quantumType, + uint8_t *quantum, + uint8_t *mintingBlob, + bool assetTypeOnly, + uint8_t *output); void starkDerivePrivateKey(uint32_t *bip32Path, uint32_t bip32PathLength, uint8_t *privateKeyData); -void stark_get_amount_string(uint8_t *contractAddress, uint8_t *quantum256, uint8_t *amount64, char *tmp100, char *target100); +void stark_get_amount_string(uint8_t *contractAddress, + uint8_t *quantum256, + uint8_t *amount64, + char *tmp100, + char *target100); int stark_sign(uint8_t *signature, /* out */ uint8_t *privateKeyData, @@ -23,4 +33,3 @@ int stark_sign(uint8_t *signature, /* out */ FieldElement condition); #endif - diff --git a/src/swap_lib_calls.h b/src/swap_lib_calls.h index 516c3f2..d777932 100644 --- a/src/swap_lib_calls.h +++ b/src/swap_lib_calls.h @@ -20,8 +20,8 @@ typedef struct check_address_parameters_s { // fields and serialization format depends on spesific coin app unsigned char* address_parameters; unsigned char address_parameters_length; - char *address_to_check; - char *extra_id_to_check; + char* address_to_check; + char* extra_id_to_check; // OUT int result; } check_address_parameters_t; @@ -45,8 +45,8 @@ typedef struct create_transaction_parameters_s { unsigned char amount_length; unsigned char* fee_amount; unsigned char fee_amount_length; - char *destination_address; - char *destination_address_extra_id; + char* destination_address; + char* destination_address_extra_id; } create_transaction_parameters_t; #endif diff --git a/src/tokens.c b/src/tokens.c index 1d79941..9c019f7 100644 --- a/src/tokens.c +++ b/src/tokens.c @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ #ifdef HAVE_TOKENS_EXTRA_LIST @@ -21,11 +21,22 @@ const tokenDefinition_t const TOKENS_EXTRA[NUM_TOKENS_EXTRA] = { - {{0x4c,0x5f,0x66,0x59,0x61,0x97,0xa8,0x6f,0xb3,0x0a,0x24,0x35,0xe2,0xef,0x4d,0xdc,0xb3,0x93,0x42,0xc9}, "tUSDT ", 6}, - {{0x1c,0x0f,0x17,0x43,0x67,0x40,0xbf,0xb9,0x2c,0x10,0x70,0xee,0x86,0x32,0x2d,0xe8,0x90,0x83,0x7c,0x6a}, "tUSDT ", 6}, - {{0xcd,0x07,0x7a,0xbe,0xdd,0x83,0x1a,0x34,0x43,0xff,0xbe,0x24,0xfb,0x76,0x66,0x1b,0xbb,0x17,0xeb,0x69}, "tZRX ", 18}, - {{0x40,0xd8,0x97,0x85,0x00,0xbf,0x68,0x32,0x4a,0x51,0x53,0x3c,0xd6,0xa2,0x1e,0x3e,0x59,0xbe,0x32,0x4a}, "tBTC ", 18}, - + {{0x4c, 0x5f, 0x66, 0x59, 0x61, 0x97, 0xa8, 0x6f, 0xb3, 0x0a, + 0x24, 0x35, 0xe2, 0xef, 0x4d, 0xdc, 0xb3, 0x93, 0x42, 0xc9}, + "tUSDT ", + 6}, + {{0x1c, 0x0f, 0x17, 0x43, 0x67, 0x40, 0xbf, 0xb9, 0x2c, 0x10, + 0x70, 0xee, 0x86, 0x32, 0x2d, 0xe8, 0x90, 0x83, 0x7c, 0x6a}, + "tUSDT ", + 6}, + {{0xcd, 0x07, 0x7a, 0xbe, 0xdd, 0x83, 0x1a, 0x34, 0x43, 0xff, + 0xbe, 0x24, 0xfb, 0x76, 0x66, 0x1b, 0xbb, 0x17, 0xeb, 0x69}, + "tZRX ", + 18}, + {{0x40, 0xd8, 0x97, 0x85, 0x00, 0xbf, 0x68, 0x32, 0x4a, 0x51, + 0x53, 0x3c, 0xd6, 0xa2, 0x1e, 0x3e, 0x59, 0xbe, 0x32, 0x4a}, + "tBTC ", + 18}, }; @@ -38,1119 +49,4440 @@ const tokenDefinition_t const TOKENS_EXTRA[NUM_TOKENS_EXTRA] = { 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}, - {{0x00,0x73,0xe5,0xE5,0x2E,0x2B,0x4f,0xE2,0x18,0xD7,0x5d,0x99,0x4e,0xE2,0xB3,0xc8,0x2f,0x9C,0x87,0xEA}, "22x ", 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}, - {{0xBa,0x7D,0xCB,0xa2,0xAd,0xe3,0x19,0xBc,0x77,0x2D,0xB4,0xdf,0x75,0xA7,0x6B,0xA0,0x0d,0xFb,0x31,0xb0}, "A18 ", 18}, - {{0xcc,0x7d,0x26,0xd8,0xea,0x62,0x81,0xbb,0x36,0x3c,0x84,0x48,0x51,0x5f,0x2c,0x61,0xf7,0xbc,0x19,0xf0}, "ABCH ", 18}, - {{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}, - {{0x13,0xf1,0xb7,0xfd,0xfb,0xe1,0xfc,0x66,0x67,0x6d,0x56,0x48,0x3e,0x21,0xb1,0xec,0xb4,0x0b,0x58,0xe2}, "ACC ", 18}, - {{0x06,0x14,0x71,0x10,0x02,0x2b,0x76,0x8b,0xa8,0xf9,0x9a,0x8f,0x38,0x5d,0xf1,0x1a,0x15,0x1a,0x9c,0xc8}, "ACE ", 0}, - {{0x2b,0xaa,0xc9,0x33,0x0c,0xf9,0xac,0x47,0x9d,0x81,0x91,0x95,0x79,0x4d,0x79,0xad,0x0c,0x76,0x16,0xe3}, "ADB ", 18}, - {{0xE6,0x9a,0x35,0x3b,0x31,0x52,0xDd,0x7b,0x70,0x6f,0xf7,0xdD,0x40,0xfe,0x1d,0x18,0xb7,0x80,0x2d,0x31}, "ADH ", 18}, - {{0x88,0x10,0xC6,0x34,0x70,0xd3,0x86,0x39,0x95,0x4c,0x6B,0x41,0xAa,0xC5,0x45,0x84,0x8C,0x46,0x48,0x4a}, "ADI ", 18}, - {{0x66,0x0e,0x71,0x48,0x37,0x85,0xf6,0x61,0x33,0x54,0x8b,0x10,0xf6,0x92,0x6d,0xc3,0x32,0xb0,0x6e,0x61}, "ADL ", 18}, - {{0x42,0x28,0x66,0xa8,0xF0,0xb0,0x32,0xc5,0xcf,0x1D,0xfB,0xDE,0xf3,0x1A,0x20,0xF4,0x50,0x95,0x62,0xb0}, "ADST ", 0}, - {{0xD0,0xD6,0xD6,0xC5,0xFe,0x4a,0x67,0x7D,0x34,0x3c,0xC4,0x33,0x53,0x6B,0xB7,0x17,0xbA,0xe1,0x67,0xdD}, "ADT ", 9}, - {{0x44,0x70,0xBB,0x87,0xd7,0x7b,0x96,0x3A,0x01,0x3D,0xB9,0x39,0xBE,0x33,0x2f,0x92,0x7f,0x2b,0x99,0x2e}, "ADX ", 4}, - {{0x5c,0xa9,0xa7,0x1b,0x1d,0x01,0x84,0x9c,0x0a,0x95,0x49,0x0c,0xc0,0x05,0x59,0x71,0x7f,0xcf,0x0d,0x1d}, "AE ", 18}, - {{0x8e,0xB2,0x43,0x19,0x39,0x37,0x16,0x66,0x8D,0x76,0x8d,0xCE,0xC2,0x93,0x56,0xae,0x9C,0xfF,0xe2,0x85}, "AGI ", 8}, - {{0x51,0x21,0xe3,0x48,0xe8,0x97,0xda,0xef,0x1e,0xef,0x23,0x95,0x9a,0xb2,0x90,0xe5,0x55,0x7c,0xf2,0x74}, "AI ", 18}, - {{0x37,0xe8,0x78,0x9b,0xb9,0x99,0x6c,0xac,0x91,0x56,0xcd,0x5f,0x5f,0xd3,0x25,0x99,0xe6,0xb9,0x12,0x89}, "AID ", 18}, - {{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}, - {{0x42,0x89,0xc0,0x43,0xa1,0x23,0x92,0xf1,0x02,0x73,0x07,0xfb,0x58,0x27,0x2d,0x8e,0xbd,0x85,0x39,0x12}, "ALI ", 18}, - {{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}, - {{0x49,0xb1,0x27,0xbc,0x33,0xce,0x7e,0x15,0x86,0xec,0x28,0xce,0xc6,0xa6,0x5b,0x11,0x25,0x96,0xc8,0x22}, "ALX ", 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}, - {{0x96,0x0b,0x23,0x6A,0x07,0xcf,0x12,0x26,0x63,0xc4,0x30,0x33,0x50,0x60,0x9A,0x66,0xA7,0xB2,0x88,0xC0}, "ANT ", 18}, - {{0x9a,0xb1,0x65,0xd7,0x95,0x01,0x9b,0x6d,0x8b,0x3e,0x97,0x1d,0xda,0x91,0x07,0x14,0x21,0x30,0x5e,0x5a}, "AOA ", 18}, - {{0x4c,0x0f,0xbe,0x1b,0xb4,0x66,0x12,0x91,0x5e,0x79,0x67,0xd2,0xc3,0x21,0x3c,0xd4,0xd8,0x72,0x57,0xad}, "APIS ", 18}, - {{0x1a,0x7a,0x8b,0xd9,0x10,0x6f,0x2b,0x8d,0x97,0x7e,0x08,0x58,0x2d,0xc7,0xd2,0x4c,0x72,0x3a,0xb0,0xdb}, "APPC ", 18}, - {{0x23,0xae,0x3c,0x5b,0x39,0xb1,0x2f,0x06,0x93,0xe0,0x54,0x35,0xee,0xaa,0x1e,0x51,0xd8,0xc6,0x15,0x30}, "APT ", 18}, - {{0xaf,0xbe,0xc4,0xd6,0x5b,0xc7,0xb1,0x16,0xd8,0x51,0x07,0xfd,0x05,0xd9,0x12,0x49,0x10,0x29,0xbf,0x46}, "ARB ", 18}, - {{0xAc,0x70,0x9F,0xcB,0x44,0xa4,0x3c,0x35,0xF0,0xDA,0x4e,0x31,0x63,0xb1,0x17,0xA1,0x7F,0x37,0x70,0xf5}, "ARC ", 18}, - {{0x12,0x45,0xef,0x80,0xf4,0xd9,0xe0,0x2e,0xd9,0x42,0x53,0x75,0xe8,0xf6,0x49,0xb9,0x22,0x1b,0x31,0xd8}, "ARCT ", 8}, - {{0x75,0xaa,0x7b,0x0d,0x02,0x53,0x2f,0x38,0x33,0xb6,0x6c,0x7f,0x0a,0xd3,0x53,0x76,0xd3,0x73,0xdd,0xf8}, "ARD ", 18}, - {{0xBA,0x5F,0x11,0xb1,0x6B,0x15,0x57,0x92,0xCf,0x3B,0x2E,0x68,0x80,0xE8,0x70,0x68,0x59,0xA8,0xAE,0xB6}, "ARN ", 8}, - {{0xfe,0xc0,0xcF,0x7f,0xE0,0x78,0xa5,0x00,0xab,0xf1,0x5F,0x12,0x84,0x95,0x8F,0x22,0x04,0x9c,0x2C,0x7e}, "ART ", 18}, - {{0x77,0x05,0xFa,0xA3,0x4B,0x16,0xEB,0x6d,0x77,0xDf,0xc7,0x81,0x2b,0xe2,0x36,0x7b,0xa6,0xB0,0x24,0x8e}, "ARX ", 8}, - {{0xb0,0xD9,0x26,0xc1,0xBC,0x3d,0x78,0x06,0x4F,0x3e,0x10,0x75,0xD5,0xbD,0x9A,0x24,0xF3,0x5A,0xe6,0xC5}, "ARXT ", 18}, - {{0xa5,0xf8,0xfc,0x09,0x21,0x88,0x0c,0xb7,0x34,0x23,0x68,0xbd,0x12,0x8e,0xb8,0x05,0x04,0x42,0xb1,0xa1}, "ARY ", 18}, - {{0x27,0x05,0x4b,0x13,0xb1,0xB7,0x98,0xB3,0x45,0xb5,0x91,0xa4,0xd2,0x2e,0x65,0x62,0xd4,0x7e,0xA7,0x5a}, "AST ", 4}, - {{0x7b,0x22,0x93,0x8c,0xa8,0x41,0xaa,0x39,0x2c,0x93,0xdb,0xb7,0xf4,0xc4,0x21,0x78,0xe3,0xd6,0x5e,0x88}, "ASTRO ", 4}, - {{0x15,0x43,0xd0,0xF8,0x34,0x89,0xe8,0x2A,0x13,0x44,0xDF,0x68,0x27,0xB2,0x3d,0x54,0x1F,0x23,0x5A,0x50}, "Aigatha ", 18}, - {{0x17,0x05,0x2d,0x51,0xE9,0x54,0x59,0x2C,0x10,0x46,0x32,0x0c,0x23,0x71,0xAb,0xaB,0x6C,0x73,0xEf,0x10}, "Athenian ", 18}, - {{0x78,0xB7,0xFA,0xDA,0x55,0xA6,0x4d,0xD8,0x95,0xD8,0xc8,0xc3,0x57,0x79,0xDD,0x8b,0x67,0xfA,0x8a,0x05}, "ATL ", 18}, - {{0x9B,0x11,0xEF,0xcA,0xAA,0x18,0x90,0xf6,0xeE,0x52,0xC6,0xbB,0x7C,0xF8,0x15,0x3a,0xC5,0xd7,0x41,0x39}, "ATM ", 8}, - {{0x97,0xAE,0xB5,0x06,0x6E,0x1A,0x59,0x0e,0x86,0x8b,0x51,0x14,0x57,0xBE,0xb6,0xFE,0x99,0xd3,0x29,0xF5}, "ATMI ", 18}, - {{0x2d,0xAE,0xE1,0xAA,0x61,0xD6,0x0A,0x25,0x2D,0xC8,0x05,0x64,0x49,0x9A,0x69,0x80,0x28,0x53,0x58,0x3A}, "ATS ", 4}, - {{0x88,0x78,0x34,0xd3,0xb8,0xd4,0x50,0xb6,0xba,0xb1,0x09,0xc2,0x52,0xdf,0x3d,0xa2,0x86,0xd7,0x3c,0xe4}, "ATT ", 18}, - {{0x63,0x39,0x78,0x4d,0x94,0x78,0xda,0x43,0x10,0x6a,0x42,0x91,0x96,0x77,0x2a,0x02,0x9c,0x2f,0x17,0x7d}, "ATTN ", 18}, - {{0x1a,0x0f,0x2a,0xb4,0x6e,0xc6,0x30,0xf9,0xfd,0x63,0x80,0x29,0x02,0x7b,0x55,0x2a,0xfa,0x64,0xb9,0x4c}, "ATX ", 18}, - {{0xc1,0x2d,0x09,0x9b,0xe3,0x15,0x67,0xad,0xd4,0xe4,0xe4,0xd0,0xd4,0x56,0x91,0xc3,0xf5,0x8f,0x56,0x63}, "AUC ", 18}, - {{0xcd,0xcf,0xc0,0xf6,0x6c,0x52,0x2f,0xd0,0x86,0xa1,0xb7,0x25,0xea,0x3c,0x0e,0xeb,0x9f,0x9e,0x88,0x14}, "AURA ", 18}, - {{0x62,0x2d,0xFf,0xCc,0x4e,0x83,0xC6,0x4b,0xa9,0x59,0x53,0x0A,0x5a,0x55,0x80,0x68,0x7a,0x57,0x58,0x1b}, "AUTO ", 18}, - {{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}, - {{0xC3,0x9E,0x62,0x6A,0x04,0xC5,0x97,0x1D,0x77,0x0e,0x31,0x97,0x60,0xD7,0x92,0x65,0x02,0x97,0x5e,0x47}, "AXPR ", 18}, - {{0x5d,0x51,0xfc,0xce,0xd3,0x11,0x4a,0x8b,0xb5,0xe9,0x0c,0xdd,0x0f,0x9d,0x68,0x2b,0xcb,0xcc,0x53,0x93}, "B2BX ", 18}, - {{0x99,0x8b,0x3b,0x82,0xbc,0x9d,0xba,0x17,0x39,0x90,0xbe,0x7a,0xfb,0x77,0x27,0x88,0xb5,0xac,0xb8,0xbd}, "BANCA ", 18}, - {{0xf8,0x7f,0x0d,0x91,0x53,0xfe,0xa5,0x49,0xc7,0x28,0xad,0x61,0xcb,0x80,0x15,0x95,0xa6,0x8b,0x73,0xde}, "BANX ", 18}, - {{0x2a,0x05,0xd2,0x2d,0xb0,0x79,0xbc,0x40,0xc2,0xf7,0x7a,0x1d,0x1f,0xf7,0x03,0xa5,0x6e,0x63,0x1c,0xc1}, "BAS ", 8}, - {{0x0D,0x87,0x75,0xF6,0x48,0x43,0x06,0x79,0xA7,0x09,0xE9,0x8d,0x2b,0x0C,0xb6,0x25,0x0d,0x28,0x87,0xEF}, "BAT ", 18}, - {{0x9a,0x02,0x42,0xb7,0xa3,0x3d,0xac,0xbe,0x40,0xed,0xb9,0x27,0x83,0x4f,0x96,0xeb,0x39,0xf8,0xfb,0xcb}, "BAX ", 18}, - {{0xe7,0xD3,0xe4,0x41,0x3E,0x29,0xae,0x35,0xB0,0x89,0x31,0x40,0xF4,0x50,0x09,0x65,0xc7,0x43,0x65,0xe5}, "BBC ", 18}, - {{0x37,0xd4,0x05,0x10,0xa2,0xf5,0xbc,0x98,0xaa,0x7a,0x0f,0x7b,0xf4,0xb3,0x45,0x3b,0xcf,0xb9,0x0a,0xc1}, "BBI ", 18}, - {{0x4a,0x60,0x58,0x66,0x6c,0xf1,0x05,0x7e,0xaC,0x3C,0xD3,0xA5,0xa6,0x14,0x62,0x05,0x47,0x55,0x9f,0xc9}, "BBK ", 18}, - {{0x35,0xa6,0x96,0x42,0x85,0x70,0x83,0xba,0x2f,0x30,0xbf,0xab,0x73,0x5d,0xac,0xc7,0xf0,0xba,0xc9,0x69}, "BBN ", 18}, - {{0x84,0xf7,0xc4,0x4b,0x6f,0xed,0x10,0x80,0xf6,0x47,0xe3,0x54,0xd5,0x52,0x59,0x5b,0xe2,0xcc,0x60,0x2f}, "BBO ", 18}, - {{0x2e,0xcb,0x13,0xa8,0xc4,0x58,0xc3,0x79,0xc4,0xd9,0xa7,0x25,0x9e,0x20,0x2d,0xe0,0x3c,0x8f,0x3d,0x19}, "BC ", 18}, - {{0x1f,0x41,0xe4,0x2d,0x0a,0x9e,0x3c,0x0d,0xd3,0xba,0x15,0xb5,0x27,0x34,0x27,0x83,0xb4,0x32,0x00,0xa9}, "BCAP ", 0}, - {{0x73,0x67,0xa6,0x80,0x39,0xd4,0x70,0x4f,0x30,0xbf,0xbf,0x6d,0x94,0x80,0x20,0xc3,0xb0,0x7d,0xfc,0x59}, "BCBC ", 18}, - {{0x1e,0x79,0x7C,0xe9,0x86,0xC3,0xCF,0xF4,0x47,0x2F,0x7D,0x38,0xd5,0xC4,0xab,0xa5,0x5D,0xfE,0xFE,0x40}, "BCDN ", 15}, - {{0xac,0xfa,0x20,0x9f,0xb7,0x3b,0xf3,0xdd,0x5b,0xbf,0xb1,0x10,0x1b,0x9b,0xc9,0x99,0xc4,0x90,0x62,0xa5}, "BCDT ", 18}, - {{0xbc,0x12,0x34,0x55,0x2E,0xBe,0xa3,0x2B,0x51,0x21,0x19,0x03,0x56,0xbB,0xa6,0xD3,0xBb,0x22,0x5b,0xb5}, "BCL ", 18}, - {{0x1c,0x44,0x81,0x75,0x0d,0xaa,0x5F,0xf5,0x21,0xA2,0xa7,0x49,0x0d,0x99,0x81,0xeD,0x46,0x46,0x5D,0xbd}, "BCPT ", 18}, - {{0x10,0x14,0x61,0x3e,0x2b,0x3c,0xbc,0x4d,0x57,0x50,0x54,0xd4,0x98,0x2e,0x58,0x0d,0x9b,0x99,0xd7,0xb1}, "BCV ", 8}, - {{0x19,0x61,0xB3,0x33,0x19,0x69,0xeD,0x52,0x77,0x07,0x51,0xfC,0x71,0x8e,0xf5,0x30,0x83,0x8b,0x6d,0xEE}, "BDG ", 18}, - {{0x4D,0x8f,0xc1,0x45,0x3a,0x0F,0x35,0x9e,0x99,0xc9,0x67,0x59,0x54,0xe6,0x56,0xD8,0x0d,0x99,0x6F,0xbF}, "BEE ", 18}, - {{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}, - {{0xee,0x74,0x11,0x0f,0xb5,0xa1,0x00,0x7b,0x06,0x28,0x2e,0x0d,0xe5,0xd7,0x3a,0x61,0xbf,0x41,0xd9,0xcd}, "BHPC ", 18}, - {{0xfe,0x5d,0x90,0x8c,0x9a,0xd8,0x5f,0x65,0x11,0x85,0xda,0xa6,0xa4,0x77,0x07,0x26,0xe2,0xb2,0x7d,0x09}, "BHR ", 18}, - {{0x08,0xb4,0xc8,0x66,0xaE,0x9D,0x1b,0xE5,0x6a,0x06,0xe0,0xC3,0x02,0x05,0x4B,0x4F,0xFe,0x06,0x7b,0x43}, "BITCAR ", 8}, - {{0xf3,0xd2,0x9f,0xb9,0x8d,0x2d,0xc5,0xe7,0x8c,0x87,0x19,0x8d,0xee,0xf9,0x93,0x77,0x34,0x5f,0xd6,0xf1}, "BITPARK ", 8}, - {{0xb3,0x10,0x4b,0x4b,0x9d,0xa8,0x20,0x25,0xe8,0xb9,0xf8,0xfb,0x28,0xb3,0x55,0x3c,0xe2,0xf6,0x70,0x69}, "BIX ", 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}, - {{0x45,0x24,0x5b,0xc5,0x92,0x19,0xee,0xaa,0xf6,0xcd,0x3f,0x38,0x2e,0x07,0x8a,0x46,0x1f,0xf9,0xde,0x7b}, "BKX ", 18}, - {{0xca,0x29,0xdb,0x42,0x21,0xc1,0x11,0x88,0x8a,0x7e,0x80,0xb1,0x2e,0xac,0x8a,0x26,0x6d,0xa3,0xee,0x0d}, "BLN ", 18}, - {{0x10,0x7c,0x45,0x04,0xcd,0x79,0xC5,0xd2,0x69,0x6E,0xa0,0x03,0x0a,0x8d,0xD4,0xe9,0x26,0x01,0xB8,0x2e}, "BLT ", 18}, - {{0x53,0x9e,0xfe,0x69,0xbc,0xdd,0x21,0xa8,0x3e,0xfd,0x91,0x22,0x57,0x1a,0x64,0xcc,0x25,0xe0,0x28,0x2b}, "BLUE ", 8}, - {{0xce,0x59,0xd2,0x9b,0x09,0xaa,0xe5,0x65,0xfe,0xee,0xf8,0xe5,0x2f,0x47,0xc3,0xcd,0x53,0x68,0xc6,0x63}, "BLX bull ", 18}, - {{0xE5,0xa7,0xc1,0x29,0x72,0xf3,0xbb,0xFe,0x70,0xed,0x29,0x52,0x1C,0x89,0x49,0xb8,0xAf,0x6a,0x09,0x70}, "BLX ico ", 18}, - {{0x57,0x32,0x04,0x6A,0x88,0x37,0x04,0x40,0x4F,0x28,0x4C,0xe4,0x1F,0xfA,0xDd,0x5b,0x00,0x7F,0xD6,0x68}, "BLZ ", 18}, - {{0xdf,0x6e,0xf3,0x43,0x35,0x07,0x80,0xbf,0x8c,0x34,0x10,0xbf,0x06,0x2e,0x0c,0x01,0x5b,0x1d,0xd6,0x71}, "BMC ", 8}, - {{0xf0,0x28,0xad,0xee,0x51,0x53,0x3b,0x1b,0x47,0xbe,0xaa,0x89,0x0f,0xeb,0x54,0xa4,0x57,0xf5,0x1e,0x89}, "BMT ", 18}, - {{0x98,0x6E,0xE2,0xB9,0x44,0xc4,0x2D,0x01,0x7F,0x52,0xAf,0x21,0xc4,0xc6,0x9B,0x84,0xDB,0xeA,0x35,0xd8}, "BMX ", 18}, - {{0xb8,0xc7,0x74,0x82,0xe4,0x5f,0x1f,0x44,0xde,0x17,0x45,0xf5,0x2c,0x74,0x42,0x6c,0x63,0x1b,0xdd,0x52}, "BNB ", 18}, - {{0xdD,0x6B,0xf5,0x6C,0xA2,0xad,0xa2,0x4c,0x68,0x3F,0xAC,0x50,0xE3,0x77,0x83,0xe5,0x5B,0x57,0xAF,0x9F}, "BNC ", 12}, - {{0xef,0x51,0xc9,0x37,0x7f,0xeb,0x29,0x85,0x6e,0x61,0x62,0x5c,0xaf,0x93,0x90,0xbd,0x0b,0x67,0xea,0x18}, "BNC ", 8}, - {{0xdA,0x2C,0x42,0x4F,0xc9,0x8c,0x74,0x1c,0x2d,0x4e,0xf2,0xf4,0x28,0x97,0xCE,0xfe,0xd8,0x97,0xCA,0x75}, "BNFT ", 9}, - {{0xda,0x80,0xb2,0x00,0x38,0xbd,0xf9,0x68,0xc7,0x30,0x7b,0xb5,0x90,0x7a,0x46,0x94,0x82,0xcf,0x62,0x51}, "BNN ", 8}, - {{0x1F,0x57,0x3D,0x6F,0xb3,0xF1,0x3d,0x68,0x9F,0xF8,0x44,0xB4,0xcE,0x37,0x79,0x4d,0x79,0xa7,0xFF,0x1C}, "BNT ", 18}, - {{0xd2,0xd6,0x15,0x86,0x83,0xae,0xe4,0xcc,0x83,0x80,0x67,0x72,0x72,0x09,0xa0,0xaa,0xf4,0x35,0x9d,0xe3}, "BNTY ", 18}, - {{0xDF,0x34,0x79,0x11,0x91,0x0b,0x6c,0x9A,0x42,0x86,0xbA,0x8E,0x2E,0xE5,0xea,0x4a,0x39,0xeB,0x21,0x34}, "BOB ", 18}, - {{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}, - {{0x13,0x9d,0x93,0x97,0x27,0x4b,0xb9,0xe2,0xc2,0x9a,0x9a,0xa8,0xaa,0x0b,0x58,0x74,0xd3,0x0d,0x62,0xe3}, "BOUTS ", 18}, - {{0x63,0xf5,0x84,0xfa,0x56,0xe6,0x0e,0x4d,0x0f,0xe8,0x80,0x2b,0x27,0xc7,0xe6,0xe3,0xb3,0x3e,0x00,0x7f}, "BOX ", 18}, - {{0xe1,0xA1,0x78,0xB6,0x81,0xBD,0x05,0x96,0x4d,0x3e,0x3E,0xd3,0x3A,0xE7,0x31,0x57,0x7d,0x9d,0x96,0xdD}, "BOX ", 18}, - {{0x78,0x01,0x16,0xd9,0x1e,0x55,0x92,0xe5,0x8a,0x3b,0x3c,0x76,0xa3,0x51,0x57,0x1b,0x39,0xab,0xce,0xc6}, "BOXX ", 15}, - {{0x32,0x76,0x82,0x77,0x9b,0xAB,0x2B,0xF4,0xd1,0x33,0x7e,0x89,0x74,0xab,0x9d,0xE8,0x27,0x5A,0x7C,0xa8}, "BPT ", 18}, - {{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}, - {{0x50,0x9A,0x38,0xb7,0xa1,0xcC,0x0d,0xcd,0x83,0xAa,0x9d,0x06,0x21,0x46,0x63,0xD9,0xeC,0x7c,0x7F,0x4a}, "BST ", 18}, - {{0x02,0x72,0x58,0x36,0xeb,0xf3,0xec,0xdb,0x1c,0xdf,0x1c,0x7b,0x02,0xfc,0xbb,0xfa,0xa2,0x73,0x6a,0xf8}, "BTCA ", 8}, - {{0x08,0x86,0x94,0x9c,0x1b,0x8C,0x41,0x28,0x60,0xc4,0x26,0x4C,0xeb,0x80,0x83,0xd1,0x36,0x5e,0x86,0xCF}, "BTCE ", 8}, - {{0x5a,0xcD,0x19,0xb9,0xc9,0x1e,0x59,0x6b,0x1f,0x06,0x2f,0x18,0xe3,0xD0,0x2d,0xa7,0xeD,0x8D,0x1e,0x50}, "BTCL ", 8}, - {{0x87,0xf5,0xe8,0xc3,0x42,0x52,0x18,0x83,0x7f,0x3c,0xb6,0x7d,0xb9,0x41,0xaf,0x0c,0x01,0x32,0x3e,0x56}, "BTCONE ", 18}, - {{0x6a,0xac,0x8c,0xb9,0x86,0x1e,0x42,0xbf,0x82,0x59,0xf5,0xab,0xdc,0x6a,0xe3,0xae,0x89,0x90,0x9e,0x11}, "BTCR ", 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}, - {{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}, - {{0xcb,0x97,0xe6,0x5f,0x07,0xda,0x24,0xd4,0x6b,0xcd,0xd0,0x78,0xeb,0xeb,0xd7,0xc6,0xe6,0xe3,0xd7,0x50}, "BTM ", 8}, - {{0x36,0x90,0x5f,0xc9,0x32,0x80,0xf5,0x23,0x62,0xa1,0xcb,0xab,0x15,0x1f,0x25,0xdc,0x46,0x74,0x2f,0xb5}, "BTO ", 18}, - {{0x16,0xB0,0xE6,0x2a,0xC1,0x3a,0x2f,0xAe,0xD3,0x6D,0x18,0xbc,0xe2,0x35,0x6d,0x25,0xAb,0x3C,0xfA,0xD3}, "BTQ ", 18}, - {{0x49,0x9a,0x6b,0x77,0xbc,0x25,0xc2,0x6b,0xcf,0x82,0x65,0xe2,0x10,0x2b,0x1b,0x3d,0xd1,0x61,0x70,0x24}, "BTR ", 18}, - {{0x03,0xc7,0x80,0xcd,0x55,0x45,0x98,0x59,0x2b,0x97,0xb7,0x25,0x6d,0xda,0xad,0x75,0x99,0x45,0xb1,0x25}, "BTRN ", 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}, - {{0xb6,0x83,0xD8,0x3a,0x53,0x2e,0x2C,0xb7,0xDF,0xa5,0x27,0x5e,0xED,0x36,0x98,0x43,0x63,0x71,0xcc,0x9f}, "BTU ", 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}, - {{0xbd,0x16,0x8c,0xbf,0x9d,0x3a,0x37,0x5b,0x38,0xdc,0x51,0xa2,0x02,0xb5,0xe8,0xa4,0xe5,0x20,0x69,0xed}, "BWX ", 18}, - {{0x43,0x75,0xe7,0xad,0x8a,0x01,0xb8,0xec,0x3e,0xd0,0x41,0x39,0x9f,0x62,0xd9,0xcd,0x12,0x0e,0x00,0x63}, "BZ ", 18}, - {{0xe1,0xae,0xe9,0x84,0x95,0x36,0x5f,0xc1,0x79,0x69,0x9c,0x1b,0xb3,0xe7,0x61,0xfa,0x71,0x6b,0xee,0x62}, "BZNT ", 18}, - {{0x38,0x39,0xd8,0xba,0x31,0x27,0x51,0xaa,0x02,0x48,0xfe,0xd6,0xa8,0xba,0xcb,0x84,0x30,0x8e,0x20,0xed}, "Bez ", 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}, - {{0x04,0xf2,0xe7,0x22,0x1f,0xdb,0x1b,0x52,0xa6,0x81,0x69,0xb2,0x57,0x93,0xe5,0x14,0x78,0xff,0x03,0x29}, "CAPP ", 2}, - {{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}, - {{0x95,0x4b,0x89,0x07,0x04,0x69,0x3a,0xf2,0x42,0x61,0x3e,0xde,0xf1,0xb6,0x03,0x82,0x5a,0xfc,0xd7,0x08}, "CARD ", 18}, - {{0xbf,0x18,0xf2,0x46,0xb9,0x30,0x1f,0x23,0x1e,0x95,0x61,0xb3,0x5a,0x38,0x79,0x76,0x9b,0xb4,0x63,0x75}, "CARE ", 18}, - {{0xe8,0x78,0x0B,0x48,0xbd,0xb0,0x5F,0x92,0x86,0x97,0xA5,0xe8,0x15,0x5f,0x67,0x2E,0xD9,0x14,0x62,0xF7}, "CAS ", 18}, - {{0x12,0x34,0x56,0x74,0x61,0xd3,0xf8,0xdb,0x74,0x96,0x58,0x17,0x74,0xbd,0x86,0x9c,0x83,0xd5,0x1c,0x93}, "BitClv ", 18}, - {{0x56,0xba,0x2E,0xe7,0x89,0x04,0x61,0xf4,0x63,0xF7,0xbe,0x02,0xaA,0xC3,0x09,0x9f,0x6d,0x58,0x11,0xA8}, "Blockcat ", 18}, - {{0x68,0xe1,0x4b,0xb5,0xA4,0x5B,0x96,0x81,0x32,0x7E,0x16,0xE5,0x28,0x08,0x4B,0x9d,0x96,0x2C,0x1a,0x39}, "BitClvs2 ", 18}, - {{0x26,0xdb,0x54,0x39,0xf6,0x51,0xca,0xf4,0x91,0xa8,0x7d,0x48,0x79,0x9d,0xa8,0x1f,0x19,0x1b,0xdb,0x6b}, "CBC ", 8}, - {{0x95,0xef,0xd1,0xfe,0x60,0x99,0xf6,0x5a,0x7e,0xd5,0x24,0xde,0xf4,0x87,0x48,0x32,0x21,0x09,0x49,0x47}, "CBM ", 18}, - {{0x07,0x6C,0x97,0xe1,0xc8,0x69,0x07,0x2e,0xE2,0x2f,0x8c,0x91,0x97,0x8C,0x99,0xB4,0xbc,0xB0,0x25,0x91}, "CBT ", 18}, - {{0xc1,0x66,0x03,0x87,0x05,0xFF,0xBA,0xb3,0x79,0x41,0x85,0xb3,0xa9,0xD9,0x25,0x63,0x2A,0x1D,0xF3,0x7D}, "CC3 ", 18}, - {{0x28,0x57,0x7A,0x6d,0x31,0x55,0x9b,0xd2,0x65,0xCe,0x3A,0xDB,0x62,0xd0,0x45,0x85,0x50,0xF7,0xb8,0xa7}, "CrashCs ", 18}, - {{0xbe,0x11,0xee,0xb1,0x86,0xe6,0x24,0xb8,0xf2,0x6a,0x50,0x45,0x57,0x5a,0x13,0x40,0xe4,0x05,0x45,0x52}, "CCC ico ", 18}, - {{0x37,0x89,0x03,0xa0,0x3f,0xb2,0xc3,0xac,0x76,0xbb,0x52,0x77,0x3e,0x3c,0xe1,0x13,0x40,0x37,0x7a,0x32}, "CCCX ", 18}, - {{0xd3,0x48,0xe0,0x7a,0x28,0x06,0x50,0x5b,0x85,0x61,0x23,0x04,0x5d,0x27,0xae,0xed,0x90,0x92,0x4b,0x50}, "CCLC ", 8}, - {{0x67,0x9b,0xad,0xc5,0x51,0x62,0x6e,0x01,0xb2,0x3c,0xee,0xce,0xfb,0xc9,0xb8,0x77,0xea,0x18,0xfc,0x46}, "CCO ", 18}, - {{0x31,0x5c,0xe5,0x9f,0xaf,0xd3,0xa8,0xd5,0x62,0xb7,0xec,0x1c,0x85,0x42,0x38,0x2d,0x27,0x10,0xb0,0x6c}, "CCS ", 18}, - {{0x33,0x6f,0x64,0x6f,0x87,0xd9,0xf6,0xbc,0x6e,0xd4,0x2d,0xd4,0x6e,0x8b,0x3f,0xd9,0xdb,0xd1,0x5c,0x22}, "CCT ", 18}, - {{0x8a,0x95,0xca,0x44,0x8A,0x52,0xC0,0xAD,0xf0,0x05,0x4b,0xB3,0x40,0x2d,0xC5,0xe0,0x9C,0xD6,0xB2,0x32}, "CDL ", 18}, - {{0x17,0x7d,0x39,0xAC,0x67,0x6E,0xD1,0xC6,0x7A,0x2b,0x26,0x8A,0xD7,0xF1,0xE5,0x88,0x26,0xE5,0xB0,0xaf}, "CDT ", 18}, - {{0x2c,0xb1,0x01,0xd7,0xda,0x0e,0xba,0xa5,0x7d,0x3f,0x2f,0xef,0x46,0xd7,0xff,0xb7,0xbb,0x64,0x59,0x2b}, "CDX C$X ", 0}, - {{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}, - {{0x11,0x22,0xb6,0xa0,0xe0,0x0d,0xce,0x05,0x63,0x08,0x2b,0x6e,0x29,0x53,0xf3,0xa9,0x43,0x85,0x5c,0x1f}, "CENNZ ", 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}, - {{0xf3,0xdb,0x75,0x60,0xe8,0x20,0x83,0x46,0x58,0xb5,0x90,0xc9,0x62,0x34,0xc3,0x33,0xcd,0x3d,0x5e,0x5e}, "CHP ", 18}, - {{0xba,0x9d,0x41,0x99,0xfa,0xb4,0xf2,0x6e,0xfe,0x35,0x51,0xd4,0x90,0xe3,0x82,0x14,0x86,0xf1,0x35,0xba}, "CHSB ", 8}, - {{0x14,0x60,0xa5,0x80,0x96,0xd8,0x0a,0x50,0xa2,0xf1,0xf9,0x56,0xdd,0xa4,0x97,0x61,0x1f,0xa4,0xf1,0x65}, "CHX ", 18}, - {{0x3a,0xbd,0xff,0x32,0xf7,0x6b,0x42,0xe7,0x63,0x5b,0xdb,0x7e,0x42,0x5f,0x02,0x31,0xa5,0xf3,0xab,0x17}, "CJT ", 18}, - {{0x06,0x01,0x2c,0x8c,0xf9,0x7b,0xea,0xd5,0xde,0xae,0x23,0x70,0x70,0xf9,0x58,0x7f,0x8e,0x7a,0x26,0x6d}, "CK ", 0}, - {{0xe8,0x1d,0x72,0xd1,0x4b,0x15,0x16,0xe6,0x8a,0xc3,0x19,0x0a,0x46,0xc9,0x33,0x02,0xcc,0x8e,0xd6,0x0f}, "CL ", 18}, - {{0xb1,0xc1,0xcb,0x8c,0x7c,0x19,0x92,0xdb,0xa2,0x4e,0x62,0x8b,0xf7,0xd3,0x8e,0x71,0xda,0xd4,0x6a,0xeb}, "CLB ", 18}, - {{0x3d,0xc9,0xa4,0x2f,0xa7,0xaf,0xe5,0x7b,0xe0,0x3c,0x58,0xfd,0x7f,0x44,0x11,0xb1,0xe4,0x66,0xc5,0x08}, "CLL ", 18}, - {{0x41,0x62,0x17,0x8B,0x78,0xD6,0x98,0x54,0x80,0xA3,0x08,0xB2,0x19,0x0E,0xE5,0x51,0x74,0x60,0x40,0x6D}, "CLN ", 18}, - {{0x7f,0xce,0x28,0x56,0x89,0x9a,0x68,0x06,0xee,0xef,0x70,0x80,0x79,0x85,0xfc,0x75,0x54,0xc6,0x63,0x40}, "CLP ", 9}, - {{0x3e,0xdd,0x23,0x5c,0x3e,0x84,0x0c,0x1f,0x29,0x28,0x6b,0x2e,0x39,0x37,0x0a,0x25,0x5c,0x7b,0x6f,0xdb}, "CMBT ", 8}, - {{0x7e,0x66,0x75,0x25,0x52,0x1c,0xF6,0x13,0x52,0xe2,0xE0,0x1b,0x50,0xFa,0xaa,0xE7,0xDf,0x39,0x74,0x9a}, "CMC ", 18}, - {{0x47,0xbc,0x01,0x59,0x77,0x98,0xdc,0xd7,0x50,0x6d,0xcc,0xa3,0x6a,0xc4,0x30,0x2f,0xc9,0x3a,0x8c,0xfb}, "CMCT ", 8}, - {{0xf8,0x5f,0xEe,0xa2,0xFd,0xD8,0x1d,0x51,0x17,0x7F,0x6b,0x8F,0x35,0xF0,0xe6,0x73,0x4C,0xe4,0x5F,0x5F}, "CMT ", 18}, - {{0xEB,0xf2,0xF9,0xE8,0xDe,0x96,0x0f,0x64,0xec,0x0f,0xDC,0xDa,0x6C,0xb2,0x82,0x42,0x31,0x33,0x34,0x7B}, "CNB ", 8}, - {{0xd4,0xc4,0x35,0xf5,0xb0,0x9f,0x85,0x5c,0x33,0x17,0xc8,0x52,0x4c,0xb1,0xf5,0x86,0xe4,0x27,0x95,0xfa}, "CND ", 18}, - {{0x87,0x13,0xd2,0x66,0x37,0xcf,0x49,0xe1,0xb6,0xb4,0xa7,0xce,0x57,0x10,0x6a,0xab,0xc9,0x32,0x53,0x43}, "CNN ", 18}, - {{0xB4,0xb1,0xD2,0xC2,0x17,0xEC,0x07,0x76,0x58,0x4C,0xE0,0x8D,0x3D,0xD9,0x8F,0x90,0xED,0xed,0xA4,0x4b}, "CO2 ", 18}, - {{0x57,0x4b,0x36,0xbc,0xed,0x44,0x33,0x38,0x87,0x5d,0x17,0x1c,0xc3,0x77,0xe6,0x91,0xf7,0xd4,0xf8,0x87}, "CO2Bit ", 18}, - {{0xb2,0xf7,0xeb,0x1f,0x2c,0x37,0x64,0x5b,0xe6,0x1d,0x73,0x95,0x30,0x35,0x36,0x0e,0x76,0x8d,0x81,0xe6}, "COB ", 18}, - {{0x31,0x36,0xeF,0x85,0x15,0x92,0xaC,0xf4,0x9C,0xA4,0xC8,0x25,0x13,0x1E,0x36,0x41,0x70,0xFA,0x32,0xb3}, "COFI ", 18}, - {{0x0c,0x91,0xb0,0x15,0xab,0xa6,0xf7,0xb4,0x73,0x8d,0xcd,0x36,0xe7,0x41,0x01,0x38,0xb2,0x9a,0xdc,0x29}, "COIL ", 8}, - {{0xeb,0x54,0x7e,0xd1,0xd8,0xa3,0xff,0x14,0x61,0xab,0xaa,0x7f,0x00,0x22,0xfe,0xd4,0x83,0x6e,0x00,0xa4}, "COIN ", 18}, - {{0xc4,0xbc,0xd6,0x4c,0xb2,0x16,0xd4,0x9f,0xd3,0xc6,0x43,0xa3,0x27,0x62,0xf3,0x46,0x26,0xb4,0x5a,0x1a}, "COSM ", 18}, - {{0x65,0x29,0x2e,0xea,0xdf,0x14,0x26,0xcd,0x2d,0xf1,0xc4,0x79,0x3a,0x3d,0x75,0x19,0xf2,0x53,0x91,0x3b}, "COSS ", 18}, - {{0x9e,0x96,0x60,0x44,0x45,0xec,0x19,0xff,0xed,0x9a,0x5e,0x8d,0xd7,0xb5,0x0a,0x29,0xc8,0x99,0xa1,0x0c}, "COSS.io ", 18}, - {{0xE2,0xFB,0x65,0x29,0xEF,0x56,0x6a,0x08,0x0e,0x6d,0x23,0xdE,0x0b,0xd3,0x51,0x31,0x10,0x87,0xD5,0x67}, "COV ", 18}, - {{0x0E,0xbb,0x61,0x42,0x04,0xE4,0x7c,0x09,0xB6,0xC3,0xFe,0xB9,0xAA,0xeC,0xad,0x8E,0xE0,0x60,0xE2,0x3E}, "CPAY ", 0}, - {{0xfA,0xE4,0xEe,0x59,0xCD,0xd8,0x6e,0x3B,0xe9,0xe8,0xb9,0x0b,0x53,0xAA,0x86,0x63,0x27,0xD7,0xc0,0x90}, "CPC ", 18}, - {{0xb7,0x87,0xd4,0xea,0xc8,0x89,0x97,0x30,0xbb,0x8c,0x57,0xfc,0x3c,0x99,0x8c,0x49,0xc5,0x24,0x4e,0xc0}, "CPEX ", 8}, - {{0x70,0x64,0xaA,0xb3,0x9A,0x0F,0xcf,0x72,0x21,0xc3,0x39,0x67,0x19,0xD0,0x91,0x7a,0x65,0xE3,0x55,0x15}, "CPOLLO ", 18}, - {{0x88,0xd5,0x0b,0x46,0x6b,0xe5,0x52,0x22,0x01,0x9d,0x71,0xf9,0xe8,0xfa,0xe1,0x7f,0x5f,0x45,0xfc,0xa1}, "CPT ", 8}, - {{0xf4,0x47,0x45,0xfb,0xd4,0x1f,0x6a,0x1b,0xa1,0x51,0xdf,0x19,0x0d,0xb0,0x56,0x4c,0x5f,0xcc,0x44,0x10}, "CPY ", 18}, - {{0x7f,0x58,0x5b,0x91,0x30,0xc6,0x4e,0x9e,0x9f,0x47,0x0b,0x61,0x8a,0x7b,0xad,0xd0,0x3d,0x79,0xca,0x7e}, "CR7 ", 18}, - {{0xAe,0xf3,0x8f,0xBF,0xBF,0x93,0x2D,0x1A,0xeF,0x3B,0x80,0x8B,0xc8,0xfB,0xd8,0xCd,0x8E,0x1f,0x8B,0xC5}, "CRB ", 8}, - {{0x2c,0xf6,0x18,0xc1,0x90,0x41,0xd9,0xdb,0x33,0x0d,0x82,0x22,0xb8,0x60,0xa6,0x24,0x02,0x1f,0x30,0xfb}, "CRBT ", 18}, - {{0xf4,0x1e,0x5f,0xbc,0x2f,0x6a,0xac,0x20,0x0d,0xd8,0x61,0x9e,0x12,0x1c,0xe1,0xf0,0x5d,0x15,0x00,0x77}, "CRC ", 18}, - {{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}, - {{0x46,0xb9,0xad,0x94,0x4d,0x10,0x59,0x45,0x0d,0xa1,0x16,0x35,0x11,0x06,0x9c,0x71,0x8f,0x69,0x9d,0x31}, "CS ", 6}, - {{0x29,0xd7,0x52,0x77,0xac,0x7f,0x03,0x35,0xb2,0x16,0x5d,0x08,0x95,0xe8,0x72,0x5c,0xbf,0x65,0x8d,0x73}, "CSNO ", 8}, - {{0xbb,0x49,0xa5,0x1e,0xe5,0xa6,0x6c,0xa3,0xa8,0xcb,0xe5,0x29,0x37,0x9b,0xa4,0x4b,0xa6,0x7e,0x67,0x71}, "CST ", 18}, - {{0x45,0x45,0x75,0x0F,0x39,0xaF,0x6B,0xe4,0xF2,0x37,0xB6,0x86,0x9D,0x4E,0xcc,0xA9,0x28,0xFd,0x5A,0x85}, "CTF ", 18}, - {{0xc8,0x7c,0x5d,0xd8,0x6a,0x3d,0x56,0x7f,0xf2,0x87,0x01,0x88,0x6f,0xb0,0x74,0x5a,0xaa,0x89,0x8d,0xa4}, "CTG ", 18}, - {{0x9e,0x7d,0x29,0xbd,0x49,0x9b,0x6c,0x7d,0xa2,0xa5,0xb2,0xea,0xfc,0xf4,0xa3,0x9d,0x3b,0xd8,0x45,0xd1}, "CTGC ", 18}, - {{0xbf,0x4c,0xfd,0x7d,0x1e,0xde,0xee,0xa5,0xf6,0x60,0x08,0x27,0x41,0x1b,0x41,0xa2,0x1e,0xb0,0x8a,0xbd}, "CTL ", 2}, - {{0x96,0xA6,0x56,0x09,0xa7,0xB8,0x4E,0x88,0x42,0x73,0x2D,0xEB,0x08,0xf5,0x6C,0x3E,0x21,0xaC,0x6f,0x8a}, "CTR ", 18}, - {{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}, - {{0xea,0x11,0x75,0x5a,0xe4,0x1d,0x88,0x9c,0xee,0xc3,0x9a,0x63,0xe6,0xff,0x75,0xa0,0x2b,0xc1,0xc0,0x0d}, "CTXC ", 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}, - {{0xbe,0x42,0x8c,0x38,0x67,0xf0,0x5d,0xea,0x2a,0x89,0xfc,0x76,0xa1,0x02,0xb5,0x44,0xea,0xc7,0xf7,0x72}, "CVT ", 18}, - {{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}, - {{0x78,0xc2,0x92,0xd1,0x44,0x5e,0x6b,0x95,0x58,0xbf,0x42,0xe8,0xbc,0x36,0x92,0x71,0xde,0xd0,0x62,0xea}, "CYMT ", 8}, - {{0x02,0x23,0xfc,0x70,0x57,0x42,0x14,0xf6,0x58,0x13,0xfe,0x33,0x6d,0x87,0x0a,0xc4,0x7e,0x14,0x7f,0xae}, "CZR ", 18}, - {{0xE4,0xc9,0x4d,0x45,0xf7,0xAe,0xf7,0x01,0x8a,0x5D,0x66,0xf4,0x4a,0xF7,0x80,0xec,0x60,0x23,0x37,0x8e}, "CrCarbon ", 6}, - {{0x05,0xc3,0x61,0x7c,0xbf,0x13,0x04,0xb9,0x26,0x0a,0xa6,0x1e,0xc9,0x60,0xf1,0x15,0xd6,0x7b,0xec,0xea}, "Cubrix ", 18}, - {{0xda,0xb0,0xC3,0x1B,0xF3,0x4C,0x89,0x7F,0xb0,0xFe,0x90,0xD1,0x2E,0xC9,0x40,0x1c,0xaf,0x5c,0x36,0xEc}, "DAB ", 0}, - {{0xa3,0x11,0x08,0xe5,0xba,0xb5,0x49,0x45,0x60,0xdb,0x34,0xc9,0x54,0x92,0x65,0x8a,0xf2,0x39,0x35,0x7c}, "DACS ", 18}, - {{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}, - {{0x07,0xd9,0xe4,0x9e,0xa4,0x02,0x19,0x4b,0xf4,0x8a,0x82,0x76,0xda,0xfb,0x16,0xe4,0xed,0x63,0x33,0x17}, "DALC ", 8}, - {{0x9B,0x70,0x74,0x0e,0x70,0x8a,0x08,0x3C,0x6f,0xF3,0x8D,0xf5,0x22,0x97,0x02,0x0f,0x5D,0xfA,0xa5,0xEE}, "DAN ", 10}, - {{0xBB,0x9b,0xc2,0x44,0xD7,0x98,0x12,0x3f,0xDe,0x78,0x3f,0xCc,0x1C,0x72,0xd3,0xBb,0x8C,0x18,0x94,0x13}, "DAO ", 16}, - {{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}, - {{0xab,0xbb,0xb6,0x44,0x7b,0x68,0xff,0xd6,0x14,0x1d,0xa7,0x7c,0x18,0xc7,0xb5,0x87,0x6e,0xd6,0xc5,0xab}, "DATx ", 18}, - {{0xd8,0x2D,0xf0,0xAB,0xD3,0xf5,0x14,0x25,0xEb,0x15,0xef,0x75,0x80,0xfD,0xA5,0x57,0x27,0x87,0x5f,0x14}, "DAV ", 18}, - {{0x0b,0x4b,0xdc,0x47,0x87,0x91,0x89,0x72,0x74,0x65,0x2d,0xc1,0x5e,0xf5,0xc1,0x35,0xca,0xe6,0x1e,0x60}, "DAX ", 18}, - {{0x61,0x72,0x5f,0x3d,0xb4,0x00,0x4a,0xfe,0x01,0x47,0x45,0xb2,0x1d,0xab,0x1e,0x16,0x77,0xcc,0x32,0x8b}, "DAXT ", 18}, - {{0x9b,0x68,0xbf,0xae,0x21,0xdf,0x5a,0x51,0x09,0x31,0xa2,0x62,0xce,0xcf,0x63,0xf4,0x13,0x38,0xf2,0x64}, "DBET ", 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}, - {{0xde,0x1e,0x0a,0xe6,0x10,0x1b,0x46,0x52,0x0c,0xf6,0x6f,0xdc,0x0b,0x10,0x59,0xc5,0xcc,0x3d,0x10,0x6c}, "DELTA ", 8}, - {{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}, - {{0x20,0xe9,0x48,0x67,0x79,0x4d,0xba,0x03,0x0e,0xe2,0x87,0xf1,0x40,0x6e,0x10,0x0d,0x03,0xc8,0x4c,0xd3}, "DEW ", 18}, - {{0x49,0x7b,0xAE,0xF2,0x94,0xc1,0x1a,0x5f,0x0f,0x5B,0xea,0x3f,0x2A,0xdB,0x30,0x73,0xDB,0x44,0x8B,0x56}, "DEX ", 18}, - {{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}, - {{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}, - {{0xf1,0x49,0x22,0x00,0x1a,0x2f,0xb8,0x54,0x1a,0x43,0x39,0x05,0x43,0x7a,0xe9,0x54,0x41,0x9c,0x24,0x39}, "DIT ", 8}, - {{0x13,0xf1,0x1C,0x99,0x05,0xA0,0x8c,0xa7,0x6e,0x3e,0x85,0x3b,0xE6,0x3D,0x4f,0x09,0x44,0x32,0x6C,0x72}, "DIVX ", 18}, - {{0x07,0xe3,0xc7,0x06,0x53,0x54,0x8b,0x04,0xf0,0xa7,0x59,0x70,0xc1,0xf8,0x1b,0x4c,0xbb,0xfb,0x60,0x6f}, "DLT ", 18}, - {{0x2c,0xcb,0xFF,0x3A,0x04,0x2c,0x68,0x71,0x6E,0xd2,0xa2,0xCb,0x0c,0x54,0x4A,0x9f,0x1d,0x19,0x35,0xE1}, "DMT ", 8}, - {{0x82,0xb0,0xe5,0x04,0x78,0xee,0xaf,0xde,0x39,0x2d,0x45,0xd1,0x25,0x9e,0xd1,0x07,0x1b,0x6f,0xda,0x81}, "DNA ", 18}, - {{0x0a,0xbd,0xac,0xe7,0x0d,0x37,0x90,0x23,0x5a,0xf4,0x48,0xc8,0x85,0x47,0x60,0x3b,0x94,0x56,0x04,0xea}, "DNT ", 18}, - {{0xE4,0x3E,0x20,0x41,0xdc,0x37,0x86,0xe1,0x66,0x96,0x1e,0xD9,0x48,0x4a,0x55,0x39,0x03,0x3d,0x10,0xfB}, "DNX ", 18}, - {{0xe5,0xda,0xda,0x80,0xaa,0x64,0x77,0xe8,0x5d,0x09,0x74,0x7f,0x28,0x42,0xf7,0x99,0x3d,0x0d,0xf7,0x1c}, "DOCK ", 18}, - {{0x90,0x6b,0x3f,0x8b,0x78,0x45,0x84,0x01,0x88,0xea,0xb5,0x3c,0x3f,0x5a,0xd3,0x48,0xa7,0x87,0x75,0x2f}, "DOR ", 15}, - {{0xac,0x32,0x11,0xa5,0x02,0x54,0x14,0xaf,0x28,0x66,0xff,0x09,0xc2,0x3f,0xc1,0x8b,0xc9,0x7e,0x79,0xb1}, "DOV ", 18}, - {{0x76,0x97,0x4c,0x7b,0x79,0xdc,0x8a,0x6a,0x10,0x9f,0xd7,0x1f,0xd7,0xce,0xb9,0xe4,0x0e,0xff,0x53,0x82}, "DOW ", 18}, - {{0x01,0xb3,0xEc,0x4a,0xAe,0x1B,0x87,0x29,0x52,0x9B,0xEB,0x49,0x65,0xF2,0x7d,0x00,0x87,0x88,0xB0,0xEB}, "DPP ", 18}, - {{0x41,0x9c,0x4d,0xb4,0xb9,0xe2,0x5d,0x6d,0xb2,0xad,0x96,0x91,0xcc,0xb8,0x32,0xc8,0xd9,0xfd,0xa0,0x5e}, "DRGN ", 18}, - {{0x46,0x72,0xba,0xd5,0x27,0x10,0x74,0x71,0xcb,0x50,0x67,0xa8,0x87,0xf4,0x65,0x6d,0x58,0x5a,0x8a,0x31}, "DROPil ", 18}, - {{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}, - {{0xe3,0x0e,0x02,0xf0,0x49,0x95,0x7e,0x2a,0x59,0x07,0x58,0x9e,0x06,0xba,0x64,0x6f,0xb2,0xc3,0x21,0xba}, "DRPU ", 8}, - {{0x9a,0xf4,0xf2,0x69,0x41,0x67,0x7c,0x70,0x6c,0xfe,0xcf,0x6d,0x33,0x79,0xff,0x01,0xbb,0x85,0xd5,0xab}, "DRT ", 8}, - {{0x62,0xd4,0xc0,0x46,0x44,0x31,0x4f,0x35,0x86,0x8b,0xa4,0xc6,0x5c,0xc2,0x7a,0x77,0x68,0x1d,0xe7,0xa9}, "DRVH ", 18}, - {{0x03,0xe3,0xf0,0xc2,0x59,0x65,0xf1,0x3D,0xbb,0xC5,0x82,0x46,0x73,0x8C,0x18,0x3E,0x27,0xb2,0x6a,0x56}, "DSCP ", 18}, - {{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}, - {{0xc2,0x04,0x64,0xe0,0xc3,0x73,0x48,0x6d,0x2b,0x33,0x35,0x57,0x6e,0x83,0xa2,0x18,0xb1,0x61,0x8a,0x5e}, "DTRC ", 18}, - {{0xf9,0xF7,0xc2,0x9C,0xFd,0xf1,0x9F,0xCf,0x1f,0x2A,0xA6,0xB8,0x4a,0xA3,0x67,0xBc,0xf1,0xbD,0x16,0x76}, "DTT ", 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}, - {{0xEd,0x7f,0xEA,0x78,0xC3,0x93,0xcF,0x7B,0x17,0xB1,0x52,0xA8,0xc2,0xD0,0xCD,0x97,0xaC,0x31,0x79,0x0B}, "DUBI ", 18}, - {{0x8d,0xb5,0x4c,0xa5,0x69,0xd3,0x01,0x9a,0x2b,0xa1,0x26,0xd0,0x3c,0x37,0xc4,0x4b,0x5e,0xf8,0x1e,0xf6}, "DXT ", 8}, - {{0xce,0x5c,0x60,0x3c,0x78,0xd0,0x47,0xef,0x43,0x03,0x2e,0x96,0xb5,0xb7,0x85,0x32,0x4f,0x75,0x3a,0x4f}, "E4ROW ", 2}, - {{0x99,0x4f,0x0d,0xff,0xdb,0xae,0x0b,0xbf,0x09,0xb6,0x52,0xd6,0xf1,0x1a,0x49,0x3f,0xd3,0x3f,0x42,0xb9}, "EAGLE ", 18}, - {{0x90,0x0b,0x44,0x49,0x23,0x6a,0x7b,0xb2,0x6b,0x28,0x66,0x01,0xdd,0x14,0xd2,0xbd,0xe7,0xa6,0xac,0x6c}, "EARTH ", 8}, - {{0x31,0xf3,0xd9,0xd1,0xbe,0xce,0x0c,0x03,0x3f,0xf7,0x8f,0xa6,0xda,0x60,0xa6,0x04,0x8f,0x3e,0x13,0xc5}, "EBC ", 18}, - {{0xaf,0xc3,0x97,0x88,0xc5,0x1f,0x0c,0x1f,0xf7,0xb5,0x53,0x17,0xf3,0xe7,0x02,0x99,0xe5,0x21,0xff,0xf6}, "eBCH ", 8}, - {{0xa5,0x78,0xac,0xc0,0xcb,0x78,0x75,0x78,0x1b,0x78,0x80,0x90,0x3f,0x45,0x94,0xd1,0x3c,0xfa,0x8b,0x98}, "ECN ", 2}, - {{0x17,0xF9,0x34,0x75,0xd2,0xA9,0x78,0xf5,0x27,0xc3,0xf7,0xc4,0x4a,0xBf,0x44,0xAd,0xfB,0xa6,0x0D,0x5C}, "ECO2 ", 2}, - {{0x17,0x1d,0x75,0x0d,0x42,0xd6,0x61,0xb6,0x2c,0x27,0x7a,0x6b,0x48,0x6a,0xdb,0x82,0x34,0x8c,0x3e,0xca}, "ECOM ", 18}, - {{0x88,0x69,0xb1,0xf9,0xbc,0x8b,0x24,0x6a,0x4d,0x72,0x20,0xf8,0x34,0xe5,0x6d,0xdf,0xdd,0x82,0x55,0xe7}, "ECP ", 18}, - {{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}, - {{0xeb,0x7c,0x20,0x02,0x71,0x72,0xe5,0xd1,0x43,0xfb,0x03,0x0d,0x50,0xf9,0x1c,0xec,0xe2,0xd1,0x48,0x5d}, "eBTC ", 8}, - {{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}, - {{0x5d,0xba,0xc2,0x4e,0x98,0xe2,0xa4,0xf4,0x3a,0xdc,0x0d,0xc8,0x2a,0xf4,0x03,0xfc,0xa0,0x63,0xce,0x2c}, "EGT ", 18}, - {{0xf9,0xF0,0xFC,0x71,0x67,0xc3,0x11,0xDd,0x2F,0x1e,0x21,0xE9,0x20,0x4F,0x87,0xEB,0xA9,0x01,0x2f,0xB2}, "EHT ", 8}, - {{0xa6,0xa8,0x40,0xe5,0x0b,0xca,0xa5,0x0d,0xa0,0x17,0xb9,0x1a,0x0d,0x86,0xb8,0xb2,0xd4,0x11,0x56,0xee}, "EKO ", 18}, - {{0xba,0xb1,0x65,0xdf,0x94,0x55,0xaa,0x0f,0x2a,0xed,0x1f,0x25,0x65,0x52,0x0b,0x91,0xdd,0xad,0xb4,0xc8}, "EKT ", 8}, - {{0xd4,0x9f,0xf1,0x36,0x61,0x45,0x13,0x13,0xca,0x15,0x53,0xfd,0x69,0x54,0xbd,0x1d,0x9b,0x6e,0x02,0xb9}, "ELEC ", 18}, - {{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}, - {{0xB8,0x02,0xb2,0x4E,0x06,0x37,0xc2,0xB8,0x7D,0x2E,0x8b,0x77,0x84,0xC0,0x55,0xBB,0xE9,0x21,0x01,0x1a}, "EMV ", 2}, - {{0x03,0x9f,0x50,0x50,0xde,0x49,0x08,0xf9,0xb5,0xdd,0xf4,0x0a,0x4f,0x3a,0xa3,0xf3,0x29,0x08,0x63,0x87}, "ENC ", 18}, - {{0xf0,0xee,0x6b,0x27,0xb7,0x59,0xc9,0x89,0x3c,0xe4,0xf0,0x94,0xb4,0x9a,0xd2,0x8f,0xd1,0x5a,0x23,0xe4}, "ENG ", 8}, - {{0xF6,0x29,0xcB,0xd9,0x4d,0x37,0x91,0xC9,0x25,0x01,0x52,0xBD,0x8d,0xfB,0xDF,0x38,0x0E,0x2a,0x3B,0x9c}, "ENJ ", 18}, - {{0x5B,0xC7,0xe5,0xf0,0xAb,0x8b,0x2E,0x10,0xD2,0xD0,0xa3,0xF2,0x17,0x39,0xFC,0xe6,0x24,0x59,0xae,0xF3}, "ENTRP ", 18}, - {{0x86,0xfa,0x04,0x98,0x57,0xe0,0x20,0x9a,0xa7,0xd9,0xe6,0x16,0xf7,0xeb,0x3b,0x3b,0x78,0xec,0xfd,0xb0}, "EOS ", 18}, - {{0x7e,0x9e,0x43,0x1a,0x0b,0x8c,0x4d,0x53,0x2c,0x74,0x5b,0x10,0x43,0xc7,0xfa,0x29,0xa4,0x8d,0x4f,0xba}, "eosDAC ", 18}, - {{0x35,0xBA,0xA7,0x20,0x38,0xF1,0x27,0xf9,0xf8,0xC8,0xf9,0xB4,0x91,0x04,0x9f,0x64,0xf3,0x77,0x91,0x4d}, "EPX ", 4}, - {{0x50,0xee,0x67,0x46,0x89,0xd7,0x5c,0x0f,0x88,0xe8,0xf8,0x3c,0xfe,0x8c,0x4b,0x69,0xe8,0xfd,0x59,0x0d}, "EPY ", 8}, - {{0x47,0xdd,0x62,0xd4,0xd0,0x75,0xde,0xad,0x71,0xd0,0xe0,0x02,0x99,0xfc,0x56,0xa2,0xd7,0x47,0xbe,0xbb}, "EQL ", 18}, - {{0x74,0xce,0xda,0x77,0x28,0x1b,0x33,0x91,0x42,0xa3,0x68,0x17,0xfa,0x5f,0x9e,0x29,0x41,0x2b,0xab,0x85}, "ERO ", 8}, - {{0x92,0xA5,0xB0,0x4D,0x0E,0xD5,0xD9,0x4D,0x7a,0x19,0x3d,0x1d,0x33,0x4D,0x3D,0x16,0x99,0x6f,0x4E,0x13}, "ERT ", 18}, - {{0xe8,0xa1,0xdf,0x95,0x8b,0xe3,0x79,0x04,0x5e,0x2b,0x46,0xa3,0x1a,0x98,0xb9,0x3a,0x2e,0xcd,0xfd,0xed}, "ESZ ", 18}, - {{0x1b,0x97,0x43,0xf5,0x56,0xd6,0x5e,0x75,0x7c,0x4c,0x65,0x0b,0x45,0x55,0xba,0xf3,0x54,0xcb,0x8b,0xd3}, "ETBS ", 12}, - {{0xdd,0x74,0xa7,0xa3,0x76,0x9f,0xa7,0x25,0x61,0xb3,0xa6,0x9e,0x65,0x96,0x8f,0x49,0x74,0x8c,0x69,0x0c}, "ETCH ", 18}, - {{0x28,0xc8,0xd0,0x1f,0xf6,0x33,0xea,0x9c,0xd8,0xfc,0x6a,0x45,0x1d,0x74,0x57,0x88,0x9e,0x69,0x8d,0xe6}, "ETG ", 0}, - {{0x3a,0x26,0x74,0x6D,0xdb,0x79,0xB1,0xB8,0xe4,0x45,0x0e,0x3F,0x4F,0xFE,0x32,0x85,0xA3,0x07,0x38,0x7E}, "ETHB ", 8}, - {{0xdb,0xfb,0x42,0x3e,0x9b,0xbf,0x16,0x29,0x43,0x88,0xe0,0x76,0x96,0xa5,0x12,0x0e,0x4c,0xeb,0xa0,0xc5}, "ETHD ", 18}, - {{0x5A,0xf2,0xBe,0x19,0x3a,0x6A,0xBC,0xa9,0xc8,0x81,0x70,0x01,0xF4,0x57,0x44,0x77,0x7D,0xb3,0x07,0x56}, "ETHOS ", 8}, - {{0x3c,0x4a,0x3f,0xfd,0x81,0x3a,0x10,0x7f,0xeb,0xd5,0x7b,0x2f,0x01,0xbc,0x34,0x42,0x64,0xd9,0x0f,0xde}, "ETK ", 2}, - {{0x69,0x27,0xC6,0x9f,0xb4,0xda,0xf2,0x04,0x3f,0xbB,0x1C,0xb7,0xb8,0x6c,0x56,0x61,0x41,0x6b,0xea,0x29}, "ETR ", 18}, - {{0xdb,0x25,0xf2,0x11,0xab,0x05,0xb1,0xc9,0x7d,0x59,0x55,0x16,0xf4,0x57,0x94,0x52,0x8a,0x80,0x7a,0xd8}, "EURS ", 2}, - {{0xab,0xdf,0x14,0x78,0x70,0x23,0x5f,0xcf,0xc3,0x41,0x53,0x82,0x8c,0x76,0x9a,0x70,0xb3,0xfa,0xe0,0x1f}, "EURT ", 6}, - {{0xb6,0x2d,0x18,0xde,0xa7,0x40,0x45,0xe8,0x22,0x35,0x2c,0xe4,0xb3,0xee,0x77,0x31,0x9d,0xc5,0xff,0x2f}, "EVC ", 18}, - {{0x92,0x31,0x08,0xa4,0x39,0xC4,0xe8,0xC2,0x31,0x5c,0x4f,0x65,0x21,0xE5,0xcE,0x95,0xB4,0x4e,0x9B,0x4c}, "EVE ", 18}, - {{0x68,0x90,0x9e,0x58,0x6e,0xea,0xc8,0xf4,0x73,0x15,0xe8,0x4b,0x4c,0x97,0x88,0xdd,0x54,0xef,0x65,0xbb}, "EVN ", 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}, - {{0x44,0x49,0x97,0xb7,0xe7,0xfC,0x83,0x0E,0x20,0x08,0x9a,0xfe,0xa3,0x07,0x8c,0xd5,0x18,0xfC,0xF2,0xA2}, "EWO ", 18}, - {{0x00,0xc4,0xb3,0x98,0x50,0x06,0x45,0xeb,0x5d,0xa0,0x0a,0x1a,0x37,0x9a,0x88,0xb1,0x16,0x83,0xba,0x01}, "EXC ", 18}, - {{0xc9,0x8e,0x06,0x39,0xc6,0xd2,0xec,0x03,0x7a,0x61,0x53,0x41,0xc3,0x69,0x66,0x6b,0x11,0x0e,0x80,0xe5}, "EXMR ", 8}, - {{0xe4,0x69,0xc4,0x47,0x3a,0xf8,0x22,0x17,0xb3,0x0c,0xf1,0x7b,0x10,0xbc,0xdb,0x6c,0x8c,0x79,0x6e,0x75}, "EXRN ", 0}, - {{0x5c,0x74,0x3a,0x35,0xe9,0x03,0xf6,0xc5,0x84,0x51,0x4e,0xc6,0x17,0xac,0xee,0x06,0x11,0xcf,0x44,0xf3}, "EXY ", 18}, - {{0x5e,0x60,0x16,0xae,0x7d,0x7c,0x49,0xd3,0x47,0xdc,0xf8,0x34,0x86,0x0b,0x9f,0x3e,0xe2,0x82,0x81,0x2b}, "EZT ", 8}, - {{0xb6,0x77,0x34,0x52,0x1e,0xAb,0xBE,0x9C,0x77,0x37,0x29,0xdB,0x73,0xE1,0x6C,0xC2,0xdf,0xb2,0x0A,0x58}, "ERupee ", 2}, - {{0x1c,0xca,0xa0,0xf2,0xa7,0x21,0x0d,0x76,0xe1,0xfd,0xec,0x74,0x0d,0x5f,0x32,0x3e,0x2e,0x1b,0x16,0x72}, "FACE ", 18}, - {{0x19,0x0e,0x56,0x9b,0xE0,0x71,0xF4,0x0c,0x70,0x4e,0x15,0x82,0x5F,0x28,0x54,0x81,0xCB,0x74,0xB6,0xcC}, "FAM ", 12}, - {{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}, - {{0x23,0x35,0x20,0x36,0xe9,0x11,0xa2,0x2c,0xfc,0x69,0x2b,0x5e,0x2e,0x19,0x66,0x92,0x65,0x8a,0xde,0xd9}, "FDZ ", 18}, - {{0xd9,0xa8,0xcf,0xe2,0x1c,0x23,0x2d,0x48,0x50,0x65,0xcb,0x62,0xa9,0x68,0x66,0x79,0x9d,0x46,0x45,0xf7}, "FGP ", 18}, - {{0x52,0xfb,0x36,0xc8,0x3a,0xd3,0x3c,0x18,0x24,0x91,0x2f,0xc8,0x10,0x71,0xca,0x5e,0xeb,0x8a,0xb3,0x90}, "FID ", 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}, - {{0x04,0x93,0x99,0xa6,0xb0,0x48,0xd5,0x29,0x71,0xf7,0xd1,0x22,0xae,0x21,0xa1,0x53,0x27,0x22,0x28,0x5f}, "FLOT ", 18}, - {{0x3a,0x1B,0xda,0x28,0xAd,0xB5,0xB0,0xa8,0x12,0xa7,0xCF,0x10,0xA1,0x95,0x0c,0x92,0x0F,0x79,0xBc,0xD3}, "FLP ", 18}, - {{0x9a,0xeF,0xBE,0x0b,0x3C,0x3b,0xa9,0xEa,0xb2,0x62,0xCB,0x98,0x56,0xE8,0x15,0x7A,0xB7,0x64,0x8e,0x09}, "FLR ", 18}, - {{0x95,0x4b,0x5d,0xe0,0x9a,0x55,0xe5,0x97,0x55,0xac,0xbd,0xa2,0x9e,0x1e,0xb7,0x4a,0x45,0xd3,0x01,0x75}, "FLUZ ", 18}, - {{0x70,0xb1,0x47,0xe0,0x1e,0x92,0x85,0xe7,0xce,0x68,0xb9,0xba,0x43,0x7f,0xe3,0xa9,0x19,0x0e,0x75,0x6a}, "FLX ", 18}, - {{0x4d,0xf4,0x7b,0x49,0x69,0xb2,0x91,0x1c,0x96,0x65,0x06,0xe3,0x59,0x2c,0x41,0x38,0x94,0x93,0x95,0x3b}, "FND ", 18}, - {{0x07,0x07,0x68,0x1f,0x34,0x4d,0xeb,0x24,0x18,0x40,0x37,0xfc,0x02,0x28,0x85,0x6f,0x21,0x37,0xb0,0x2e}, "FNKOS ", 18}, - {{0xbd,0x4b,0x60,0xa1,0x38,0xb3,0xfc,0xe3,0x58,0x4e,0xa0,0x1f,0x50,0xc0,0x90,0x8c,0x18,0xf9,0x67,0x7a}, "FNTB ", 8}, - {{0x2a,0x09,0x3B,0xcF,0x0C,0x98,0xEf,0x74,0x4B,0xb6,0xF6,0x9D,0x74,0xf2,0xF8,0x56,0x05,0x32,0x42,0x90}, "FOOD ", 8}, - {{0x42,0x70,0xbb,0x23,0x8f,0x6d,0xd8,0xb1,0xc3,0xca,0x01,0xf9,0x6c,0xa6,0x5b,0x26,0x47,0xc0,0x6d,0x3c}, "FOTA ", 18}, - {{0x0A,0xBe,0xFb,0x76,0x11,0xCb,0x3A,0x01,0xEA,0x3F,0xaD,0x85,0xf3,0x3C,0x3C,0x93,0x4F,0x8e,0x2c,0xF4}, "FRD ", 18}, - {{0x17,0xe6,0x7d,0x1c,0xb4,0xe3,0x49,0xb9,0xca,0x4b,0xc3,0xe1,0x7c,0x7d,0xf2,0xa3,0x97,0xa7,0xbb,0x64}, "FREC ", 18}, - {{0x48,0xdf,0x4e,0x02,0x96,0xf9,0x08,0xce,0xab,0x04,0x28,0xa5,0x18,0x2d,0x19,0xb3,0x1f,0xc0,0x37,0xd6}, "FRV ", 8}, - {{0xd0,0x35,0x2a,0x01,0x9e,0x9a,0xb9,0xd7,0x57,0x77,0x6f,0x53,0x23,0x77,0xaa,0xeb,0xd3,0x6f,0xd5,0x41}, "FSN ", 18}, - {{0x78,0xa7,0x3B,0x6C,0xBc,0x5D,0x18,0x3C,0xE5,0x6e,0x78,0x6f,0x6e,0x90,0x5C,0xaD,0xEC,0x63,0x54,0x7B}, "FT ", 18}, - {{0xe6,0xf7,0x4d,0xcf,0xa0,0xe2,0x08,0x83,0x00,0x8d,0x8c,0x16,0xb6,0xd9,0xa3,0x29,0x18,0x9d,0x0c,0x30}, "FTC ", 2}, - {{0x94,0x3e,0xd8,0x52,0xda,0xdb,0x5c,0x39,0x38,0xec,0xdc,0x68,0x83,0x71,0x8d,0xf8,0x14,0x2d,0xe4,0xc8}, "FTI ", 18}, - {{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}, - {{0xd5,0x59,0xf2,0x02,0x96,0xff,0x48,0x95,0xda,0x39,0xb5,0xbd,0x9a,0xdd,0x54,0xb4,0x42,0x59,0x6a,0x61}, "FTX ", 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}, - {{0x18,0x29,0xaa,0x04,0x5e,0x21,0xe0,0xd5,0x95,0x80,0x02,0x4a,0x95,0x1d,0xb4,0x80,0x96,0xe0,0x17,0x82}, "FXT ", 18}, - {{0x88,0xFC,0xFB,0xc2,0x2C,0x6d,0x3d,0xBa,0xa2,0x5a,0xF4,0x78,0xC5,0x78,0x97,0x83,0x39,0xBD,0xe7,0x7a}, "FYN ", 18}, - {{0x8f,0x09,0x21,0xf3,0x05,0x55,0x62,0x41,0x43,0xd4,0x27,0xb3,0x40,0xb1,0x15,0x69,0x14,0x88,0x2c,0x10}, "FYP ", 18}, - {{0xf6,0x74,0x51,0xdc,0x84,0x21,0xf0,0xe0,0xaf,0xeb,0x52,0xfa,0xa8,0x10,0x10,0x34,0xed,0x08,0x1e,0xd9}, "GAM ", 8}, - {{0xc0,0xEA,0x63,0x06,0xF6,0x36,0x0F,0xE7,0xdC,0xAB,0x65,0xD1,0x6B,0xf1,0xa3,0xAF,0x92,0xC7,0x9A,0xa2}, "GANA ", 18}, - {{0x68,0x71,0x74,0xf8,0xc4,0x9c,0xeb,0x77,0x29,0xd9,0x25,0xc3,0xa9,0x61,0x50,0x7e,0xa4,0xac,0x7b,0x28}, "GAT ", 18}, - {{0x70,0x88,0x76,0xf4,0x86,0xe4,0x48,0xee,0x89,0xeb,0x33,0x2b,0xfb,0xc8,0xe5,0x93,0x55,0x30,0x58,0xb9}, "GAVEL ", 18}, - {{0x75,0x85,0xF8,0x35,0xae,0x2d,0x52,0x27,0x22,0xd2,0x68,0x43,0x23,0xa0,0xba,0x83,0x40,0x1f,0x32,0xf5}, "GBT ", 18}, - {{0x12,0xfC,0xd6,0x46,0x3E,0x66,0x97,0x4c,0xF7,0xbB,0xC2,0x4F,0xFC,0x4d,0x40,0xd6,0xbE,0x45,0x82,0x83}, "GBX ", 8}, - {{0xdb,0x0F,0x69,0x30,0x6F,0xF8,0xF9,0x49,0xf2,0x58,0xE8,0x3f,0x6b,0x87,0xee,0x5D,0x05,0x2d,0x0b,0x23}, "GCP ", 18}, - {{0x4F,0x4f,0x0D,0xb4,0xde,0x90,0x3B,0x88,0xf2,0xB1,0xa2,0x84,0x79,0x71,0xE2,0x31,0xD5,0x4F,0x8f,0xd3}, "GEE ", 8}, - {{0x24,0x08,0x3b,0xb3,0x00,0x72,0x64,0x3c,0x3b,0xb9,0x0b,0x44,0xb7,0x28,0x58,0x60,0xa7,0x55,0xe6,0x87}, "GELD ", 18}, - {{0xc7,0xbb,0xa5,0xb7,0x65,0x58,0x1e,0xfb,0x2c,0xdd,0x26,0x79,0xdb,0x5b,0xea,0x9e,0xe7,0x9b,0x20,0x1f}, "GEM ", 18}, - {{0x54,0x3F,0xf2,0x27,0xF6,0x4A,0xa1,0x7e,0xA1,0x32,0xBf,0x98,0x86,0xcA,0xb5,0xDB,0x55,0xDC,0xAd,0xdf}, "GEN ", 18}, - {{0x8a,0x85,0x42,0x88,0xa5,0x97,0x60,0x36,0xa7,0x25,0x87,0x91,0x64,0xca,0x3e,0x91,0xd3,0x0c,0x6a,0x1b}, "GET ", 18}, - {{0xFc,0xD8,0x62,0x98,0x56,0x28,0xb2,0x54,0x06,0x1F,0x7A,0x91,0x80,0x35,0xB8,0x03,0x40,0xD0,0x45,0xd3}, "GIF ", 18}, - {{0xaE,0x4f,0x56,0xF0,0x72,0xc3,0x4C,0x0a,0x65,0xB3,0xae,0x3E,0x4D,0xB7,0x97,0xD8,0x31,0x43,0x9D,0x93}, "GIM ", 8}, - {{0x71,0xd0,0x1d,0xb8,0xd6,0xa2,0xfb,0xea,0x7f,0x8d,0x43,0x45,0x99,0xc2,0x37,0x98,0x0c,0x23,0x4e,0x4c}, "GLA ", 8}, - {{0xb3,0xBd,0x49,0xE2,0x8f,0x8F,0x83,0x2b,0x8d,0x1E,0x24,0x61,0x06,0x99,0x1e,0x54,0x6c,0x32,0x35,0x02}, "GMT ", 18}, - {{0x68,0x10,0xe7,0x76,0x88,0x0C,0x02,0x93,0x3D,0x47,0xDB,0x1b,0x9f,0xc0,0x59,0x08,0xe5,0x38,0x6b,0x96}, "GNO ", 18}, - {{0xa7,0x44,0x76,0x44,0x31,0x19,0xA9,0x42,0xdE,0x49,0x85,0x90,0xFe,0x1f,0x24,0x54,0xd7,0xD4,0xaC,0x0d}, "GNT ", 18}, - {{0x6e,0xc8,0xa2,0x4c,0xab,0xdc,0x33,0x9a,0x06,0xa1,0x72,0xf8,0x22,0x3e,0xa5,0x57,0x05,0x5a,0xda,0xa5}, "GNX ", 9}, - {{0x24,0x75,0x51,0xF2,0xEB,0x33,0x62,0xE2,0x22,0xc7,0x42,0xE9,0xc7,0x88,0xB8,0x95,0x7D,0x9B,0xC8,0x7e}, "GNY ", 18}, - {{0xeA,0xb4,0x31,0x93,0xCF,0x06,0x23,0x07,0x3C,0xa8,0x9D,0xB9,0xB7,0x12,0x79,0x63,0x56,0xFA,0x74,0x14}, "GOLDX ", 18}, - {{0x42,0x3b,0x5f,0x62,0xb3,0x28,0xd0,0xd6,0xd4,0x48,0x70,0xf4,0xee,0xe3,0x16,0xbe,0xfa,0x0b,0x2d,0xf5}, "GOT ", 18}, - {{0x12,0xb1,0x9d,0x3e,0x2c,0xcc,0x14,0xda,0x04,0xfa,0xe3,0x3e,0x63,0x65,0x2c,0xe4,0x69,0xb3,0xf2,0xfd}, "GRID ", 12}, - {{0xb4,0x44,0x20,0x8c,0xb0,0x51,0x6c,0x15,0x01,0x78,0xfc,0xf9,0xa5,0x26,0x04,0xbc,0x04,0xa1,0xac,0xea}, "GRMD ", 18}, - {{0xC1,0x71,0x95,0xbd,0xe4,0x9D,0x70,0xCe,0xfC,0xF8,0xA9,0xF2,0xee,0x17,0x59,0xFF,0xC2,0x7B,0xF0,0xB1}, "GROO ", 18}, - {{0x0a,0x9A,0x9c,0xe6,0x00,0xD0,0x8B,0xF9,0xb7,0x6F,0x49,0xFA,0x4e,0x7b,0x38,0xA6,0x7E,0xBE,0xB1,0xE6}, "GROW ", 8}, - {{0x22,0x8b,0xa5,0x14,0x30,0x9f,0xfd,0xf0,0x3a,0x81,0xa2,0x05,0xa6,0xd0,0x40,0xe4,0x29,0xd6,0xe8,0x0c}, "GSC ", 18}, - {{0xe5,0x30,0x44,0x1f,0x4f,0x73,0xbD,0xB6,0xDC,0x2f,0xA5,0xaF,0x7c,0x3f,0xC5,0xfD,0x55,0x1E,0xc8,0x38}, "GSE ", 4}, - {{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}, - {{0xbd,0xcf,0xbf,0x5c,0x4d,0x91,0xab,0xc0,0xbc,0x97,0x09,0xc7,0x28,0x6d,0x00,0x06,0x3c,0x0e,0x6f,0x22}, "GUESS ", 2}, - {{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}, - {{0x48,0xc1,0xb2,0xf3,0xef,0xa8,0x5f,0xba,0xfb,0x2a,0xb9,0x51,0xbf,0x4b,0xa8,0x60,0xa0,0x8c,0xdb,0xb7}, "HAND ", 0}, - {{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}, "SNX ", 18}, - {{0xe2,0x49,0x2f,0x8d,0x2a,0x26,0x18,0xd8,0x70,0x9c,0xa9,0x9b,0x1d,0x8d,0x75,0x71,0x3b,0xd8,0x40,0x89}, "HB ", 18}, - {{0xdd,0x6c,0x68,0xbb,0x32,0x46,0x2e,0x01,0x70,0x50,0x11,0xa4,0xe2,0xad,0x1a,0x60,0x74,0x0f,0x21,0x7f}, "HBT ", 15}, - {{0xe3,0x4e,0x19,0x44,0xe7,0x76,0xf3,0x9b,0x92,0x52,0x79,0x0a,0x05,0x27,0xeb,0xda,0x64,0x7a,0xe6,0x68}, "HBZ ", 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}, - {{0x49,0x1c,0x9a,0x23,0xdb,0x85,0x62,0x3e,0xed,0x45,0x5a,0x8e,0xfd,0xd6,0xab,0xa9,0xb9,0x11,0xc5,0xdf}, "HER ", 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}, - {{0x9e,0x6b,0x2b,0x11,0x54,0x2f,0x2b,0xc5,0x2f,0x30,0x29,0x07,0x7a,0xce,0x37,0xe8,0xfd,0x83,0x8d,0x7f}, "HKN ", 8}, - {{0x88,0xac,0x94,0xd5,0xd1,0x75,0x13,0x03,0x47,0xfc,0x95,0xe1,0x09,0xd7,0x7a,0xc0,0x9d,0xbf,0x5a,0xb7}, "HKY ", 18}, - {{0x66,0xeb,0x65,0xD7,0xAb,0x8e,0x95,0x67,0xba,0x0f,0xa6,0xE3,0x7c,0x30,0x59,0x56,0xc5,0x34,0x15,0x74}, "HLX ", 5}, - {{0xAa,0x0b,0xb1,0x0C,0xEc,0x1f,0xa3,0x72,0xeb,0x3A,0xbc,0x17,0xC9,0x33,0xFC,0x6b,0xa8,0x63,0xDD,0x9E}, "HMC ", 18}, - {{0xcb,0xCC,0x0F,0x03,0x6E,0xD4,0x78,0x8F,0x63,0xFC,0x0f,0xEE,0x32,0x87,0x3d,0x6A,0x74,0x87,0xb9,0x08}, "HMQ ", 8}, - {{0xb4,0x5d,0x7B,0xc4,0xcE,0xBc,0xAB,0x98,0xaD,0x09,0xBA,0xBD,0xF8,0xC8,0x18,0xB2,0x29,0x2B,0x67,0x2c}, "HODL ", 18}, - {{0x5B,0x07,0x51,0x71,0x3b,0x25,0x27,0xd7,0xf0,0x02,0xc0,0xc4,0xe2,0xa3,0x7e,0x12,0x19,0x61,0x0A,0x6B}, "HORSE ", 18}, - {{0x6c,0x6e,0xe5,0xe3,0x1d,0x82,0x8d,0xe2,0x41,0x28,0x2b,0x96,0x06,0xc8,0xe9,0x8e,0xa4,0x85,0x26,0xe2}, "HoloTkn ", 18}, - {{0x9a,0xf8,0x39,0x68,0x7f,0x6c,0x94,0x54,0x2a,0xc5,0xec,0xe2,0xe3,0x17,0xda,0xae,0x35,0x54,0x93,0xa1}, "Hydro ", 18}, - {{0x38,0xc6,0xa6,0x83,0x04,0xcd,0xef,0xb9,0xbe,0xc4,0x8b,0xbf,0xaa,0xba,0x5c,0x5b,0x47,0x81,0x8b,0xb2}, "HPB ", 18}, - {{0x55,0x4C,0x20,0xB7,0xc4,0x86,0xbe,0xeE,0x43,0x92,0x77,0xb4,0x54,0x0A,0x43,0x45,0x66,0xdC,0x4C,0x02}, "HST ", 18}, - {{0x6f,0x25,0x96,0x37,0xdc,0xd7,0x4c,0x76,0x77,0x81,0xe3,0x7b,0xc6,0x13,0x3c,0xd6,0xa6,0x8a,0xa1,0x61}, "HT ", 18}, - {{0xC0,0xEb,0x85,0x28,0x5d,0x83,0x21,0x7C,0xD7,0xc8,0x91,0x70,0x2b,0xcb,0xC0,0xFC,0x40,0x1E,0x2D,0x9D}, "HVN ", 8}, - {{0xeb,0xbd,0xf3,0x02,0xc9,0x40,0xc6,0xbf,0xd4,0x9c,0x6b,0x16,0x5f,0x45,0x7f,0xdb,0x32,0x46,0x49,0xbc}, "HYDRO ", 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}, "Hdp2 ", 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}, - {{0x01,0x4B,0x50,0x46,0x65,0x90,0x34,0x0D,0x41,0x30,0x7C,0xc5,0x4D,0xCe,0xe9,0x90,0xc8,0xD5,0x8a,0xa8}, "ICOS ", 6}, - {{0xb5,0xa5,0xf2,0x26,0x94,0x35,0x2c,0x15,0xb0,0x03,0x23,0x84,0x4a,0xd5,0x45,0xab,0xb2,0xb1,0x10,0x28}, "ICX ", 18}, - {{0x81,0x4c,0xaf,0xd4,0x78,0x2d,0x2e,0x72,0x81,0x70,0xfd,0xa6,0x82,0x57,0x98,0x3f,0x03,0x32,0x1c,0x58}, "IDEA ", 0}, - {{0x51,0x36,0xc9,0x8a,0x80,0x81,0x1c,0x3f,0x46,0xbd,0xda,0x8b,0x5c,0x45,0x55,0xcf,0xd9,0xf8,0x12,0xf0}, "IDH ", 6}, - {{0xcc,0x13,0xfc,0x62,0x7e,0xff,0xd6,0xe3,0x5d,0x2d,0x27,0x06,0xea,0x3c,0x4d,0x73,0x96,0xc6,0x10,0xea}, "IDXM ", 8}, - {{0x85,0x9a,0x9c,0x0b,0x44,0xcb,0x70,0x66,0xd9,0x56,0xa9,0x58,0xb0,0xb8,0x2e,0x54,0xc9,0xe4,0x4b,0x4b}, "iETH ", 8}, - {{0x76,0x54,0x91,0x5a,0x1b,0x82,0xd6,0xd2,0xd0,0xaf,0xc3,0x7c,0x52,0xaf,0x55,0x6e,0xa8,0x98,0x3c,0x7e}, "IFT ", 18}, - {{0x8a,0x88,0xf0,0x4e,0x0c,0x90,0x50,0x54,0xd2,0xf3,0x3b,0x26,0xbb,0x3a,0x46,0xd7,0x09,0x1a,0x03,0x9a}, "IG ", 18}, - {{0xed,0xa8,0xb0,0x16,0xef,0xa8,0xb1,0x16,0x12,0x08,0xcf,0x04,0x1c,0xd8,0x69,0x72,0xee,0xe0,0xf3,0x1e}, "IHT ", 18}, - {{0x16,0x66,0x2f,0x73,0xdf,0x3e,0x79,0xe5,0x4c,0x6c,0x59,0x38,0xb4,0x31,0x3f,0x92,0xc5,0x24,0xc1,0x20}, "IIC ", 18}, - {{0x88,0xAE,0x96,0x84,0x5e,0x15,0x75,0x58,0xef,0x59,0xe9,0xFf,0x90,0xE7,0x66,0xE2,0x2E,0x48,0x03,0x90}, "IKB ", 0}, - {{0xe3,0x83,0x1c,0x5A,0x98,0x2B,0x27,0x9A,0x19,0x84,0x56,0xD5,0x77,0xcf,0xb9,0x04,0x24,0xcb,0x63,0x40}, "IMC ", 6}, - {{0x22,0xE5,0xF6,0x2D,0x0F,0xA1,0x99,0x74,0x74,0x9f,0xaa,0x19,0x4e,0x3d,0x3e,0xF6,0xd8,0x9c,0x08,0xd7}, "IMT Immo ", 0}, - {{0x13,0x11,0x9E,0x34,0xE1,0x40,0x09,0x7a,0x50,0x7B,0x07,0xa5,0x56,0x4b,0xDe,0x1b,0xC3,0x75,0xD9,0xe6}, "IMT Mony ", 18}, - {{0xf8,0xe3,0x86,0xED,0xa8,0x57,0x48,0x4f,0x5a,0x12,0xe4,0xB5,0xDA,0xa9,0x98,0x4E,0x06,0xE7,0x37,0x05}, "IND ", 18}, - {{0x24,0xdd,0xff,0x6d,0x8b,0x8a,0x42,0xd8,0x35,0xaf,0x3b,0x44,0x0d,0xe9,0x1f,0x33,0x86,0x55,0x4a,0xa4}, "ING ", 18}, - {{0x48,0xe5,0x41,0x3b,0x73,0xad,0xd2,0x43,0x4e,0x47,0x50,0x4E,0x2a,0x22,0xd1,0x49,0x40,0xdB,0xFe,0x78}, "INRM ", 3}, - {{0x5b,0x2e,0x4a,0x70,0x0d,0xfb,0xc5,0x60,0x06,0x1e,0x95,0x7e,0xde,0xc8,0xf6,0xee,0xeb,0x74,0xa3,0x20}, "INS ", 10}, - {{0xc7,0x2f,0xe8,0xe3,0xdd,0x5b,0xef,0x0f,0x9f,0x31,0xf2,0x59,0x39,0x9f,0x30,0x12,0x72,0xef,0x2a,0x2d}, "INSTAR ", 18}, - {{0x0b,0x76,0x54,0x4f,0x6c,0x41,0x3a,0x55,0x5f,0x30,0x9b,0xf7,0x62,0x60,0xd1,0xe0,0x23,0x77,0xc0,0x2a}, "INT ", 6}, - {{0xec,0xe8,0x36,0x17,0xdb,0x20,0x8a,0xd2,0x55,0xad,0x4f,0x45,0xda,0xf8,0x1e,0x25,0x13,0x75,0x35,0xbb}, "INV ", 8}, - {{0xa8,0x00,0x6c,0x4c,0xa5,0x6f,0x24,0xd6,0x83,0x67,0x27,0xd1,0x06,0x34,0x93,0x20,0xdb,0x7f,0xef,0x82}, "INXT ", 8}, - {{0xFA,0x1a,0x85,0x6C,0xfa,0x34,0x09,0xCF,0xa1,0x45,0xFa,0x4e,0x20,0xEb,0x27,0x0d,0xF3,0xEB,0x21,0xab}, "IOST ", 18}, - {{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}, - {{0xA4,0xeA,0x68,0x7A,0x2A,0x7F,0x29,0xcF,0x2d,0xc6,0x6B,0x39,0xc6,0x8e,0x44,0x11,0xC0,0xD0,0x0C,0x49}, "IVY ", 18}, - {{0xfc,0xa4,0x79,0x62,0xd4,0x5a,0xdf,0xdf,0xd1,0xab,0x2d,0x97,0x23,0x15,0xdb,0x4c,0xe7,0xcc,0xf0,0x94}, "IXT ", 8}, - {{0xc3,0x4b,0x21,0xf6,0xf8,0xe5,0x1c,0xc9,0x65,0xc2,0x39,0x3b,0x3c,0xcf,0xa3,0xb8,0x2b,0xeb,0x24,0x03}, "IoT ", 6}, - {{0x0d,0x26,0x2e,0x5d,0xc4,0xa0,0x6a,0x0f,0x1c,0x90,0xce,0x79,0xc7,0xa6,0x0c,0x09,0xdf,0xc8,0x84,0xe4}, "J8T ", 8}, - {{0x88,0x4e,0x39,0x02,0xC4,0xd5,0xcF,0xA8,0x6d,0xe4,0xaC,0xE7,0xA9,0x6A,0xA9,0x1E,0xbC,0x25,0xC0,0xFf}, "JBX ", 0}, - {{0xe2,0xd8,0x2d,0xc7,0xda,0x0e,0x6f,0x88,0x2e,0x96,0x84,0x64,0x51,0xf4,0xfa,0xbc,0xc8,0xf9,0x05,0x28}, "JC ", 18}, - {{0x87,0x27,0xc1,0x12,0xc7,0x12,0xc4,0xa0,0x33,0x71,0xac,0x87,0xa7,0x4d,0xd6,0xab,0x10,0x4a,0xf7,0x68}, "JET ", 18}, - {{0xa5,0xFd,0x1A,0x79,0x1C,0x4d,0xfc,0xaa,0xcC,0x96,0x3D,0x4F,0x73,0xc6,0xAe,0x58,0x24,0x14,0x9e,0xA7}, "JNT ", 18}, - {{0xdb,0x45,0x5c,0x71,0xc1,0xbc,0x2d,0xe4,0xe8,0x0c,0xa4,0x51,0x18,0x40,0x41,0xef,0x32,0x05,0x40,0x01}, "JOT ", 18}, - {{0xDD,0xe1,0x2a,0x12,0xA6,0xf6,0x71,0x56,0xe0,0xDA,0x67,0x2b,0xe0,0x5c,0x37,0x4e,0x1B,0x0a,0x3e,0x57}, "JOY ", 6}, - {{0x77,0x34,0x50,0x33,0x5e,0xD4,0xec,0x3D,0xB4,0x5a,0xF7,0x4f,0x34,0xF2,0xc8,0x53,0x48,0x64,0x5D,0x39}, "JetCoins ", 18}, - {{0x14,0x10,0x43,0x4b,0x03,0x46,0xf5,0xbe,0x67,0x8d,0x0f,0xb5,0x54,0xe5,0xc7,0xab,0x62,0x0f,0x8f,0x4a}, "KAN ", 18}, - {{0x0D,0x6D,0xD9,0xf6,0x8d,0x24,0xEC,0x1d,0x5f,0xE2,0x17,0x4f,0x3E,0xC8,0xDA,0xB5,0x2B,0x52,0xBa,0xF5}, "KC ", 18}, - {{0x72,0xD3,0x2a,0xc1,0xc5,0xE6,0x6B,0xfC,0x5b,0x08,0x80,0x62,0x71,0xf8,0xeE,0xF9,0x15,0x54,0x51,0x64}, "KEE ", 0}, - {{0x4c,0xd9,0x88,0xaf,0xba,0xd3,0x72,0x89,0xba,0xaf,0x53,0xc1,0x3e,0x98,0xe2,0xbd,0x46,0xaa,0xea,0x8c}, "BihuKey ", 18}, - {{0x4C,0xC1,0x93,0x56,0xf2,0xD3,0x73,0x38,0xb9,0x80,0x2a,0xa8,0xE8,0xfc,0x58,0xB0,0x37,0x32,0x96,0xE7}, "SelfKey ", 18}, - {{0x27,0x69,0x5E,0x09,0x14,0x9A,0xdC,0x73,0x8A,0x97,0x8e,0x9A,0x67,0x8F,0x99,0xE4,0xc3,0x9e,0x9e,0xb9}, "KICK ", 8}, - {{0x81,0x8F,0xc6,0xC2,0xEc,0x59,0x86,0xbc,0x6E,0x2C,0xBf,0x00,0x93,0x9d,0x90,0x55,0x6a,0xB1,0x2c,0xe5}, "KIN ", 18}, - {{0x46,0x18,0x51,0x9d,0xe4,0xc3,0x04,0xf3,0x44,0x4f,0xfa,0x7f,0x81,0x2d,0xdd,0xc2,0x97,0x1c,0xc6,0x88}, "KIND ", 8}, - {{0xdd,0x97,0x4D,0x5C,0x2e,0x29,0x28,0xde,0xA5,0xF7,0x1b,0x98,0x25,0xb8,0xb6,0x46,0x68,0x6B,0xD2,0x00}, "KNC ", 18}, - {{0x8e,0x56,0x10,0xab,0x5e,0x39,0xd2,0x68,0x28,0x16,0x76,0x40,0xea,0x29,0x82,0x3f,0xe1,0xdd,0x58,0x43}, "KNDC ", 8}, - {{0xff,0x5c,0x25,0xd2,0xf4,0x0b,0x47,0xc4,0xa3,0x7f,0x98,0x9d,0xe9,0x33,0xe2,0x65,0x62,0xef,0x0a,0xc0}, "KNT ", 16}, - {{0xb5,0xc3,0x3f,0x96,0x5c,0x88,0x99,0xd2,0x55,0xc3,0x4c,0xdd,0x2a,0x3e,0xfa,0x8a,0xbc,0xbb,0x3d,0xea}, "KPR ", 18}, - {{0x46,0x4e,0xbe,0x77,0xc2,0x93,0xe4,0x73,0xb4,0x8c,0xfe,0x96,0xdd,0xcf,0x88,0xfc,0xf7,0xbf,0xda,0xc0}, "KRL ", 18}, - {{0xdf,0x13,0x38,0xFb,0xAf,0xe7,0xaF,0x17,0x89,0x15,0x16,0x27,0xB8,0x86,0x78,0x1b,0xa5,0x56,0xeF,0x9a}, "KUE ", 18}, - {{0x24,0x1b,0xa6,0x72,0x57,0x4a,0x78,0xa3,0xa6,0x04,0xcd,0xd0,0xa9,0x44,0x29,0xa7,0x3a,0x84,0xa3,0x24}, "KWATT ", 18}, - {{0x95,0x41,0xFD,0x8B,0x9b,0x5F,0xA9,0x73,0x81,0x78,0x37,0x83,0xCe,0xBF,0x2F,0x5f,0xA7,0x93,0xC2,0x62}, "KZN ", 8}, - {{0xE5,0x03,0x65,0xf5,0xD6,0x79,0xCB,0x98,0xa1,0xdd,0x62,0xD6,0xF6,0xe5,0x8e,0x59,0x32,0x1B,0xcd,0xDf}, "LA ", 18}, - {{0xfD,0x10,0x7B,0x47,0x3A,0xB9,0x0e,0x8F,0xbd,0x89,0x87,0x21,0x44,0xa3,0xDC,0x92,0xC4,0x0F,0xa8,0xC9}, "LALA ", 18}, - {{0x2f,0x85,0xe5,0x02,0xa9,0x88,0xaf,0x76,0xf7,0xee,0x6d,0x83,0xb7,0xdb,0x8d,0x6c,0x0a,0x82,0x3b,0xf9}, "LATX ", 8}, - {{0xfe,0x5f,0x14,0x1b,0xf9,0x4f,0xe8,0x4b,0xc2,0x8d,0xed,0x0a,0xb9,0x66,0xc1,0x6b,0x17,0x49,0x06,0x57}, "LBA ", 18}, - {{0xaa,0x19,0x96,0x1b,0x6b,0x85,0x8d,0x9f,0x18,0xa1,0x15,0xf2,0x5a,0xa1,0xd9,0x8a,0xbc,0x1f,0xdb,0xa8}, "LCS ", 18}, - {{0x4a,0x37,0xa9,0x1e,0xec,0x4c,0x97,0xf9,0x09,0x0c,0xe6,0x6d,0x21,0xd3,0xb3,0xaa,0xdf,0x1a,0xe5,0xad}, "LCT ", 18}, - {{0x05,0xc7,0x06,0x5d,0x64,0x40,0x96,0xa4,0xe4,0xc3,0xfe,0x24,0xaf,0x86,0xe3,0x6d,0xe0,0x21,0x07,0x4b}, "LCT ", 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}, - {{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}, - {{0x0f,0x4c,0xa9,0x26,0x60,0xef,0xad,0x97,0xa9,0xa7,0x0c,0xb0,0xfe,0x96,0x9c,0x75,0x54,0x39,0x77,0x2c}, "LEV ", 9}, - {{0xc7,0x98,0xcd,0x1c,0x49,0xdb,0x0e,0x29,0x73,0x12,0xe4,0xc6,0x82,0x75,0x26,0x68,0xce,0x1d,0xb2,0xad}, "LFR ", 5}, - {{0xc5,0x20,0xF3,0xAc,0x30,0x3a,0x10,0x7D,0x8F,0x4B,0x08,0xb3,0x26,0xB6,0xea,0x66,0xA4,0xf9,0x61,0xcd}, "LG ", 18}, - {{0x59,0x06,0x1b,0x6f,0x26,0xBB,0x4A,0x9c,0xE5,0x82,0x8A,0x19,0xd3,0x5C,0xFD,0x5A,0x4B,0x80,0xF0,0x56}, "LGD ", 8}, - {{0x12,0x3a,0xb1,0x95,0xdd,0x38,0xb1,0xb4,0x05,0x10,0xd4,0x67,0xa6,0xa3,0x59,0xb2,0x01,0xaf,0x05,0x6f}, "LGO ", 8}, - {{0x2e,0xb8,0x6e,0x8f,0xc5,0x20,0xe0,0xf6,0xbb,0x5d,0x9a,0xf0,0x8f,0x92,0x4f,0xe7,0x05,0x58,0xab,0x89}, "LGR ", 8}, - {{0xe6,0xdf,0xbf,0x1f,0xac,0xa9,0x50,0x36,0xb8,0xe7,0x6e,0x1f,0xb2,0x89,0x33,0xd0,0x25,0xb7,0x6c,0xc0}, "LIBER ", 18}, - {{0xEB,0x99,0x51,0x02,0x16,0x98,0xB4,0x2e,0x43,0x99,0xf9,0xcB,0xb6,0x26,0x7A,0xa3,0x5F,0x82,0xD5,0x9D}, "LIF ", 18}, - {{0xff,0x18,0xdb,0xc4,0x87,0xb4,0xc2,0xe3,0x22,0x2d,0x11,0x59,0x52,0xba,0xbf,0xda,0x8b,0xa5,0x2f,0x5f}, "LIFE ", 18}, - {{0x02,0xf6,0x1f,0xd2,0x66,0xda,0x6e,0x8b,0x10,0x2d,0x41,0x21,0xf5,0xce,0x7b,0x99,0x26,0x40,0xcf,0x98}, "LIKE ", 18}, - {{0x51,0x49,0x10,0x77,0x1a,0xf9,0xca,0x65,0x6a,0xf8,0x40,0xdf,0xf8,0x3e,0x82,0x64,0xec,0xf9,0x86,0xca}, "ChainLnk ", 18}, - {{0xe2,0xe6,0xd4,0xbe,0x08,0x6c,0x69,0x38,0xb5,0x3b,0x22,0x14,0x48,0x55,0xee,0xf6,0x74,0x28,0x16,0x39}, "LINK ptf ", 18}, - {{0x24,0xA7,0x7c,0x1F,0x17,0xC5,0x47,0x10,0x5E,0x14,0x81,0x3e,0x51,0x7b,0xe0,0x6b,0x00,0x40,0xaa,0x76}, "LIVE ", 18}, - {{0x49,0xbd,0x2d,0xa7,0x5b,0x1f,0x7a,0xf1,0xe4,0xdf,0xd6,0xb1,0x12,0x5f,0xec,0xde,0x59,0xdb,0xec,0x58}, "LKY ", 18}, - {{0x25,0xB6,0x32,0x5f,0x5B,0xB1,0xc1,0xE0,0x3c,0xfb,0xC3,0xe5,0x3F,0x47,0x0E,0x1F,0x1c,0xa0,0x22,0xE3}, "LML ", 18}, - {{0x63,0xe6,0x34,0x33,0x0A,0x20,0x15,0x0D,0xbB,0x61,0xB1,0x56,0x48,0xbC,0x73,0x85,0x5d,0x6C,0xCF,0x07}, "LNC ", 18}, - {{0x6b,0xeb,0x41,0x8f,0xc6,0xe1,0x95,0x82,0x04,0xac,0x8b,0xad,0xdc,0xf1,0x09,0xb8,0xe9,0x69,0x49,0x66}, "LinkCoin ", 18}, - {{0x09,0x47,0xb0,0xe6,0xD8,0x21,0x37,0x88,0x05,0xc9,0x59,0x82,0x91,0x38,0x5C,0xE7,0xc7,0x91,0xA6,0xB2}, "LND ", 18}, - {{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}, - {{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}, - {{0xFB,0x12,0xe3,0xCc,0xA9,0x83,0xB9,0xf5,0x9D,0x90,0x91,0x2F,0xd1,0x7F,0x8D,0x74,0x5A,0x8B,0x29,0x53}, "LUCK ", 0}, - {{0xa8,0x9b,0x59,0x34,0x86,0x34,0x47,0xf6,0xe4,0xfc,0x53,0xb3,0x15,0xa9,0x3e,0x87,0x3b,0xda,0x69,0xa3}, "LUM ", 18}, - {{0xfa,0x05,0xA7,0x3F,0xfE,0x78,0xef,0x8f,0x1a,0x73,0x94,0x73,0xe4,0x62,0xc5,0x4b,0xae,0x65,0x67,0xD9}, "LUN ", 18}, - {{0x57,0xad,0x67,0xac,0xf9,0xbf,0x01,0x5e,0x48,0x20,0xfb,0xd6,0x6e,0xa1,0xa2,0x1b,0xed,0x88,0x52,0xec}, "LYM ", 18}, - {{0x3f,0x4b,0x72,0x66,0x68,0xda,0x46,0xf5,0xe0,0xe7,0x5a,0xa5,0xd4,0x78,0xac,0xec,0x9f,0x38,0x21,0x0f}, "M-ETH ", 18}, - {{0x5b,0x09,0xa0,0x37,0x1c,0x1d,0xa4,0x4a,0x8e,0x24,0xd3,0x6b,0xf5,0xde,0xb1,0x14,0x1a,0x84,0xd8,0x75}, "MAD ", 18}, - {{0xe2,0x5b,0xCe,0xc5,0xD3,0x80,0x1c,0xE3,0xa7,0x94,0x07,0x9B,0xF9,0x4a,0xdF,0x1B,0x8c,0xCD,0x80,0x2D}, "MAN ", 18}, - {{0x0F,0x5D,0x2f,0xB2,0x9f,0xb7,0xd3,0xCF,0xeE,0x44,0x4a,0x20,0x02,0x98,0xf4,0x68,0x90,0x8c,0xC9,0x42}, "MANA ", 18}, - {{0xfd,0xcc,0x07,0xAb,0x60,0x66,0x0d,0xe5,0x33,0xb5,0xAd,0x26,0xe1,0x45,0x7b,0x56,0x5a,0x9D,0x59,0xBd}, "MART ", 18}, - {{0x38,0x64,0x67,0xf1,0xf3,0xdd,0xbe,0x83,0x24,0x48,0x65,0x04,0x18,0x31,0x1a,0x47,0x9e,0xec,0xfc,0x57}, "MBRS ", 0}, - {{0x93,0xE6,0x82,0x10,0x7d,0x1E,0x9d,0xef,0xB0,0xb5,0xee,0x70,0x1C,0x71,0x70,0x7a,0x4B,0x2E,0x46,0xBc}, "MCAP ", 8}, - {{0x13,0x8A,0x87,0x52,0x09,0x3F,0x4f,0x9a,0x79,0xAa,0xeD,0xF4,0x8d,0x4B,0x92,0x48,0xfa,0xb9,0x3c,0x9C}, "MCI ", 18}, - {{0xB6,0x3B,0x60,0x6A,0xc8,0x10,0xa5,0x2c,0xCa,0x15,0xe4,0x4b,0xB6,0x30,0xfd,0x42,0xD8,0xd1,0xd8,0x3d}, "MCO ", 8}, - {{0x51,0xDB,0x5A,0xd3,0x5C,0x67,0x1a,0x87,0x20,0x7d,0x88,0xfC,0x11,0xd5,0x93,0xAC,0x0C,0x84,0x15,0xbd}, "MDA ", 18}, - {{0x66,0x18,0x60,0x08,0xC1,0x05,0x06,0x27,0xF9,0x79,0xd4,0x64,0xeA,0xBb,0x25,0x88,0x60,0x56,0x3d,0xbE}, "MDS ", 18}, - {{0x81,0x4e,0x09,0x08,0xb1,0x2a,0x99,0xfe,0xcf,0x5b,0xc1,0x01,0xbb,0x5d,0x0b,0x8b,0x5c,0xdf,0x7d,0x26}, "MDT ", 18}, - {{0xfd,0x1e,0x80,0x50,0x8f,0x24,0x3e,0x64,0xce,0x23,0x4e,0xa8,0x8a,0x5f,0xd2,0x82,0x7c,0x71,0xd4,0xb7}, "MEDX ", 8}, - {{0xf0,0x30,0x45,0xa4,0xc8,0x07,0x7e,0x38,0xf3,0xb8,0xe2,0xed,0x33,0xb8,0xae,0xe6,0x9e,0xdf,0x86,0x9f}, "MESH ", 18}, - {{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}, - {{0xa3,0xd5,0x8c,0x4e,0x56,0xfe,0xdc,0xae,0x3a,0x7c,0x43,0xa7,0x25,0xae,0xe9,0xa7,0x1f,0x0e,0xce,0x4e}, "MET ", 18}, - {{0xfe,0xf3,0x88,0x4b,0x60,0x3c,0x33,0xef,0x8e,0xd4,0x18,0x33,0x46,0xe0,0x93,0xa1,0x73,0xc9,0x4d,0xa6}, "METM ", 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}, - {{0x3a,0x12,0x37,0xd3,0x8d,0x0f,0xb9,0x45,0x13,0xf8,0x5d,0x61,0x67,0x9c,0xad,0x7f,0x38,0x50,0x72,0x42}, "MIC ", 18}, - {{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}, - {{0x4a,0x52,0x7d,0x8f,0xc1,0x3c,0x52,0x03,0xab,0x24,0xba,0x09,0x44,0xf4,0xcb,0x14,0x65,0x8d,0x1d,0xb6}, "MITx ", 18}, - {{0x9f,0x8F,0x72,0xaA,0x93,0x04,0xc8,0xB5,0x93,0xd5,0x55,0xF1,0x2e,0xF6,0x58,0x9c,0xC3,0xA5,0x79,0xA2}, "MKR ", 18}, - {{0x79,0x39,0x88,0x2b,0x54,0xfc,0xf0,0xbc,0xae,0x6b,0x53,0xde,0xc3,0x9a,0xd6,0xe8,0x06,0x17,0x64,0x42}, "MKT ", 8}, - {{0xBE,0xB9,0xeF,0x51,0x4a,0x37,0x9B,0x99,0x7e,0x07,0x98,0xFD,0xcC,0x90,0x1E,0xe4,0x74,0xB6,0xD9,0xA1}, "MLN ", 18}, - {{0x1a,0x95,0xB2,0x71,0xB0,0x53,0x5D,0x15,0xfa,0x49,0x93,0x2D,0xab,0xa3,0x1B,0xA6,0x12,0xb5,0x29,0x46}, "MNE ", 8}, - {{0xA9,0x87,0x7b,0x1e,0x05,0xD0,0x35,0x89,0x91,0x31,0xDB,0xd1,0xe4,0x03,0x82,0x51,0x66,0xD0,0x9f,0x92}, "MNT ", 18}, - {{0x83,0xce,0xe9,0xe0,0x86,0xa7,0x7e,0x49,0x2e,0xe0,0xbb,0x93,0xc2,0xb0,0x43,0x7a,0xd6,0xfd,0xec,0xcc}, "MNTP ", 18}, - {{0x86,0x5e,0xc5,0x8b,0x06,0xbf,0x63,0x05,0xb8,0x86,0x79,0x3a,0xa2,0x0a,0x2d,0xa3,0x1d,0x03,0x4e,0x68}, "MOC ", 18}, - {{0x95,0x7c,0x30,0xaB,0x04,0x26,0xe0,0xC9,0x3C,0xD8,0x24,0x1E,0x2c,0x60,0x39,0x2d,0x08,0xc6,0xaC,0x8e}, "MOD ", 0}, - {{0x50,0x12,0x62,0x28,0x1b,0x2b,0xa0,0x43,0xe2,0xfb,0xf1,0x49,0x04,0x98,0x06,0x89,0xcd,0xdb,0x0c,0x78}, "MORE ", 2}, - {{0x26,0x3c,0x61,0x84,0x80,0xdb,0xe3,0x5c,0x30,0x0d,0x8d,0x5e,0xcd,0xa1,0x9b,0xbb,0x98,0x6a,0xca,0xed}, "MOT ", 18}, - {{0xfb,0xd0,0xd1,0xc7,0x7b,0x50,0x17,0x96,0xa3,0x5d,0x86,0xcf,0x91,0xd6,0x5d,0x97,0x78,0xee,0xe6,0x95}, "MOVED ", 3}, - {{0x44,0xbf,0x22,0x94,0x9f,0x9c,0xc8,0x4b,0x61,0xb9,0x32,0x8a,0x9d,0x88,0x5d,0x1b,0x5c,0x80,0x6b,0x41}, "MOZO ", 2}, - {{0xf4,0x53,0xb5,0xb9,0xd4,0xe0,0xb5,0xc6,0x2f,0xfb,0x25,0x6b,0xb2,0x37,0x8c,0xc2,0xbc,0x8e,0x8a,0x89}, "MRK ", 8}, - {{0x82,0x12,0x5A,0xFe,0x01,0x81,0x9D,0xff,0x15,0x35,0xD0,0xD6,0x27,0x6d,0x57,0x04,0x52,0x91,0xB6,0xc0}, "MRL ", 18}, - {{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 Med ", 18}, - {{0xdf,0xdc,0x0d,0x82,0xd9,0x6f,0x8f,0xd4,0x0c,0xa0,0xcf,0xb4,0xa2,0x88,0x95,0x5b,0xec,0xec,0x20,0x88}, "MTC Mesh ", 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}, - {{0x7F,0xC4,0x08,0x01,0x11,0x65,0x76,0x0e,0xE3,0x1b,0xE2,0xBF,0x20,0xdA,0xf4,0x50,0x35,0x66,0x92,0xAf}, "MTR ", 8}, - {{0x1e,0x49,0xfF,0x77,0xc3,0x55,0xA3,0xe3,0x8D,0x66,0x51,0xce,0x84,0x04,0xAF,0x0E,0x48,0xc5,0x39,0x5f}, "MTRc ", 18}, - {{0x0A,0xF4,0x4e,0x27,0x84,0x63,0x72,0x18,0xdD,0x1D,0x32,0xA3,0x22,0xD4,0x4e,0x60,0x3A,0x8f,0x0c,0x6A}, "MTX ", 18}, - {{0x51,0x56,0x69,0xd3,0x08,0xf8,0x87,0xfd,0x83,0xa4,0x71,0xc7,0x76,0x4f,0x5d,0x08,0x48,0x86,0xd3,0x4d}, "MUXE ", 18}, - {{0xa8,0x49,0xea,0xae,0x99,0x4f,0xb8,0x6a,0xfa,0x73,0x38,0x2e,0x9b,0xd8,0x8c,0x2b,0x6b,0x18,0xdc,0x71}, "MVL ", 18}, - {{0x8a,0x77,0xe4,0x09,0x36,0xbb,0xc2,0x7e,0x80,0xe9,0xa3,0xf5,0x26,0x36,0x8c,0x96,0x78,0x69,0xc8,0x6d}, "MVP ", 18}, - {{0x64,0x25,0xc6,0xbe,0x90,0x2d,0x69,0x2a,0xe2,0xdb,0x75,0x2b,0x3c,0x26,0x8a,0xfa,0xdb,0x09,0x9d,0x3b}, "MWAT ", 18}, - {{0xf7,0xe9,0x83,0x78,0x16,0x09,0x01,0x23,0x07,0xf2,0x51,0x4f,0x63,0xD5,0x26,0xD8,0x3D,0x24,0xF4,0x66}, "MYD ", 16}, - {{0xa6,0x45,0x26,0x4C,0x56,0x03,0xE9,0x6c,0x3b,0x0B,0x07,0x8c,0xda,0xb6,0x87,0x33,0x79,0x4B,0x0A,0x71}, "MYST ", 8}, - {{0x8d,0x80,0xde,0x8A,0x78,0x19,0x83,0x96,0x32,0x9d,0xfA,0x76,0x9a,0xD5,0x4d,0x24,0xbF,0x90,0xE7,0xaa}, "NAC ", 18}, - {{0xff,0xe0,0x2e,0xe4,0xc6,0x9e,0xdf,0x1b,0x34,0x0f,0xca,0xd6,0x4f,0xbd,0x6b,0x37,0xa7,0xb9,0xe2,0x65}, "NANJ ", 8}, - {{0x5d,0x65,0xD9,0x71,0x89,0x5E,0xdc,0x43,0x8f,0x46,0x5c,0x17,0xDB,0x69,0x92,0x69,0x8a,0x52,0x31,0x8D}, "NAS ", 18}, - {{0x58,0x80,0x47,0x36,0x5d,0xf5,0xba,0x58,0x9f,0x92,0x36,0x04,0xaa,0xc2,0x3d,0x67,0x35,0x55,0xc6,0x23}, "NAVI ", 18}, - {{0x17,0xf8,0xaF,0xB6,0x3D,0xfc,0xDc,0xC9,0x0e,0xbE,0x6e,0x84,0xF0,0x60,0xCc,0x30,0x6A,0x98,0x25,0x7D}, "NBAI ", 18}, - {{0x9f,0x19,0x56,0x17,0xfa,0x8f,0xba,0xd9,0x54,0x0c,0x5d,0x11,0x3a,0x99,0xa0,0xa0,0x17,0x2a,0xae,0xdc}, "NBC ", 18}, - {{0x80,0x98,0x26,0xcc,0xea,0xb6,0x8c,0x38,0x77,0x26,0xaf,0x96,0x27,0x13,0xb6,0x4c,0xb5,0xcb,0x3c,0xca}, "NCASH ", 18}, - {{0x5d,0x48,0xf2,0x93,0xba,0xed,0x24,0x7a,0x2d,0x01,0x89,0x05,0x8b,0xa3,0x7a,0xa2,0x38,0xbd,0x47,0x25}, "NCC Neur ", 18}, - {{0x93,0x44,0xb3,0x83,0xb1,0xD5,0x9b,0x5c,0xe3,0x46,0x8B,0x23,0x4D,0xAB,0x43,0xC7,0x19,0x0b,0xa7,0x35}, "NCC Need ", 18}, - {{0x9e,0x46,0xa3,0x8f,0x5d,0xaa,0xbe,0x86,0x83,0xe1,0x07,0x93,0xb0,0x67,0x49,0xee,0xf7,0xd7,0x33,0xd1}, "NCT ", 18}, - {{0xa5,0x4d,0xdc,0x7b,0x3c,0xce,0x7f,0xc8,0xb1,0xe3,0xfa,0x02,0x56,0xd0,0xdb,0x80,0xd2,0xc1,0x09,0x70}, "NDC ", 18}, - {{0xcc,0x80,0xc0,0x51,0x05,0x7b,0x77,0x4c,0xd7,0x50,0x67,0xdc,0x48,0xf8,0x98,0x7c,0x4e,0xb9,0x7a,0x5e}, "NEC ", 18}, - {{0xd8,0x44,0x62,0x36,0xFA,0x95,0xb9,0xb5,0xf9,0xfd,0x0f,0x8E,0x7D,0xf1,0xa9,0x44,0x82,0x3c,0x68,0x3d}, "NEEO ", 18}, - {{0xcf,0xb9,0x86,0x37,0xbc,0xae,0x43,0xC1,0x33,0x23,0xEA,0xa1,0x73,0x1c,0xED,0x2B,0x71,0x69,0x62,0xfD}, "NET ", 18}, - {{0xa8,0x23,0xe6,0x72,0x20,0x06,0xaf,0xe9,0x9e,0x91,0xc3,0x0f,0xf5,0x29,0x50,0x52,0xfe,0x6b,0x8e,0x32}, "NEU ", 18}, - {{0x81,0x49,0x64,0xb1,0xbc,0xeA,0xf2,0x4e,0x26,0x29,0x6D,0x03,0x1E,0xaD,0xf1,0x34,0xa2,0xCa,0x41,0x05}, "NEWB ", 0}, - {{0xb6,0x21,0x32,0xe3,0x5a,0x6c,0x13,0xee,0x1e,0xe0,0xf8,0x4d,0xc5,0xd4,0x0b,0xad,0x8d,0x81,0x52,0x06}, "NEXO ", 18}, - {{0x72,0xdd,0x4b,0x6b,0xd8,0x52,0xa3,0xaa,0x17,0x2b,0xe4,0xd6,0xc5,0xa6,0xdb,0xec,0x58,0x8c,0xf1,0x31}, "NGC ", 18}, - {{0xe2,0x65,0x17,0xA9,0x96,0x72,0x99,0x45,0x3d,0x3F,0x1B,0x48,0xAa,0x00,0x5E,0x61,0x27,0xe6,0x72,0x10}, "NIMFA ", 18}, - {{0x55,0x54,0xe0,0x4e,0x76,0x53,0x3e,0x1d,0x14,0xc5,0x2f,0x05,0xbe,0xef,0x6c,0x9d,0x32,0x9e,0x1e,0x30}, "NIO ", 0}, - {{0x17,0x76,0xe1,0xF2,0x6f,0x98,0xb1,0xA5,0xdF,0x9c,0xD3,0x47,0x95,0x3a,0x26,0xdd,0x3C,0xb4,0x66,0x71}, "NMR ", 18}, - {{0x58,0xa4,0x88,0x41,0x82,0xd9,0xe8,0x35,0x59,0x7f,0x40,0x5e,0x5f,0x25,0x82,0x90,0xe4,0x6a,0xe7,0xc2}, "NOAH ", 18}, - {{0xf4,0xfa,0xea,0x45,0x55,0x75,0x35,0x4d,0x26,0x99,0xbc,0x20,0x9b,0x0a,0x65,0xca,0x99,0xf6,0x99,0x82}, "NOBS ", 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}, - {{0x28,0xb5,0xe1,0x2c,0xce,0x51,0xf1,0x55,0x94,0xb0,0xb9,0x1d,0x5b,0x5a,0xda,0xa7,0x0f,0x68,0x4a,0x02}, "NPX ", 2}, - {{0xa1,0x5c,0x7e,0xbe,0x1f,0x07,0xca,0xf6,0xbf,0xf0,0x97,0xd8,0xa5,0x89,0xfb,0x8a,0xc4,0x9a,0xe5,0xb3}, "NPXS ", 18}, - {{0x69,0xbe,0xab,0x40,0x34,0x38,0x25,0x3f,0x13,0xb6,0xe9,0x2d,0xb9,0x1f,0x7f,0xb8,0x49,0x25,0x82,0x63}, "NTK ", 18}, - {{0x5d,0x4d,0x57,0xcd,0x06,0xfa,0x7f,0xe9,0x9e,0x26,0xfd,0xc4,0x81,0xb4,0x68,0xf7,0x7f,0x05,0x07,0x3c}, "NTK ", 18}, - {{0x8a,0x99,0xed,0x8a,0x1b,0x20,0x49,0x03,0xee,0x46,0xe7,0x33,0xf2,0xc1,0x28,0x6f,0x6d,0x20,0xb1,0x77}, "NTO ", 18}, - {{0x22,0x33,0x79,0x9e,0xe2,0x68,0x3d,0x75,0xdf,0xef,0xac,0xbc,0xd2,0xa2,0x6c,0x78,0xd3,0x4b,0x47,0x0d}, "NTWK ", 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}, "sUSD ", 18}, - {{0x76,0x27,0xde,0x4b,0x93,0x26,0x3a,0x6a,0x75,0x70,0xb8,0xda,0xfa,0x64,0xba,0xe8,0x12,0xe5,0xc3,0x94}, "NXX ", 8}, - {{0x5c,0x61,0x83,0xd1,0x0A,0x00,0xCD,0x74,0x7a,0x6D,0xbb,0x5F,0x65,0x8a,0xD5,0x14,0x38,0x3e,0x94,0x19}, "NXX OLD ", 8}, - {{0x45,0xe4,0x2D,0x65,0x9D,0x9f,0x94,0x66,0xcD,0x5D,0xF6,0x22,0x50,0x60,0x33,0x14,0x5a,0x9b,0x89,0xBc}, "NxC ", 3}, - {{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}, - {{0x40,0x92,0x67,0x8e,0x4e,0x78,0x23,0x0f,0x46,0xa1,0x53,0x4c,0x0f,0xbc,0x8f,0xa3,0x97,0x80,0x89,0x2b}, "OCN ", 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}, - {{0xc6,0x6e,0xa8,0x02,0x71,0x7b,0xfb,0x98,0x33,0x40,0x02,0x64,0xdd,0x12,0xc2,0xbc,0xea,0xa3,0x4a,0x6d}, "OLD_MKR ", 18}, - {{0x9d,0x92,0x23,0x43,0x6d,0xdd,0x46,0x6f,0xc2,0x47,0xe9,0xdb,0xbd,0x20,0x20,0x7e,0x64,0x0f,0xef,0x58}, "OLE ", 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}, - {{0xb5,0xdb,0xc6,0xd3,0xcf,0x38,0x00,0x79,0xdf,0x3b,0x27,0x13,0x56,0x64,0xb6,0xbc,0xf4,0x5d,0x18,0x69}, "OMX ", 8}, - {{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}, - {{0x68,0x63,0xbe,0x0e,0x7c,0xf7,0xce,0x86,0x0a,0x57,0x47,0x60,0xe9,0x02,0x0d,0x51,0x9a,0x8b,0xdc,0x47}, "ONL ", 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}, - {{0x83,0x29,0x04,0x86,0x39,0x78,0xb9,0x48,0x02,0x12,0x31,0x06,0xe6,0xeb,0x49,0x1b,0xdf,0x0d,0xf9,0x28}, "OPTI ", 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}, - {{0xd2,0xfa,0x8f,0x92,0xea,0x72,0xab,0xb3,0x5d,0xbd,0x6d,0xec,0xa5,0x71,0x73,0xd2,0x2d,0xb2,0xba,0x49}, "ORI ", 18}, - {{0x51,0x6E,0x54,0x36,0xbA,0xfd,0xc1,0x10,0x83,0x65,0x4D,0xE7,0xBb,0x9b,0x95,0x38,0x2d,0x08,0xd5,0xDE}, "ORME ", 8}, - {{0xeb,0x9a,0x4b,0x18,0x58,0x16,0xc3,0x54,0xdb,0x92,0xdb,0x09,0xcc,0x3b,0x50,0xbe,0x60,0xb9,0x01,0xb6}, "ORS ", 18}, - {{0x2C,0x4e,0x8f,0x2D,0x74,0x61,0x13,0xd0,0x69,0x6c,0xE8,0x9B,0x35,0xF0,0xd8,0xbF,0x88,0xE0,0xAE,0xcA}, "OST ", 18}, - {{0x88,0x1e,0xf4,0x82,0x11,0x98,0x2d,0x01,0xe2,0xcb,0x70,0x92,0xc9,0x15,0xe6,0x47,0xcd,0x40,0xd8,0x5c}, "OTN ", 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}, - {{0xb9,0xbb,0x08,0xab,0x7e,0x9f,0xa0,0xa1,0x35,0x6b,0xd4,0xa3,0x9e,0xc0,0xca,0x26,0x7e,0x03,0xb0,0xb3}, "PAI ", 18}, - {{0xfe,0xDA,0xE5,0x64,0x26,0x68,0xf8,0x63,0x6A,0x11,0x98,0x7F,0xf3,0x86,0xbf,0xd2,0x15,0xF9,0x42,0xEE}, "PAL ", 18}, - {{0xea,0x5f,0x88,0xe5,0x4d,0x98,0x2c,0xbb,0x0c,0x44,0x1c,0xde,0x4e,0x79,0xbc,0x30,0x5e,0x5b,0x43,0xbc}, "PARETO ", 18}, - {{0x6d,0xd4,0xe4,0xaa,0xd2,0x9a,0x40,0xed,0xd6,0xa4,0x09,0xb9,0xc1,0x62,0x51,0x86,0xc9,0x85,0x5b,0x4d}, "PARKGEN ", 8}, - {{0x77,0x76,0x1e,0x63,0xc0,0x5a,0xee,0x66,0x48,0xfd,0xae,0xaa,0x9b,0x94,0x24,0x83,0x51,0xaf,0x9b,0xcd}, "PASS ", 18}, - {{0xF3,0xb3,0xCa,0xd0,0x94,0xB8,0x93,0x92,0xfc,0xE5,0xfa,0xFD,0x40,0xbC,0x03,0xb8,0x0F,0x2B,0xc6,0x24}, "PAT ", 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}, - {{0x8e,0x87,0x0d,0x67,0xf6,0x60,0xd9,0x5d,0x5b,0xe5,0x30,0x38,0x0d,0x0e,0xc0,0xbd,0x38,0x82,0x89,0xe1}, "PAX ", 18}, - {{0xB9,0x70,0x48,0x62,0x8D,0xB6,0xB6,0x61,0xD4,0xC2,0xaA,0x83,0x3e,0x95,0xDb,0xe1,0xA9,0x05,0xB2,0x80}, "PAY ", 18}, - {{0x55,0x64,0x8d,0xe1,0x98,0x36,0x33,0x85,0x49,0x13,0x0b,0x1a,0xf5,0x87,0xf1,0x6b,0xea,0x46,0xf6,0x6b}, "PBL ", 18}, - {{0xF4,0xc0,0x7b,0x18,0x65,0xbC,0x32,0x6A,0x3c,0x01,0x33,0x94,0x92,0xCa,0x75,0x38,0xFD,0x03,0x8C,0xc0}, "PBT ", 4}, - {{0xfc,0xAC,0x7A,0x75,0x15,0xe9,0xA9,0xd7,0x61,0x9f,0xA7,0x7A,0x1f,0xa7,0x38,0x11,0x1f,0x66,0x72,0x7e}, "PCH ", 18}, - {{0xe3,0xf4,0xb4,0xa5,0xd9,0x1e,0x5c,0xb9,0x43,0x5b,0x94,0x7f,0x09,0x0a,0x31,0x97,0x37,0x03,0x63,0x12}, "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}, - {{0x0d,0xb0,0x3B,0x6C,0xDe,0x0B,0x2d,0x42,0x7C,0x64,0xa0,0x4F,0xeA,0xfd,0x82,0x59,0x38,0x36,0x8f,0x1F}, "PDATA ", 18}, - {{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}, - {{0x2f,0xa3,0x2a,0x39,0xfc,0x1c,0x39,0x9e,0x0c,0xc7,0xb2,0x93,0x58,0x68,0xf5,0x16,0x5d,0xe7,0xce,0x97}, "PFR ", 8}, - {{0x13,0xc2,0xfa,0xb6,0x35,0x4d,0x37,0x90,0xd8,0xec,0xe4,0xf0,0xf1,0xa3,0x28,0x0b,0x4a,0x25,0xad,0x96}, "PHI ", 18}, - {{0xE6,0x45,0x09,0xF0,0xbf,0x07,0xce,0x2d,0x29,0xA7,0xeF,0x19,0xA8,0xA9,0xbc,0x06,0x54,0x77,0xC1,0xB4}, "PIPL ", 8}, - {{0x0f,0xf1,0x61,0x07,0x1e,0x62,0x7a,0x0e,0x6d,0xe1,0x38,0x10,0x5c,0x73,0x97,0x0f,0x86,0xca,0x79,0x22}, "PIT ", 18}, - {{0x8e,0xFF,0xd4,0x94,0xeB,0x69,0x8c,0xc3,0x99,0xAF,0x62,0x31,0xfC,0xcd,0x39,0xE0,0x8f,0xd2,0x0B,0x15}, "PIX ", 0}, - {{0x02,0xf2,0xd4,0xa0,0x4e,0x6e,0x01,0xac,0xe8,0x8b,0xd2,0xcd,0x63,0x28,0x75,0x54,0x3b,0x2e,0xf5,0x77}, "PKG ", 18}, - {{0x26,0x04,0xfa,0x40,0x6b,0xe9,0x57,0xe5,0x42,0xbe,0xb8,0x9e,0x67,0x54,0xfc,0xde,0x68,0x15,0xe8,0x3f}, "PKT ", 18}, - {{0x59,0x41,0x6A,0x25,0x62,0x8A,0x76,0xb4,0x73,0x0e,0xC5,0x14,0x86,0x11,0x4c,0x32,0xE0,0xB5,0x82,0xA1}, "PLASMA ", 6}, - {{0xE4,0x77,0x29,0x2f,0x1B,0x32,0x68,0x68,0x7A,0x29,0x37,0x61,0x16,0xB0,0xED,0x27,0xA9,0xc7,0x61,0x70}, "PLAY ", 18}, - {{0x0A,0xfF,0xa0,0x6e,0x7F,0xbe,0x5b,0xC9,0xa7,0x64,0xC9,0x79,0xaA,0x66,0xE8,0x25,0x6A,0x63,0x1f,0x02}, "PLBT ", 6}, - {{0xe3,0x81,0x85,0x04,0xc1,0xB3,0x2b,0xF1,0x55,0x7b,0x16,0xC2,0x38,0xB2,0xE0,0x1F,0xd3,0x14,0x9C,0x17}, "PLR ", 18}, - {{0xD8,0x91,0x2C,0x10,0x68,0x1D,0x8B,0x21,0xFd,0x37,0x42,0x24,0x4f,0x44,0x65,0x8d,0xBA,0x12,0x26,0x4E}, "PLU ", 18}, - {{0x84,0x6c,0x66,0xcf,0x71,0xc4,0x3f,0x80,0x40,0x3b,0x51,0xfe,0x39,0x06,0xb3,0x59,0x9d,0x63,0x33,0x6f}, "PMA ", 18}, - {{0x81,0xb4,0xd0,0x86,0x45,0xda,0x11,0x37,0x4a,0x03,0x74,0x9a,0xb1,0x70,0x83,0x6e,0x4e,0x53,0x97,0x67}, "PMNT ", 9}, - {{0x93,0xed,0x3f,0xbe,0x21,0x20,0x7e,0xc2,0xe8,0xf2,0xd3,0xc3,0xde,0x6e,0x05,0x8c,0xb7,0x3b,0xc0,0x4d}, "PNK ", 18}, - {{0x67,0x58,0xb7,0xd4,0x41,0xa9,0x73,0x9b,0x98,0x55,0x2b,0x37,0x37,0x03,0xd8,0xd3,0xd1,0x4f,0x9e,0x62}, "POA20 ", 18}, - {{0x0e,0x09,0x89,0xb1,0xf9,0xb8,0xa3,0x89,0x83,0xc2,0xba,0x80,0x53,0x26,0x9c,0xa6,0x2e,0xc9,0xb1,0x95}, "POE ", 8}, - {{0x43,0xf6,0xa1,0xbe,0x99,0x2d,0xee,0x40,0x87,0x21,0x74,0x84,0x90,0x77,0x2b,0x15,0x14,0x3c,0xe0,0xa7}, "POIN ", 0}, - {{0x70,0x5E,0xE9,0x6c,0x1c,0x16,0x08,0x42,0xC9,0x2c,0x1a,0xeC,0xfC,0xFf,0xcc,0xc9,0xC4,0x12,0xe3,0xD9}, "POLL ", 18}, - {{0x99,0x92,0xeC,0x3c,0xF6,0xA5,0x5b,0x00,0x97,0x8c,0xdD,0xF2,0xb2,0x7B,0xC6,0x88,0x2d,0x88,0xD1,0xeC}, "POLY ", 18}, - {{0x77,0x9B,0x7b,0x71,0x3C,0x86,0xe3,0xE6,0x77,0x4f,0x50,0x40,0xD9,0xcC,0xC2,0xD4,0x3a,0xd3,0x75,0xF8}, "POOL ", 8}, - {{0xee,0x60,0x9f,0xe2,0x92,0x12,0x8c,0xad,0x03,0xb7,0x86,0xdb,0xb9,0xbc,0x26,0x34,0xcc,0xdb,0xe7,0xfc}, "POS ", 18}, - {{0x59,0x58,0x32,0xf8,0xfc,0x6b,0xf5,0x9c,0x85,0xc5,0x27,0xfe,0xc3,0x74,0x0a,0x1b,0x7a,0x36,0x12,0x69}, "POWR ", 6}, - {{0xc4,0x22,0x09,0xac,0xcc,0x14,0x02,0x9c,0x10,0x12,0xfb,0x56,0x80,0xd9,0x5f,0xbd,0x60,0x36,0xe2,0xa0}, "PPP ", 18}, - {{0xd4,0xfa,0x14,0x60,0xF5,0x37,0xbb,0x90,0x85,0xd2,0x2C,0x7b,0xcC,0xB5,0xDD,0x45,0x0E,0xf2,0x8e,0x3a}, "PPT ", 8}, - {{0x88,0xa3,0xe4,0xf3,0x5d,0x64,0xaa,0xd4,0x1a,0x6d,0x40,0x30,0xac,0x9a,0xfe,0x43,0x56,0xcb,0x84,0xfa}, "PRE ", 18}, - {{0x77,0x28,0xdf,0xef,0x5a,0xbd,0x46,0x86,0x69,0xeb,0x7f,0x9b,0x48,0xa7,0xf7,0x0a,0x50,0x1e,0xd2,0x9d}, "PRG ", 6}, - {{0x3a,0xdf,0xc4,0x99,0x9f,0x77,0xd0,0x4c,0x83,0x41,0xba,0xc5,0xf3,0xa7,0x6f,0x58,0xdf,0xf5,0xb3,0x7a}, "PRIX ", 8}, - {{0x18,0x44,0xb2,0x15,0x93,0x26,0x26,0x68,0xb7,0x24,0x8d,0x0f,0x57,0xa2,0x20,0xca,0xab,0xa4,0x6a,0xb9}, "PRL ", 18}, - {{0x90,0x41,0xfe,0x5b,0x3f,0xde,0xa0,0xf5,0xe4,0xaf,0xdc,0x17,0xe7,0x51,0x80,0x73,0x8d,0x87,0x7a,0x01}, "PRO ", 18}, - {{0x22,0x6b,0xb5,0x99,0xa1,0x2C,0x82,0x64,0x76,0xe3,0xA7,0x71,0x45,0x46,0x97,0xEA,0x52,0xE9,0xE2,0x20}, "PRO ", 8}, - {{0xA3,0x14,0x9E,0x0f,0xA0,0x06,0x1A,0x90,0x07,0xfA,0xf3,0x07,0x07,0x4c,0xdC,0xd2,0x90,0xf0,0xe2,0xFd}, "PRON ", 8}, - {{0xE4,0x0C,0x37,0x4d,0x88,0x05,0xb1,0xdD,0x58,0xCD,0xcE,0xFf,0x99,0x8A,0x2F,0x69,0x20,0xCb,0x52,0xFD}, "PRPS ", 18}, - {{0x16,0x37,0x33,0xbc,0xc2,0x8d,0xbf,0x26,0xB4,0x1a,0x8C,0xfA,0x83,0xe3,0x69,0xb5,0xB3,0xaf,0x74,0x1b}, "PRS ", 18}, - {{0x0c,0x04,0xd4,0xf3,0x31,0xda,0x8d,0xf7,0x5f,0x9e,0x2e,0x27,0x1e,0x3f,0x3f,0x14,0x94,0xc6,0x6c,0x36}, "PRSP ", 9}, - {{0x5d,0x4a,0xbc,0x77,0xb8,0x40,0x5a,0xd1,0x77,0xd8,0xac,0x66,0x82,0xd5,0x84,0xec,0xbf,0xd4,0x6c,0xec}, "PST ", 18}, - {{0x66,0x49,0x7a,0x28,0x3e,0x0a,0x00,0x7b,0xa3,0x97,0x4e,0x83,0x77,0x84,0xc6,0xae,0x32,0x34,0x47,0xde}, "PT ", 18}, - {{0x2a,0x8E,0x98,0xe2,0x56,0xf3,0x22,0x59,0xb5,0xE5,0xCb,0x55,0xDd,0x63,0xC8,0xe8,0x91,0x95,0x06,0x66}, "PTC ", 18}, - {{0x49,0x46,0x58,0x3c,0x5b,0x86,0xe0,0x1c,0xcd,0x30,0xc7,0x1a,0x05,0x61,0x7d,0x06,0xe3,0xe7,0x30,0x60}, "PTON ", 18}, - {{0x8A,0xe4,0xBF,0x2C,0x33,0xa8,0xe6,0x67,0xde,0x34,0xB5,0x49,0x38,0xB0,0xcc,0xD0,0x3E,0xb8,0xCC,0x06}, "PTOY ", 8}, - {{0x46,0x89,0xa4,0xe1,0x69,0xeb,0x39,0xcc,0x90,0x78,0xc0,0x94,0x0e,0x21,0xff,0x1a,0xa8,0xa3,0x9b,0x9c}, "PTT ", 18}, - {{0x55,0x12,0xe1,0xd6,0xa7,0xbe,0x42,0x4b,0x43,0x23,0x12,0x6b,0x4f,0x9e,0x86,0xd0,0x23,0xf9,0x57,0x64}, "PTWO ", 18}, - {{0xef,0x6b,0x4c,0xe8,0xc9,0xbc,0x83,0x74,0x4f,0xbc,0xde,0x26,0x57,0xb3,0x2e,0xc1,0x87,0x90,0x45,0x8a}, "PUC ", 0}, - {{0xc1,0x48,0x30,0xe5,0x3a,0xa3,0x44,0xe8,0xc1,0x46,0x03,0xa9,0x12,0x29,0xa0,0xb9,0x25,0xb0,0xb2,0x62}, "PXT ", 8}, - {{0x77,0x03,0xc3,0x5c,0xff,0xdc,0x5c,0xda,0x8d,0x27,0xaa,0x3d,0xf2,0xf9,0xba,0x69,0x64,0x54,0x4b,0x6e}, "PYLNT ", 18}, - {{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}, - {{0xcb,0x5e,0xa3,0xc1,0x90,0xd8,0xf8,0x2d,0xea,0xdf,0x7c,0xe5,0xaf,0x85,0x5d,0xdb,0xf3,0x3e,0x39,0x62}, "QBIT ", 6}, - {{0x24,0x67,0xaa,0x6b,0x5a,0x23,0x51,0x41,0x6f,0xd4,0xc3,0xde,0xf8,0x46,0x2d,0x84,0x1f,0xee,0xec,0xec}, "QBX ", 18}, - {{0xea,0x26,0xc4,0xac,0x16,0xd4,0xa5,0xa1,0x06,0x82,0x0b,0xc8,0xae,0xe8,0x5f,0xd0,0xb7,0xb2,0xb6,0x64}, "QKC ", 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}, - {{0x2C,0x3C,0x1F,0x05,0x18,0x7d,0xBa,0x7A,0x5f,0x2D,0xd4,0x7D,0xca,0x57,0x28,0x1C,0x4d,0x4F,0x18,0x3F}, "QTQ ", 18}, - {{0x9a,0x64,0x2d,0x6b,0x33,0x68,0xdd,0xc6,0x62,0xCA,0x24,0x4b,0xAd,0xf3,0x2c,0xDA,0x71,0x60,0x05,0xBC}, "QTUM ", 18}, - {{0x26,0x4d,0xc2,0xde,0xdc,0xdc,0xbb,0x89,0x75,0x61,0xa5,0x7c,0xba,0x50,0x85,0xca,0x41,0x6f,0xb7,0xb4}, "QUN ", 18}, - {{0x11,0x83,0xf9,0x2a,0x56,0x24,0xd6,0x8e,0x85,0xff,0xb9,0x17,0x0f,0x16,0xbf,0x04,0x43,0xb4,0xc2,0x42}, "QVT ", 18}, - {{0x48,0xf7,0x75,0xef,0xbe,0x4f,0x5e,0xce,0x6e,0x0d,0xf2,0xf7,0xb5,0x93,0x2d,0xf5,0x68,0x23,0xb9,0x90}, "R ", 0}, - {{0x45,0xed,0xb5,0x35,0x94,0x2a,0x8c,0x84,0xd9,0xf4,0xb5,0xd3,0x7e,0x1b,0x25,0xf9,0x1e,0xa4,0x80,0x4c}, "RAO ", 18}, - {{0xfc,0x2c,0x4d,0x8f,0x95,0x00,0x2c,0x14,0xed,0x0a,0x7a,0xa6,0x51,0x02,0xca,0xc9,0xe5,0x95,0x3b,0x5e}, "RBLX ", 18}, - {{0xf9,0x70,0xb8,0xe3,0x6e,0x23,0xf7,0xfc,0x3f,0xd7,0x52,0xee,0xa8,0x6f,0x8b,0xe8,0xd8,0x33,0x75,0xa6}, "RCN ", 18}, - {{0x13,0xf2,0x5c,0xd5,0x2b,0x21,0x65,0x0c,0xaa,0x82,0x25,0xc9,0x94,0x23,0x37,0xd9,0x14,0xc9,0xb0,0x30}, "RCT ", 18}, - {{0x25,0x5a,0xa6,0xdf,0x07,0x54,0x0c,0xb5,0xd3,0xd2,0x97,0xf0,0xd0,0xd4,0xd8,0x4c,0xb5,0x2b,0xc8,0xe6}, "RDN ", 18}, - {{0x76,0x7b,0xA2,0x91,0x5E,0xC3,0x44,0x01,0x5a,0x79,0x38,0xE3,0xeE,0xDf,0xeC,0x27,0x85,0x19,0x5D,0x05}, "REA ", 18}, - {{0x92,0x14,0xec,0x02,0xcb,0x71,0xcb,0xa0,0xad,0xa6,0x89,0x6b,0x8d,0xa2,0x60,0x73,0x6a,0x67,0xab,0x10}, "REAL ", 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}, - {{0x89,0x30,0x35,0x00,0xa7,0xab,0xfb,0x17,0x8b,0x27,0x4f,0xd8,0x9f,0x24,0x69,0xc2,0x64,0x95,0x1e,0x1f}, "REF ", 8}, - {{0x83,0x98,0x4d,0x61,0x42,0x93,0x4b,0xb5,0x35,0x79,0x3a,0x82,0xad,0xb0,0xa4,0x6e,0xf0,0xf6,0x6b,0x6d}, "REM ", 4}, - {{0x40,0x8e,0x41,0x87,0x6c,0xCC,0xDC,0x0F,0x92,0x21,0x06,0x00,0xef,0x50,0x37,0x26,0x56,0x05,0x2a,0x38}, "REN ", 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}, - {{0x4c,0x38,0x3b,0xdc,0xae,0x52,0xa6,0xe1,0xcb,0x81,0x0c,0x76,0xc7,0x0d,0x6f,0x31,0xa2,0x49,0xec,0x9b}, "RGS ", 8}, - {{0x16,0x82,0x96,0xbb,0x09,0xe2,0x4a,0x88,0x80,0x5c,0xb9,0xc3,0x33,0x56,0x53,0x6b,0x98,0x0d,0x3f,0xc5}, "RHOC ", 8}, - {{0x94,0x69,0xD0,0x13,0x80,0x5b,0xFf,0xB7,0xD3,0xDE,0xBe,0x5E,0x78,0x39,0x23,0x7e,0x53,0x5e,0xc4,0x83}, "RING ", 18}, - {{0xdd,0x00,0x72,0x78,0xb6,0x67,0xf6,0xbe,0xf5,0x2f,0xd0,0xa4,0xc2,0x36,0x04,0xaa,0x1f,0x96,0x03,0x9a}, "RIPT ", 8}, - {{0x0b,0x17,0x24,0xcc,0x9f,0xda,0x01,0x86,0x91,0x1e,0xf6,0xa7,0x59,0x49,0xe9,0xc0,0xd3,0xf0,0xf2,0xf3}, "RIYA ", 8}, - {{0x10,0x6a,0xa4,0x92,0x95,0xb5,0x25,0xfc,0xf9,0x59,0xaa,0x75,0xec,0x3f,0x7d,0xcb,0xf5,0x35,0x2f,0x1c}, "RKT ", 18}, - {{0x60,0x7F,0x4C,0x5B,0xB6,0x72,0x23,0x0e,0x86,0x72,0x08,0x55,0x32,0xf7,0xe9,0x01,0x54,0x4a,0x73,0x75}, "RLC ", 9}, - {{0xcC,0xeD,0x5B,0x82,0x88,0x08,0x6B,0xE8,0xc3,0x8E,0x23,0x56,0x7e,0x68,0x4C,0x37,0x40,0xbe,0x4D,0x48}, "RLT ", 10}, - {{0xbe,0x99,0xB0,0x97,0x09,0xfc,0x75,0x3b,0x09,0xBC,0xf5,0x57,0xA9,0x92,0xF6,0x60,0x5D,0x59,0x97,0xB0}, "RLTY ", 8}, - {{0x4a,0x42,0xd2,0xc5,0x80,0xf8,0x3d,0xce,0x40,0x4a,0xca,0xd1,0x8d,0xab,0x26,0xdb,0x11,0xa1,0x75,0x0e}, "RLX ", 18}, - {{0x7d,0xc4,0xf4,0x12,0x94,0x69,0x7a,0x79,0x03,0xc4,0x02,0x7f,0x6a,0xc5,0x28,0xc5,0xd1,0x4c,0xd7,0xeb}, "RMC ", 8}, - {{0x8d,0x56,0x82,0x94,0x1c,0xe4,0x56,0x90,0x0b,0x12,0xd4,0x7a,0xc0,0x6a,0x88,0xb4,0x7c,0x76,0x4c,0xe1}, "RMESH ", 18}, - {{0x09,0x96,0xbf,0xb5,0xd0,0x57,0xfa,0xa2,0x37,0x64,0x0e,0x25,0x06,0xbe,0x7b,0x4f,0x9c,0x46,0xde,0x0b}, "RNDR ", 18}, - {{0xff,0x60,0x3f,0x43,0x94,0x6a,0x3a,0x28,0xdf,0x5e,0x6a,0x73,0x17,0x25,0x55,0xd8,0xc8,0xb0,0x23,0x86}, "RNT ", 18}, - {{0x1f,0xe7,0x0b,0xe7,0x34,0xe4,0x73,0xe5,0x72,0x1e,0xa5,0x7c,0x8b,0x5b,0x01,0xe6,0xca,0xa5,0x26,0x86}, "RNTB ", 18}, - {{0x1b,0xcb,0xc5,0x41,0x66,0xf6,0xba,0x14,0x99,0x34,0x87,0x0b,0x60,0x50,0x61,0x99,0xb6,0xc9,0xdb,0x6d}, "ROC ", 10}, - {{0xA4,0x01,0x06,0x13,0x4c,0x5b,0xF4,0xc4,0x14,0x11,0x55,0x4e,0x6d,0xb9,0x9B,0x95,0xA1,0x5e,0xd9,0xd8}, "ROCK ", 18}, - {{0xC1,0x6b,0x54,0x2f,0xf4,0x90,0xe0,0x1f,0xcc,0x0D,0xC5,0x8a,0x60,0xe1,0xEF,0xdc,0x3e,0x35,0x7c,0xA6}, "ROCK2 ", 0}, - {{0x0E,0x3d,0xe3,0xB0,0xE3,0xD6,0x17,0xFD,0x8D,0x1D,0x80,0x88,0x63,0x9b,0xA8,0x77,0xfe,0xb4,0xd7,0x42}, "ROCK2PAY ", 18}, - {{0xc9,0xde,0x4b,0x7f,0x0c,0x3d,0x99,0x1e,0x96,0x71,0x58,0xe4,0xd4,0xbf,0xa4,0xb5,0x1e,0xc0,0xb1,0x14}, "ROK ", 18}, - {{0x49,0x93,0xCB,0x95,0xc7,0x44,0x3b,0xdC,0x06,0x15,0x5c,0x5f,0x56,0x88,0xBe,0x9D,0x8f,0x69,0x99,0xa5}, "ROUND ", 18}, - {{0xb4,0xef,0xd8,0x5c,0x19,0x99,0x9d,0x84,0x25,0x13,0x04,0xbd,0xa9,0x9e,0x90,0xb9,0x23,0x00,0xbd,0x93}, "RPL ", 18}, - {{0xec,0x49,0x1c,0x10,0x88,0xea,0xe9,0x92,0xb7,0xa2,0x14,0xef,0xb0,0xa2,0x66,0xad,0x09,0x27,0xa7,0x2a}, "RTB ", 18}, - {{0x3f,0xd8,0xf3,0x9a,0x96,0x2e,0xfd,0xa0,0x49,0x56,0x98,0x1c,0x31,0xab,0x89,0xfa,0xb5,0xfb,0x8b,0xc8}, "RTH ", 18}, - {{0x54,0xb2,0x93,0x22,0x60,0x00,0xcc,0xBF,0xC0,0x4D,0xF9,0x02,0xeE,0xC5,0x67,0xCB,0x4C,0x35,0xa9,0x03}, "RTN ", 18}, - {{0xf2,0x78,0xc1,0xca,0x96,0x90,0x95,0xff,0xdd,0xde,0xd0,0x20,0x29,0x0c,0xf8,0xb5,0xc4,0x24,0xac,0xe2}, "RUFF ", 18}, - {{0xdE,0xE0,0x2D,0x94,0xbe,0x49,0x29,0xd2,0x6f,0x67,0xB6,0x4A,0xda,0x7a,0xCf,0x19,0x14,0x00,0x7F,0x10}, "RUNE ", 18}, - {{0x3d,0x1b,0xa9,0xbe,0x9f,0x66,0xb8,0xee,0x10,0x19,0x11,0xbc,0x36,0xd3,0xfb,0x56,0x2e,0xac,0x22,0x44}, "RVT ", 18}, - {{0xe8,0x66,0x3a,0x64,0xa9,0x61,0x69,0xff,0x4d,0x95,0xb4,0x29,0x9e,0x7a,0xe9,0xa7,0x6b,0x90,0x5b,0x31}, "Rating ", 8}, - {{0x1e,0xc8,0xfe,0x51,0xa9,0xb6,0xa3,0xa6,0xc4,0x27,0xd1,0x7d,0x9e,0xcc,0x30,0x60,0xfb,0xc4,0xa4,0x5c}, "S-A-PAT ", 18}, - {{0x3e,0xb9,0x1d,0x23,0x7e,0x49,0x1e,0x0d,0xee,0x85,0x82,0xc4,0x02,0xd8,0x5c,0xb4,0x40,0xfb,0x6b,0x54}, "S-ETH ", 18}, - {{0x41,0x56,0xD3,0x34,0x2D,0x5c,0x38,0x5a,0x87,0xD2,0x64,0xF9,0x06,0x53,0x73,0x35,0x92,0x00,0x05,0x81}, "SALT ", 8}, - {{0x7C,0x5A,0x0C,0xE9,0x26,0x7E,0xD1,0x9B,0x22,0xF8,0xca,0xe6,0x53,0xF1,0x98,0xe3,0xE8,0xda,0xf0,0x98}, "SAN ", 18}, - {{0x78,0xfe,0x18,0xe4,0x1f,0x43,0x6e,0x19,0x81,0xa3,0xa6,0x0d,0x15,0x57,0xc8,0xa7,0xa9,0x37,0x04,0x61}, "SCANDI ", 2}, - {{0xd7,0x63,0x17,0x87,0xb4,0xdc,0xc8,0x7b,0x12,0x54,0xcf,0xd1,0xe5,0xce,0x48,0xe9,0x68,0x23,0xde,0xe8}, "SCL ", 8}, - {{0x24,0xdc,0xc8,0x81,0xe7,0xdd,0x73,0x05,0x46,0x83,0x44,0x52,0xf2,0x18,0x72,0xd5,0xcb,0x4b,0x52,0x93}, "SCRL ", 18}, - {{0xa1,0x3f,0x07,0x43,0x95,0x1b,0x4f,0x6e,0x3e,0x3a,0xa0,0x39,0xf6,0x82,0xe1,0x72,0x79,0xf5,0x2b,0xc3}, "SENC ", 18}, - {{0x67,0x45,0xfA,0xB6,0x80,0x1e,0x37,0x6c,0xD2,0x4F,0x03,0x57,0x2B,0x9C,0x9B,0x0D,0x4E,0xdD,0xDC,0xcf}, "SENSE ", 8}, - {{0xa4,0x4e,0x51,0x37,0x29,0x3e,0x85,0x5b,0x1b,0x7b,0xc7,0xe2,0xc6,0xf8,0xcd,0x79,0x6f,0xfc,0xb0,0x37}, "SENT ", 8}, - {{0xe0,0x6e,0xda,0x74,0x35,0xba,0x74,0x9b,0x04,0x73,0x80,0xce,0xd4,0x91,0x21,0xdd,0xe9,0x33,0x34,0xae}, "SET ", 0}, - {{0x98,0xf5,0xe9,0xb7,0xf0,0xe3,0x39,0x56,0xc0,0x44,0x3e,0x81,0xbf,0x7d,0xeb,0x8b,0x5b,0x1e,0xd5,0x45}, "SEXY ", 18}, - {{0xa1,0xcc,0xc1,0x66,0xfa,0xf0,0xE9,0x98,0xb3,0xE3,0x32,0x25,0xA1,0xA0,0x30,0x1B,0x1C,0x86,0x11,0x9D}, "SGEL ", 18}, - {{0xb2,0x13,0x5a,0xb9,0x69,0x5a,0x76,0x78,0xdd,0x59,0x0b,0x1a,0x99,0x6c,0xb0,0xf3,0x7b,0xcb,0x07,0x18}, "SGN ", 9}, - {{0x33,0xc6,0x23,0xa2,0xba,0xaf,0xeb,0x8d,0x15,0xdf,0xaf,0x3c,0xe4,0x40,0x95,0xef,0xec,0x83,0xd7,0x2c}, "SGP ", 18}, - {{0xcb,0x5a,0x05,0xbe,0xf3,0x25,0x76,0x13,0xe9,0x84,0xc1,0x7d,0xbc,0xf0,0x39,0x95,0x2b,0x6d,0x88,0x3f}, "SGR ", 8}, - {{0x37,0x42,0x75,0x76,0x32,0x4f,0xE1,0xf3,0x62,0x5c,0x91,0x02,0x67,0x47,0x72,0xd7,0xCF,0x71,0x37,0x7d}, "SelfieYo ", 18}, - {{0xd2,0x48,0xB0,0xD4,0x8E,0x44,0xaa,0xF9,0xc4,0x9a,0xea,0x03,0x12,0xbe,0x7E,0x13,0xa6,0xdc,0x14,0x68}, "StatusGn ", 1}, - {{0xe2,0x5b,0x0b,0xba,0x01,0xdc,0x56,0x30,0x31,0x2b,0x6a,0x21,0x92,0x7e,0x57,0x80,0x61,0xa1,0x3f,0x55}, "SHIP ", 18}, - {{0xEF,0x2E,0x99,0x66,0xeb,0x61,0xBB,0x49,0x4E,0x53,0x75,0xd5,0xDf,0x8d,0x67,0xB7,0xdB,0x8A,0x78,0x0D}, "SHIT ", 0}, - {{0x85,0x42,0x32,0x5b,0x72,0xc6,0xd9,0xfc,0x0a,0xd2,0xca,0x96,0x5a,0x78,0x43,0x54,0x13,0xa9,0x15,0xa0}, "SHL ", 18}, - {{0xef,0x24,0x63,0x09,0x93,0x60,0xa0,0x85,0xf1,0xf1,0x0b,0x07,0x6e,0xd7,0x2e,0xf6,0x25,0x49,0x7a,0x06}, "SHP ", 18}, - {{0x8a,0x18,0x7d,0x52,0x85,0xd3,0x16,0xbc,0xbc,0x9a,0xda,0xfc,0x08,0xb5,0x1d,0x70,0xa0,0xd8,0xe0,0x00}, "SIFT ", 0}, - {{0x68,0x88,0xa1,0x6e,0xA9,0x79,0x2c,0x15,0xA4,0xDC,0xF2,0xf6,0xC6,0x23,0xD0,0x55,0xc8,0xeD,0xe7,0x92}, "SIG ", 18}, - {{0x4a,0xf3,0x28,0xc5,0x29,0x21,0x70,0x6d,0xcb,0x73,0x9f,0x25,0x78,0x62,0x10,0x49,0x91,0x69,0xaf,0xe6}, "SKB ", 8}, - {{0x13,0xDB,0x74,0xB3,0xcf,0x51,0x2F,0x65,0xC4,0xb9,0x16,0x83,0x94,0x0B,0x4f,0x39,0x55,0xE0,0x50,0x85}, "SKE ", 8}, - {{0x2b,0xDC,0x0D,0x42,0x99,0x60,0x17,0xfC,0xe2,0x14,0xb2,0x16,0x07,0xa5,0x15,0xDA,0x41,0xA9,0xE0,0xC5}, "SKIN ", 6}, - {{0xd9,0x9b,0x8a,0x7f,0xa4,0x8e,0x25,0xcc,0xe8,0x3b,0x81,0x81,0x22,0x20,0xa3,0xe0,0x3b,0xf6,0x4e,0x5f}, "SKM ", 18}, - {{0x49,0x94,0xe8,0x18,0x97,0xa9,0x20,0xc0,0xFE,0xA2,0x35,0xeb,0x8C,0xEd,0xEE,0xd3,0xc6,0xfF,0xF6,0x97}, "SKO1 ", 18}, - {{0x4c,0x38,0x2F,0x8E,0x09,0x61,0x5A,0xC8,0x6E,0x08,0xCE,0x58,0x26,0x6C,0xC2,0x27,0xe7,0xd4,0xD9,0x13}, "SKR ", 6}, - {{0xfd,0xFE,0x8b,0x7a,0xB6,0xCF,0x1b,0xD1,0xE3,0xd1,0x45,0x38,0xEf,0x40,0x68,0x62,0x96,0xC4,0x20,0x52}, "SKRP ", 18}, - {{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}, - {{0x39,0x01,0x3f,0x96,0x1c,0x37,0x8f,0x02,0xc2,0xb8,0x2a,0x6e,0x1d,0x31,0xe9,0x81,0x27,0x86,0xfd,0x9d}, "SMS ", 3}, - {{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}, - {{0x78,0xEb,0x8D,0xC6,0x41,0x07,0x7F,0x04,0x9f,0x91,0x06,0x59,0xb6,0xd5,0x80,0xE8,0x0d,0xC4,0xd2,0x37}, "SocialMk ", 8}, - {{0x19,0x8a,0x87,0xb3,0x11,0x41,0x43,0x91,0x3d,0x42,0x29,0xfb,0x0f,0x6d,0x4b,0xcb,0x44,0xaa,0x8a,0xff}, "SNBL ", 8}, - {{0xF4,0x13,0x41,0x46,0xAF,0x2d,0x51,0x1D,0xd5,0xEA,0x8c,0xDB,0x1C,0x4A,0xC8,0x8C,0x57,0xD6,0x04,0x04}, "SNC ", 18}, - {{0xf3,0x33,0xb2,0xAc,0xe9,0x92,0xac,0x2b,0xBD,0x87,0x98,0xbF,0x57,0xBc,0x65,0xa0,0x61,0x84,0xaf,0xBa}, "SND ", 0}, - {{0xcF,0xD6,0xAe,0x8B,0xF1,0x3f,0x42,0xDE,0x14,0x86,0x73,0x51,0xeA,0xff,0x7A,0x8A,0x3b,0x9F,0xbB,0xe7}, "SNG ", 8}, - {{0xae,0xC2,0xE8,0x7E,0x0A,0x23,0x52,0x66,0xD9,0xC5,0xAD,0xc9,0xDE,0xb4,0xb2,0xE2,0x9b,0x54,0xD0,0x09}, "SNGLS ", 0}, - {{0x44,0xF5,0x88,0xaE,0xeB,0x8C,0x44,0x47,0x14,0x39,0xD1,0x27,0x0B,0x36,0x03,0xc6,0x6a,0x92,0x62,0xF1}, "SNIP ", 18}, - {{0x98,0x3F,0x6d,0x60,0xdb,0x79,0xea,0x8c,0xA4,0xeB,0x99,0x68,0xC6,0xaF,0xf8,0xcf,0xA0,0x4B,0x3c,0x63}, "SNM ", 18}, - {{0xbd,0xc5,0xba,0xc3,0x9d,0xbe,0x13,0x2b,0x1e,0x03,0x0e,0x89,0x8a,0xe3,0x83,0x00,0x17,0xd7,0xd9,0x69}, "SNOV ", 18}, - {{0x74,0x4d,0x70,0xFD,0xBE,0x2B,0xa4,0xCF,0x95,0x13,0x16,0x26,0x61,0x4a,0x17,0x63,0xDF,0x80,0x5B,0x9E}, "SNT ", 18}, - {{0x28,0x59,0x02,0x1e,0xe7,0xf2,0xcb,0x10,0x16,0x2e,0x67,0xf3,0x3a,0xf2,0xd2,0x27,0x64,0xb3,0x1a,0xff}, "SNTR ", 4}, - {{0x2d,0x0e,0x95,0xbd,0x47,0x95,0xd7,0xac,0xe0,0xda,0x3c,0x0f,0xf7,0xb7,0x06,0xa5,0x97,0x0e,0xb9,0xd3}, "SOC ", 18}, - {{0x1f,0x54,0x63,0x8b,0x77,0x37,0x19,0x3f,0xfd,0x86,0xc1,0x9e,0xc5,0x19,0x07,0xa7,0xc4,0x17,0x55,0xd8}, "SOL ", 6}, - {{0x1c,0x62,0xac,0xa2,0xb7,0x60,0x5d,0xb3,0x60,0x6e,0xac,0xda,0x7b,0xc6,0x7a,0x18,0x57,0xdd,0xb8,0xff}, "SONIQ ", 18}, - {{0x42,0xd6,0x62,0x2d,0xec,0xe3,0x94,0xb5,0x49,0x99,0xfb,0xd7,0x3d,0x10,0x81,0x23,0x80,0x6f,0x6a,0x18}, "SPANK ", 18}, - {{0x58,0xbf,0x7d,0xf5,0x7d,0x9D,0xA7,0x11,0x3c,0x4c,0xCb,0x49,0xd8,0x46,0x3D,0x49,0x08,0xC7,0x35,0xcb}, "SPARC ", 18}, - {{0x24,0xae,0xf3,0xbf,0x1a,0x47,0x56,0x15,0x00,0xf9,0x43,0x0d,0x74,0xed,0x40,0x97,0xc4,0x7f,0x51,0xf2}, "SPARTA ", 4}, - {{0x1d,0xea,0x97,0x9a,0xe7,0x6f,0x26,0x07,0x18,0x70,0xf8,0x24,0x08,0x8d,0xa7,0x89,0x79,0xeb,0x91,0xc8}, "SPD ", 18}, - {{0x85,0x08,0x93,0x89,0xC1,0x4B,0xd9,0xc7,0x7F,0xC2,0xb8,0xF0,0xc3,0xd1,0xdC,0x33,0x63,0xBf,0x06,0xEf}, "SPF ", 18}, - {{0x38,0x33,0xdd,0xa0,0xae,0xb6,0x94,0x7b,0x98,0xce,0x45,0x4d,0x89,0x36,0x6c,0xba,0x8c,0xc5,0x55,0x28}, "SPHTX ", 18}, - {{0x03,0x24,0xdd,0x19,0x5d,0x0c,0xd5,0x3f,0x9f,0x07,0xbe,0xe6,0xa4,0x8e,0xe7,0xa2,0x0b,0xad,0x73,0x8f}, "SPICE ", 8}, - {{0x20,0xF7,0xA3,0xDd,0xF2,0x44,0xdc,0x92,0x99,0x97,0x5b,0x4D,0xa1,0xC3,0x9F,0x8D,0x5D,0x75,0xf0,0x5A}, "SPN ", 6}, - {{0x05,0xaa,0xaa,0x82,0x9a,0xfa,0x40,0x7d,0x83,0x31,0x5c,0xde,0xd1,0xd4,0x5e,0xb1,0x60,0x25,0x91,0x0c}, "SPX ", 18}, - {{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}, - {{0x62,0x4d,0x52,0x0b,0xab,0x2e,0x4a,0xd8,0x39,0x35,0xfa,0x50,0x3f,0xb1,0x30,0x61,0x43,0x74,0xe8,0x50}, "SSP ", 4}, - {{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}, - {{0x09,0xbc,0xa6,0xeb,0xab,0x05,0xee,0x2a,0xe9,0x45,0xbe,0x4e,0xda,0x51,0x39,0x3d,0x94,0xbf,0x7b,0x99}, "STB ", 4}, - {{0x62,0x9a,0xEe,0x55,0xed,0x49,0x58,0x1C,0x33,0xab,0x27,0xf9,0x40,0x3F,0x79,0x92,0xA2,0x89,0xff,0xd5}, "STC ", 18}, - {{0xaE,0x73,0xB3,0x8d,0x1c,0x9A,0x8b,0x27,0x41,0x27,0xec,0x30,0x16,0x0a,0x49,0x27,0xC4,0xd7,0x18,0x24}, "STK ", 18}, - {{0x59,0x93,0x46,0x77,0x9e,0x90,0xfc,0x3F,0x5F,0x99,0x7b,0x5e,0xa7,0x15,0x34,0x98,0x20,0xF9,0x15,0x71}, "STN ", 4}, - {{0xB6,0x4e,0xf5,0x1C,0x88,0x89,0x72,0xc9,0x08,0xCF,0xac,0xf5,0x9B,0x47,0xC1,0xAf,0xBC,0x0A,0xb8,0xaC}, "STORJ ", 8}, - {{0xD0,0xa4,0xb8,0x94,0x6C,0xb5,0x2f,0x06,0x61,0x27,0x3b,0xfb,0xC6,0xfD,0x0E,0x0C,0x75,0xFc,0x64,0x33}, "STORM ", 18}, - {{0xec,0xd5,0x70,0xbB,0xf7,0x47,0x61,0xb9,0x60,0xFa,0x04,0xCc,0x10,0xfe,0x2c,0x4e,0x86,0xFf,0xDA,0x36}, "STP ", 8}, - {{0x5c,0x3a,0x22,0x85,0x10,0xd2,0x46,0xb7,0x8a,0x37,0x65,0xc2,0x02,0x21,0xcb,0xf3,0x08,0x2b,0x44,0xa4}, "STQ ", 18}, - {{0xBA,0xE2,0x35,0x82,0x3D,0x72,0x55,0xD9,0xD4,0x86,0x35,0xcE,0xd4,0x73,0x52,0x27,0x24,0x4C,0xd5,0x83}, "STR ", 18}, - {{0x46,0x49,0x24,0x73,0x75,0x5e,0x8d,0xF9,0x60,0xF8,0x03,0x48,0x77,0xF6,0x17,0x32,0xD7,0x18,0xCE,0x96}, "STRC ", 8}, - {{0x03,0x71,0xa8,0x2e,0x4a,0x9d,0x0a,0x43,0x12,0xf3,0xee,0x2a,0xc9,0xc6,0x95,0x85,0x12,0x89,0x13,0x72}, "STU ", 18}, - {{0x00,0x6B,0xeA,0x43,0xBa,0xa3,0xf7,0xA6,0xf7,0x65,0xF1,0x4f,0x10,0xA1,0xa1,0xb0,0x83,0x34,0xEF,0x45}, "STX ", 18}, - {{0x12,0x48,0x0E,0x24,0xeb,0x5b,0xec,0x1a,0x9D,0x43,0x69,0xCa,0xB6,0xa8,0x0c,0xaD,0x3c,0x0A,0x37,0x7A}, "SUB ", 2}, - {{0xe1,0x20,0xc1,0xec,0xbf,0xdf,0xea,0x7f,0x0a,0x8f,0x0e,0xe3,0x00,0x63,0x49,0x1e,0x8c,0x26,0xfe,0xdf}, "SUR ", 8}, - {{0xbd,0xeb,0x4b,0x83,0x25,0x1f,0xb1,0x46,0x68,0x7f,0xa1,0x9d,0x1c,0x66,0x0f,0x99,0x41,0x1e,0xef,0xe3}, "SVD ", 18}, - {{0x0b,0xb2,0x17,0xe4,0x0f,0x8a,0x5c,0xb7,0x9a,0xdf,0x04,0xe1,0xaa,0xb6,0x0e,0x5a,0xbd,0x0d,0xfc,0x1e}, "SWFTC ", 8}, - {{0x9e,0x88,0x61,0x34,0x18,0xcf,0x03,0xdc,0xa5,0x4d,0x6a,0x2c,0xf6,0xad,0x93,0x4a,0x78,0xc7,0xa1,0x7a}, "SWM ", 18}, - {{0xB9,0xe7,0xF8,0x56,0x8e,0x08,0xd5,0x65,0x9f,0x5D,0x29,0xC4,0x99,0x71,0x73,0xd8,0x4C,0xdF,0x26,0x07}, "SWT ", 18}, - {{0x12,0xb3,0x06,0xfa,0x98,0xf4,0xcb,0xb8,0xd4,0x45,0x7f,0xdf,0xf3,0xa0,0xa0,0xa5,0x6f,0x07,0xcc,0xdf}, "SXDT ", 18}, - {{0x2c,0x82,0xc7,0x3d,0x5b,0x34,0xaa,0x01,0x59,0x89,0x46,0x2b,0x29,0x48,0xcd,0x61,0x6a,0x37,0x64,0x1f}, "SXUT ", 18}, - {{0x10,0xb1,0x23,0xfd,0xdd,0xe0,0x03,0x24,0x31,0x99,0xaa,0xd0,0x35,0x22,0x06,0x5d,0xc0,0x58,0x27,0xa0}, "SYN ", 18}, - {{0xb1,0xee,0xf1,0x47,0x02,0x8e,0x9f,0x48,0x0d,0xbc,0x5c,0xca,0xa3,0x27,0x7d,0x41,0x7d,0x1b,0x85,0xf0}, "Seele ", 18}, - {{0x4c,0xa7,0x41,0x85,0x53,0x2d,0xc1,0x78,0x95,0x27,0x19,0x4e,0x5b,0x9c,0x86,0x6d,0xd3,0x3f,0x4e,0x82}, "SenSatoI ", 18}, - {{0xD6,0x59,0x60,0xFA,0xcb,0x8E,0x4a,0x2d,0xFc,0xb2,0xC2,0x21,0x2c,0xb2,0xe4,0x4a,0x02,0xe2,0xa5,0x7E}, "Soar ", 6}, - {{0x1d,0x4c,0xcc,0x31,0xda,0xb6,0xea,0x20,0xf4,0x61,0xd3,0x29,0xa0,0x56,0x2c,0x1c,0x58,0x41,0x25,0x15}, "TALAO ", 18}, - {{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}, - {{0x3a,0x92,0xbd,0x39,0x6a,0xef,0x82,0xaf,0x98,0xeb,0xc0,0xaa,0x90,0x30,0xd2,0x5a,0x23,0xb1,0x1c,0x6b}, "TBX ", 18}, - {{0xfA,0x0e,0xF5,0xE0,0x34,0xCa,0xE1,0xAE,0x75,0x2d,0x59,0xbd,0xb8,0xaD,0xcD,0xe3,0x7E,0xd7,0xaB,0x97}, "TCA ", 18}, - {{0x99,0x72,0xa0,0xf2,0x41,0x94,0x44,0x7e,0x73,0xa7,0xe8,0xb6,0xcd,0x26,0xa5,0x2e,0x02,0xdd,0xfa,0xd5}, "TCH ", 0}, - {{0x2a,0x1d,0xba,0xbe,0x65,0xc5,0x95,0xB0,0x02,0x2e,0x75,0x20,0x8C,0x34,0x01,0x41,0x39,0xd5,0xd3,0x57}, "TDH ", 18}, - {{0x1c,0x79,0xab,0x32,0xc6,0x6a,0xca,0xa1,0xe9,0xe8,0x19,0x52,0xb8,0xaa,0xa5,0x81,0xb4,0x3e,0x54,0xe7}, "TEAM ", 4}, - {{0xEc,0x32,0xA9,0x72,0x5C,0x59,0x85,0x5d,0x84,0x1b,0xa7,0xd8,0xD9,0xc9,0x9c,0x84,0xff,0x75,0x46,0x88}, "TEL Medi ", 18}, - {{0x85,0xe0,0x76,0x36,0x1c,0xc8,0x13,0xa9,0x08,0xff,0x67,0x2f,0x9b,0xad,0x15,0x41,0x47,0x44,0x02,0xb2}, "TEL ", 2}, - {{0xdd,0x16,0xec,0x0f,0x66,0xe5,0x4d,0x45,0x3e,0x67,0x56,0x71,0x3e,0x53,0x33,0x55,0x98,0x90,0x40,0xe4}, "TEN ", 18}, - {{0xe5,0xf1,0x66,0xc0,0xd8,0x87,0x2b,0x68,0x79,0x00,0x61,0x31,0x7b,0xb6,0xcc,0xa0,0x45,0x82,0xc9,0x12}, "TFD ", 18}, - {{0xa7,0xf9,0x76,0xC3,0x60,0xeb,0xBe,0xD4,0x46,0x5c,0x28,0x55,0x68,0x4D,0x1A,0xAE,0x52,0x71,0xeF,0xa9}, "TFL ", 8}, - {{0xf8,0xe0,0x6e,0x4e,0x4a,0x80,0x28,0x7f,0xdc,0xa5,0xb0,0x2d,0xcc,0xec,0xaa,0x9d,0x09,0x54,0x84,0x0f}, "TGAME ", 18}, - {{0xac,0x3d,0xa5,0x87,0xea,0xc2,0x29,0xc9,0x89,0x6d,0x91,0x9a,0xbc,0x23,0x5c,0xa4,0xfd,0x7f,0x72,0xc1}, "TGT ", 1}, - {{0x38,0x83,0xf5,0xe1,0x81,0xfc,0xca,0xf8,0x41,0x0f,0xa6,0x1e,0x12,0xb5,0x9b,0xad,0x96,0x3f,0xb6,0x45}, "THETA ", 18}, - {{0x1c,0xb3,0x20,0x9d,0x45,0xb2,0xa6,0x0b,0x7f,0xbc,0xa1,0xcc,0xdb,0xf8,0x7f,0x67,0x42,0x37,0xa4,0xaa}, "THR ", 4}, - {{0x4f,0x27,0x05,0x3f,0x32,0xed,0xa8,0xaf,0x84,0x95,0x64,0x37,0xbc,0x00,0xe5,0xff,0xa7,0x00,0x32,0x87}, "THRT ", 18}, - {{0xfe,0x7B,0x91,0x5A,0x0b,0xAA,0x0E,0x79,0xf8,0x5c,0x55,0x53,0x26,0x65,0x13,0xF7,0xC1,0xc0,0x3E,0xd0}, "THUG ", 18}, - {{0x72,0x43,0x0a,0x61,0x2a,0xdc,0x00,0x7c,0x50,0xe3,0xb6,0x94,0x6d,0xbb,0x1b,0xb0,0xfd,0x31,0x01,0xd1}, "TIC ", 8}, - {{0x7F,0x4B,0x2A,0x69,0x06,0x05,0xA7,0xcb,0xb6,0x6F,0x7A,0xA6,0x88,0x5E,0xbD,0x90,0x6a,0x5e,0x2E,0x9E}, "TICO ", 8}, - {{0x99,0x99,0x67,0xe2,0xec,0x8a,0x74,0xb7,0xc8,0xe9,0xdb,0x19,0xe0,0x39,0xd9,0x20,0xb3,0x1d,0x39,0xd0}, "TIE ", 18}, - {{0xee,0xe2,0xd0,0x0e,0xb7,0xde,0xb8,0xdd,0x69,0x24,0x18,0x7f,0x5a,0xa3,0x49,0x6b,0x7d,0x06,0xe6,0x2a}, "TIG ", 18}, - {{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}, - {{0xda,0xe1,0xba,0xf2,0x49,0x96,0x4b,0xc4,0xb6,0xac,0x98,0xc3,0x12,0x2f,0x0e,0x3e,0x78,0x5f,0xd2,0x79}, "TKA ", 18}, - {{0x06,0x75,0xda,0xa9,0x47,0x25,0xa5,0x28,0xb0,0x5a,0x3a,0x88,0x63,0x5c,0x03,0xea,0x96,0x4b,0xfa,0x7e}, "TKLN ", 18}, - {{0xaA,0xAf,0x91,0xD9,0xb9,0x0d,0xF8,0x00,0xDf,0x4F,0x55,0xc2,0x05,0xfd,0x69,0x89,0xc9,0x77,0xE7,0x3a}, "TKN ", 8}, - {{0xb4,0x5a,0x50,0x54,0x5b,0xee,0xab,0x73,0xf3,0x8f,0x31,0xe5,0x97,0x37,0x68,0xc4,0x21,0x80,0x5e,0x5e}, "TKR ", 18}, - {{0xb3,0x61,0x65,0x50,0xab,0xc8,0xaf,0x79,0xc7,0xa5,0x90,0x2d,0xef,0x9e,0xfa,0x3b,0xc9,0xa9,0x52,0x00}, "TLX ", 8}, - {{0x32,0x09,0xf9,0x8b,0xeb,0xf0,0x14,0x9b,0x76,0x9c,0xe2,0x6d,0x71,0xf7,0xae,0xa8,0xe4,0x35,0xef,0xea}, "TMT ", 18}, - {{0xb0,0x28,0x07,0x43,0xb4,0x4b,0xf7,0xdb,0x4b,0x6b,0xe4,0x82,0xb2,0xba,0x7b,0x75,0xe5,0xda,0x09,0x6c}, "TNS ", 18}, - {{0x08,0xf5,0xa9,0x23,0x5b,0x08,0x17,0x3b,0x75,0x69,0xf8,0x36,0x45,0xd2,0xc7,0xfb,0x55,0xe8,0xcc,0xd8}, "TNT ", 8}, - {{0x8b,0x35,0x30,0x21,0x18,0x93,0x75,0x59,0x17,0x23,0xe7,0x38,0x42,0x62,0xf4,0x57,0x09,0xa3,0xc3,0xdc}, "TOMO ", 18}, - {{0x8e,0xb9,0x65,0xee,0x9c,0xCF,0xBC,0xE7,0x6c,0x0a,0x06,0x26,0x44,0x92,0xc0,0xaf,0xEf,0xc2,0x82,0x6d}, "TOOR ", 18}, - {{0xaa,0x7a,0x9c,0xa8,0x7d,0x36,0x94,0xb5,0x75,0x5f,0x21,0x3b,0x5d,0x04,0x09,0x4b,0x8d,0x0f,0x0a,0x6f}, "TRAC ", 18}, - {{0x12,0x75,0x95,0x12,0xd3,0x26,0x30,0x3b,0x45,0xf1,0xce,0xc8,0xf7,0xb6,0xfd,0x96,0xf3,0x87,0x77,0x8e}, "TRAK ", 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}, - {{0x30,0xce,0xCB,0x54,0x61,0xA4,0x49,0xA9,0x00,0x81,0xF5,0xa5,0xF5,0x5d,0xb4,0xe0,0x48,0x39,0x7B,0xAB}, "TRCT ", 8}, - {{0x33,0xf9,0x0d,0xee,0x07,0xc6,0xe8,0xb9,0x68,0x2d,0xd2,0x0f,0x73,0xe6,0xc3,0x58,0xb2,0xed,0x0f,0x03}, "TRDT ", 0}, - {{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}, - {{0xaa,0xb6,0x06,0x81,0x78,0x09,0x84,0x1e,0x8b,0x11,0x68,0xbe,0x87,0x79,0xee,0xaf,0x67,0x44,0xef,0x64}, "TTA ", 18}, - {{0x93,0x89,0x43,0x48,0x52,0xb9,0x4b,0xba,0xd4,0xc8,0xaf,0xed,0x5b,0x7b,0xdb,0xc5,0xff,0x0c,0x22,0x75}, "TTC ", 18}, - {{0x9c,0xda,0x8a,0x60,0xdd,0x5a,0xfa,0x15,0x6c,0x95,0xbd,0x97,0x44,0x28,0xd9,0x1a,0x08,0x12,0xe0,0x54}, "TTU ", 18}, - {{0x8d,0xd5,0xfb,0xce,0x2f,0x6a,0x95,0x6c,0x30,0x22,0xba,0x36,0x63,0x75,0x90,0x11,0xdd,0x51,0xe7,0x3e}, "TUSD ", 18}, - {{0x2e,0xF1,0xaB,0x8a,0x26,0x18,0x7C,0x58,0xBB,0x8a,0xAe,0xB1,0x1B,0x2f,0xC6,0xD2,0x5C,0x5c,0x07,0x16}, "TWN ", 18}, - {{0xE7,0x77,0x5A,0x6e,0x9B,0xcf,0x90,0x4e,0xb3,0x9D,0xA2,0xb6,0x8c,0x5e,0xfb,0x4F,0x93,0x60,0xe0,0x8C}, "TaaS ", 6}, - {{0x84,0x00,0xd9,0x4a,0x5c,0xb0,0xfa,0x0d,0x04,0x1a,0x37,0x88,0xe3,0x95,0x28,0x5d,0x61,0xc9,0xee,0x5e}, "UBT ", 8}, - {{0x92,0xe5,0x2a,0x1a,0x23,0x5d,0x9a,0x10,0x3d,0x97,0x09,0x01,0x06,0x6c,0xe9,0x10,0xaa,0xce,0xfd,0x37}, "UCASH ", 8}, - {{0xaa,0xf3,0x70,0x55,0x18,0x8f,0xee,0xe4,0x86,0x9d,0xe6,0x34,0x64,0x93,0x7e,0x68,0x3d,0x61,0xb2,0xa1}, "UCN ", 18}, - {{0xea,0x09,0x7a,0x2b,0x1d,0xb0,0x06,0x27,0xb2,0xfa,0x17,0x46,0x0a,0xd2,0x60,0xc0,0x16,0x01,0x69,0x77}, "UFR ", 18}, - {{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}, - {{0x6b,0xa4,0x60,0xab,0x75,0xcd,0x2c,0x56,0x34,0x3b,0x35,0x17,0xff,0xeb,0xa6,0x07,0x48,0x65,0x4d,0x26}, "UP ", 8}, - {{0xc8,0x6d,0x05,0x48,0x09,0x62,0x34,0x32,0x21,0x0c,0x10,0x7a,0xf2,0xe3,0xf6,0x19,0xdc,0xfb,0xf6,0x52}, "UPP ", 18}, - {{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}, - {{0xa0,0xb8,0x69,0x91,0xc6,0x21,0x8b,0x36,0xc1,0xd1,0x9d,0x4a,0x2e,0x9e,0xb0,0xce,0x36,0x06,0xeb,0x48}, "USDC ", 6}, - {{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}, - {{0x16,0xf8,0x12,0xbe,0x7f,0xff,0x02,0xca,0xf6,0x62,0xb8,0x5d,0x5d,0x58,0xa5,0xda,0x65,0x72,0xd4,0xdf}, "UTT ", 8}, - {{0x35,0x43,0x63,0x8e,0xD4,0xa9,0x00,0x6E,0x48,0x40,0xB1,0x05,0x94,0x42,0x71,0xBc,0xea,0x15,0x60,0x5D}, "UUU ", 18}, - {{0x89,0x20,0x5A,0x3A,0x3b,0x2A,0x69,0xDe,0x6D,0xbf,0x7f,0x01,0xED,0x13,0xB2,0x10,0x8B,0x2c,0x43,0xe7}, "Unicorn ", 0}, - {{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}, - {{0xD8,0x50,0x94,0x2e,0xF8,0x81,0x1f,0x2A,0x86,0x66,0x92,0xA6,0x23,0x01,0x1b,0xDE,0x52,0xa4,0x62,0xC1}, "VEN ", 18}, - {{0xEb,0xeD,0x4f,0xF9,0xfe,0x34,0x41,0x3d,0xb8,0xfC,0x82,0x94,0x55,0x6B,0xBD,0x15,0x28,0xa4,0xDA,0xca}, "VENUS ", 3}, - {{0x8f,0x34,0x70,0xA7,0x38,0x8c,0x05,0xeE,0x4e,0x7A,0xF3,0xd0,0x1D,0x8C,0x72,0x2b,0x0F,0xF5,0x23,0x74}, "VERI ", 18}, - {{0x2C,0x97,0x4B,0x2d,0x0B,0xA1,0x71,0x6E,0x64,0x4c,0x1F,0xC5,0x99,0x82,0xa8,0x9D,0xDD,0x2f,0xF7,0x24}, "VIB ", 18}, - {{0xe8,0xff,0x5c,0x9c,0x75,0xde,0xb3,0x46,0xac,0xac,0x49,0x3c,0x46,0x3c,0x89,0x50,0xbe,0x03,0xdf,0xba}, "VIBE ", 18}, - {{0x88,0x24,0x48,0xf8,0x3d,0x90,0xb2,0xbf,0x47,0x7a,0xf2,0xea,0x79,0x32,0x7f,0xde,0xa1,0x33,0x5d,0x93}, "VIBEX ", 18}, - {{0xf0,0x3f,0x8d,0x65,0xba,0xfa,0x59,0x86,0x11,0xc3,0x49,0x51,0x24,0x09,0x3c,0x56,0xe8,0xf6,0x38,0xf0}, "VIEW ", 18}, - {{0xd2,0x94,0x6b,0xe7,0x86,0xf3,0x5c,0x3c,0xc4,0x02,0xc2,0x9b,0x32,0x36,0x47,0xab,0xda,0x79,0x90,0x71}, "VIKKY ", 8}, - {{0xf3,0xe0,0x14,0xfe,0x81,0x26,0x78,0x70,0x62,0x41,0x32,0xef,0x3a,0x64,0x6b,0x8e,0x83,0x85,0x3a,0x96}, "VIN ", 18}, - {{0x23,0xb7,0x5B,0xc7,0xAa,0xF2,0x8e,0x2d,0x66,0x28,0xC3,0xf4,0x24,0xB3,0x88,0x2F,0x8f,0x07,0x2a,0x3c}, "VIT ", 18}, - {{0x1b,0x79,0x3e,0x49,0x23,0x77,0x58,0xdb,0xd8,0xb7,0x52,0xaf,0xc9,0xeb,0x4b,0x32,0x9d,0x5d,0xa0,0x16}, "VITE ", 18}, - {{0x51,0x94,0x75,0xb3,0x16,0x53,0xe4,0x6d,0x20,0xcd,0x09,0xf9,0xfd,0xcf,0x3b,0x12,0xbd,0xac,0xb4,0xf5}, "VIU ", 18}, - {{0x92,0x2a,0xc4,0x73,0xa3,0xcc,0x24,0x1f,0xd3,0xa0,0x04,0x9e,0xd1,0x45,0x36,0x45,0x2d,0x58,0xd7,0x3c}, "VLD ", 18}, - {{0xc3,0xbc,0x9e,0xb7,0x1f,0x75,0xec,0x43,0x9a,0x6b,0x6c,0x8e,0x8b,0x74,0x6f,0xcf,0x5b,0x62,0xf7,0x03}, "VOC ", 18}, - {{0x83,0xeE,0xA0,0x0D,0x83,0x8f,0x92,0xdE,0xC4,0xD1,0x47,0x56,0x97,0xB9,0xf4,0xD3,0x53,0x7b,0x56,0xE3}, "VOISE ", 8}, - {{0xeD,0xBa,0xF3,0xc5,0x10,0x03,0x02,0xdC,0xdd,0xA5,0x32,0x69,0x32,0x2f,0x37,0x30,0xb1,0xF0,0x41,0x6d}, "VRS ", 5}, - {{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}, - {{0x97,0x20,0xb4,0x67,0xa7,0x10,0x38,0x2A,0x23,0x2a,0x32,0xF5,0x40,0xbD,0xCe,0xd7,0xd6,0x62,0xa1,0x0B}, "VZT ", 18}, - {{0x4b,0xbb,0xc5,0x7a,0xf2,0x70,0x13,0x8e,0xf2,0xff,0x2c,0x50,0xdb,0xfa,0xd6,0x84,0xe9,0xe0,0xe6,0x04}, "WAB ", 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}, - {{0x84,0x0f,0xe7,0x5a,0xbf,0xad,0xc0,0xf2,0xd5,0x40,0x37,0x82,0x95,0x71,0xb2,0x78,0x2e,0x91,0x9c,0xe4}, "WEB ", 18}, - {{0xC0,0x2a,0xaA,0x39,0xb2,0x23,0xFE,0x8D,0x0A,0x0e,0x5C,0x4F,0x27,0xeA,0xD9,0x08,0x3C,0x75,0x6C,0xc2}, "WETH ", 18}, - {{0xf4,0xfe,0x95,0x60,0x38,0x81,0xd0,0xe0,0x79,0x54,0xfd,0x76,0x05,0xe0,0xe9,0xa9,0x16,0xe4,0x2c,0x44}, "WHEN ", 18}, - {{0xe9,0x33,0xc0,0xCd,0x97,0x84,0x41,0x4d,0x5F,0x27,0x8C,0x11,0x49,0x04,0xF5,0xA8,0x4b,0x39,0x69,0x19}, "WHO ", 18}, - {{0x62,0xcd,0x07,0xd4,0x14,0xec,0x50,0xb6,0x8c,0x7e,0xca,0xa8,0x63,0xa2,0x3d,0x34,0x4f,0x2d,0x06,0x2f}, "WIC ", 0}, - {{0xD3,0xC0,0x07,0x72,0xB2,0x4D,0x99,0x7A,0x81,0x22,0x49,0xca,0x63,0x7a,0x92,0x1e,0x81,0x35,0x77,0x01}, "WILD ", 18}, - {{0x89,0x93,0x38,0xb8,0x4d,0x25,0xac,0x50,0x5a,0x33,0x2a,0xdc,0xe7,0x40,0x2d,0x69,0x7d,0x94,0x74,0x94}, "WIN ", 8}, - {{0x66,0x70,0x88,0xb2,0x12,0xce,0x3d,0x06,0xa1,0xb5,0x53,0xa7,0x22,0x1E,0x1f,0xD1,0x90,0x00,0xd9,0xaF}, "WINGS ", 18}, - {{0x1b,0x22,0xc3,0x2c,0xd9,0x36,0xcb,0x97,0xc2,0x8c,0x56,0x90,0xa0,0x69,0x5a,0x82,0xab,0xf6,0x88,0xe6}, "WISH ", 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}, - {{0xa6,0x86,0x51,0x4f,0xaf,0x7d,0x54,0x28,0x92,0x66,0xf4,0x83,0xd1,0xe4,0x85,0x2c,0x99,0xe1,0x3e,0xc7}, "WORK ", 8}, - {{0x4C,0xF4,0x88,0x38,0x7F,0x03,0x5F,0xF0,0x8c,0x37,0x15,0x15,0x56,0x2C,0xBa,0x71,0x2f,0x90,0x15,0xd4}, "WPR ", 18}, - {{0x72,0xad,0xad,0xb4,0x47,0x78,0x4d,0xd7,0xab,0x1f,0x47,0x24,0x67,0x75,0x0f,0xc4,0x85,0xe4,0xcb,0x2d}, "WRC ", 6}, - {{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}, - {{0x84,0x11,0x9c,0xb3,0x3e,0x8f,0x59,0x0d,0x75,0xc2,0xd6,0xea,0x4e,0x6b,0x07,0x41,0xa7,0x49,0x4e,0xda}, "WTT ", 0}, - {{0xd8,0x95,0x0f,0xDe,0xaa,0x10,0x30,0x4B,0x7A,0x7F,0xd0,0x3a,0x2F,0xC6,0x6B,0xC3,0x9f,0x3c,0x71,0x1a}, "WYS ", 18}, - {{0x05,0x60,0x17,0xc5,0x5a,0xE7,0xAE,0x32,0xd1,0x2A,0xeF,0x7C,0x67,0x9d,0xF8,0x3A,0x85,0xca,0x75,0xFf}, "WYV ", 18}, - {{0x28,0x6B,0xDA,0x14,0x13,0xa2,0xDf,0x81,0x73,0x1D,0x49,0x30,0xce,0x2F,0x86,0x2a,0x35,0xA6,0x09,0xfE}, "WaBi ", 18}, - {{0x5e,0x4A,0xBE,0x64,0x19,0x65,0x0C,0xA8,0x39,0xCe,0x5B,0xB7,0xDb,0x42,0x2b,0x88,0x1a,0x60,0x64,0xbB}, "WiC ", 18}, - {{0x91,0x0D,0xfc,0x18,0xD6,0xEA,0x3D,0x6a,0x71,0x24,0xA6,0xF8,0xB5,0x45,0x8F,0x28,0x10,0x60,0xfa,0x4c}, "X8X ", 18}, - {{0x4D,0xF8,0x12,0xF6,0x06,0x4d,0xef,0x1e,0x5e,0x02,0x9f,0x1c,0xa8,0x58,0x77,0x7C,0xC9,0x8D,0x2D,0x81}, "XAUR ", 8}, - {{0x49,0xae,0xc0,0x75,0x2e,0x68,0xd0,0x28,0x2d,0xb5,0x44,0xc6,0x77,0xf6,0xba,0x40,0x7b,0xa1,0x7e,0xd7}, "XBL ", 18}, - {{0x28,0xde,0xe0,0x1d,0x53,0xfe,0xd0,0xed,0xf5,0xf6,0xe3,0x10,0xbf,0x8e,0xf9,0x31,0x15,0x13,0xae,0x40}, "XBP ", 18}, - {{0x4d,0x82,0x9f,0x8c,0x92,0xa6,0x69,0x1c,0x56,0x30,0x0d,0x02,0x0c,0x9e,0x0d,0xb9,0x84,0xcf,0xe2,0xba}, "XCC ", 18}, - {{0x1e,0x26,0xb3,0xd0,0x7e,0x57,0xf4,0x53,0xca,0xe3,0x0f,0x7d,0xdd,0x2f,0x94,0x5f,0x5b,0xf3,0xef,0x33}, "XCLR ", 8}, - {{0x41,0xab,0x1b,0x6f,0xcb,0xb2,0xfa,0x9d,0xce,0xd8,0x1a,0xcb,0xde,0xc1,0x3e,0xa6,0x31,0x5f,0x2b,0xf2}, "XDCE ", 18}, - {{0xa0,0x17,0xac,0x5f,0xac,0x59,0x41,0xf9,0x50,0x10,0xb1,0x25,0x70,0xb8,0x12,0xc9,0x74,0x46,0x9c,0x2c}, "XES ", 18}, - {{0x05,0x4c,0x64,0x74,0x1d,0xba,0xfd,0xc1,0x97,0x84,0x50,0x54,0x94,0x02,0x98,0x23,0xd8,0x9c,0x3b,0x13}, "XET ", 8}, - {{0x16,0xaF,0x5b,0xfb,0x4A,0xe7,0xE4,0x75,0xb9,0xaD,0xC3,0xBf,0x5C,0xb2,0xf1,0xE6,0xa5,0x0d,0x79,0x40}, "XFS ", 8}, - {{0xf6,0xb6,0xaa,0x0e,0xf0,0xf5,0xed,0xc2,0xc1,0xc5,0xd9,0x25,0x47,0x7f,0x97,0xea,0xf6,0x63,0x03,0xe7}, "XGG ", 8}, - {{0x53,0x3e,0xf0,0x98,0x4b,0x2F,0xAA,0x22,0x7A,0xcC,0x62,0x0C,0x67,0xcc,0xe1,0x2a,0xA3,0x9C,0xD8,0xCD}, "XGM ", 8}, - {{0x30,0xf4,0xA3,0xe0,0xaB,0x7a,0x76,0x73,0x3D,0x8b,0x60,0xb8,0x9D,0xD9,0x3c,0x3D,0x0b,0x4c,0x9E,0x2f}, "XGT ", 18}, - {{0xB1,0x10,0xeC,0x7B,0x1d,0xcb,0x8F,0xAB,0x8d,0xED,0xbf,0x28,0xf5,0x3B,0xc6,0x3e,0xA5,0xBE,0xdd,0x84}, "XID ", 8}, - {{0x44,0x44,0x9F,0xa4,0xd6,0x07,0xF8,0x07,0xd1,0xeD,0x4a,0x69,0xad,0x94,0x29,0x71,0x72,0x83,0x91,0xC8}, "XMCT ", 18}, - {{0x0f,0x8c,0x45,0xb8,0x96,0x78,0x4a,0x1e,0x40,0x85,0x26,0xb9,0x30,0x05,0x19,0xef,0x86,0x60,0x20,0x9c}, "XMX ", 8}, - {{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}, - {{0x15,0x3e,0xd9,0xcc,0x1b,0x79,0x29,0x79,0xd2,0xbd,0xe0,0xbb,0xf4,0x5c,0xc2,0xa7,0xe4,0x36,0xa5,0xf9}, "XOV ", 18}, - {{0x90,0x52,0x8a,0xeb,0x3a,0x2b,0x73,0x6b,0x78,0x0f,0xd1,0xb6,0xc4,0x78,0xbb,0x7e,0x1d,0x64,0x31,0x70}, "XPA ", 18}, - {{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}, - {{0x55,0x29,0x6f,0x69,0xf4,0x0e,0xa6,0xd2,0x0e,0x47,0x85,0x33,0xc1,0x5a,0x6b,0x08,0xb6,0x54,0xe7,0x58}, "XYO ", 18}, - {{0x92,0x21,0x05,0xfa,0xd8,0x15,0x3f,0x51,0x6b,0xcf,0xb8,0x29,0xf5,0x6d,0xc0,0x97,0xa0,0xe1,0xd7,0x05}, "YEE ", 18}, - {{0xca,0x27,0x96,0xf9,0xf6,0x1d,0xc7,0xb2,0x38,0xaa,0xb0,0x43,0x97,0x1e,0x49,0xc6,0x16,0x4d,0xf3,0x75}, "YEED ", 18}, - {{0xcb,0xea,0xec,0x69,0x94,0x31,0x85,0x7f,0xdb,0x4d,0x37,0xad,0xdb,0xbd,0xc2,0x0e,0x13,0x2d,0x49,0x03}, "YOYOW ", 18}, - {{0xd9,0xa1,0x2c,0xde,0x03,0xa8,0x6e,0x80,0x04,0x96,0x46,0x98,0x58,0xde,0x85,0x81,0xd3,0xa5,0x35,0x3d}, "YUP ", 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}, - {{0xb9,0xEF,0x77,0x0B,0x6A,0x5e,0x12,0xE4,0x59,0x83,0xC5,0xD8,0x05,0x45,0x25,0x8a,0xA3,0x8F,0x3B,0x78}, "ZCN ", 10}, - {{0x20,0x08,0xe3,0x05,0x7b,0xd7,0x34,0xe1,0x0a,0xd1,0x3c,0x9e,0xae,0x45,0xff,0x13,0x2a,0xbc,0x17,0x22}, "ZCO ", 8}, - {{0x05,0xf4,0xa4,0x2e,0x25,0x1f,0x2d,0x52,0xb8,0xed,0x15,0xE9,0xFE,0xdA,0xac,0xFc,0xEF,0x1F,0xAD,0x27}, "ZIL ", 12}, - {{0x4a,0xac,0x46,0x1c,0x86,0xab,0xfa,0x71,0xe9,0xd0,0x0d,0x9a,0x2c,0xde,0x8d,0x74,0xe4,0xe1,0xae,0xea}, "ZINC ", 18}, - {{0xa9,0xd2,0x92,0x7d,0x3a,0x04,0x30,0x9e,0x00,0x8b,0x6a,0xf6,0xe2,0xe2,0x82,0xae,0x29,0x52,0xe7,0xfd}, "ZIP ", 18}, - {{0xed,0xd7,0xc9,0x4f,0xd7,0xb4,0x97,0x1b,0x91,0x6d,0x15,0x06,0x7b,0xc4,0x54,0xb9,0xe1,0xba,0xd9,0x80}, "ZIPT ", 18}, - {{0xfd,0x89,0x71,0xd5,0xe8,0xe1,0x74,0x0c,0xe2,0xd0,0xa8,0x40,0x95,0xfc,0xa4,0xde,0x72,0x9d,0x0c,0x16}, "ZLA ", 18}, - {{0x55,0x4f,0xfc,0x77,0xf4,0x25,0x1a,0x9f,0xb3,0xc0,0xe3,0x59,0x0a,0x6a,0x20,0x5f,0x8d,0x4e,0x06,0x7d}, "ZMN ", 18}, - {{0xb5,0xb8,0xf5,0x61,0x6f,0xe4,0x2d,0x5c,0xec,0xa3,0xe8,0x7f,0x3f,0xdd,0xbd,0xd8,0xf4,0x96,0xd7,0x60}, "ZPR ", 18}, - {{0xE4,0x1d,0x24,0x89,0x57,0x1d,0x32,0x21,0x89,0x24,0x6D,0xaF,0xA5,0xeb,0xDe,0x1F,0x46,0x99,0xF4,0x98}, "ZRX ", 18}, - {{0x7A,0x41,0xe0,0x51,0x7a,0x5e,0xcA,0x4F,0xdb,0xC7,0xFb,0xeb,0xA4,0xD4,0xc4,0x7B,0x9f,0xF6,0xDC,0x63}, "ZSC ", 18}, - {{0xe3,0x86,0xb1,0x39,0xed,0x37,0x15,0xca,0x4b,0x18,0xfd,0x52,0x67,0x1b,0xdc,0xea,0x1c,0xdf,0xe4,0xb1}, "ZST ", 8}, - {{0xE8,0xF9,0xfa,0x97,0x7e,0xa5,0x85,0x59,0x1d,0x9F,0x39,0x46,0x81,0x31,0x8C,0x16,0x55,0x25,0x77,0xfB}, "ZTX ", 18}, - {{0x83,0xe2,0xbe,0x8d,0x11,0x4f,0x96,0x61,0x22,0x13,0x84,0xb3,0xa5,0x0d,0x24,0xb9,0x6a,0x56,0x53,0xf5}, "ZXC ", 18}, - {{0xab,0xC1,0x28,0x0A,0x01,0x87,0xa2,0x02,0x0c,0xC6,0x75,0x43,0x7a,0xed,0x40,0x01,0x85,0xF8,0x6D,0xb6}, "SAC ", 18}, - {{0xf3,0xC0,0x92,0xcA,0x8C,0xD6,0xD3,0xd4,0xca,0x00,0x4D,0xc1,0xd0,0xf1,0xfe,0x8C,0xcA,0xB5,0x35,0x99}, "ZIX ", 18}, + {{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}, + {{0x00, 0x73, 0xe5, 0xE5, 0x2E, 0x2B, 0x4f, 0xE2, 0x18, 0xD7, + 0x5d, 0x99, 0x4e, 0xE2, 0xB3, 0xc8, 0x2f, 0x9C, 0x87, 0xEA}, + "22x ", + 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}, + {{0xBa, 0x7D, 0xCB, 0xa2, 0xAd, 0xe3, 0x19, 0xBc, 0x77, 0x2D, + 0xB4, 0xdf, 0x75, 0xA7, 0x6B, 0xA0, 0x0d, 0xFb, 0x31, 0xb0}, + "A18 ", + 18}, + {{0xcc, 0x7d, 0x26, 0xd8, 0xea, 0x62, 0x81, 0xbb, 0x36, 0x3c, + 0x84, 0x48, 0x51, 0x5f, 0x2c, 0x61, 0xf7, 0xbc, 0x19, 0xf0}, + "ABCH ", + 18}, + {{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}, + {{0x13, 0xf1, 0xb7, 0xfd, 0xfb, 0xe1, 0xfc, 0x66, 0x67, 0x6d, + 0x56, 0x48, 0x3e, 0x21, 0xb1, 0xec, 0xb4, 0x0b, 0x58, 0xe2}, + "ACC ", + 18}, + {{0x06, 0x14, 0x71, 0x10, 0x02, 0x2b, 0x76, 0x8b, 0xa8, 0xf9, + 0x9a, 0x8f, 0x38, 0x5d, 0xf1, 0x1a, 0x15, 0x1a, 0x9c, 0xc8}, + "ACE ", + 0}, + {{0x2b, 0xaa, 0xc9, 0x33, 0x0c, 0xf9, 0xac, 0x47, 0x9d, 0x81, + 0x91, 0x95, 0x79, 0x4d, 0x79, 0xad, 0x0c, 0x76, 0x16, 0xe3}, + "ADB ", + 18}, + {{0xE6, 0x9a, 0x35, 0x3b, 0x31, 0x52, 0xDd, 0x7b, 0x70, 0x6f, + 0xf7, 0xdD, 0x40, 0xfe, 0x1d, 0x18, 0xb7, 0x80, 0x2d, 0x31}, + "ADH ", + 18}, + {{0x88, 0x10, 0xC6, 0x34, 0x70, 0xd3, 0x86, 0x39, 0x95, 0x4c, + 0x6B, 0x41, 0xAa, 0xC5, 0x45, 0x84, 0x8C, 0x46, 0x48, 0x4a}, + "ADI ", + 18}, + {{0x66, 0x0e, 0x71, 0x48, 0x37, 0x85, 0xf6, 0x61, 0x33, 0x54, + 0x8b, 0x10, 0xf6, 0x92, 0x6d, 0xc3, 0x32, 0xb0, 0x6e, 0x61}, + "ADL ", + 18}, + {{0x42, 0x28, 0x66, 0xa8, 0xF0, 0xb0, 0x32, 0xc5, 0xcf, 0x1D, + 0xfB, 0xDE, 0xf3, 0x1A, 0x20, 0xF4, 0x50, 0x95, 0x62, 0xb0}, + "ADST ", + 0}, + {{0xD0, 0xD6, 0xD6, 0xC5, 0xFe, 0x4a, 0x67, 0x7D, 0x34, 0x3c, + 0xC4, 0x33, 0x53, 0x6B, 0xB7, 0x17, 0xbA, 0xe1, 0x67, 0xdD}, + "ADT ", + 9}, + {{0x44, 0x70, 0xBB, 0x87, 0xd7, 0x7b, 0x96, 0x3A, 0x01, 0x3D, + 0xB9, 0x39, 0xBE, 0x33, 0x2f, 0x92, 0x7f, 0x2b, 0x99, 0x2e}, + "ADX ", + 4}, + {{0x5c, 0xa9, 0xa7, 0x1b, 0x1d, 0x01, 0x84, 0x9c, 0x0a, 0x95, + 0x49, 0x0c, 0xc0, 0x05, 0x59, 0x71, 0x7f, 0xcf, 0x0d, 0x1d}, + "AE ", + 18}, + {{0x8e, 0xB2, 0x43, 0x19, 0x39, 0x37, 0x16, 0x66, 0x8D, 0x76, + 0x8d, 0xCE, 0xC2, 0x93, 0x56, 0xae, 0x9C, 0xfF, 0xe2, 0x85}, + "AGI ", + 8}, + {{0x51, 0x21, 0xe3, 0x48, 0xe8, 0x97, 0xda, 0xef, 0x1e, 0xef, + 0x23, 0x95, 0x9a, 0xb2, 0x90, 0xe5, 0x55, 0x7c, 0xf2, 0x74}, + "AI ", + 18}, + {{0x37, 0xe8, 0x78, 0x9b, 0xb9, 0x99, 0x6c, 0xac, 0x91, 0x56, + 0xcd, 0x5f, 0x5f, 0xd3, 0x25, 0x99, 0xe6, 0xb9, 0x12, 0x89}, + "AID ", + 18}, + {{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}, + {{0x42, 0x89, 0xc0, 0x43, 0xa1, 0x23, 0x92, 0xf1, 0x02, 0x73, + 0x07, 0xfb, 0x58, 0x27, 0x2d, 0x8e, 0xbd, 0x85, 0x39, 0x12}, + "ALI ", + 18}, + {{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}, + {{0x49, 0xb1, 0x27, 0xbc, 0x33, 0xce, 0x7e, 0x15, 0x86, 0xec, + 0x28, 0xce, 0xc6, 0xa6, 0x5b, 0x11, 0x25, 0x96, 0xc8, 0x22}, + "ALX ", + 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}, + {{0x96, 0x0b, 0x23, 0x6A, 0x07, 0xcf, 0x12, 0x26, 0x63, 0xc4, + 0x30, 0x33, 0x50, 0x60, 0x9A, 0x66, 0xA7, 0xB2, 0x88, 0xC0}, + "ANT ", + 18}, + {{0x9a, 0xb1, 0x65, 0xd7, 0x95, 0x01, 0x9b, 0x6d, 0x8b, 0x3e, + 0x97, 0x1d, 0xda, 0x91, 0x07, 0x14, 0x21, 0x30, 0x5e, 0x5a}, + "AOA ", + 18}, + {{0x4c, 0x0f, 0xbe, 0x1b, 0xb4, 0x66, 0x12, 0x91, 0x5e, 0x79, + 0x67, 0xd2, 0xc3, 0x21, 0x3c, 0xd4, 0xd8, 0x72, 0x57, 0xad}, + "APIS ", + 18}, + {{0x1a, 0x7a, 0x8b, 0xd9, 0x10, 0x6f, 0x2b, 0x8d, 0x97, 0x7e, + 0x08, 0x58, 0x2d, 0xc7, 0xd2, 0x4c, 0x72, 0x3a, 0xb0, 0xdb}, + "APPC ", + 18}, + {{0x23, 0xae, 0x3c, 0x5b, 0x39, 0xb1, 0x2f, 0x06, 0x93, 0xe0, + 0x54, 0x35, 0xee, 0xaa, 0x1e, 0x51, 0xd8, 0xc6, 0x15, 0x30}, + "APT ", + 18}, + {{0xaf, 0xbe, 0xc4, 0xd6, 0x5b, 0xc7, 0xb1, 0x16, 0xd8, 0x51, + 0x07, 0xfd, 0x05, 0xd9, 0x12, 0x49, 0x10, 0x29, 0xbf, 0x46}, + "ARB ", + 18}, + {{0xAc, 0x70, 0x9F, 0xcB, 0x44, 0xa4, 0x3c, 0x35, 0xF0, 0xDA, + 0x4e, 0x31, 0x63, 0xb1, 0x17, 0xA1, 0x7F, 0x37, 0x70, 0xf5}, + "ARC ", + 18}, + {{0x12, 0x45, 0xef, 0x80, 0xf4, 0xd9, 0xe0, 0x2e, 0xd9, 0x42, + 0x53, 0x75, 0xe8, 0xf6, 0x49, 0xb9, 0x22, 0x1b, 0x31, 0xd8}, + "ARCT ", + 8}, + {{0x75, 0xaa, 0x7b, 0x0d, 0x02, 0x53, 0x2f, 0x38, 0x33, 0xb6, + 0x6c, 0x7f, 0x0a, 0xd3, 0x53, 0x76, 0xd3, 0x73, 0xdd, 0xf8}, + "ARD ", + 18}, + {{0xBA, 0x5F, 0x11, 0xb1, 0x6B, 0x15, 0x57, 0x92, 0xCf, 0x3B, + 0x2E, 0x68, 0x80, 0xE8, 0x70, 0x68, 0x59, 0xA8, 0xAE, 0xB6}, + "ARN ", + 8}, + {{0xfe, 0xc0, 0xcF, 0x7f, 0xE0, 0x78, 0xa5, 0x00, 0xab, 0xf1, + 0x5F, 0x12, 0x84, 0x95, 0x8F, 0x22, 0x04, 0x9c, 0x2C, 0x7e}, + "ART ", + 18}, + {{0x77, 0x05, 0xFa, 0xA3, 0x4B, 0x16, 0xEB, 0x6d, 0x77, 0xDf, + 0xc7, 0x81, 0x2b, 0xe2, 0x36, 0x7b, 0xa6, 0xB0, 0x24, 0x8e}, + "ARX ", + 8}, + {{0xb0, 0xD9, 0x26, 0xc1, 0xBC, 0x3d, 0x78, 0x06, 0x4F, 0x3e, + 0x10, 0x75, 0xD5, 0xbD, 0x9A, 0x24, 0xF3, 0x5A, 0xe6, 0xC5}, + "ARXT ", + 18}, + {{0xa5, 0xf8, 0xfc, 0x09, 0x21, 0x88, 0x0c, 0xb7, 0x34, 0x23, + 0x68, 0xbd, 0x12, 0x8e, 0xb8, 0x05, 0x04, 0x42, 0xb1, 0xa1}, + "ARY ", + 18}, + {{0x27, 0x05, 0x4b, 0x13, 0xb1, 0xB7, 0x98, 0xB3, 0x45, 0xb5, + 0x91, 0xa4, 0xd2, 0x2e, 0x65, 0x62, 0xd4, 0x7e, 0xA7, 0x5a}, + "AST ", + 4}, + {{0x7b, 0x22, 0x93, 0x8c, 0xa8, 0x41, 0xaa, 0x39, 0x2c, 0x93, + 0xdb, 0xb7, 0xf4, 0xc4, 0x21, 0x78, 0xe3, 0xd6, 0x5e, 0x88}, + "ASTRO ", + 4}, + {{0x15, 0x43, 0xd0, 0xF8, 0x34, 0x89, 0xe8, 0x2A, 0x13, 0x44, + 0xDF, 0x68, 0x27, 0xB2, 0x3d, 0x54, 0x1F, 0x23, 0x5A, 0x50}, + "Aigatha ", + 18}, + {{0x17, 0x05, 0x2d, 0x51, 0xE9, 0x54, 0x59, 0x2C, 0x10, 0x46, + 0x32, 0x0c, 0x23, 0x71, 0xAb, 0xaB, 0x6C, 0x73, 0xEf, 0x10}, + "Athenian ", + 18}, + {{0x78, 0xB7, 0xFA, 0xDA, 0x55, 0xA6, 0x4d, 0xD8, 0x95, 0xD8, + 0xc8, 0xc3, 0x57, 0x79, 0xDD, 0x8b, 0x67, 0xfA, 0x8a, 0x05}, + "ATL ", + 18}, + {{0x9B, 0x11, 0xEF, 0xcA, 0xAA, 0x18, 0x90, 0xf6, 0xeE, 0x52, + 0xC6, 0xbB, 0x7C, 0xF8, 0x15, 0x3a, 0xC5, 0xd7, 0x41, 0x39}, + "ATM ", + 8}, + {{0x97, 0xAE, 0xB5, 0x06, 0x6E, 0x1A, 0x59, 0x0e, 0x86, 0x8b, + 0x51, 0x14, 0x57, 0xBE, 0xb6, 0xFE, 0x99, 0xd3, 0x29, 0xF5}, + "ATMI ", + 18}, + {{0x2d, 0xAE, 0xE1, 0xAA, 0x61, 0xD6, 0x0A, 0x25, 0x2D, 0xC8, + 0x05, 0x64, 0x49, 0x9A, 0x69, 0x80, 0x28, 0x53, 0x58, 0x3A}, + "ATS ", + 4}, + {{0x88, 0x78, 0x34, 0xd3, 0xb8, 0xd4, 0x50, 0xb6, 0xba, 0xb1, + 0x09, 0xc2, 0x52, 0xdf, 0x3d, 0xa2, 0x86, 0xd7, 0x3c, 0xe4}, + "ATT ", + 18}, + {{0x63, 0x39, 0x78, 0x4d, 0x94, 0x78, 0xda, 0x43, 0x10, 0x6a, + 0x42, 0x91, 0x96, 0x77, 0x2a, 0x02, 0x9c, 0x2f, 0x17, 0x7d}, + "ATTN ", + 18}, + {{0x1a, 0x0f, 0x2a, 0xb4, 0x6e, 0xc6, 0x30, 0xf9, 0xfd, 0x63, + 0x80, 0x29, 0x02, 0x7b, 0x55, 0x2a, 0xfa, 0x64, 0xb9, 0x4c}, + "ATX ", + 18}, + {{0xc1, 0x2d, 0x09, 0x9b, 0xe3, 0x15, 0x67, 0xad, 0xd4, 0xe4, + 0xe4, 0xd0, 0xd4, 0x56, 0x91, 0xc3, 0xf5, 0x8f, 0x56, 0x63}, + "AUC ", + 18}, + {{0xcd, 0xcf, 0xc0, 0xf6, 0x6c, 0x52, 0x2f, 0xd0, 0x86, 0xa1, + 0xb7, 0x25, 0xea, 0x3c, 0x0e, 0xeb, 0x9f, 0x9e, 0x88, 0x14}, + "AURA ", + 18}, + {{0x62, 0x2d, 0xFf, 0xCc, 0x4e, 0x83, 0xC6, 0x4b, 0xa9, 0x59, + 0x53, 0x0A, 0x5a, 0x55, 0x80, 0x68, 0x7a, 0x57, 0x58, 0x1b}, + "AUTO ", + 18}, + {{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}, + {{0xC3, 0x9E, 0x62, 0x6A, 0x04, 0xC5, 0x97, 0x1D, 0x77, 0x0e, + 0x31, 0x97, 0x60, 0xD7, 0x92, 0x65, 0x02, 0x97, 0x5e, 0x47}, + "AXPR ", + 18}, + {{0x5d, 0x51, 0xfc, 0xce, 0xd3, 0x11, 0x4a, 0x8b, 0xb5, 0xe9, + 0x0c, 0xdd, 0x0f, 0x9d, 0x68, 0x2b, 0xcb, 0xcc, 0x53, 0x93}, + "B2BX ", + 18}, + {{0x99, 0x8b, 0x3b, 0x82, 0xbc, 0x9d, 0xba, 0x17, 0x39, 0x90, + 0xbe, 0x7a, 0xfb, 0x77, 0x27, 0x88, 0xb5, 0xac, 0xb8, 0xbd}, + "BANCA ", + 18}, + {{0xf8, 0x7f, 0x0d, 0x91, 0x53, 0xfe, 0xa5, 0x49, 0xc7, 0x28, + 0xad, 0x61, 0xcb, 0x80, 0x15, 0x95, 0xa6, 0x8b, 0x73, 0xde}, + "BANX ", + 18}, + {{0x2a, 0x05, 0xd2, 0x2d, 0xb0, 0x79, 0xbc, 0x40, 0xc2, 0xf7, + 0x7a, 0x1d, 0x1f, 0xf7, 0x03, 0xa5, 0x6e, 0x63, 0x1c, 0xc1}, + "BAS ", + 8}, + {{0x0D, 0x87, 0x75, 0xF6, 0x48, 0x43, 0x06, 0x79, 0xA7, 0x09, + 0xE9, 0x8d, 0x2b, 0x0C, 0xb6, 0x25, 0x0d, 0x28, 0x87, 0xEF}, + "BAT ", + 18}, + {{0x9a, 0x02, 0x42, 0xb7, 0xa3, 0x3d, 0xac, 0xbe, 0x40, 0xed, + 0xb9, 0x27, 0x83, 0x4f, 0x96, 0xeb, 0x39, 0xf8, 0xfb, 0xcb}, + "BAX ", + 18}, + {{0xe7, 0xD3, 0xe4, 0x41, 0x3E, 0x29, 0xae, 0x35, 0xB0, 0x89, + 0x31, 0x40, 0xF4, 0x50, 0x09, 0x65, 0xc7, 0x43, 0x65, 0xe5}, + "BBC ", + 18}, + {{0x37, 0xd4, 0x05, 0x10, 0xa2, 0xf5, 0xbc, 0x98, 0xaa, 0x7a, + 0x0f, 0x7b, 0xf4, 0xb3, 0x45, 0x3b, 0xcf, 0xb9, 0x0a, 0xc1}, + "BBI ", + 18}, + {{0x4a, 0x60, 0x58, 0x66, 0x6c, 0xf1, 0x05, 0x7e, 0xaC, 0x3C, + 0xD3, 0xA5, 0xa6, 0x14, 0x62, 0x05, 0x47, 0x55, 0x9f, 0xc9}, + "BBK ", + 18}, + {{0x35, 0xa6, 0x96, 0x42, 0x85, 0x70, 0x83, 0xba, 0x2f, 0x30, + 0xbf, 0xab, 0x73, 0x5d, 0xac, 0xc7, 0xf0, 0xba, 0xc9, 0x69}, + "BBN ", + 18}, + {{0x84, 0xf7, 0xc4, 0x4b, 0x6f, 0xed, 0x10, 0x80, 0xf6, 0x47, + 0xe3, 0x54, 0xd5, 0x52, 0x59, 0x5b, 0xe2, 0xcc, 0x60, 0x2f}, + "BBO ", + 18}, + {{0x2e, 0xcb, 0x13, 0xa8, 0xc4, 0x58, 0xc3, 0x79, 0xc4, 0xd9, + 0xa7, 0x25, 0x9e, 0x20, 0x2d, 0xe0, 0x3c, 0x8f, 0x3d, 0x19}, + "BC ", + 18}, + {{0x1f, 0x41, 0xe4, 0x2d, 0x0a, 0x9e, 0x3c, 0x0d, 0xd3, 0xba, + 0x15, 0xb5, 0x27, 0x34, 0x27, 0x83, 0xb4, 0x32, 0x00, 0xa9}, + "BCAP ", + 0}, + {{0x73, 0x67, 0xa6, 0x80, 0x39, 0xd4, 0x70, 0x4f, 0x30, 0xbf, + 0xbf, 0x6d, 0x94, 0x80, 0x20, 0xc3, 0xb0, 0x7d, 0xfc, 0x59}, + "BCBC ", + 18}, + {{0x1e, 0x79, 0x7C, 0xe9, 0x86, 0xC3, 0xCF, 0xF4, 0x47, 0x2F, + 0x7D, 0x38, 0xd5, 0xC4, 0xab, 0xa5, 0x5D, 0xfE, 0xFE, 0x40}, + "BCDN ", + 15}, + {{0xac, 0xfa, 0x20, 0x9f, 0xb7, 0x3b, 0xf3, 0xdd, 0x5b, 0xbf, + 0xb1, 0x10, 0x1b, 0x9b, 0xc9, 0x99, 0xc4, 0x90, 0x62, 0xa5}, + "BCDT ", + 18}, + {{0xbc, 0x12, 0x34, 0x55, 0x2E, 0xBe, 0xa3, 0x2B, 0x51, 0x21, + 0x19, 0x03, 0x56, 0xbB, 0xa6, 0xD3, 0xBb, 0x22, 0x5b, 0xb5}, + "BCL ", + 18}, + {{0x1c, 0x44, 0x81, 0x75, 0x0d, 0xaa, 0x5F, 0xf5, 0x21, 0xA2, + 0xa7, 0x49, 0x0d, 0x99, 0x81, 0xeD, 0x46, 0x46, 0x5D, 0xbd}, + "BCPT ", + 18}, + {{0x10, 0x14, 0x61, 0x3e, 0x2b, 0x3c, 0xbc, 0x4d, 0x57, 0x50, + 0x54, 0xd4, 0x98, 0x2e, 0x58, 0x0d, 0x9b, 0x99, 0xd7, 0xb1}, + "BCV ", + 8}, + {{0x19, 0x61, 0xB3, 0x33, 0x19, 0x69, 0xeD, 0x52, 0x77, 0x07, + 0x51, 0xfC, 0x71, 0x8e, 0xf5, 0x30, 0x83, 0x8b, 0x6d, 0xEE}, + "BDG ", + 18}, + {{0x4D, 0x8f, 0xc1, 0x45, 0x3a, 0x0F, 0x35, 0x9e, 0x99, 0xc9, + 0x67, 0x59, 0x54, 0xe6, 0x56, 0xD8, 0x0d, 0x99, 0x6F, 0xbF}, + "BEE ", + 18}, + {{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}, + {{0xee, 0x74, 0x11, 0x0f, 0xb5, 0xa1, 0x00, 0x7b, 0x06, 0x28, + 0x2e, 0x0d, 0xe5, 0xd7, 0x3a, 0x61, 0xbf, 0x41, 0xd9, 0xcd}, + "BHPC ", + 18}, + {{0xfe, 0x5d, 0x90, 0x8c, 0x9a, 0xd8, 0x5f, 0x65, 0x11, 0x85, + 0xda, 0xa6, 0xa4, 0x77, 0x07, 0x26, 0xe2, 0xb2, 0x7d, 0x09}, + "BHR ", + 18}, + {{0x08, 0xb4, 0xc8, 0x66, 0xaE, 0x9D, 0x1b, 0xE5, 0x6a, 0x06, + 0xe0, 0xC3, 0x02, 0x05, 0x4B, 0x4F, 0xFe, 0x06, 0x7b, 0x43}, + "BITCAR ", + 8}, + {{0xf3, 0xd2, 0x9f, 0xb9, 0x8d, 0x2d, 0xc5, 0xe7, 0x8c, 0x87, + 0x19, 0x8d, 0xee, 0xf9, 0x93, 0x77, 0x34, 0x5f, 0xd6, 0xf1}, + "BITPARK ", + 8}, + {{0xb3, 0x10, 0x4b, 0x4b, 0x9d, 0xa8, 0x20, 0x25, 0xe8, 0xb9, + 0xf8, 0xfb, 0x28, 0xb3, 0x55, 0x3c, 0xe2, 0xf6, 0x70, 0x69}, + "BIX ", + 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}, + {{0x45, 0x24, 0x5b, 0xc5, 0x92, 0x19, 0xee, 0xaa, 0xf6, 0xcd, + 0x3f, 0x38, 0x2e, 0x07, 0x8a, 0x46, 0x1f, 0xf9, 0xde, 0x7b}, + "BKX ", + 18}, + {{0xca, 0x29, 0xdb, 0x42, 0x21, 0xc1, 0x11, 0x88, 0x8a, 0x7e, + 0x80, 0xb1, 0x2e, 0xac, 0x8a, 0x26, 0x6d, 0xa3, 0xee, 0x0d}, + "BLN ", + 18}, + {{0x10, 0x7c, 0x45, 0x04, 0xcd, 0x79, 0xC5, 0xd2, 0x69, 0x6E, + 0xa0, 0x03, 0x0a, 0x8d, 0xD4, 0xe9, 0x26, 0x01, 0xB8, 0x2e}, + "BLT ", + 18}, + {{0x53, 0x9e, 0xfe, 0x69, 0xbc, 0xdd, 0x21, 0xa8, 0x3e, 0xfd, + 0x91, 0x22, 0x57, 0x1a, 0x64, 0xcc, 0x25, 0xe0, 0x28, 0x2b}, + "BLUE ", + 8}, + {{0xce, 0x59, 0xd2, 0x9b, 0x09, 0xaa, 0xe5, 0x65, 0xfe, 0xee, + 0xf8, 0xe5, 0x2f, 0x47, 0xc3, 0xcd, 0x53, 0x68, 0xc6, 0x63}, + "BLX bull ", + 18}, + {{0xE5, 0xa7, 0xc1, 0x29, 0x72, 0xf3, 0xbb, 0xFe, 0x70, 0xed, + 0x29, 0x52, 0x1C, 0x89, 0x49, 0xb8, 0xAf, 0x6a, 0x09, 0x70}, + "BLX ico ", + 18}, + {{0x57, 0x32, 0x04, 0x6A, 0x88, 0x37, 0x04, 0x40, 0x4F, 0x28, + 0x4C, 0xe4, 0x1F, 0xfA, 0xDd, 0x5b, 0x00, 0x7F, 0xD6, 0x68}, + "BLZ ", + 18}, + {{0xdf, 0x6e, 0xf3, 0x43, 0x35, 0x07, 0x80, 0xbf, 0x8c, 0x34, + 0x10, 0xbf, 0x06, 0x2e, 0x0c, 0x01, 0x5b, 0x1d, 0xd6, 0x71}, + "BMC ", + 8}, + {{0xf0, 0x28, 0xad, 0xee, 0x51, 0x53, 0x3b, 0x1b, 0x47, 0xbe, + 0xaa, 0x89, 0x0f, 0xeb, 0x54, 0xa4, 0x57, 0xf5, 0x1e, 0x89}, + "BMT ", + 18}, + {{0x98, 0x6E, 0xE2, 0xB9, 0x44, 0xc4, 0x2D, 0x01, 0x7F, 0x52, + 0xAf, 0x21, 0xc4, 0xc6, 0x9B, 0x84, 0xDB, 0xeA, 0x35, 0xd8}, + "BMX ", + 18}, + {{0xb8, 0xc7, 0x74, 0x82, 0xe4, 0x5f, 0x1f, 0x44, 0xde, 0x17, + 0x45, 0xf5, 0x2c, 0x74, 0x42, 0x6c, 0x63, 0x1b, 0xdd, 0x52}, + "BNB ", + 18}, + {{0xdD, 0x6B, 0xf5, 0x6C, 0xA2, 0xad, 0xa2, 0x4c, 0x68, 0x3F, + 0xAC, 0x50, 0xE3, 0x77, 0x83, 0xe5, 0x5B, 0x57, 0xAF, 0x9F}, + "BNC ", + 12}, + {{0xef, 0x51, 0xc9, 0x37, 0x7f, 0xeb, 0x29, 0x85, 0x6e, 0x61, + 0x62, 0x5c, 0xaf, 0x93, 0x90, 0xbd, 0x0b, 0x67, 0xea, 0x18}, + "BNC ", + 8}, + {{0xdA, 0x2C, 0x42, 0x4F, 0xc9, 0x8c, 0x74, 0x1c, 0x2d, 0x4e, + 0xf2, 0xf4, 0x28, 0x97, 0xCE, 0xfe, 0xd8, 0x97, 0xCA, 0x75}, + "BNFT ", + 9}, + {{0xda, 0x80, 0xb2, 0x00, 0x38, 0xbd, 0xf9, 0x68, 0xc7, 0x30, + 0x7b, 0xb5, 0x90, 0x7a, 0x46, 0x94, 0x82, 0xcf, 0x62, 0x51}, + "BNN ", + 8}, + {{0x1F, 0x57, 0x3D, 0x6F, 0xb3, 0xF1, 0x3d, 0x68, 0x9F, 0xF8, + 0x44, 0xB4, 0xcE, 0x37, 0x79, 0x4d, 0x79, 0xa7, 0xFF, 0x1C}, + "BNT ", + 18}, + {{0xd2, 0xd6, 0x15, 0x86, 0x83, 0xae, 0xe4, 0xcc, 0x83, 0x80, + 0x67, 0x72, 0x72, 0x09, 0xa0, 0xaa, 0xf4, 0x35, 0x9d, 0xe3}, + "BNTY ", + 18}, + {{0xDF, 0x34, 0x79, 0x11, 0x91, 0x0b, 0x6c, 0x9A, 0x42, 0x86, + 0xbA, 0x8E, 0x2E, 0xE5, 0xea, 0x4a, 0x39, 0xeB, 0x21, 0x34}, + "BOB ", + 18}, + {{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}, + {{0x13, 0x9d, 0x93, 0x97, 0x27, 0x4b, 0xb9, 0xe2, 0xc2, 0x9a, + 0x9a, 0xa8, 0xaa, 0x0b, 0x58, 0x74, 0xd3, 0x0d, 0x62, 0xe3}, + "BOUTS ", + 18}, + {{0x63, 0xf5, 0x84, 0xfa, 0x56, 0xe6, 0x0e, 0x4d, 0x0f, 0xe8, + 0x80, 0x2b, 0x27, 0xc7, 0xe6, 0xe3, 0xb3, 0x3e, 0x00, 0x7f}, + "BOX ", + 18}, + {{0xe1, 0xA1, 0x78, 0xB6, 0x81, 0xBD, 0x05, 0x96, 0x4d, 0x3e, + 0x3E, 0xd3, 0x3A, 0xE7, 0x31, 0x57, 0x7d, 0x9d, 0x96, 0xdD}, + "BOX ", + 18}, + {{0x78, 0x01, 0x16, 0xd9, 0x1e, 0x55, 0x92, 0xe5, 0x8a, 0x3b, + 0x3c, 0x76, 0xa3, 0x51, 0x57, 0x1b, 0x39, 0xab, 0xce, 0xc6}, + "BOXX ", + 15}, + {{0x32, 0x76, 0x82, 0x77, 0x9b, 0xAB, 0x2B, 0xF4, 0xd1, 0x33, + 0x7e, 0x89, 0x74, 0xab, 0x9d, 0xE8, 0x27, 0x5A, 0x7C, 0xa8}, + "BPT ", + 18}, + {{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}, + {{0x50, 0x9A, 0x38, 0xb7, 0xa1, 0xcC, 0x0d, 0xcd, 0x83, 0xAa, + 0x9d, 0x06, 0x21, 0x46, 0x63, 0xD9, 0xeC, 0x7c, 0x7F, 0x4a}, + "BST ", + 18}, + {{0x02, 0x72, 0x58, 0x36, 0xeb, 0xf3, 0xec, 0xdb, 0x1c, 0xdf, + 0x1c, 0x7b, 0x02, 0xfc, 0xbb, 0xfa, 0xa2, 0x73, 0x6a, 0xf8}, + "BTCA ", + 8}, + {{0x08, 0x86, 0x94, 0x9c, 0x1b, 0x8C, 0x41, 0x28, 0x60, 0xc4, + 0x26, 0x4C, 0xeb, 0x80, 0x83, 0xd1, 0x36, 0x5e, 0x86, 0xCF}, + "BTCE ", + 8}, + {{0x5a, 0xcD, 0x19, 0xb9, 0xc9, 0x1e, 0x59, 0x6b, 0x1f, 0x06, + 0x2f, 0x18, 0xe3, 0xD0, 0x2d, 0xa7, 0xeD, 0x8D, 0x1e, 0x50}, + "BTCL ", + 8}, + {{0x87, 0xf5, 0xe8, 0xc3, 0x42, 0x52, 0x18, 0x83, 0x7f, 0x3c, + 0xb6, 0x7d, 0xb9, 0x41, 0xaf, 0x0c, 0x01, 0x32, 0x3e, 0x56}, + "BTCONE ", + 18}, + {{0x6a, 0xac, 0x8c, 0xb9, 0x86, 0x1e, 0x42, 0xbf, 0x82, 0x59, + 0xf5, 0xab, 0xdc, 0x6a, 0xe3, 0xae, 0x89, 0x90, 0x9e, 0x11}, + "BTCR ", + 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}, + {{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}, + {{0xcb, 0x97, 0xe6, 0x5f, 0x07, 0xda, 0x24, 0xd4, 0x6b, 0xcd, + 0xd0, 0x78, 0xeb, 0xeb, 0xd7, 0xc6, 0xe6, 0xe3, 0xd7, 0x50}, + "BTM ", + 8}, + {{0x36, 0x90, 0x5f, 0xc9, 0x32, 0x80, 0xf5, 0x23, 0x62, 0xa1, + 0xcb, 0xab, 0x15, 0x1f, 0x25, 0xdc, 0x46, 0x74, 0x2f, 0xb5}, + "BTO ", + 18}, + {{0x16, 0xB0, 0xE6, 0x2a, 0xC1, 0x3a, 0x2f, 0xAe, 0xD3, 0x6D, + 0x18, 0xbc, 0xe2, 0x35, 0x6d, 0x25, 0xAb, 0x3C, 0xfA, 0xD3}, + "BTQ ", + 18}, + {{0x49, 0x9a, 0x6b, 0x77, 0xbc, 0x25, 0xc2, 0x6b, 0xcf, 0x82, + 0x65, 0xe2, 0x10, 0x2b, 0x1b, 0x3d, 0xd1, 0x61, 0x70, 0x24}, + "BTR ", + 18}, + {{0x03, 0xc7, 0x80, 0xcd, 0x55, 0x45, 0x98, 0x59, 0x2b, 0x97, + 0xb7, 0x25, 0x6d, 0xda, 0xad, 0x75, 0x99, 0x45, 0xb1, 0x25}, + "BTRN ", + 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}, + {{0xb6, 0x83, 0xD8, 0x3a, 0x53, 0x2e, 0x2C, 0xb7, 0xDF, 0xa5, + 0x27, 0x5e, 0xED, 0x36, 0x98, 0x43, 0x63, 0x71, 0xcc, 0x9f}, + "BTU ", + 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}, + {{0xbd, 0x16, 0x8c, 0xbf, 0x9d, 0x3a, 0x37, 0x5b, 0x38, 0xdc, + 0x51, 0xa2, 0x02, 0xb5, 0xe8, 0xa4, 0xe5, 0x20, 0x69, 0xed}, + "BWX ", + 18}, + {{0x43, 0x75, 0xe7, 0xad, 0x8a, 0x01, 0xb8, 0xec, 0x3e, 0xd0, + 0x41, 0x39, 0x9f, 0x62, 0xd9, 0xcd, 0x12, 0x0e, 0x00, 0x63}, + "BZ ", + 18}, + {{0xe1, 0xae, 0xe9, 0x84, 0x95, 0x36, 0x5f, 0xc1, 0x79, 0x69, + 0x9c, 0x1b, 0xb3, 0xe7, 0x61, 0xfa, 0x71, 0x6b, 0xee, 0x62}, + "BZNT ", + 18}, + {{0x38, 0x39, 0xd8, 0xba, 0x31, 0x27, 0x51, 0xaa, 0x02, 0x48, + 0xfe, 0xd6, 0xa8, 0xba, 0xcb, 0x84, 0x30, 0x8e, 0x20, 0xed}, + "Bez ", + 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}, + {{0x04, 0xf2, 0xe7, 0x22, 0x1f, 0xdb, 0x1b, 0x52, 0xa6, 0x81, + 0x69, 0xb2, 0x57, 0x93, 0xe5, 0x14, 0x78, 0xff, 0x03, 0x29}, + "CAPP ", + 2}, + {{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}, + {{0x95, 0x4b, 0x89, 0x07, 0x04, 0x69, 0x3a, 0xf2, 0x42, 0x61, + 0x3e, 0xde, 0xf1, 0xb6, 0x03, 0x82, 0x5a, 0xfc, 0xd7, 0x08}, + "CARD ", + 18}, + {{0xbf, 0x18, 0xf2, 0x46, 0xb9, 0x30, 0x1f, 0x23, 0x1e, 0x95, + 0x61, 0xb3, 0x5a, 0x38, 0x79, 0x76, 0x9b, 0xb4, 0x63, 0x75}, + "CARE ", + 18}, + {{0xe8, 0x78, 0x0B, 0x48, 0xbd, 0xb0, 0x5F, 0x92, 0x86, 0x97, + 0xA5, 0xe8, 0x15, 0x5f, 0x67, 0x2E, 0xD9, 0x14, 0x62, 0xF7}, + "CAS ", + 18}, + {{0x12, 0x34, 0x56, 0x74, 0x61, 0xd3, 0xf8, 0xdb, 0x74, 0x96, + 0x58, 0x17, 0x74, 0xbd, 0x86, 0x9c, 0x83, 0xd5, 0x1c, 0x93}, + "BitClv ", + 18}, + {{0x56, 0xba, 0x2E, 0xe7, 0x89, 0x04, 0x61, 0xf4, 0x63, 0xF7, + 0xbe, 0x02, 0xaA, 0xC3, 0x09, 0x9f, 0x6d, 0x58, 0x11, 0xA8}, + "Blockcat ", + 18}, + {{0x68, 0xe1, 0x4b, 0xb5, 0xA4, 0x5B, 0x96, 0x81, 0x32, 0x7E, + 0x16, 0xE5, 0x28, 0x08, 0x4B, 0x9d, 0x96, 0x2C, 0x1a, 0x39}, + "BitClvs2 ", + 18}, + {{0x26, 0xdb, 0x54, 0x39, 0xf6, 0x51, 0xca, 0xf4, 0x91, 0xa8, + 0x7d, 0x48, 0x79, 0x9d, 0xa8, 0x1f, 0x19, 0x1b, 0xdb, 0x6b}, + "CBC ", + 8}, + {{0x95, 0xef, 0xd1, 0xfe, 0x60, 0x99, 0xf6, 0x5a, 0x7e, 0xd5, + 0x24, 0xde, 0xf4, 0x87, 0x48, 0x32, 0x21, 0x09, 0x49, 0x47}, + "CBM ", + 18}, + {{0x07, 0x6C, 0x97, 0xe1, 0xc8, 0x69, 0x07, 0x2e, 0xE2, 0x2f, + 0x8c, 0x91, 0x97, 0x8C, 0x99, 0xB4, 0xbc, 0xB0, 0x25, 0x91}, + "CBT ", + 18}, + {{0xc1, 0x66, 0x03, 0x87, 0x05, 0xFF, 0xBA, 0xb3, 0x79, 0x41, + 0x85, 0xb3, 0xa9, 0xD9, 0x25, 0x63, 0x2A, 0x1D, 0xF3, 0x7D}, + "CC3 ", + 18}, + {{0x28, 0x57, 0x7A, 0x6d, 0x31, 0x55, 0x9b, 0xd2, 0x65, 0xCe, + 0x3A, 0xDB, 0x62, 0xd0, 0x45, 0x85, 0x50, 0xF7, 0xb8, 0xa7}, + "CrashCs ", + 18}, + {{0xbe, 0x11, 0xee, 0xb1, 0x86, 0xe6, 0x24, 0xb8, 0xf2, 0x6a, + 0x50, 0x45, 0x57, 0x5a, 0x13, 0x40, 0xe4, 0x05, 0x45, 0x52}, + "CCC ico ", + 18}, + {{0x37, 0x89, 0x03, 0xa0, 0x3f, 0xb2, 0xc3, 0xac, 0x76, 0xbb, + 0x52, 0x77, 0x3e, 0x3c, 0xe1, 0x13, 0x40, 0x37, 0x7a, 0x32}, + "CCCX ", + 18}, + {{0xd3, 0x48, 0xe0, 0x7a, 0x28, 0x06, 0x50, 0x5b, 0x85, 0x61, + 0x23, 0x04, 0x5d, 0x27, 0xae, 0xed, 0x90, 0x92, 0x4b, 0x50}, + "CCLC ", + 8}, + {{0x67, 0x9b, 0xad, 0xc5, 0x51, 0x62, 0x6e, 0x01, 0xb2, 0x3c, + 0xee, 0xce, 0xfb, 0xc9, 0xb8, 0x77, 0xea, 0x18, 0xfc, 0x46}, + "CCO ", + 18}, + {{0x31, 0x5c, 0xe5, 0x9f, 0xaf, 0xd3, 0xa8, 0xd5, 0x62, 0xb7, + 0xec, 0x1c, 0x85, 0x42, 0x38, 0x2d, 0x27, 0x10, 0xb0, 0x6c}, + "CCS ", + 18}, + {{0x33, 0x6f, 0x64, 0x6f, 0x87, 0xd9, 0xf6, 0xbc, 0x6e, 0xd4, + 0x2d, 0xd4, 0x6e, 0x8b, 0x3f, 0xd9, 0xdb, 0xd1, 0x5c, 0x22}, + "CCT ", + 18}, + {{0x8a, 0x95, 0xca, 0x44, 0x8A, 0x52, 0xC0, 0xAD, 0xf0, 0x05, + 0x4b, 0xB3, 0x40, 0x2d, 0xC5, 0xe0, 0x9C, 0xD6, 0xB2, 0x32}, + "CDL ", + 18}, + {{0x17, 0x7d, 0x39, 0xAC, 0x67, 0x6E, 0xD1, 0xC6, 0x7A, 0x2b, + 0x26, 0x8A, 0xD7, 0xF1, 0xE5, 0x88, 0x26, 0xE5, 0xB0, 0xaf}, + "CDT ", + 18}, + {{0x2c, 0xb1, 0x01, 0xd7, 0xda, 0x0e, 0xba, 0xa5, 0x7d, 0x3f, + 0x2f, 0xef, 0x46, 0xd7, 0xff, 0xb7, 0xbb, 0x64, 0x59, 0x2b}, + "CDX C$X ", + 0}, + {{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}, + {{0x11, 0x22, 0xb6, 0xa0, 0xe0, 0x0d, 0xce, 0x05, 0x63, 0x08, + 0x2b, 0x6e, 0x29, 0x53, 0xf3, 0xa9, 0x43, 0x85, 0x5c, 0x1f}, + "CENNZ ", + 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}, + {{0xf3, 0xdb, 0x75, 0x60, 0xe8, 0x20, 0x83, 0x46, 0x58, 0xb5, + 0x90, 0xc9, 0x62, 0x34, 0xc3, 0x33, 0xcd, 0x3d, 0x5e, 0x5e}, + "CHP ", + 18}, + {{0xba, 0x9d, 0x41, 0x99, 0xfa, 0xb4, 0xf2, 0x6e, 0xfe, 0x35, + 0x51, 0xd4, 0x90, 0xe3, 0x82, 0x14, 0x86, 0xf1, 0x35, 0xba}, + "CHSB ", + 8}, + {{0x14, 0x60, 0xa5, 0x80, 0x96, 0xd8, 0x0a, 0x50, 0xa2, 0xf1, + 0xf9, 0x56, 0xdd, 0xa4, 0x97, 0x61, 0x1f, 0xa4, 0xf1, 0x65}, + "CHX ", + 18}, + {{0x3a, 0xbd, 0xff, 0x32, 0xf7, 0x6b, 0x42, 0xe7, 0x63, 0x5b, + 0xdb, 0x7e, 0x42, 0x5f, 0x02, 0x31, 0xa5, 0xf3, 0xab, 0x17}, + "CJT ", + 18}, + {{0x06, 0x01, 0x2c, 0x8c, 0xf9, 0x7b, 0xea, 0xd5, 0xde, 0xae, + 0x23, 0x70, 0x70, 0xf9, 0x58, 0x7f, 0x8e, 0x7a, 0x26, 0x6d}, + "CK ", + 0}, + {{0xe8, 0x1d, 0x72, 0xd1, 0x4b, 0x15, 0x16, 0xe6, 0x8a, 0xc3, + 0x19, 0x0a, 0x46, 0xc9, 0x33, 0x02, 0xcc, 0x8e, 0xd6, 0x0f}, + "CL ", + 18}, + {{0xb1, 0xc1, 0xcb, 0x8c, 0x7c, 0x19, 0x92, 0xdb, 0xa2, 0x4e, + 0x62, 0x8b, 0xf7, 0xd3, 0x8e, 0x71, 0xda, 0xd4, 0x6a, 0xeb}, + "CLB ", + 18}, + {{0x3d, 0xc9, 0xa4, 0x2f, 0xa7, 0xaf, 0xe5, 0x7b, 0xe0, 0x3c, + 0x58, 0xfd, 0x7f, 0x44, 0x11, 0xb1, 0xe4, 0x66, 0xc5, 0x08}, + "CLL ", + 18}, + {{0x41, 0x62, 0x17, 0x8B, 0x78, 0xD6, 0x98, 0x54, 0x80, 0xA3, + 0x08, 0xB2, 0x19, 0x0E, 0xE5, 0x51, 0x74, 0x60, 0x40, 0x6D}, + "CLN ", + 18}, + {{0x7f, 0xce, 0x28, 0x56, 0x89, 0x9a, 0x68, 0x06, 0xee, 0xef, + 0x70, 0x80, 0x79, 0x85, 0xfc, 0x75, 0x54, 0xc6, 0x63, 0x40}, + "CLP ", + 9}, + {{0x3e, 0xdd, 0x23, 0x5c, 0x3e, 0x84, 0x0c, 0x1f, 0x29, 0x28, + 0x6b, 0x2e, 0x39, 0x37, 0x0a, 0x25, 0x5c, 0x7b, 0x6f, 0xdb}, + "CMBT ", + 8}, + {{0x7e, 0x66, 0x75, 0x25, 0x52, 0x1c, 0xF6, 0x13, 0x52, 0xe2, + 0xE0, 0x1b, 0x50, 0xFa, 0xaa, 0xE7, 0xDf, 0x39, 0x74, 0x9a}, + "CMC ", + 18}, + {{0x47, 0xbc, 0x01, 0x59, 0x77, 0x98, 0xdc, 0xd7, 0x50, 0x6d, + 0xcc, 0xa3, 0x6a, 0xc4, 0x30, 0x2f, 0xc9, 0x3a, 0x8c, 0xfb}, + "CMCT ", + 8}, + {{0xf8, 0x5f, 0xEe, 0xa2, 0xFd, 0xD8, 0x1d, 0x51, 0x17, 0x7F, + 0x6b, 0x8F, 0x35, 0xF0, 0xe6, 0x73, 0x4C, 0xe4, 0x5F, 0x5F}, + "CMT ", + 18}, + {{0xEB, 0xf2, 0xF9, 0xE8, 0xDe, 0x96, 0x0f, 0x64, 0xec, 0x0f, + 0xDC, 0xDa, 0x6C, 0xb2, 0x82, 0x42, 0x31, 0x33, 0x34, 0x7B}, + "CNB ", + 8}, + {{0xd4, 0xc4, 0x35, 0xf5, 0xb0, 0x9f, 0x85, 0x5c, 0x33, 0x17, + 0xc8, 0x52, 0x4c, 0xb1, 0xf5, 0x86, 0xe4, 0x27, 0x95, 0xfa}, + "CND ", + 18}, + {{0x87, 0x13, 0xd2, 0x66, 0x37, 0xcf, 0x49, 0xe1, 0xb6, 0xb4, + 0xa7, 0xce, 0x57, 0x10, 0x6a, 0xab, 0xc9, 0x32, 0x53, 0x43}, + "CNN ", + 18}, + {{0xB4, 0xb1, 0xD2, 0xC2, 0x17, 0xEC, 0x07, 0x76, 0x58, 0x4C, + 0xE0, 0x8D, 0x3D, 0xD9, 0x8F, 0x90, 0xED, 0xed, 0xA4, 0x4b}, + "CO2 ", + 18}, + {{0x57, 0x4b, 0x36, 0xbc, 0xed, 0x44, 0x33, 0x38, 0x87, 0x5d, + 0x17, 0x1c, 0xc3, 0x77, 0xe6, 0x91, 0xf7, 0xd4, 0xf8, 0x87}, + "CO2Bit ", + 18}, + {{0xb2, 0xf7, 0xeb, 0x1f, 0x2c, 0x37, 0x64, 0x5b, 0xe6, 0x1d, + 0x73, 0x95, 0x30, 0x35, 0x36, 0x0e, 0x76, 0x8d, 0x81, 0xe6}, + "COB ", + 18}, + {{0x31, 0x36, 0xeF, 0x85, 0x15, 0x92, 0xaC, 0xf4, 0x9C, 0xA4, + 0xC8, 0x25, 0x13, 0x1E, 0x36, 0x41, 0x70, 0xFA, 0x32, 0xb3}, + "COFI ", + 18}, + {{0x0c, 0x91, 0xb0, 0x15, 0xab, 0xa6, 0xf7, 0xb4, 0x73, 0x8d, + 0xcd, 0x36, 0xe7, 0x41, 0x01, 0x38, 0xb2, 0x9a, 0xdc, 0x29}, + "COIL ", + 8}, + {{0xeb, 0x54, 0x7e, 0xd1, 0xd8, 0xa3, 0xff, 0x14, 0x61, 0xab, + 0xaa, 0x7f, 0x00, 0x22, 0xfe, 0xd4, 0x83, 0x6e, 0x00, 0xa4}, + "COIN ", + 18}, + {{0xc4, 0xbc, 0xd6, 0x4c, 0xb2, 0x16, 0xd4, 0x9f, 0xd3, 0xc6, + 0x43, 0xa3, 0x27, 0x62, 0xf3, 0x46, 0x26, 0xb4, 0x5a, 0x1a}, + "COSM ", + 18}, + {{0x65, 0x29, 0x2e, 0xea, 0xdf, 0x14, 0x26, 0xcd, 0x2d, 0xf1, + 0xc4, 0x79, 0x3a, 0x3d, 0x75, 0x19, 0xf2, 0x53, 0x91, 0x3b}, + "COSS ", + 18}, + {{0x9e, 0x96, 0x60, 0x44, 0x45, 0xec, 0x19, 0xff, 0xed, 0x9a, + 0x5e, 0x8d, 0xd7, 0xb5, 0x0a, 0x29, 0xc8, 0x99, 0xa1, 0x0c}, + "COSS.io ", + 18}, + {{0xE2, 0xFB, 0x65, 0x29, 0xEF, 0x56, 0x6a, 0x08, 0x0e, 0x6d, + 0x23, 0xdE, 0x0b, 0xd3, 0x51, 0x31, 0x10, 0x87, 0xD5, 0x67}, + "COV ", + 18}, + {{0x0E, 0xbb, 0x61, 0x42, 0x04, 0xE4, 0x7c, 0x09, 0xB6, 0xC3, + 0xFe, 0xB9, 0xAA, 0xeC, 0xad, 0x8E, 0xE0, 0x60, 0xE2, 0x3E}, + "CPAY ", + 0}, + {{0xfA, 0xE4, 0xEe, 0x59, 0xCD, 0xd8, 0x6e, 0x3B, 0xe9, 0xe8, + 0xb9, 0x0b, 0x53, 0xAA, 0x86, 0x63, 0x27, 0xD7, 0xc0, 0x90}, + "CPC ", + 18}, + {{0xb7, 0x87, 0xd4, 0xea, 0xc8, 0x89, 0x97, 0x30, 0xbb, 0x8c, + 0x57, 0xfc, 0x3c, 0x99, 0x8c, 0x49, 0xc5, 0x24, 0x4e, 0xc0}, + "CPEX ", + 8}, + {{0x70, 0x64, 0xaA, 0xb3, 0x9A, 0x0F, 0xcf, 0x72, 0x21, 0xc3, + 0x39, 0x67, 0x19, 0xD0, 0x91, 0x7a, 0x65, 0xE3, 0x55, 0x15}, + "CPOLLO ", + 18}, + {{0x88, 0xd5, 0x0b, 0x46, 0x6b, 0xe5, 0x52, 0x22, 0x01, 0x9d, + 0x71, 0xf9, 0xe8, 0xfa, 0xe1, 0x7f, 0x5f, 0x45, 0xfc, 0xa1}, + "CPT ", + 8}, + {{0xf4, 0x47, 0x45, 0xfb, 0xd4, 0x1f, 0x6a, 0x1b, 0xa1, 0x51, + 0xdf, 0x19, 0x0d, 0xb0, 0x56, 0x4c, 0x5f, 0xcc, 0x44, 0x10}, + "CPY ", + 18}, + {{0x7f, 0x58, 0x5b, 0x91, 0x30, 0xc6, 0x4e, 0x9e, 0x9f, 0x47, + 0x0b, 0x61, 0x8a, 0x7b, 0xad, 0xd0, 0x3d, 0x79, 0xca, 0x7e}, + "CR7 ", + 18}, + {{0xAe, 0xf3, 0x8f, 0xBF, 0xBF, 0x93, 0x2D, 0x1A, 0xeF, 0x3B, + 0x80, 0x8B, 0xc8, 0xfB, 0xd8, 0xCd, 0x8E, 0x1f, 0x8B, 0xC5}, + "CRB ", + 8}, + {{0x2c, 0xf6, 0x18, 0xc1, 0x90, 0x41, 0xd9, 0xdb, 0x33, 0x0d, + 0x82, 0x22, 0xb8, 0x60, 0xa6, 0x24, 0x02, 0x1f, 0x30, 0xfb}, + "CRBT ", + 18}, + {{0xf4, 0x1e, 0x5f, 0xbc, 0x2f, 0x6a, 0xac, 0x20, 0x0d, 0xd8, + 0x61, 0x9e, 0x12, 0x1c, 0xe1, 0xf0, 0x5d, 0x15, 0x00, 0x77}, + "CRC ", + 18}, + {{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}, + {{0x46, 0xb9, 0xad, 0x94, 0x4d, 0x10, 0x59, 0x45, 0x0d, 0xa1, + 0x16, 0x35, 0x11, 0x06, 0x9c, 0x71, 0x8f, 0x69, 0x9d, 0x31}, + "CS ", + 6}, + {{0x29, 0xd7, 0x52, 0x77, 0xac, 0x7f, 0x03, 0x35, 0xb2, 0x16, + 0x5d, 0x08, 0x95, 0xe8, 0x72, 0x5c, 0xbf, 0x65, 0x8d, 0x73}, + "CSNO ", + 8}, + {{0xbb, 0x49, 0xa5, 0x1e, 0xe5, 0xa6, 0x6c, 0xa3, 0xa8, 0xcb, + 0xe5, 0x29, 0x37, 0x9b, 0xa4, 0x4b, 0xa6, 0x7e, 0x67, 0x71}, + "CST ", + 18}, + {{0x45, 0x45, 0x75, 0x0F, 0x39, 0xaF, 0x6B, 0xe4, 0xF2, 0x37, + 0xB6, 0x86, 0x9D, 0x4E, 0xcc, 0xA9, 0x28, 0xFd, 0x5A, 0x85}, + "CTF ", + 18}, + {{0xc8, 0x7c, 0x5d, 0xd8, 0x6a, 0x3d, 0x56, 0x7f, 0xf2, 0x87, + 0x01, 0x88, 0x6f, 0xb0, 0x74, 0x5a, 0xaa, 0x89, 0x8d, 0xa4}, + "CTG ", + 18}, + {{0x9e, 0x7d, 0x29, 0xbd, 0x49, 0x9b, 0x6c, 0x7d, 0xa2, 0xa5, + 0xb2, 0xea, 0xfc, 0xf4, 0xa3, 0x9d, 0x3b, 0xd8, 0x45, 0xd1}, + "CTGC ", + 18}, + {{0xbf, 0x4c, 0xfd, 0x7d, 0x1e, 0xde, 0xee, 0xa5, 0xf6, 0x60, + 0x08, 0x27, 0x41, 0x1b, 0x41, 0xa2, 0x1e, 0xb0, 0x8a, 0xbd}, + "CTL ", + 2}, + {{0x96, 0xA6, 0x56, 0x09, 0xa7, 0xB8, 0x4E, 0x88, 0x42, 0x73, + 0x2D, 0xEB, 0x08, 0xf5, 0x6C, 0x3E, 0x21, 0xaC, 0x6f, 0x8a}, + "CTR ", + 18}, + {{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}, + {{0xea, 0x11, 0x75, 0x5a, 0xe4, 0x1d, 0x88, 0x9c, 0xee, 0xc3, + 0x9a, 0x63, 0xe6, 0xff, 0x75, 0xa0, 0x2b, 0xc1, 0xc0, 0x0d}, + "CTXC ", + 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}, + {{0xbe, 0x42, 0x8c, 0x38, 0x67, 0xf0, 0x5d, 0xea, 0x2a, 0x89, + 0xfc, 0x76, 0xa1, 0x02, 0xb5, 0x44, 0xea, 0xc7, 0xf7, 0x72}, + "CVT ", + 18}, + {{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}, + {{0x78, 0xc2, 0x92, 0xd1, 0x44, 0x5e, 0x6b, 0x95, 0x58, 0xbf, + 0x42, 0xe8, 0xbc, 0x36, 0x92, 0x71, 0xde, 0xd0, 0x62, 0xea}, + "CYMT ", + 8}, + {{0x02, 0x23, 0xfc, 0x70, 0x57, 0x42, 0x14, 0xf6, 0x58, 0x13, + 0xfe, 0x33, 0x6d, 0x87, 0x0a, 0xc4, 0x7e, 0x14, 0x7f, 0xae}, + "CZR ", + 18}, + {{0xE4, 0xc9, 0x4d, 0x45, 0xf7, 0xAe, 0xf7, 0x01, 0x8a, 0x5D, + 0x66, 0xf4, 0x4a, 0xF7, 0x80, 0xec, 0x60, 0x23, 0x37, 0x8e}, + "CrCarbon ", + 6}, + {{0x05, 0xc3, 0x61, 0x7c, 0xbf, 0x13, 0x04, 0xb9, 0x26, 0x0a, + 0xa6, 0x1e, 0xc9, 0x60, 0xf1, 0x15, 0xd6, 0x7b, 0xec, 0xea}, + "Cubrix ", + 18}, + {{0xda, 0xb0, 0xC3, 0x1B, 0xF3, 0x4C, 0x89, 0x7F, 0xb0, 0xFe, + 0x90, 0xD1, 0x2E, 0xC9, 0x40, 0x1c, 0xaf, 0x5c, 0x36, 0xEc}, + "DAB ", + 0}, + {{0xa3, 0x11, 0x08, 0xe5, 0xba, 0xb5, 0x49, 0x45, 0x60, 0xdb, + 0x34, 0xc9, 0x54, 0x92, 0x65, 0x8a, 0xf2, 0x39, 0x35, 0x7c}, + "DACS ", + 18}, + {{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}, + {{0x07, 0xd9, 0xe4, 0x9e, 0xa4, 0x02, 0x19, 0x4b, 0xf4, 0x8a, + 0x82, 0x76, 0xda, 0xfb, 0x16, 0xe4, 0xed, 0x63, 0x33, 0x17}, + "DALC ", + 8}, + {{0x9B, 0x70, 0x74, 0x0e, 0x70, 0x8a, 0x08, 0x3C, 0x6f, 0xF3, + 0x8D, 0xf5, 0x22, 0x97, 0x02, 0x0f, 0x5D, 0xfA, 0xa5, 0xEE}, + "DAN ", + 10}, + {{0xBB, 0x9b, 0xc2, 0x44, 0xD7, 0x98, 0x12, 0x3f, 0xDe, 0x78, + 0x3f, 0xCc, 0x1C, 0x72, 0xd3, 0xBb, 0x8C, 0x18, 0x94, 0x13}, + "DAO ", + 16}, + {{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}, + {{0xab, 0xbb, 0xb6, 0x44, 0x7b, 0x68, 0xff, 0xd6, 0x14, 0x1d, + 0xa7, 0x7c, 0x18, 0xc7, 0xb5, 0x87, 0x6e, 0xd6, 0xc5, 0xab}, + "DATx ", + 18}, + {{0xd8, 0x2D, 0xf0, 0xAB, 0xD3, 0xf5, 0x14, 0x25, 0xEb, 0x15, + 0xef, 0x75, 0x80, 0xfD, 0xA5, 0x57, 0x27, 0x87, 0x5f, 0x14}, + "DAV ", + 18}, + {{0x0b, 0x4b, 0xdc, 0x47, 0x87, 0x91, 0x89, 0x72, 0x74, 0x65, + 0x2d, 0xc1, 0x5e, 0xf5, 0xc1, 0x35, 0xca, 0xe6, 0x1e, 0x60}, + "DAX ", + 18}, + {{0x61, 0x72, 0x5f, 0x3d, 0xb4, 0x00, 0x4a, 0xfe, 0x01, 0x47, + 0x45, 0xb2, 0x1d, 0xab, 0x1e, 0x16, 0x77, 0xcc, 0x32, 0x8b}, + "DAXT ", + 18}, + {{0x9b, 0x68, 0xbf, 0xae, 0x21, 0xdf, 0x5a, 0x51, 0x09, 0x31, + 0xa2, 0x62, 0xce, 0xcf, 0x63, 0xf4, 0x13, 0x38, 0xf2, 0x64}, + "DBET ", + 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}, + {{0xde, 0x1e, 0x0a, 0xe6, 0x10, 0x1b, 0x46, 0x52, 0x0c, 0xf6, + 0x6f, 0xdc, 0x0b, 0x10, 0x59, 0xc5, 0xcc, 0x3d, 0x10, 0x6c}, + "DELTA ", + 8}, + {{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}, + {{0x20, 0xe9, 0x48, 0x67, 0x79, 0x4d, 0xba, 0x03, 0x0e, 0xe2, + 0x87, 0xf1, 0x40, 0x6e, 0x10, 0x0d, 0x03, 0xc8, 0x4c, 0xd3}, + "DEW ", + 18}, + {{0x49, 0x7b, 0xAE, 0xF2, 0x94, 0xc1, 0x1a, 0x5f, 0x0f, 0x5B, + 0xea, 0x3f, 0x2A, 0xdB, 0x30, 0x73, 0xDB, 0x44, 0x8B, 0x56}, + "DEX ", + 18}, + {{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}, + {{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}, + {{0xf1, 0x49, 0x22, 0x00, 0x1a, 0x2f, 0xb8, 0x54, 0x1a, 0x43, + 0x39, 0x05, 0x43, 0x7a, 0xe9, 0x54, 0x41, 0x9c, 0x24, 0x39}, + "DIT ", + 8}, + {{0x13, 0xf1, 0x1C, 0x99, 0x05, 0xA0, 0x8c, 0xa7, 0x6e, 0x3e, + 0x85, 0x3b, 0xE6, 0x3D, 0x4f, 0x09, 0x44, 0x32, 0x6C, 0x72}, + "DIVX ", + 18}, + {{0x07, 0xe3, 0xc7, 0x06, 0x53, 0x54, 0x8b, 0x04, 0xf0, 0xa7, + 0x59, 0x70, 0xc1, 0xf8, 0x1b, 0x4c, 0xbb, 0xfb, 0x60, 0x6f}, + "DLT ", + 18}, + {{0x2c, 0xcb, 0xFF, 0x3A, 0x04, 0x2c, 0x68, 0x71, 0x6E, 0xd2, + 0xa2, 0xCb, 0x0c, 0x54, 0x4A, 0x9f, 0x1d, 0x19, 0x35, 0xE1}, + "DMT ", + 8}, + {{0x82, 0xb0, 0xe5, 0x04, 0x78, 0xee, 0xaf, 0xde, 0x39, 0x2d, + 0x45, 0xd1, 0x25, 0x9e, 0xd1, 0x07, 0x1b, 0x6f, 0xda, 0x81}, + "DNA ", + 18}, + {{0x0a, 0xbd, 0xac, 0xe7, 0x0d, 0x37, 0x90, 0x23, 0x5a, 0xf4, + 0x48, 0xc8, 0x85, 0x47, 0x60, 0x3b, 0x94, 0x56, 0x04, 0xea}, + "DNT ", + 18}, + {{0xE4, 0x3E, 0x20, 0x41, 0xdc, 0x37, 0x86, 0xe1, 0x66, 0x96, + 0x1e, 0xD9, 0x48, 0x4a, 0x55, 0x39, 0x03, 0x3d, 0x10, 0xfB}, + "DNX ", + 18}, + {{0xe5, 0xda, 0xda, 0x80, 0xaa, 0x64, 0x77, 0xe8, 0x5d, 0x09, + 0x74, 0x7f, 0x28, 0x42, 0xf7, 0x99, 0x3d, 0x0d, 0xf7, 0x1c}, + "DOCK ", + 18}, + {{0x90, 0x6b, 0x3f, 0x8b, 0x78, 0x45, 0x84, 0x01, 0x88, 0xea, + 0xb5, 0x3c, 0x3f, 0x5a, 0xd3, 0x48, 0xa7, 0x87, 0x75, 0x2f}, + "DOR ", + 15}, + {{0xac, 0x32, 0x11, 0xa5, 0x02, 0x54, 0x14, 0xaf, 0x28, 0x66, + 0xff, 0x09, 0xc2, 0x3f, 0xc1, 0x8b, 0xc9, 0x7e, 0x79, 0xb1}, + "DOV ", + 18}, + {{0x76, 0x97, 0x4c, 0x7b, 0x79, 0xdc, 0x8a, 0x6a, 0x10, 0x9f, + 0xd7, 0x1f, 0xd7, 0xce, 0xb9, 0xe4, 0x0e, 0xff, 0x53, 0x82}, + "DOW ", + 18}, + {{0x01, 0xb3, 0xEc, 0x4a, 0xAe, 0x1B, 0x87, 0x29, 0x52, 0x9B, + 0xEB, 0x49, 0x65, 0xF2, 0x7d, 0x00, 0x87, 0x88, 0xB0, 0xEB}, + "DPP ", + 18}, + {{0x41, 0x9c, 0x4d, 0xb4, 0xb9, 0xe2, 0x5d, 0x6d, 0xb2, 0xad, + 0x96, 0x91, 0xcc, 0xb8, 0x32, 0xc8, 0xd9, 0xfd, 0xa0, 0x5e}, + "DRGN ", + 18}, + {{0x46, 0x72, 0xba, 0xd5, 0x27, 0x10, 0x74, 0x71, 0xcb, 0x50, + 0x67, 0xa8, 0x87, 0xf4, 0x65, 0x6d, 0x58, 0x5a, 0x8a, 0x31}, + "DROPil ", + 18}, + {{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}, + {{0xe3, 0x0e, 0x02, 0xf0, 0x49, 0x95, 0x7e, 0x2a, 0x59, 0x07, + 0x58, 0x9e, 0x06, 0xba, 0x64, 0x6f, 0xb2, 0xc3, 0x21, 0xba}, + "DRPU ", + 8}, + {{0x9a, 0xf4, 0xf2, 0x69, 0x41, 0x67, 0x7c, 0x70, 0x6c, 0xfe, + 0xcf, 0x6d, 0x33, 0x79, 0xff, 0x01, 0xbb, 0x85, 0xd5, 0xab}, + "DRT ", + 8}, + {{0x62, 0xd4, 0xc0, 0x46, 0x44, 0x31, 0x4f, 0x35, 0x86, 0x8b, + 0xa4, 0xc6, 0x5c, 0xc2, 0x7a, 0x77, 0x68, 0x1d, 0xe7, 0xa9}, + "DRVH ", + 18}, + {{0x03, 0xe3, 0xf0, 0xc2, 0x59, 0x65, 0xf1, 0x3D, 0xbb, 0xC5, + 0x82, 0x46, 0x73, 0x8C, 0x18, 0x3E, 0x27, 0xb2, 0x6a, 0x56}, + "DSCP ", + 18}, + {{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}, + {{0xc2, 0x04, 0x64, 0xe0, 0xc3, 0x73, 0x48, 0x6d, 0x2b, 0x33, + 0x35, 0x57, 0x6e, 0x83, 0xa2, 0x18, 0xb1, 0x61, 0x8a, 0x5e}, + "DTRC ", + 18}, + {{0xf9, 0xF7, 0xc2, 0x9C, 0xFd, 0xf1, 0x9F, 0xCf, 0x1f, 0x2A, + 0xA6, 0xB8, 0x4a, 0xA3, 0x67, 0xBc, 0xf1, 0xbD, 0x16, 0x76}, + "DTT ", + 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}, + {{0xEd, 0x7f, 0xEA, 0x78, 0xC3, 0x93, 0xcF, 0x7B, 0x17, 0xB1, + 0x52, 0xA8, 0xc2, 0xD0, 0xCD, 0x97, 0xaC, 0x31, 0x79, 0x0B}, + "DUBI ", + 18}, + {{0x8d, 0xb5, 0x4c, 0xa5, 0x69, 0xd3, 0x01, 0x9a, 0x2b, 0xa1, + 0x26, 0xd0, 0x3c, 0x37, 0xc4, 0x4b, 0x5e, 0xf8, 0x1e, 0xf6}, + "DXT ", + 8}, + {{0xce, 0x5c, 0x60, 0x3c, 0x78, 0xd0, 0x47, 0xef, 0x43, 0x03, + 0x2e, 0x96, 0xb5, 0xb7, 0x85, 0x32, 0x4f, 0x75, 0x3a, 0x4f}, + "E4ROW ", + 2}, + {{0x99, 0x4f, 0x0d, 0xff, 0xdb, 0xae, 0x0b, 0xbf, 0x09, 0xb6, + 0x52, 0xd6, 0xf1, 0x1a, 0x49, 0x3f, 0xd3, 0x3f, 0x42, 0xb9}, + "EAGLE ", + 18}, + {{0x90, 0x0b, 0x44, 0x49, 0x23, 0x6a, 0x7b, 0xb2, 0x6b, 0x28, + 0x66, 0x01, 0xdd, 0x14, 0xd2, 0xbd, 0xe7, 0xa6, 0xac, 0x6c}, + "EARTH ", + 8}, + {{0x31, 0xf3, 0xd9, 0xd1, 0xbe, 0xce, 0x0c, 0x03, 0x3f, 0xf7, + 0x8f, 0xa6, 0xda, 0x60, 0xa6, 0x04, 0x8f, 0x3e, 0x13, 0xc5}, + "EBC ", + 18}, + {{0xaf, 0xc3, 0x97, 0x88, 0xc5, 0x1f, 0x0c, 0x1f, 0xf7, 0xb5, + 0x53, 0x17, 0xf3, 0xe7, 0x02, 0x99, 0xe5, 0x21, 0xff, 0xf6}, + "eBCH ", + 8}, + {{0xa5, 0x78, 0xac, 0xc0, 0xcb, 0x78, 0x75, 0x78, 0x1b, 0x78, + 0x80, 0x90, 0x3f, 0x45, 0x94, 0xd1, 0x3c, 0xfa, 0x8b, 0x98}, + "ECN ", + 2}, + {{0x17, 0xF9, 0x34, 0x75, 0xd2, 0xA9, 0x78, 0xf5, 0x27, 0xc3, + 0xf7, 0xc4, 0x4a, 0xBf, 0x44, 0xAd, 0xfB, 0xa6, 0x0D, 0x5C}, + "ECO2 ", + 2}, + {{0x17, 0x1d, 0x75, 0x0d, 0x42, 0xd6, 0x61, 0xb6, 0x2c, 0x27, + 0x7a, 0x6b, 0x48, 0x6a, 0xdb, 0x82, 0x34, 0x8c, 0x3e, 0xca}, + "ECOM ", + 18}, + {{0x88, 0x69, 0xb1, 0xf9, 0xbc, 0x8b, 0x24, 0x6a, 0x4d, 0x72, + 0x20, 0xf8, 0x34, 0xe5, 0x6d, 0xdf, 0xdd, 0x82, 0x55, 0xe7}, + "ECP ", + 18}, + {{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}, + {{0xeb, 0x7c, 0x20, 0x02, 0x71, 0x72, 0xe5, 0xd1, 0x43, 0xfb, + 0x03, 0x0d, 0x50, 0xf9, 0x1c, 0xec, 0xe2, 0xd1, 0x48, 0x5d}, + "eBTC ", + 8}, + {{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}, + {{0x5d, 0xba, 0xc2, 0x4e, 0x98, 0xe2, 0xa4, 0xf4, 0x3a, 0xdc, + 0x0d, 0xc8, 0x2a, 0xf4, 0x03, 0xfc, 0xa0, 0x63, 0xce, 0x2c}, + "EGT ", + 18}, + {{0xf9, 0xF0, 0xFC, 0x71, 0x67, 0xc3, 0x11, 0xDd, 0x2F, 0x1e, + 0x21, 0xE9, 0x20, 0x4F, 0x87, 0xEB, 0xA9, 0x01, 0x2f, 0xB2}, + "EHT ", + 8}, + {{0xa6, 0xa8, 0x40, 0xe5, 0x0b, 0xca, 0xa5, 0x0d, 0xa0, 0x17, + 0xb9, 0x1a, 0x0d, 0x86, 0xb8, 0xb2, 0xd4, 0x11, 0x56, 0xee}, + "EKO ", + 18}, + {{0xba, 0xb1, 0x65, 0xdf, 0x94, 0x55, 0xaa, 0x0f, 0x2a, 0xed, + 0x1f, 0x25, 0x65, 0x52, 0x0b, 0x91, 0xdd, 0xad, 0xb4, 0xc8}, + "EKT ", + 8}, + {{0xd4, 0x9f, 0xf1, 0x36, 0x61, 0x45, 0x13, 0x13, 0xca, 0x15, + 0x53, 0xfd, 0x69, 0x54, 0xbd, 0x1d, 0x9b, 0x6e, 0x02, 0xb9}, + "ELEC ", + 18}, + {{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}, + {{0xB8, 0x02, 0xb2, 0x4E, 0x06, 0x37, 0xc2, 0xB8, 0x7D, 0x2E, + 0x8b, 0x77, 0x84, 0xC0, 0x55, 0xBB, 0xE9, 0x21, 0x01, 0x1a}, + "EMV ", + 2}, + {{0x03, 0x9f, 0x50, 0x50, 0xde, 0x49, 0x08, 0xf9, 0xb5, 0xdd, + 0xf4, 0x0a, 0x4f, 0x3a, 0xa3, 0xf3, 0x29, 0x08, 0x63, 0x87}, + "ENC ", + 18}, + {{0xf0, 0xee, 0x6b, 0x27, 0xb7, 0x59, 0xc9, 0x89, 0x3c, 0xe4, + 0xf0, 0x94, 0xb4, 0x9a, 0xd2, 0x8f, 0xd1, 0x5a, 0x23, 0xe4}, + "ENG ", + 8}, + {{0xF6, 0x29, 0xcB, 0xd9, 0x4d, 0x37, 0x91, 0xC9, 0x25, 0x01, + 0x52, 0xBD, 0x8d, 0xfB, 0xDF, 0x38, 0x0E, 0x2a, 0x3B, 0x9c}, + "ENJ ", + 18}, + {{0x5B, 0xC7, 0xe5, 0xf0, 0xAb, 0x8b, 0x2E, 0x10, 0xD2, 0xD0, + 0xa3, 0xF2, 0x17, 0x39, 0xFC, 0xe6, 0x24, 0x59, 0xae, 0xF3}, + "ENTRP ", + 18}, + {{0x86, 0xfa, 0x04, 0x98, 0x57, 0xe0, 0x20, 0x9a, 0xa7, 0xd9, + 0xe6, 0x16, 0xf7, 0xeb, 0x3b, 0x3b, 0x78, 0xec, 0xfd, 0xb0}, + "EOS ", + 18}, + {{0x7e, 0x9e, 0x43, 0x1a, 0x0b, 0x8c, 0x4d, 0x53, 0x2c, 0x74, + 0x5b, 0x10, 0x43, 0xc7, 0xfa, 0x29, 0xa4, 0x8d, 0x4f, 0xba}, + "eosDAC ", + 18}, + {{0x35, 0xBA, 0xA7, 0x20, 0x38, 0xF1, 0x27, 0xf9, 0xf8, 0xC8, + 0xf9, 0xB4, 0x91, 0x04, 0x9f, 0x64, 0xf3, 0x77, 0x91, 0x4d}, + "EPX ", + 4}, + {{0x50, 0xee, 0x67, 0x46, 0x89, 0xd7, 0x5c, 0x0f, 0x88, 0xe8, + 0xf8, 0x3c, 0xfe, 0x8c, 0x4b, 0x69, 0xe8, 0xfd, 0x59, 0x0d}, + "EPY ", + 8}, + {{0x47, 0xdd, 0x62, 0xd4, 0xd0, 0x75, 0xde, 0xad, 0x71, 0xd0, + 0xe0, 0x02, 0x99, 0xfc, 0x56, 0xa2, 0xd7, 0x47, 0xbe, 0xbb}, + "EQL ", + 18}, + {{0x74, 0xce, 0xda, 0x77, 0x28, 0x1b, 0x33, 0x91, 0x42, 0xa3, + 0x68, 0x17, 0xfa, 0x5f, 0x9e, 0x29, 0x41, 0x2b, 0xab, 0x85}, + "ERO ", + 8}, + {{0x92, 0xA5, 0xB0, 0x4D, 0x0E, 0xD5, 0xD9, 0x4D, 0x7a, 0x19, + 0x3d, 0x1d, 0x33, 0x4D, 0x3D, 0x16, 0x99, 0x6f, 0x4E, 0x13}, + "ERT ", + 18}, + {{0xe8, 0xa1, 0xdf, 0x95, 0x8b, 0xe3, 0x79, 0x04, 0x5e, 0x2b, + 0x46, 0xa3, 0x1a, 0x98, 0xb9, 0x3a, 0x2e, 0xcd, 0xfd, 0xed}, + "ESZ ", + 18}, + {{0x1b, 0x97, 0x43, 0xf5, 0x56, 0xd6, 0x5e, 0x75, 0x7c, 0x4c, + 0x65, 0x0b, 0x45, 0x55, 0xba, 0xf3, 0x54, 0xcb, 0x8b, 0xd3}, + "ETBS ", + 12}, + {{0xdd, 0x74, 0xa7, 0xa3, 0x76, 0x9f, 0xa7, 0x25, 0x61, 0xb3, + 0xa6, 0x9e, 0x65, 0x96, 0x8f, 0x49, 0x74, 0x8c, 0x69, 0x0c}, + "ETCH ", + 18}, + {{0x28, 0xc8, 0xd0, 0x1f, 0xf6, 0x33, 0xea, 0x9c, 0xd8, 0xfc, + 0x6a, 0x45, 0x1d, 0x74, 0x57, 0x88, 0x9e, 0x69, 0x8d, 0xe6}, + "ETG ", + 0}, + {{0x3a, 0x26, 0x74, 0x6D, 0xdb, 0x79, 0xB1, 0xB8, 0xe4, 0x45, + 0x0e, 0x3F, 0x4F, 0xFE, 0x32, 0x85, 0xA3, 0x07, 0x38, 0x7E}, + "ETHB ", + 8}, + {{0xdb, 0xfb, 0x42, 0x3e, 0x9b, 0xbf, 0x16, 0x29, 0x43, 0x88, + 0xe0, 0x76, 0x96, 0xa5, 0x12, 0x0e, 0x4c, 0xeb, 0xa0, 0xc5}, + "ETHD ", + 18}, + {{0x5A, 0xf2, 0xBe, 0x19, 0x3a, 0x6A, 0xBC, 0xa9, 0xc8, 0x81, + 0x70, 0x01, 0xF4, 0x57, 0x44, 0x77, 0x7D, 0xb3, 0x07, 0x56}, + "ETHOS ", + 8}, + {{0x3c, 0x4a, 0x3f, 0xfd, 0x81, 0x3a, 0x10, 0x7f, 0xeb, 0xd5, + 0x7b, 0x2f, 0x01, 0xbc, 0x34, 0x42, 0x64, 0xd9, 0x0f, 0xde}, + "ETK ", + 2}, + {{0x69, 0x27, 0xC6, 0x9f, 0xb4, 0xda, 0xf2, 0x04, 0x3f, 0xbB, + 0x1C, 0xb7, 0xb8, 0x6c, 0x56, 0x61, 0x41, 0x6b, 0xea, 0x29}, + "ETR ", + 18}, + {{0xdb, 0x25, 0xf2, 0x11, 0xab, 0x05, 0xb1, 0xc9, 0x7d, 0x59, + 0x55, 0x16, 0xf4, 0x57, 0x94, 0x52, 0x8a, 0x80, 0x7a, 0xd8}, + "EURS ", + 2}, + {{0xab, 0xdf, 0x14, 0x78, 0x70, 0x23, 0x5f, 0xcf, 0xc3, 0x41, + 0x53, 0x82, 0x8c, 0x76, 0x9a, 0x70, 0xb3, 0xfa, 0xe0, 0x1f}, + "EURT ", + 6}, + {{0xb6, 0x2d, 0x18, 0xde, 0xa7, 0x40, 0x45, 0xe8, 0x22, 0x35, + 0x2c, 0xe4, 0xb3, 0xee, 0x77, 0x31, 0x9d, 0xc5, 0xff, 0x2f}, + "EVC ", + 18}, + {{0x92, 0x31, 0x08, 0xa4, 0x39, 0xC4, 0xe8, 0xC2, 0x31, 0x5c, + 0x4f, 0x65, 0x21, 0xE5, 0xcE, 0x95, 0xB4, 0x4e, 0x9B, 0x4c}, + "EVE ", + 18}, + {{0x68, 0x90, 0x9e, 0x58, 0x6e, 0xea, 0xc8, 0xf4, 0x73, 0x15, + 0xe8, 0x4b, 0x4c, 0x97, 0x88, 0xdd, 0x54, 0xef, 0x65, 0xbb}, + "EVN ", + 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}, + {{0x44, 0x49, 0x97, 0xb7, 0xe7, 0xfC, 0x83, 0x0E, 0x20, 0x08, + 0x9a, 0xfe, 0xa3, 0x07, 0x8c, 0xd5, 0x18, 0xfC, 0xF2, 0xA2}, + "EWO ", + 18}, + {{0x00, 0xc4, 0xb3, 0x98, 0x50, 0x06, 0x45, 0xeb, 0x5d, 0xa0, + 0x0a, 0x1a, 0x37, 0x9a, 0x88, 0xb1, 0x16, 0x83, 0xba, 0x01}, + "EXC ", + 18}, + {{0xc9, 0x8e, 0x06, 0x39, 0xc6, 0xd2, 0xec, 0x03, 0x7a, 0x61, + 0x53, 0x41, 0xc3, 0x69, 0x66, 0x6b, 0x11, 0x0e, 0x80, 0xe5}, + "EXMR ", + 8}, + {{0xe4, 0x69, 0xc4, 0x47, 0x3a, 0xf8, 0x22, 0x17, 0xb3, 0x0c, + 0xf1, 0x7b, 0x10, 0xbc, 0xdb, 0x6c, 0x8c, 0x79, 0x6e, 0x75}, + "EXRN ", + 0}, + {{0x5c, 0x74, 0x3a, 0x35, 0xe9, 0x03, 0xf6, 0xc5, 0x84, 0x51, + 0x4e, 0xc6, 0x17, 0xac, 0xee, 0x06, 0x11, 0xcf, 0x44, 0xf3}, + "EXY ", + 18}, + {{0x5e, 0x60, 0x16, 0xae, 0x7d, 0x7c, 0x49, 0xd3, 0x47, 0xdc, + 0xf8, 0x34, 0x86, 0x0b, 0x9f, 0x3e, 0xe2, 0x82, 0x81, 0x2b}, + "EZT ", + 8}, + {{0xb6, 0x77, 0x34, 0x52, 0x1e, 0xAb, 0xBE, 0x9C, 0x77, 0x37, + 0x29, 0xdB, 0x73, 0xE1, 0x6C, 0xC2, 0xdf, 0xb2, 0x0A, 0x58}, + "ERupee ", + 2}, + {{0x1c, 0xca, 0xa0, 0xf2, 0xa7, 0x21, 0x0d, 0x76, 0xe1, 0xfd, + 0xec, 0x74, 0x0d, 0x5f, 0x32, 0x3e, 0x2e, 0x1b, 0x16, 0x72}, + "FACE ", + 18}, + {{0x19, 0x0e, 0x56, 0x9b, 0xE0, 0x71, 0xF4, 0x0c, 0x70, 0x4e, + 0x15, 0x82, 0x5F, 0x28, 0x54, 0x81, 0xCB, 0x74, 0xB6, 0xcC}, + "FAM ", + 12}, + {{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}, + {{0x23, 0x35, 0x20, 0x36, 0xe9, 0x11, 0xa2, 0x2c, 0xfc, 0x69, + 0x2b, 0x5e, 0x2e, 0x19, 0x66, 0x92, 0x65, 0x8a, 0xde, 0xd9}, + "FDZ ", + 18}, + {{0xd9, 0xa8, 0xcf, 0xe2, 0x1c, 0x23, 0x2d, 0x48, 0x50, 0x65, + 0xcb, 0x62, 0xa9, 0x68, 0x66, 0x79, 0x9d, 0x46, 0x45, 0xf7}, + "FGP ", + 18}, + {{0x52, 0xfb, 0x36, 0xc8, 0x3a, 0xd3, 0x3c, 0x18, 0x24, 0x91, + 0x2f, 0xc8, 0x10, 0x71, 0xca, 0x5e, 0xeb, 0x8a, 0xb3, 0x90}, + "FID ", + 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}, + {{0x04, 0x93, 0x99, 0xa6, 0xb0, 0x48, 0xd5, 0x29, 0x71, 0xf7, + 0xd1, 0x22, 0xae, 0x21, 0xa1, 0x53, 0x27, 0x22, 0x28, 0x5f}, + "FLOT ", + 18}, + {{0x3a, 0x1B, 0xda, 0x28, 0xAd, 0xB5, 0xB0, 0xa8, 0x12, 0xa7, + 0xCF, 0x10, 0xA1, 0x95, 0x0c, 0x92, 0x0F, 0x79, 0xBc, 0xD3}, + "FLP ", + 18}, + {{0x9a, 0xeF, 0xBE, 0x0b, 0x3C, 0x3b, 0xa9, 0xEa, 0xb2, 0x62, + 0xCB, 0x98, 0x56, 0xE8, 0x15, 0x7A, 0xB7, 0x64, 0x8e, 0x09}, + "FLR ", + 18}, + {{0x95, 0x4b, 0x5d, 0xe0, 0x9a, 0x55, 0xe5, 0x97, 0x55, 0xac, + 0xbd, 0xa2, 0x9e, 0x1e, 0xb7, 0x4a, 0x45, 0xd3, 0x01, 0x75}, + "FLUZ ", + 18}, + {{0x70, 0xb1, 0x47, 0xe0, 0x1e, 0x92, 0x85, 0xe7, 0xce, 0x68, + 0xb9, 0xba, 0x43, 0x7f, 0xe3, 0xa9, 0x19, 0x0e, 0x75, 0x6a}, + "FLX ", + 18}, + {{0x4d, 0xf4, 0x7b, 0x49, 0x69, 0xb2, 0x91, 0x1c, 0x96, 0x65, + 0x06, 0xe3, 0x59, 0x2c, 0x41, 0x38, 0x94, 0x93, 0x95, 0x3b}, + "FND ", + 18}, + {{0x07, 0x07, 0x68, 0x1f, 0x34, 0x4d, 0xeb, 0x24, 0x18, 0x40, + 0x37, 0xfc, 0x02, 0x28, 0x85, 0x6f, 0x21, 0x37, 0xb0, 0x2e}, + "FNKOS ", + 18}, + {{0xbd, 0x4b, 0x60, 0xa1, 0x38, 0xb3, 0xfc, 0xe3, 0x58, 0x4e, + 0xa0, 0x1f, 0x50, 0xc0, 0x90, 0x8c, 0x18, 0xf9, 0x67, 0x7a}, + "FNTB ", + 8}, + {{0x2a, 0x09, 0x3B, 0xcF, 0x0C, 0x98, 0xEf, 0x74, 0x4B, 0xb6, + 0xF6, 0x9D, 0x74, 0xf2, 0xF8, 0x56, 0x05, 0x32, 0x42, 0x90}, + "FOOD ", + 8}, + {{0x42, 0x70, 0xbb, 0x23, 0x8f, 0x6d, 0xd8, 0xb1, 0xc3, 0xca, + 0x01, 0xf9, 0x6c, 0xa6, 0x5b, 0x26, 0x47, 0xc0, 0x6d, 0x3c}, + "FOTA ", + 18}, + {{0x0A, 0xBe, 0xFb, 0x76, 0x11, 0xCb, 0x3A, 0x01, 0xEA, 0x3F, + 0xaD, 0x85, 0xf3, 0x3C, 0x3C, 0x93, 0x4F, 0x8e, 0x2c, 0xF4}, + "FRD ", + 18}, + {{0x17, 0xe6, 0x7d, 0x1c, 0xb4, 0xe3, 0x49, 0xb9, 0xca, 0x4b, + 0xc3, 0xe1, 0x7c, 0x7d, 0xf2, 0xa3, 0x97, 0xa7, 0xbb, 0x64}, + "FREC ", + 18}, + {{0x48, 0xdf, 0x4e, 0x02, 0x96, 0xf9, 0x08, 0xce, 0xab, 0x04, + 0x28, 0xa5, 0x18, 0x2d, 0x19, 0xb3, 0x1f, 0xc0, 0x37, 0xd6}, + "FRV ", + 8}, + {{0xd0, 0x35, 0x2a, 0x01, 0x9e, 0x9a, 0xb9, 0xd7, 0x57, 0x77, + 0x6f, 0x53, 0x23, 0x77, 0xaa, 0xeb, 0xd3, 0x6f, 0xd5, 0x41}, + "FSN ", + 18}, + {{0x78, 0xa7, 0x3B, 0x6C, 0xBc, 0x5D, 0x18, 0x3C, 0xE5, 0x6e, + 0x78, 0x6f, 0x6e, 0x90, 0x5C, 0xaD, 0xEC, 0x63, 0x54, 0x7B}, + "FT ", + 18}, + {{0xe6, 0xf7, 0x4d, 0xcf, 0xa0, 0xe2, 0x08, 0x83, 0x00, 0x8d, + 0x8c, 0x16, 0xb6, 0xd9, 0xa3, 0x29, 0x18, 0x9d, 0x0c, 0x30}, + "FTC ", + 2}, + {{0x94, 0x3e, 0xd8, 0x52, 0xda, 0xdb, 0x5c, 0x39, 0x38, 0xec, + 0xdc, 0x68, 0x83, 0x71, 0x8d, 0xf8, 0x14, 0x2d, 0xe4, 0xc8}, + "FTI ", + 18}, + {{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}, + {{0xd5, 0x59, 0xf2, 0x02, 0x96, 0xff, 0x48, 0x95, 0xda, 0x39, + 0xb5, 0xbd, 0x9a, 0xdd, 0x54, 0xb4, 0x42, 0x59, 0x6a, 0x61}, + "FTX ", + 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}, + {{0x18, 0x29, 0xaa, 0x04, 0x5e, 0x21, 0xe0, 0xd5, 0x95, 0x80, + 0x02, 0x4a, 0x95, 0x1d, 0xb4, 0x80, 0x96, 0xe0, 0x17, 0x82}, + "FXT ", + 18}, + {{0x88, 0xFC, 0xFB, 0xc2, 0x2C, 0x6d, 0x3d, 0xBa, 0xa2, 0x5a, + 0xF4, 0x78, 0xC5, 0x78, 0x97, 0x83, 0x39, 0xBD, 0xe7, 0x7a}, + "FYN ", + 18}, + {{0x8f, 0x09, 0x21, 0xf3, 0x05, 0x55, 0x62, 0x41, 0x43, 0xd4, + 0x27, 0xb3, 0x40, 0xb1, 0x15, 0x69, 0x14, 0x88, 0x2c, 0x10}, + "FYP ", + 18}, + {{0xf6, 0x74, 0x51, 0xdc, 0x84, 0x21, 0xf0, 0xe0, 0xaf, 0xeb, + 0x52, 0xfa, 0xa8, 0x10, 0x10, 0x34, 0xed, 0x08, 0x1e, 0xd9}, + "GAM ", + 8}, + {{0xc0, 0xEA, 0x63, 0x06, 0xF6, 0x36, 0x0F, 0xE7, 0xdC, 0xAB, + 0x65, 0xD1, 0x6B, 0xf1, 0xa3, 0xAF, 0x92, 0xC7, 0x9A, 0xa2}, + "GANA ", + 18}, + {{0x68, 0x71, 0x74, 0xf8, 0xc4, 0x9c, 0xeb, 0x77, 0x29, 0xd9, + 0x25, 0xc3, 0xa9, 0x61, 0x50, 0x7e, 0xa4, 0xac, 0x7b, 0x28}, + "GAT ", + 18}, + {{0x70, 0x88, 0x76, 0xf4, 0x86, 0xe4, 0x48, 0xee, 0x89, 0xeb, + 0x33, 0x2b, 0xfb, 0xc8, 0xe5, 0x93, 0x55, 0x30, 0x58, 0xb9}, + "GAVEL ", + 18}, + {{0x75, 0x85, 0xF8, 0x35, 0xae, 0x2d, 0x52, 0x27, 0x22, 0xd2, + 0x68, 0x43, 0x23, 0xa0, 0xba, 0x83, 0x40, 0x1f, 0x32, 0xf5}, + "GBT ", + 18}, + {{0x12, 0xfC, 0xd6, 0x46, 0x3E, 0x66, 0x97, 0x4c, 0xF7, 0xbB, + 0xC2, 0x4F, 0xFC, 0x4d, 0x40, 0xd6, 0xbE, 0x45, 0x82, 0x83}, + "GBX ", + 8}, + {{0xdb, 0x0F, 0x69, 0x30, 0x6F, 0xF8, 0xF9, 0x49, 0xf2, 0x58, + 0xE8, 0x3f, 0x6b, 0x87, 0xee, 0x5D, 0x05, 0x2d, 0x0b, 0x23}, + "GCP ", + 18}, + {{0x4F, 0x4f, 0x0D, 0xb4, 0xde, 0x90, 0x3B, 0x88, 0xf2, 0xB1, + 0xa2, 0x84, 0x79, 0x71, 0xE2, 0x31, 0xD5, 0x4F, 0x8f, 0xd3}, + "GEE ", + 8}, + {{0x24, 0x08, 0x3b, 0xb3, 0x00, 0x72, 0x64, 0x3c, 0x3b, 0xb9, + 0x0b, 0x44, 0xb7, 0x28, 0x58, 0x60, 0xa7, 0x55, 0xe6, 0x87}, + "GELD ", + 18}, + {{0xc7, 0xbb, 0xa5, 0xb7, 0x65, 0x58, 0x1e, 0xfb, 0x2c, 0xdd, + 0x26, 0x79, 0xdb, 0x5b, 0xea, 0x9e, 0xe7, 0x9b, 0x20, 0x1f}, + "GEM ", + 18}, + {{0x54, 0x3F, 0xf2, 0x27, 0xF6, 0x4A, 0xa1, 0x7e, 0xA1, 0x32, + 0xBf, 0x98, 0x86, 0xcA, 0xb5, 0xDB, 0x55, 0xDC, 0xAd, 0xdf}, + "GEN ", + 18}, + {{0x8a, 0x85, 0x42, 0x88, 0xa5, 0x97, 0x60, 0x36, 0xa7, 0x25, + 0x87, 0x91, 0x64, 0xca, 0x3e, 0x91, 0xd3, 0x0c, 0x6a, 0x1b}, + "GET ", + 18}, + {{0xFc, 0xD8, 0x62, 0x98, 0x56, 0x28, 0xb2, 0x54, 0x06, 0x1F, + 0x7A, 0x91, 0x80, 0x35, 0xB8, 0x03, 0x40, 0xD0, 0x45, 0xd3}, + "GIF ", + 18}, + {{0xaE, 0x4f, 0x56, 0xF0, 0x72, 0xc3, 0x4C, 0x0a, 0x65, 0xB3, + 0xae, 0x3E, 0x4D, 0xB7, 0x97, 0xD8, 0x31, 0x43, 0x9D, 0x93}, + "GIM ", + 8}, + {{0x71, 0xd0, 0x1d, 0xb8, 0xd6, 0xa2, 0xfb, 0xea, 0x7f, 0x8d, + 0x43, 0x45, 0x99, 0xc2, 0x37, 0x98, 0x0c, 0x23, 0x4e, 0x4c}, + "GLA ", + 8}, + {{0xb3, 0xBd, 0x49, 0xE2, 0x8f, 0x8F, 0x83, 0x2b, 0x8d, 0x1E, + 0x24, 0x61, 0x06, 0x99, 0x1e, 0x54, 0x6c, 0x32, 0x35, 0x02}, + "GMT ", + 18}, + {{0x68, 0x10, 0xe7, 0x76, 0x88, 0x0C, 0x02, 0x93, 0x3D, 0x47, + 0xDB, 0x1b, 0x9f, 0xc0, 0x59, 0x08, 0xe5, 0x38, 0x6b, 0x96}, + "GNO ", + 18}, + {{0xa7, 0x44, 0x76, 0x44, 0x31, 0x19, 0xA9, 0x42, 0xdE, 0x49, + 0x85, 0x90, 0xFe, 0x1f, 0x24, 0x54, 0xd7, 0xD4, 0xaC, 0x0d}, + "GNT ", + 18}, + {{0x6e, 0xc8, 0xa2, 0x4c, 0xab, 0xdc, 0x33, 0x9a, 0x06, 0xa1, + 0x72, 0xf8, 0x22, 0x3e, 0xa5, 0x57, 0x05, 0x5a, 0xda, 0xa5}, + "GNX ", + 9}, + {{0x24, 0x75, 0x51, 0xF2, 0xEB, 0x33, 0x62, 0xE2, 0x22, 0xc7, + 0x42, 0xE9, 0xc7, 0x88, 0xB8, 0x95, 0x7D, 0x9B, 0xC8, 0x7e}, + "GNY ", + 18}, + {{0xeA, 0xb4, 0x31, 0x93, 0xCF, 0x06, 0x23, 0x07, 0x3C, 0xa8, + 0x9D, 0xB9, 0xB7, 0x12, 0x79, 0x63, 0x56, 0xFA, 0x74, 0x14}, + "GOLDX ", + 18}, + {{0x42, 0x3b, 0x5f, 0x62, 0xb3, 0x28, 0xd0, 0xd6, 0xd4, 0x48, + 0x70, 0xf4, 0xee, 0xe3, 0x16, 0xbe, 0xfa, 0x0b, 0x2d, 0xf5}, + "GOT ", + 18}, + {{0x12, 0xb1, 0x9d, 0x3e, 0x2c, 0xcc, 0x14, 0xda, 0x04, 0xfa, + 0xe3, 0x3e, 0x63, 0x65, 0x2c, 0xe4, 0x69, 0xb3, 0xf2, 0xfd}, + "GRID ", + 12}, + {{0xb4, 0x44, 0x20, 0x8c, 0xb0, 0x51, 0x6c, 0x15, 0x01, 0x78, + 0xfc, 0xf9, 0xa5, 0x26, 0x04, 0xbc, 0x04, 0xa1, 0xac, 0xea}, + "GRMD ", + 18}, + {{0xC1, 0x71, 0x95, 0xbd, 0xe4, 0x9D, 0x70, 0xCe, 0xfC, 0xF8, + 0xA9, 0xF2, 0xee, 0x17, 0x59, 0xFF, 0xC2, 0x7B, 0xF0, 0xB1}, + "GROO ", + 18}, + {{0x0a, 0x9A, 0x9c, 0xe6, 0x00, 0xD0, 0x8B, 0xF9, 0xb7, 0x6F, + 0x49, 0xFA, 0x4e, 0x7b, 0x38, 0xA6, 0x7E, 0xBE, 0xB1, 0xE6}, + "GROW ", + 8}, + {{0x22, 0x8b, 0xa5, 0x14, 0x30, 0x9f, 0xfd, 0xf0, 0x3a, 0x81, + 0xa2, 0x05, 0xa6, 0xd0, 0x40, 0xe4, 0x29, 0xd6, 0xe8, 0x0c}, + "GSC ", + 18}, + {{0xe5, 0x30, 0x44, 0x1f, 0x4f, 0x73, 0xbD, 0xB6, 0xDC, 0x2f, + 0xA5, 0xaF, 0x7c, 0x3f, 0xC5, 0xfD, 0x55, 0x1E, 0xc8, 0x38}, + "GSE ", + 4}, + {{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}, + {{0xbd, 0xcf, 0xbf, 0x5c, 0x4d, 0x91, 0xab, 0xc0, 0xbc, 0x97, + 0x09, 0xc7, 0x28, 0x6d, 0x00, 0x06, 0x3c, 0x0e, 0x6f, 0x22}, + "GUESS ", + 2}, + {{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}, + {{0x48, 0xc1, 0xb2, 0xf3, 0xef, 0xa8, 0x5f, 0xba, 0xfb, 0x2a, + 0xb9, 0x51, 0xbf, 0x4b, 0xa8, 0x60, 0xa0, 0x8c, 0xdb, 0xb7}, + "HAND ", + 0}, + {{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}, + "SNX ", + 18}, + {{0xe2, 0x49, 0x2f, 0x8d, 0x2a, 0x26, 0x18, 0xd8, 0x70, 0x9c, + 0xa9, 0x9b, 0x1d, 0x8d, 0x75, 0x71, 0x3b, 0xd8, 0x40, 0x89}, + "HB ", + 18}, + {{0xdd, 0x6c, 0x68, 0xbb, 0x32, 0x46, 0x2e, 0x01, 0x70, 0x50, + 0x11, 0xa4, 0xe2, 0xad, 0x1a, 0x60, 0x74, 0x0f, 0x21, 0x7f}, + "HBT ", + 15}, + {{0xe3, 0x4e, 0x19, 0x44, 0xe7, 0x76, 0xf3, 0x9b, 0x92, 0x52, + 0x79, 0x0a, 0x05, 0x27, 0xeb, 0xda, 0x64, 0x7a, 0xe6, 0x68}, + "HBZ ", + 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}, + {{0x49, 0x1c, 0x9a, 0x23, 0xdb, 0x85, 0x62, 0x3e, 0xed, 0x45, + 0x5a, 0x8e, 0xfd, 0xd6, 0xab, 0xa9, 0xb9, 0x11, 0xc5, 0xdf}, + "HER ", + 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}, + {{0x9e, 0x6b, 0x2b, 0x11, 0x54, 0x2f, 0x2b, 0xc5, 0x2f, 0x30, + 0x29, 0x07, 0x7a, 0xce, 0x37, 0xe8, 0xfd, 0x83, 0x8d, 0x7f}, + "HKN ", + 8}, + {{0x88, 0xac, 0x94, 0xd5, 0xd1, 0x75, 0x13, 0x03, 0x47, 0xfc, + 0x95, 0xe1, 0x09, 0xd7, 0x7a, 0xc0, 0x9d, 0xbf, 0x5a, 0xb7}, + "HKY ", + 18}, + {{0x66, 0xeb, 0x65, 0xD7, 0xAb, 0x8e, 0x95, 0x67, 0xba, 0x0f, + 0xa6, 0xE3, 0x7c, 0x30, 0x59, 0x56, 0xc5, 0x34, 0x15, 0x74}, + "HLX ", + 5}, + {{0xAa, 0x0b, 0xb1, 0x0C, 0xEc, 0x1f, 0xa3, 0x72, 0xeb, 0x3A, + 0xbc, 0x17, 0xC9, 0x33, 0xFC, 0x6b, 0xa8, 0x63, 0xDD, 0x9E}, + "HMC ", + 18}, + {{0xcb, 0xCC, 0x0F, 0x03, 0x6E, 0xD4, 0x78, 0x8F, 0x63, 0xFC, + 0x0f, 0xEE, 0x32, 0x87, 0x3d, 0x6A, 0x74, 0x87, 0xb9, 0x08}, + "HMQ ", + 8}, + {{0xb4, 0x5d, 0x7B, 0xc4, 0xcE, 0xBc, 0xAB, 0x98, 0xaD, 0x09, + 0xBA, 0xBD, 0xF8, 0xC8, 0x18, 0xB2, 0x29, 0x2B, 0x67, 0x2c}, + "HODL ", + 18}, + {{0x5B, 0x07, 0x51, 0x71, 0x3b, 0x25, 0x27, 0xd7, 0xf0, 0x02, + 0xc0, 0xc4, 0xe2, 0xa3, 0x7e, 0x12, 0x19, 0x61, 0x0A, 0x6B}, + "HORSE ", + 18}, + {{0x6c, 0x6e, 0xe5, 0xe3, 0x1d, 0x82, 0x8d, 0xe2, 0x41, 0x28, + 0x2b, 0x96, 0x06, 0xc8, 0xe9, 0x8e, 0xa4, 0x85, 0x26, 0xe2}, + "HoloTkn ", + 18}, + {{0x9a, 0xf8, 0x39, 0x68, 0x7f, 0x6c, 0x94, 0x54, 0x2a, 0xc5, + 0xec, 0xe2, 0xe3, 0x17, 0xda, 0xae, 0x35, 0x54, 0x93, 0xa1}, + "Hydro ", + 18}, + {{0x38, 0xc6, 0xa6, 0x83, 0x04, 0xcd, 0xef, 0xb9, 0xbe, 0xc4, + 0x8b, 0xbf, 0xaa, 0xba, 0x5c, 0x5b, 0x47, 0x81, 0x8b, 0xb2}, + "HPB ", + 18}, + {{0x55, 0x4C, 0x20, 0xB7, 0xc4, 0x86, 0xbe, 0xeE, 0x43, 0x92, + 0x77, 0xb4, 0x54, 0x0A, 0x43, 0x45, 0x66, 0xdC, 0x4C, 0x02}, + "HST ", + 18}, + {{0x6f, 0x25, 0x96, 0x37, 0xdc, 0xd7, 0x4c, 0x76, 0x77, 0x81, + 0xe3, 0x7b, 0xc6, 0x13, 0x3c, 0xd6, 0xa6, 0x8a, 0xa1, 0x61}, + "HT ", + 18}, + {{0xC0, 0xEb, 0x85, 0x28, 0x5d, 0x83, 0x21, 0x7C, 0xD7, 0xc8, + 0x91, 0x70, 0x2b, 0xcb, 0xC0, 0xFC, 0x40, 0x1E, 0x2D, 0x9D}, + "HVN ", + 8}, + {{0xeb, 0xbd, 0xf3, 0x02, 0xc9, 0x40, 0xc6, 0xbf, 0xd4, 0x9c, + 0x6b, 0x16, 0x5f, 0x45, 0x7f, 0xdb, 0x32, 0x46, 0x49, 0xbc}, + "HYDRO ", + 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}, + "Hdp2 ", + 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}, + {{0x01, 0x4B, 0x50, 0x46, 0x65, 0x90, 0x34, 0x0D, 0x41, 0x30, + 0x7C, 0xc5, 0x4D, 0xCe, 0xe9, 0x90, 0xc8, 0xD5, 0x8a, 0xa8}, + "ICOS ", + 6}, + {{0xb5, 0xa5, 0xf2, 0x26, 0x94, 0x35, 0x2c, 0x15, 0xb0, 0x03, + 0x23, 0x84, 0x4a, 0xd5, 0x45, 0xab, 0xb2, 0xb1, 0x10, 0x28}, + "ICX ", + 18}, + {{0x81, 0x4c, 0xaf, 0xd4, 0x78, 0x2d, 0x2e, 0x72, 0x81, 0x70, + 0xfd, 0xa6, 0x82, 0x57, 0x98, 0x3f, 0x03, 0x32, 0x1c, 0x58}, + "IDEA ", + 0}, + {{0x51, 0x36, 0xc9, 0x8a, 0x80, 0x81, 0x1c, 0x3f, 0x46, 0xbd, + 0xda, 0x8b, 0x5c, 0x45, 0x55, 0xcf, 0xd9, 0xf8, 0x12, 0xf0}, + "IDH ", + 6}, + {{0xcc, 0x13, 0xfc, 0x62, 0x7e, 0xff, 0xd6, 0xe3, 0x5d, 0x2d, + 0x27, 0x06, 0xea, 0x3c, 0x4d, 0x73, 0x96, 0xc6, 0x10, 0xea}, + "IDXM ", + 8}, + {{0x85, 0x9a, 0x9c, 0x0b, 0x44, 0xcb, 0x70, 0x66, 0xd9, 0x56, + 0xa9, 0x58, 0xb0, 0xb8, 0x2e, 0x54, 0xc9, 0xe4, 0x4b, 0x4b}, + "iETH ", + 8}, + {{0x76, 0x54, 0x91, 0x5a, 0x1b, 0x82, 0xd6, 0xd2, 0xd0, 0xaf, + 0xc3, 0x7c, 0x52, 0xaf, 0x55, 0x6e, 0xa8, 0x98, 0x3c, 0x7e}, + "IFT ", + 18}, + {{0x8a, 0x88, 0xf0, 0x4e, 0x0c, 0x90, 0x50, 0x54, 0xd2, 0xf3, + 0x3b, 0x26, 0xbb, 0x3a, 0x46, 0xd7, 0x09, 0x1a, 0x03, 0x9a}, + "IG ", + 18}, + {{0xed, 0xa8, 0xb0, 0x16, 0xef, 0xa8, 0xb1, 0x16, 0x12, 0x08, + 0xcf, 0x04, 0x1c, 0xd8, 0x69, 0x72, 0xee, 0xe0, 0xf3, 0x1e}, + "IHT ", + 18}, + {{0x16, 0x66, 0x2f, 0x73, 0xdf, 0x3e, 0x79, 0xe5, 0x4c, 0x6c, + 0x59, 0x38, 0xb4, 0x31, 0x3f, 0x92, 0xc5, 0x24, 0xc1, 0x20}, + "IIC ", + 18}, + {{0x88, 0xAE, 0x96, 0x84, 0x5e, 0x15, 0x75, 0x58, 0xef, 0x59, + 0xe9, 0xFf, 0x90, 0xE7, 0x66, 0xE2, 0x2E, 0x48, 0x03, 0x90}, + "IKB ", + 0}, + {{0xe3, 0x83, 0x1c, 0x5A, 0x98, 0x2B, 0x27, 0x9A, 0x19, 0x84, + 0x56, 0xD5, 0x77, 0xcf, 0xb9, 0x04, 0x24, 0xcb, 0x63, 0x40}, + "IMC ", + 6}, + {{0x22, 0xE5, 0xF6, 0x2D, 0x0F, 0xA1, 0x99, 0x74, 0x74, 0x9f, + 0xaa, 0x19, 0x4e, 0x3d, 0x3e, 0xF6, 0xd8, 0x9c, 0x08, 0xd7}, + "IMT Immo ", + 0}, + {{0x13, 0x11, 0x9E, 0x34, 0xE1, 0x40, 0x09, 0x7a, 0x50, 0x7B, + 0x07, 0xa5, 0x56, 0x4b, 0xDe, 0x1b, 0xC3, 0x75, 0xD9, 0xe6}, + "IMT Mony ", + 18}, + {{0xf8, 0xe3, 0x86, 0xED, 0xa8, 0x57, 0x48, 0x4f, 0x5a, 0x12, + 0xe4, 0xB5, 0xDA, 0xa9, 0x98, 0x4E, 0x06, 0xE7, 0x37, 0x05}, + "IND ", + 18}, + {{0x24, 0xdd, 0xff, 0x6d, 0x8b, 0x8a, 0x42, 0xd8, 0x35, 0xaf, + 0x3b, 0x44, 0x0d, 0xe9, 0x1f, 0x33, 0x86, 0x55, 0x4a, 0xa4}, + "ING ", + 18}, + {{0x48, 0xe5, 0x41, 0x3b, 0x73, 0xad, 0xd2, 0x43, 0x4e, 0x47, + 0x50, 0x4E, 0x2a, 0x22, 0xd1, 0x49, 0x40, 0xdB, 0xFe, 0x78}, + "INRM ", + 3}, + {{0x5b, 0x2e, 0x4a, 0x70, 0x0d, 0xfb, 0xc5, 0x60, 0x06, 0x1e, + 0x95, 0x7e, 0xde, 0xc8, 0xf6, 0xee, 0xeb, 0x74, 0xa3, 0x20}, + "INS ", + 10}, + {{0xc7, 0x2f, 0xe8, 0xe3, 0xdd, 0x5b, 0xef, 0x0f, 0x9f, 0x31, + 0xf2, 0x59, 0x39, 0x9f, 0x30, 0x12, 0x72, 0xef, 0x2a, 0x2d}, + "INSTAR ", + 18}, + {{0x0b, 0x76, 0x54, 0x4f, 0x6c, 0x41, 0x3a, 0x55, 0x5f, 0x30, + 0x9b, 0xf7, 0x62, 0x60, 0xd1, 0xe0, 0x23, 0x77, 0xc0, 0x2a}, + "INT ", + 6}, + {{0xec, 0xe8, 0x36, 0x17, 0xdb, 0x20, 0x8a, 0xd2, 0x55, 0xad, + 0x4f, 0x45, 0xda, 0xf8, 0x1e, 0x25, 0x13, 0x75, 0x35, 0xbb}, + "INV ", + 8}, + {{0xa8, 0x00, 0x6c, 0x4c, 0xa5, 0x6f, 0x24, 0xd6, 0x83, 0x67, + 0x27, 0xd1, 0x06, 0x34, 0x93, 0x20, 0xdb, 0x7f, 0xef, 0x82}, + "INXT ", + 8}, + {{0xFA, 0x1a, 0x85, 0x6C, 0xfa, 0x34, 0x09, 0xCF, 0xa1, 0x45, + 0xFa, 0x4e, 0x20, 0xEb, 0x27, 0x0d, 0xF3, 0xEB, 0x21, 0xab}, + "IOST ", + 18}, + {{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}, + {{0xA4, 0xeA, 0x68, 0x7A, 0x2A, 0x7F, 0x29, 0xcF, 0x2d, 0xc6, + 0x6B, 0x39, 0xc6, 0x8e, 0x44, 0x11, 0xC0, 0xD0, 0x0C, 0x49}, + "IVY ", + 18}, + {{0xfc, 0xa4, 0x79, 0x62, 0xd4, 0x5a, 0xdf, 0xdf, 0xd1, 0xab, + 0x2d, 0x97, 0x23, 0x15, 0xdb, 0x4c, 0xe7, 0xcc, 0xf0, 0x94}, + "IXT ", + 8}, + {{0xc3, 0x4b, 0x21, 0xf6, 0xf8, 0xe5, 0x1c, 0xc9, 0x65, 0xc2, + 0x39, 0x3b, 0x3c, 0xcf, 0xa3, 0xb8, 0x2b, 0xeb, 0x24, 0x03}, + "IoT ", + 6}, + {{0x0d, 0x26, 0x2e, 0x5d, 0xc4, 0xa0, 0x6a, 0x0f, 0x1c, 0x90, + 0xce, 0x79, 0xc7, 0xa6, 0x0c, 0x09, 0xdf, 0xc8, 0x84, 0xe4}, + "J8T ", + 8}, + {{0x88, 0x4e, 0x39, 0x02, 0xC4, 0xd5, 0xcF, 0xA8, 0x6d, 0xe4, + 0xaC, 0xE7, 0xA9, 0x6A, 0xA9, 0x1E, 0xbC, 0x25, 0xC0, 0xFf}, + "JBX ", + 0}, + {{0xe2, 0xd8, 0x2d, 0xc7, 0xda, 0x0e, 0x6f, 0x88, 0x2e, 0x96, + 0x84, 0x64, 0x51, 0xf4, 0xfa, 0xbc, 0xc8, 0xf9, 0x05, 0x28}, + "JC ", + 18}, + {{0x87, 0x27, 0xc1, 0x12, 0xc7, 0x12, 0xc4, 0xa0, 0x33, 0x71, + 0xac, 0x87, 0xa7, 0x4d, 0xd6, 0xab, 0x10, 0x4a, 0xf7, 0x68}, + "JET ", + 18}, + {{0xa5, 0xFd, 0x1A, 0x79, 0x1C, 0x4d, 0xfc, 0xaa, 0xcC, 0x96, + 0x3D, 0x4F, 0x73, 0xc6, 0xAe, 0x58, 0x24, 0x14, 0x9e, 0xA7}, + "JNT ", + 18}, + {{0xdb, 0x45, 0x5c, 0x71, 0xc1, 0xbc, 0x2d, 0xe4, 0xe8, 0x0c, + 0xa4, 0x51, 0x18, 0x40, 0x41, 0xef, 0x32, 0x05, 0x40, 0x01}, + "JOT ", + 18}, + {{0xDD, 0xe1, 0x2a, 0x12, 0xA6, 0xf6, 0x71, 0x56, 0xe0, 0xDA, + 0x67, 0x2b, 0xe0, 0x5c, 0x37, 0x4e, 0x1B, 0x0a, 0x3e, 0x57}, + "JOY ", + 6}, + {{0x77, 0x34, 0x50, 0x33, 0x5e, 0xD4, 0xec, 0x3D, 0xB4, 0x5a, + 0xF7, 0x4f, 0x34, 0xF2, 0xc8, 0x53, 0x48, 0x64, 0x5D, 0x39}, + "JetCoins ", + 18}, + {{0x14, 0x10, 0x43, 0x4b, 0x03, 0x46, 0xf5, 0xbe, 0x67, 0x8d, + 0x0f, 0xb5, 0x54, 0xe5, 0xc7, 0xab, 0x62, 0x0f, 0x8f, 0x4a}, + "KAN ", + 18}, + {{0x0D, 0x6D, 0xD9, 0xf6, 0x8d, 0x24, 0xEC, 0x1d, 0x5f, 0xE2, + 0x17, 0x4f, 0x3E, 0xC8, 0xDA, 0xB5, 0x2B, 0x52, 0xBa, 0xF5}, + "KC ", + 18}, + {{0x72, 0xD3, 0x2a, 0xc1, 0xc5, 0xE6, 0x6B, 0xfC, 0x5b, 0x08, + 0x80, 0x62, 0x71, 0xf8, 0xeE, 0xF9, 0x15, 0x54, 0x51, 0x64}, + "KEE ", + 0}, + {{0x4c, 0xd9, 0x88, 0xaf, 0xba, 0xd3, 0x72, 0x89, 0xba, 0xaf, + 0x53, 0xc1, 0x3e, 0x98, 0xe2, 0xbd, 0x46, 0xaa, 0xea, 0x8c}, + "BihuKey ", + 18}, + {{0x4C, 0xC1, 0x93, 0x56, 0xf2, 0xD3, 0x73, 0x38, 0xb9, 0x80, + 0x2a, 0xa8, 0xE8, 0xfc, 0x58, 0xB0, 0x37, 0x32, 0x96, 0xE7}, + "SelfKey ", + 18}, + {{0x27, 0x69, 0x5E, 0x09, 0x14, 0x9A, 0xdC, 0x73, 0x8A, 0x97, + 0x8e, 0x9A, 0x67, 0x8F, 0x99, 0xE4, 0xc3, 0x9e, 0x9e, 0xb9}, + "KICK ", + 8}, + {{0x81, 0x8F, 0xc6, 0xC2, 0xEc, 0x59, 0x86, 0xbc, 0x6E, 0x2C, + 0xBf, 0x00, 0x93, 0x9d, 0x90, 0x55, 0x6a, 0xB1, 0x2c, 0xe5}, + "KIN ", + 18}, + {{0x46, 0x18, 0x51, 0x9d, 0xe4, 0xc3, 0x04, 0xf3, 0x44, 0x4f, + 0xfa, 0x7f, 0x81, 0x2d, 0xdd, 0xc2, 0x97, 0x1c, 0xc6, 0x88}, + "KIND ", + 8}, + {{0xdd, 0x97, 0x4D, 0x5C, 0x2e, 0x29, 0x28, 0xde, 0xA5, 0xF7, + 0x1b, 0x98, 0x25, 0xb8, 0xb6, 0x46, 0x68, 0x6B, 0xD2, 0x00}, + "KNC ", + 18}, + {{0x8e, 0x56, 0x10, 0xab, 0x5e, 0x39, 0xd2, 0x68, 0x28, 0x16, + 0x76, 0x40, 0xea, 0x29, 0x82, 0x3f, 0xe1, 0xdd, 0x58, 0x43}, + "KNDC ", + 8}, + {{0xff, 0x5c, 0x25, 0xd2, 0xf4, 0x0b, 0x47, 0xc4, 0xa3, 0x7f, + 0x98, 0x9d, 0xe9, 0x33, 0xe2, 0x65, 0x62, 0xef, 0x0a, 0xc0}, + "KNT ", + 16}, + {{0xb5, 0xc3, 0x3f, 0x96, 0x5c, 0x88, 0x99, 0xd2, 0x55, 0xc3, + 0x4c, 0xdd, 0x2a, 0x3e, 0xfa, 0x8a, 0xbc, 0xbb, 0x3d, 0xea}, + "KPR ", + 18}, + {{0x46, 0x4e, 0xbe, 0x77, 0xc2, 0x93, 0xe4, 0x73, 0xb4, 0x8c, + 0xfe, 0x96, 0xdd, 0xcf, 0x88, 0xfc, 0xf7, 0xbf, 0xda, 0xc0}, + "KRL ", + 18}, + {{0xdf, 0x13, 0x38, 0xFb, 0xAf, 0xe7, 0xaF, 0x17, 0x89, 0x15, + 0x16, 0x27, 0xB8, 0x86, 0x78, 0x1b, 0xa5, 0x56, 0xeF, 0x9a}, + "KUE ", + 18}, + {{0x24, 0x1b, 0xa6, 0x72, 0x57, 0x4a, 0x78, 0xa3, 0xa6, 0x04, + 0xcd, 0xd0, 0xa9, 0x44, 0x29, 0xa7, 0x3a, 0x84, 0xa3, 0x24}, + "KWATT ", + 18}, + {{0x95, 0x41, 0xFD, 0x8B, 0x9b, 0x5F, 0xA9, 0x73, 0x81, 0x78, + 0x37, 0x83, 0xCe, 0xBF, 0x2F, 0x5f, 0xA7, 0x93, 0xC2, 0x62}, + "KZN ", + 8}, + {{0xE5, 0x03, 0x65, 0xf5, 0xD6, 0x79, 0xCB, 0x98, 0xa1, 0xdd, + 0x62, 0xD6, 0xF6, 0xe5, 0x8e, 0x59, 0x32, 0x1B, 0xcd, 0xDf}, + "LA ", + 18}, + {{0xfD, 0x10, 0x7B, 0x47, 0x3A, 0xB9, 0x0e, 0x8F, 0xbd, 0x89, + 0x87, 0x21, 0x44, 0xa3, 0xDC, 0x92, 0xC4, 0x0F, 0xa8, 0xC9}, + "LALA ", + 18}, + {{0x2f, 0x85, 0xe5, 0x02, 0xa9, 0x88, 0xaf, 0x76, 0xf7, 0xee, + 0x6d, 0x83, 0xb7, 0xdb, 0x8d, 0x6c, 0x0a, 0x82, 0x3b, 0xf9}, + "LATX ", + 8}, + {{0xfe, 0x5f, 0x14, 0x1b, 0xf9, 0x4f, 0xe8, 0x4b, 0xc2, 0x8d, + 0xed, 0x0a, 0xb9, 0x66, 0xc1, 0x6b, 0x17, 0x49, 0x06, 0x57}, + "LBA ", + 18}, + {{0xaa, 0x19, 0x96, 0x1b, 0x6b, 0x85, 0x8d, 0x9f, 0x18, 0xa1, + 0x15, 0xf2, 0x5a, 0xa1, 0xd9, 0x8a, 0xbc, 0x1f, 0xdb, 0xa8}, + "LCS ", + 18}, + {{0x4a, 0x37, 0xa9, 0x1e, 0xec, 0x4c, 0x97, 0xf9, 0x09, 0x0c, + 0xe6, 0x6d, 0x21, 0xd3, 0xb3, 0xaa, 0xdf, 0x1a, 0xe5, 0xad}, + "LCT ", + 18}, + {{0x05, 0xc7, 0x06, 0x5d, 0x64, 0x40, 0x96, 0xa4, 0xe4, 0xc3, + 0xfe, 0x24, 0xaf, 0x86, 0xe3, 0x6d, 0xe0, 0x21, 0x07, 0x4b}, + "LCT ", + 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}, + {{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}, + {{0x0f, 0x4c, 0xa9, 0x26, 0x60, 0xef, 0xad, 0x97, 0xa9, 0xa7, + 0x0c, 0xb0, 0xfe, 0x96, 0x9c, 0x75, 0x54, 0x39, 0x77, 0x2c}, + "LEV ", + 9}, + {{0xc7, 0x98, 0xcd, 0x1c, 0x49, 0xdb, 0x0e, 0x29, 0x73, 0x12, + 0xe4, 0xc6, 0x82, 0x75, 0x26, 0x68, 0xce, 0x1d, 0xb2, 0xad}, + "LFR ", + 5}, + {{0xc5, 0x20, 0xF3, 0xAc, 0x30, 0x3a, 0x10, 0x7D, 0x8F, 0x4B, + 0x08, 0xb3, 0x26, 0xB6, 0xea, 0x66, 0xA4, 0xf9, 0x61, 0xcd}, + "LG ", + 18}, + {{0x59, 0x06, 0x1b, 0x6f, 0x26, 0xBB, 0x4A, 0x9c, 0xE5, 0x82, + 0x8A, 0x19, 0xd3, 0x5C, 0xFD, 0x5A, 0x4B, 0x80, 0xF0, 0x56}, + "LGD ", + 8}, + {{0x12, 0x3a, 0xb1, 0x95, 0xdd, 0x38, 0xb1, 0xb4, 0x05, 0x10, + 0xd4, 0x67, 0xa6, 0xa3, 0x59, 0xb2, 0x01, 0xaf, 0x05, 0x6f}, + "LGO ", + 8}, + {{0x2e, 0xb8, 0x6e, 0x8f, 0xc5, 0x20, 0xe0, 0xf6, 0xbb, 0x5d, + 0x9a, 0xf0, 0x8f, 0x92, 0x4f, 0xe7, 0x05, 0x58, 0xab, 0x89}, + "LGR ", + 8}, + {{0xe6, 0xdf, 0xbf, 0x1f, 0xac, 0xa9, 0x50, 0x36, 0xb8, 0xe7, + 0x6e, 0x1f, 0xb2, 0x89, 0x33, 0xd0, 0x25, 0xb7, 0x6c, 0xc0}, + "LIBER ", + 18}, + {{0xEB, 0x99, 0x51, 0x02, 0x16, 0x98, 0xB4, 0x2e, 0x43, 0x99, + 0xf9, 0xcB, 0xb6, 0x26, 0x7A, 0xa3, 0x5F, 0x82, 0xD5, 0x9D}, + "LIF ", + 18}, + {{0xff, 0x18, 0xdb, 0xc4, 0x87, 0xb4, 0xc2, 0xe3, 0x22, 0x2d, + 0x11, 0x59, 0x52, 0xba, 0xbf, 0xda, 0x8b, 0xa5, 0x2f, 0x5f}, + "LIFE ", + 18}, + {{0x02, 0xf6, 0x1f, 0xd2, 0x66, 0xda, 0x6e, 0x8b, 0x10, 0x2d, + 0x41, 0x21, 0xf5, 0xce, 0x7b, 0x99, 0x26, 0x40, 0xcf, 0x98}, + "LIKE ", + 18}, + {{0x51, 0x49, 0x10, 0x77, 0x1a, 0xf9, 0xca, 0x65, 0x6a, 0xf8, + 0x40, 0xdf, 0xf8, 0x3e, 0x82, 0x64, 0xec, 0xf9, 0x86, 0xca}, + "ChainLnk ", + 18}, + {{0xe2, 0xe6, 0xd4, 0xbe, 0x08, 0x6c, 0x69, 0x38, 0xb5, 0x3b, + 0x22, 0x14, 0x48, 0x55, 0xee, 0xf6, 0x74, 0x28, 0x16, 0x39}, + "LINK ptf ", + 18}, + {{0x24, 0xA7, 0x7c, 0x1F, 0x17, 0xC5, 0x47, 0x10, 0x5E, 0x14, + 0x81, 0x3e, 0x51, 0x7b, 0xe0, 0x6b, 0x00, 0x40, 0xaa, 0x76}, + "LIVE ", + 18}, + {{0x49, 0xbd, 0x2d, 0xa7, 0x5b, 0x1f, 0x7a, 0xf1, 0xe4, 0xdf, + 0xd6, 0xb1, 0x12, 0x5f, 0xec, 0xde, 0x59, 0xdb, 0xec, 0x58}, + "LKY ", + 18}, + {{0x25, 0xB6, 0x32, 0x5f, 0x5B, 0xB1, 0xc1, 0xE0, 0x3c, 0xfb, + 0xC3, 0xe5, 0x3F, 0x47, 0x0E, 0x1F, 0x1c, 0xa0, 0x22, 0xE3}, + "LML ", + 18}, + {{0x63, 0xe6, 0x34, 0x33, 0x0A, 0x20, 0x15, 0x0D, 0xbB, 0x61, + 0xB1, 0x56, 0x48, 0xbC, 0x73, 0x85, 0x5d, 0x6C, 0xCF, 0x07}, + "LNC ", + 18}, + {{0x6b, 0xeb, 0x41, 0x8f, 0xc6, 0xe1, 0x95, 0x82, 0x04, 0xac, + 0x8b, 0xad, 0xdc, 0xf1, 0x09, 0xb8, 0xe9, 0x69, 0x49, 0x66}, + "LinkCoin ", + 18}, + {{0x09, 0x47, 0xb0, 0xe6, 0xD8, 0x21, 0x37, 0x88, 0x05, 0xc9, + 0x59, 0x82, 0x91, 0x38, 0x5C, 0xE7, 0xc7, 0x91, 0xA6, 0xB2}, + "LND ", + 18}, + {{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}, + {{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}, + {{0xFB, 0x12, 0xe3, 0xCc, 0xA9, 0x83, 0xB9, 0xf5, 0x9D, 0x90, + 0x91, 0x2F, 0xd1, 0x7F, 0x8D, 0x74, 0x5A, 0x8B, 0x29, 0x53}, + "LUCK ", + 0}, + {{0xa8, 0x9b, 0x59, 0x34, 0x86, 0x34, 0x47, 0xf6, 0xe4, 0xfc, + 0x53, 0xb3, 0x15, 0xa9, 0x3e, 0x87, 0x3b, 0xda, 0x69, 0xa3}, + "LUM ", + 18}, + {{0xfa, 0x05, 0xA7, 0x3F, 0xfE, 0x78, 0xef, 0x8f, 0x1a, 0x73, + 0x94, 0x73, 0xe4, 0x62, 0xc5, 0x4b, 0xae, 0x65, 0x67, 0xD9}, + "LUN ", + 18}, + {{0x57, 0xad, 0x67, 0xac, 0xf9, 0xbf, 0x01, 0x5e, 0x48, 0x20, + 0xfb, 0xd6, 0x6e, 0xa1, 0xa2, 0x1b, 0xed, 0x88, 0x52, 0xec}, + "LYM ", + 18}, + {{0x3f, 0x4b, 0x72, 0x66, 0x68, 0xda, 0x46, 0xf5, 0xe0, 0xe7, + 0x5a, 0xa5, 0xd4, 0x78, 0xac, 0xec, 0x9f, 0x38, 0x21, 0x0f}, + "M-ETH ", + 18}, + {{0x5b, 0x09, 0xa0, 0x37, 0x1c, 0x1d, 0xa4, 0x4a, 0x8e, 0x24, + 0xd3, 0x6b, 0xf5, 0xde, 0xb1, 0x14, 0x1a, 0x84, 0xd8, 0x75}, + "MAD ", + 18}, + {{0xe2, 0x5b, 0xCe, 0xc5, 0xD3, 0x80, 0x1c, 0xE3, 0xa7, 0x94, + 0x07, 0x9B, 0xF9, 0x4a, 0xdF, 0x1B, 0x8c, 0xCD, 0x80, 0x2D}, + "MAN ", + 18}, + {{0x0F, 0x5D, 0x2f, 0xB2, 0x9f, 0xb7, 0xd3, 0xCF, 0xeE, 0x44, + 0x4a, 0x20, 0x02, 0x98, 0xf4, 0x68, 0x90, 0x8c, 0xC9, 0x42}, + "MANA ", + 18}, + {{0xfd, 0xcc, 0x07, 0xAb, 0x60, 0x66, 0x0d, 0xe5, 0x33, 0xb5, + 0xAd, 0x26, 0xe1, 0x45, 0x7b, 0x56, 0x5a, 0x9D, 0x59, 0xBd}, + "MART ", + 18}, + {{0x38, 0x64, 0x67, 0xf1, 0xf3, 0xdd, 0xbe, 0x83, 0x24, 0x48, + 0x65, 0x04, 0x18, 0x31, 0x1a, 0x47, 0x9e, 0xec, 0xfc, 0x57}, + "MBRS ", + 0}, + {{0x93, 0xE6, 0x82, 0x10, 0x7d, 0x1E, 0x9d, 0xef, 0xB0, 0xb5, + 0xee, 0x70, 0x1C, 0x71, 0x70, 0x7a, 0x4B, 0x2E, 0x46, 0xBc}, + "MCAP ", + 8}, + {{0x13, 0x8A, 0x87, 0x52, 0x09, 0x3F, 0x4f, 0x9a, 0x79, 0xAa, + 0xeD, 0xF4, 0x8d, 0x4B, 0x92, 0x48, 0xfa, 0xb9, 0x3c, 0x9C}, + "MCI ", + 18}, + {{0xB6, 0x3B, 0x60, 0x6A, 0xc8, 0x10, 0xa5, 0x2c, 0xCa, 0x15, + 0xe4, 0x4b, 0xB6, 0x30, 0xfd, 0x42, 0xD8, 0xd1, 0xd8, 0x3d}, + "MCO ", + 8}, + {{0x51, 0xDB, 0x5A, 0xd3, 0x5C, 0x67, 0x1a, 0x87, 0x20, 0x7d, + 0x88, 0xfC, 0x11, 0xd5, 0x93, 0xAC, 0x0C, 0x84, 0x15, 0xbd}, + "MDA ", + 18}, + {{0x66, 0x18, 0x60, 0x08, 0xC1, 0x05, 0x06, 0x27, 0xF9, 0x79, + 0xd4, 0x64, 0xeA, 0xBb, 0x25, 0x88, 0x60, 0x56, 0x3d, 0xbE}, + "MDS ", + 18}, + {{0x81, 0x4e, 0x09, 0x08, 0xb1, 0x2a, 0x99, 0xfe, 0xcf, 0x5b, + 0xc1, 0x01, 0xbb, 0x5d, 0x0b, 0x8b, 0x5c, 0xdf, 0x7d, 0x26}, + "MDT ", + 18}, + {{0xfd, 0x1e, 0x80, 0x50, 0x8f, 0x24, 0x3e, 0x64, 0xce, 0x23, + 0x4e, 0xa8, 0x8a, 0x5f, 0xd2, 0x82, 0x7c, 0x71, 0xd4, 0xb7}, + "MEDX ", + 8}, + {{0xf0, 0x30, 0x45, 0xa4, 0xc8, 0x07, 0x7e, 0x38, 0xf3, 0xb8, + 0xe2, 0xed, 0x33, 0xb8, 0xae, 0xe6, 0x9e, 0xdf, 0x86, 0x9f}, + "MESH ", + 18}, + {{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}, + {{0xa3, 0xd5, 0x8c, 0x4e, 0x56, 0xfe, 0xdc, 0xae, 0x3a, 0x7c, + 0x43, 0xa7, 0x25, 0xae, 0xe9, 0xa7, 0x1f, 0x0e, 0xce, 0x4e}, + "MET ", + 18}, + {{0xfe, 0xf3, 0x88, 0x4b, 0x60, 0x3c, 0x33, 0xef, 0x8e, 0xd4, + 0x18, 0x33, 0x46, 0xe0, 0x93, 0xa1, 0x73, 0xc9, 0x4d, 0xa6}, + "METM ", + 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}, + {{0x3a, 0x12, 0x37, 0xd3, 0x8d, 0x0f, 0xb9, 0x45, 0x13, 0xf8, + 0x5d, 0x61, 0x67, 0x9c, 0xad, 0x7f, 0x38, 0x50, 0x72, 0x42}, + "MIC ", + 18}, + {{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}, + {{0x4a, 0x52, 0x7d, 0x8f, 0xc1, 0x3c, 0x52, 0x03, 0xab, 0x24, + 0xba, 0x09, 0x44, 0xf4, 0xcb, 0x14, 0x65, 0x8d, 0x1d, 0xb6}, + "MITx ", + 18}, + {{0x9f, 0x8F, 0x72, 0xaA, 0x93, 0x04, 0xc8, 0xB5, 0x93, 0xd5, + 0x55, 0xF1, 0x2e, 0xF6, 0x58, 0x9c, 0xC3, 0xA5, 0x79, 0xA2}, + "MKR ", + 18}, + {{0x79, 0x39, 0x88, 0x2b, 0x54, 0xfc, 0xf0, 0xbc, 0xae, 0x6b, + 0x53, 0xde, 0xc3, 0x9a, 0xd6, 0xe8, 0x06, 0x17, 0x64, 0x42}, + "MKT ", + 8}, + {{0xBE, 0xB9, 0xeF, 0x51, 0x4a, 0x37, 0x9B, 0x99, 0x7e, 0x07, + 0x98, 0xFD, 0xcC, 0x90, 0x1E, 0xe4, 0x74, 0xB6, 0xD9, 0xA1}, + "MLN ", + 18}, + {{0x1a, 0x95, 0xB2, 0x71, 0xB0, 0x53, 0x5D, 0x15, 0xfa, 0x49, + 0x93, 0x2D, 0xab, 0xa3, 0x1B, 0xA6, 0x12, 0xb5, 0x29, 0x46}, + "MNE ", + 8}, + {{0xA9, 0x87, 0x7b, 0x1e, 0x05, 0xD0, 0x35, 0x89, 0x91, 0x31, + 0xDB, 0xd1, 0xe4, 0x03, 0x82, 0x51, 0x66, 0xD0, 0x9f, 0x92}, + "MNT ", + 18}, + {{0x83, 0xce, 0xe9, 0xe0, 0x86, 0xa7, 0x7e, 0x49, 0x2e, 0xe0, + 0xbb, 0x93, 0xc2, 0xb0, 0x43, 0x7a, 0xd6, 0xfd, 0xec, 0xcc}, + "MNTP ", + 18}, + {{0x86, 0x5e, 0xc5, 0x8b, 0x06, 0xbf, 0x63, 0x05, 0xb8, 0x86, + 0x79, 0x3a, 0xa2, 0x0a, 0x2d, 0xa3, 0x1d, 0x03, 0x4e, 0x68}, + "MOC ", + 18}, + {{0x95, 0x7c, 0x30, 0xaB, 0x04, 0x26, 0xe0, 0xC9, 0x3C, 0xD8, + 0x24, 0x1E, 0x2c, 0x60, 0x39, 0x2d, 0x08, 0xc6, 0xaC, 0x8e}, + "MOD ", + 0}, + {{0x50, 0x12, 0x62, 0x28, 0x1b, 0x2b, 0xa0, 0x43, 0xe2, 0xfb, + 0xf1, 0x49, 0x04, 0x98, 0x06, 0x89, 0xcd, 0xdb, 0x0c, 0x78}, + "MORE ", + 2}, + {{0x26, 0x3c, 0x61, 0x84, 0x80, 0xdb, 0xe3, 0x5c, 0x30, 0x0d, + 0x8d, 0x5e, 0xcd, 0xa1, 0x9b, 0xbb, 0x98, 0x6a, 0xca, 0xed}, + "MOT ", + 18}, + {{0xfb, 0xd0, 0xd1, 0xc7, 0x7b, 0x50, 0x17, 0x96, 0xa3, 0x5d, + 0x86, 0xcf, 0x91, 0xd6, 0x5d, 0x97, 0x78, 0xee, 0xe6, 0x95}, + "MOVED ", + 3}, + {{0x44, 0xbf, 0x22, 0x94, 0x9f, 0x9c, 0xc8, 0x4b, 0x61, 0xb9, + 0x32, 0x8a, 0x9d, 0x88, 0x5d, 0x1b, 0x5c, 0x80, 0x6b, 0x41}, + "MOZO ", + 2}, + {{0xf4, 0x53, 0xb5, 0xb9, 0xd4, 0xe0, 0xb5, 0xc6, 0x2f, 0xfb, + 0x25, 0x6b, 0xb2, 0x37, 0x8c, 0xc2, 0xbc, 0x8e, 0x8a, 0x89}, + "MRK ", + 8}, + {{0x82, 0x12, 0x5A, 0xFe, 0x01, 0x81, 0x9D, 0xff, 0x15, 0x35, + 0xD0, 0xD6, 0x27, 0x6d, 0x57, 0x04, 0x52, 0x91, 0xB6, 0xc0}, + "MRL ", + 18}, + {{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 Med ", + 18}, + {{0xdf, 0xdc, 0x0d, 0x82, 0xd9, 0x6f, 0x8f, 0xd4, 0x0c, 0xa0, + 0xcf, 0xb4, 0xa2, 0x88, 0x95, 0x5b, 0xec, 0xec, 0x20, 0x88}, + "MTC Mesh ", + 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}, + {{0x7F, 0xC4, 0x08, 0x01, 0x11, 0x65, 0x76, 0x0e, 0xE3, 0x1b, + 0xE2, 0xBF, 0x20, 0xdA, 0xf4, 0x50, 0x35, 0x66, 0x92, 0xAf}, + "MTR ", + 8}, + {{0x1e, 0x49, 0xfF, 0x77, 0xc3, 0x55, 0xA3, 0xe3, 0x8D, 0x66, + 0x51, 0xce, 0x84, 0x04, 0xAF, 0x0E, 0x48, 0xc5, 0x39, 0x5f}, + "MTRc ", + 18}, + {{0x0A, 0xF4, 0x4e, 0x27, 0x84, 0x63, 0x72, 0x18, 0xdD, 0x1D, + 0x32, 0xA3, 0x22, 0xD4, 0x4e, 0x60, 0x3A, 0x8f, 0x0c, 0x6A}, + "MTX ", + 18}, + {{0x51, 0x56, 0x69, 0xd3, 0x08, 0xf8, 0x87, 0xfd, 0x83, 0xa4, + 0x71, 0xc7, 0x76, 0x4f, 0x5d, 0x08, 0x48, 0x86, 0xd3, 0x4d}, + "MUXE ", + 18}, + {{0xa8, 0x49, 0xea, 0xae, 0x99, 0x4f, 0xb8, 0x6a, 0xfa, 0x73, + 0x38, 0x2e, 0x9b, 0xd8, 0x8c, 0x2b, 0x6b, 0x18, 0xdc, 0x71}, + "MVL ", + 18}, + {{0x8a, 0x77, 0xe4, 0x09, 0x36, 0xbb, 0xc2, 0x7e, 0x80, 0xe9, + 0xa3, 0xf5, 0x26, 0x36, 0x8c, 0x96, 0x78, 0x69, 0xc8, 0x6d}, + "MVP ", + 18}, + {{0x64, 0x25, 0xc6, 0xbe, 0x90, 0x2d, 0x69, 0x2a, 0xe2, 0xdb, + 0x75, 0x2b, 0x3c, 0x26, 0x8a, 0xfa, 0xdb, 0x09, 0x9d, 0x3b}, + "MWAT ", + 18}, + {{0xf7, 0xe9, 0x83, 0x78, 0x16, 0x09, 0x01, 0x23, 0x07, 0xf2, + 0x51, 0x4f, 0x63, 0xD5, 0x26, 0xD8, 0x3D, 0x24, 0xF4, 0x66}, + "MYD ", + 16}, + {{0xa6, 0x45, 0x26, 0x4C, 0x56, 0x03, 0xE9, 0x6c, 0x3b, 0x0B, + 0x07, 0x8c, 0xda, 0xb6, 0x87, 0x33, 0x79, 0x4B, 0x0A, 0x71}, + "MYST ", + 8}, + {{0x8d, 0x80, 0xde, 0x8A, 0x78, 0x19, 0x83, 0x96, 0x32, 0x9d, + 0xfA, 0x76, 0x9a, 0xD5, 0x4d, 0x24, 0xbF, 0x90, 0xE7, 0xaa}, + "NAC ", + 18}, + {{0xff, 0xe0, 0x2e, 0xe4, 0xc6, 0x9e, 0xdf, 0x1b, 0x34, 0x0f, + 0xca, 0xd6, 0x4f, 0xbd, 0x6b, 0x37, 0xa7, 0xb9, 0xe2, 0x65}, + "NANJ ", + 8}, + {{0x5d, 0x65, 0xD9, 0x71, 0x89, 0x5E, 0xdc, 0x43, 0x8f, 0x46, + 0x5c, 0x17, 0xDB, 0x69, 0x92, 0x69, 0x8a, 0x52, 0x31, 0x8D}, + "NAS ", + 18}, + {{0x58, 0x80, 0x47, 0x36, 0x5d, 0xf5, 0xba, 0x58, 0x9f, 0x92, + 0x36, 0x04, 0xaa, 0xc2, 0x3d, 0x67, 0x35, 0x55, 0xc6, 0x23}, + "NAVI ", + 18}, + {{0x17, 0xf8, 0xaF, 0xB6, 0x3D, 0xfc, 0xDc, 0xC9, 0x0e, 0xbE, + 0x6e, 0x84, 0xF0, 0x60, 0xCc, 0x30, 0x6A, 0x98, 0x25, 0x7D}, + "NBAI ", + 18}, + {{0x9f, 0x19, 0x56, 0x17, 0xfa, 0x8f, 0xba, 0xd9, 0x54, 0x0c, + 0x5d, 0x11, 0x3a, 0x99, 0xa0, 0xa0, 0x17, 0x2a, 0xae, 0xdc}, + "NBC ", + 18}, + {{0x80, 0x98, 0x26, 0xcc, 0xea, 0xb6, 0x8c, 0x38, 0x77, 0x26, + 0xaf, 0x96, 0x27, 0x13, 0xb6, 0x4c, 0xb5, 0xcb, 0x3c, 0xca}, + "NCASH ", + 18}, + {{0x5d, 0x48, 0xf2, 0x93, 0xba, 0xed, 0x24, 0x7a, 0x2d, 0x01, + 0x89, 0x05, 0x8b, 0xa3, 0x7a, 0xa2, 0x38, 0xbd, 0x47, 0x25}, + "NCC Neur ", + 18}, + {{0x93, 0x44, 0xb3, 0x83, 0xb1, 0xD5, 0x9b, 0x5c, 0xe3, 0x46, + 0x8B, 0x23, 0x4D, 0xAB, 0x43, 0xC7, 0x19, 0x0b, 0xa7, 0x35}, + "NCC Need ", + 18}, + {{0x9e, 0x46, 0xa3, 0x8f, 0x5d, 0xaa, 0xbe, 0x86, 0x83, 0xe1, + 0x07, 0x93, 0xb0, 0x67, 0x49, 0xee, 0xf7, 0xd7, 0x33, 0xd1}, + "NCT ", + 18}, + {{0xa5, 0x4d, 0xdc, 0x7b, 0x3c, 0xce, 0x7f, 0xc8, 0xb1, 0xe3, + 0xfa, 0x02, 0x56, 0xd0, 0xdb, 0x80, 0xd2, 0xc1, 0x09, 0x70}, + "NDC ", + 18}, + {{0xcc, 0x80, 0xc0, 0x51, 0x05, 0x7b, 0x77, 0x4c, 0xd7, 0x50, + 0x67, 0xdc, 0x48, 0xf8, 0x98, 0x7c, 0x4e, 0xb9, 0x7a, 0x5e}, + "NEC ", + 18}, + {{0xd8, 0x44, 0x62, 0x36, 0xFA, 0x95, 0xb9, 0xb5, 0xf9, 0xfd, + 0x0f, 0x8E, 0x7D, 0xf1, 0xa9, 0x44, 0x82, 0x3c, 0x68, 0x3d}, + "NEEO ", + 18}, + {{0xcf, 0xb9, 0x86, 0x37, 0xbc, 0xae, 0x43, 0xC1, 0x33, 0x23, + 0xEA, 0xa1, 0x73, 0x1c, 0xED, 0x2B, 0x71, 0x69, 0x62, 0xfD}, + "NET ", + 18}, + {{0xa8, 0x23, 0xe6, 0x72, 0x20, 0x06, 0xaf, 0xe9, 0x9e, 0x91, + 0xc3, 0x0f, 0xf5, 0x29, 0x50, 0x52, 0xfe, 0x6b, 0x8e, 0x32}, + "NEU ", + 18}, + {{0x81, 0x49, 0x64, 0xb1, 0xbc, 0xeA, 0xf2, 0x4e, 0x26, 0x29, + 0x6D, 0x03, 0x1E, 0xaD, 0xf1, 0x34, 0xa2, 0xCa, 0x41, 0x05}, + "NEWB ", + 0}, + {{0xb6, 0x21, 0x32, 0xe3, 0x5a, 0x6c, 0x13, 0xee, 0x1e, 0xe0, + 0xf8, 0x4d, 0xc5, 0xd4, 0x0b, 0xad, 0x8d, 0x81, 0x52, 0x06}, + "NEXO ", + 18}, + {{0x72, 0xdd, 0x4b, 0x6b, 0xd8, 0x52, 0xa3, 0xaa, 0x17, 0x2b, + 0xe4, 0xd6, 0xc5, 0xa6, 0xdb, 0xec, 0x58, 0x8c, 0xf1, 0x31}, + "NGC ", + 18}, + {{0xe2, 0x65, 0x17, 0xA9, 0x96, 0x72, 0x99, 0x45, 0x3d, 0x3F, + 0x1B, 0x48, 0xAa, 0x00, 0x5E, 0x61, 0x27, 0xe6, 0x72, 0x10}, + "NIMFA ", + 18}, + {{0x55, 0x54, 0xe0, 0x4e, 0x76, 0x53, 0x3e, 0x1d, 0x14, 0xc5, + 0x2f, 0x05, 0xbe, 0xef, 0x6c, 0x9d, 0x32, 0x9e, 0x1e, 0x30}, + "NIO ", + 0}, + {{0x17, 0x76, 0xe1, 0xF2, 0x6f, 0x98, 0xb1, 0xA5, 0xdF, 0x9c, + 0xD3, 0x47, 0x95, 0x3a, 0x26, 0xdd, 0x3C, 0xb4, 0x66, 0x71}, + "NMR ", + 18}, + {{0x58, 0xa4, 0x88, 0x41, 0x82, 0xd9, 0xe8, 0x35, 0x59, 0x7f, + 0x40, 0x5e, 0x5f, 0x25, 0x82, 0x90, 0xe4, 0x6a, 0xe7, 0xc2}, + "NOAH ", + 18}, + {{0xf4, 0xfa, 0xea, 0x45, 0x55, 0x75, 0x35, 0x4d, 0x26, 0x99, + 0xbc, 0x20, 0x9b, 0x0a, 0x65, 0xca, 0x99, 0xf6, 0x99, 0x82}, + "NOBS ", + 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}, + {{0x28, 0xb5, 0xe1, 0x2c, 0xce, 0x51, 0xf1, 0x55, 0x94, 0xb0, + 0xb9, 0x1d, 0x5b, 0x5a, 0xda, 0xa7, 0x0f, 0x68, 0x4a, 0x02}, + "NPX ", + 2}, + {{0xa1, 0x5c, 0x7e, 0xbe, 0x1f, 0x07, 0xca, 0xf6, 0xbf, 0xf0, + 0x97, 0xd8, 0xa5, 0x89, 0xfb, 0x8a, 0xc4, 0x9a, 0xe5, 0xb3}, + "NPXS ", + 18}, + {{0x69, 0xbe, 0xab, 0x40, 0x34, 0x38, 0x25, 0x3f, 0x13, 0xb6, + 0xe9, 0x2d, 0xb9, 0x1f, 0x7f, 0xb8, 0x49, 0x25, 0x82, 0x63}, + "NTK ", + 18}, + {{0x5d, 0x4d, 0x57, 0xcd, 0x06, 0xfa, 0x7f, 0xe9, 0x9e, 0x26, + 0xfd, 0xc4, 0x81, 0xb4, 0x68, 0xf7, 0x7f, 0x05, 0x07, 0x3c}, + "NTK ", + 18}, + {{0x8a, 0x99, 0xed, 0x8a, 0x1b, 0x20, 0x49, 0x03, 0xee, 0x46, + 0xe7, 0x33, 0xf2, 0xc1, 0x28, 0x6f, 0x6d, 0x20, 0xb1, 0x77}, + "NTO ", + 18}, + {{0x22, 0x33, 0x79, 0x9e, 0xe2, 0x68, 0x3d, 0x75, 0xdf, 0xef, + 0xac, 0xbc, 0xd2, 0xa2, 0x6c, 0x78, 0xd3, 0x4b, 0x47, 0x0d}, + "NTWK ", + 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}, + "sUSD ", + 18}, + {{0x76, 0x27, 0xde, 0x4b, 0x93, 0x26, 0x3a, 0x6a, 0x75, 0x70, + 0xb8, 0xda, 0xfa, 0x64, 0xba, 0xe8, 0x12, 0xe5, 0xc3, 0x94}, + "NXX ", + 8}, + {{0x5c, 0x61, 0x83, 0xd1, 0x0A, 0x00, 0xCD, 0x74, 0x7a, 0x6D, + 0xbb, 0x5F, 0x65, 0x8a, 0xD5, 0x14, 0x38, 0x3e, 0x94, 0x19}, + "NXX OLD ", + 8}, + {{0x45, 0xe4, 0x2D, 0x65, 0x9D, 0x9f, 0x94, 0x66, 0xcD, 0x5D, + 0xF6, 0x22, 0x50, 0x60, 0x33, 0x14, 0x5a, 0x9b, 0x89, 0xBc}, + "NxC ", + 3}, + {{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}, + {{0x40, 0x92, 0x67, 0x8e, 0x4e, 0x78, 0x23, 0x0f, 0x46, 0xa1, + 0x53, 0x4c, 0x0f, 0xbc, 0x8f, 0xa3, 0x97, 0x80, 0x89, 0x2b}, + "OCN ", + 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}, + {{0xc6, 0x6e, 0xa8, 0x02, 0x71, 0x7b, 0xfb, 0x98, 0x33, 0x40, + 0x02, 0x64, 0xdd, 0x12, 0xc2, 0xbc, 0xea, 0xa3, 0x4a, 0x6d}, + "OLD_MKR ", + 18}, + {{0x9d, 0x92, 0x23, 0x43, 0x6d, 0xdd, 0x46, 0x6f, 0xc2, 0x47, + 0xe9, 0xdb, 0xbd, 0x20, 0x20, 0x7e, 0x64, 0x0f, 0xef, 0x58}, + "OLE ", + 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}, + {{0xb5, 0xdb, 0xc6, 0xd3, 0xcf, 0x38, 0x00, 0x79, 0xdf, 0x3b, + 0x27, 0x13, 0x56, 0x64, 0xb6, 0xbc, 0xf4, 0x5d, 0x18, 0x69}, + "OMX ", + 8}, + {{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}, + {{0x68, 0x63, 0xbe, 0x0e, 0x7c, 0xf7, 0xce, 0x86, 0x0a, 0x57, + 0x47, 0x60, 0xe9, 0x02, 0x0d, 0x51, 0x9a, 0x8b, 0xdc, 0x47}, + "ONL ", + 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}, + {{0x83, 0x29, 0x04, 0x86, 0x39, 0x78, 0xb9, 0x48, 0x02, 0x12, + 0x31, 0x06, 0xe6, 0xeb, 0x49, 0x1b, 0xdf, 0x0d, 0xf9, 0x28}, + "OPTI ", + 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}, + {{0xd2, 0xfa, 0x8f, 0x92, 0xea, 0x72, 0xab, 0xb3, 0x5d, 0xbd, + 0x6d, 0xec, 0xa5, 0x71, 0x73, 0xd2, 0x2d, 0xb2, 0xba, 0x49}, + "ORI ", + 18}, + {{0x51, 0x6E, 0x54, 0x36, 0xbA, 0xfd, 0xc1, 0x10, 0x83, 0x65, + 0x4D, 0xE7, 0xBb, 0x9b, 0x95, 0x38, 0x2d, 0x08, 0xd5, 0xDE}, + "ORME ", + 8}, + {{0xeb, 0x9a, 0x4b, 0x18, 0x58, 0x16, 0xc3, 0x54, 0xdb, 0x92, + 0xdb, 0x09, 0xcc, 0x3b, 0x50, 0xbe, 0x60, 0xb9, 0x01, 0xb6}, + "ORS ", + 18}, + {{0x2C, 0x4e, 0x8f, 0x2D, 0x74, 0x61, 0x13, 0xd0, 0x69, 0x6c, + 0xE8, 0x9B, 0x35, 0xF0, 0xd8, 0xbF, 0x88, 0xE0, 0xAE, 0xcA}, + "OST ", + 18}, + {{0x88, 0x1e, 0xf4, 0x82, 0x11, 0x98, 0x2d, 0x01, 0xe2, 0xcb, + 0x70, 0x92, 0xc9, 0x15, 0xe6, 0x47, 0xcd, 0x40, 0xd8, 0x5c}, + "OTN ", + 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}, + {{0xb9, 0xbb, 0x08, 0xab, 0x7e, 0x9f, 0xa0, 0xa1, 0x35, 0x6b, + 0xd4, 0xa3, 0x9e, 0xc0, 0xca, 0x26, 0x7e, 0x03, 0xb0, 0xb3}, + "PAI ", + 18}, + {{0xfe, 0xDA, 0xE5, 0x64, 0x26, 0x68, 0xf8, 0x63, 0x6A, 0x11, + 0x98, 0x7F, 0xf3, 0x86, 0xbf, 0xd2, 0x15, 0xF9, 0x42, 0xEE}, + "PAL ", + 18}, + {{0xea, 0x5f, 0x88, 0xe5, 0x4d, 0x98, 0x2c, 0xbb, 0x0c, 0x44, + 0x1c, 0xde, 0x4e, 0x79, 0xbc, 0x30, 0x5e, 0x5b, 0x43, 0xbc}, + "PARETO ", + 18}, + {{0x6d, 0xd4, 0xe4, 0xaa, 0xd2, 0x9a, 0x40, 0xed, 0xd6, 0xa4, + 0x09, 0xb9, 0xc1, 0x62, 0x51, 0x86, 0xc9, 0x85, 0x5b, 0x4d}, + "PARKGEN ", + 8}, + {{0x77, 0x76, 0x1e, 0x63, 0xc0, 0x5a, 0xee, 0x66, 0x48, 0xfd, + 0xae, 0xaa, 0x9b, 0x94, 0x24, 0x83, 0x51, 0xaf, 0x9b, 0xcd}, + "PASS ", + 18}, + {{0xF3, 0xb3, 0xCa, 0xd0, 0x94, 0xB8, 0x93, 0x92, 0xfc, 0xE5, + 0xfa, 0xFD, 0x40, 0xbC, 0x03, 0xb8, 0x0F, 0x2B, 0xc6, 0x24}, + "PAT ", + 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}, + {{0x8e, 0x87, 0x0d, 0x67, 0xf6, 0x60, 0xd9, 0x5d, 0x5b, 0xe5, + 0x30, 0x38, 0x0d, 0x0e, 0xc0, 0xbd, 0x38, 0x82, 0x89, 0xe1}, + "PAX ", + 18}, + {{0xB9, 0x70, 0x48, 0x62, 0x8D, 0xB6, 0xB6, 0x61, 0xD4, 0xC2, + 0xaA, 0x83, 0x3e, 0x95, 0xDb, 0xe1, 0xA9, 0x05, 0xB2, 0x80}, + "PAY ", + 18}, + {{0x55, 0x64, 0x8d, 0xe1, 0x98, 0x36, 0x33, 0x85, 0x49, 0x13, + 0x0b, 0x1a, 0xf5, 0x87, 0xf1, 0x6b, 0xea, 0x46, 0xf6, 0x6b}, + "PBL ", + 18}, + {{0xF4, 0xc0, 0x7b, 0x18, 0x65, 0xbC, 0x32, 0x6A, 0x3c, 0x01, + 0x33, 0x94, 0x92, 0xCa, 0x75, 0x38, 0xFD, 0x03, 0x8C, 0xc0}, + "PBT ", + 4}, + {{0xfc, 0xAC, 0x7A, 0x75, 0x15, 0xe9, 0xA9, 0xd7, 0x61, 0x9f, + 0xA7, 0x7A, 0x1f, 0xa7, 0x38, 0x11, 0x1f, 0x66, 0x72, 0x7e}, + "PCH ", + 18}, + {{0xe3, 0xf4, 0xb4, 0xa5, 0xd9, 0x1e, 0x5c, 0xb9, 0x43, 0x5b, + 0x94, 0x7f, 0x09, 0x0a, 0x31, 0x97, 0x37, 0x03, 0x63, 0x12}, + "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}, + {{0x0d, 0xb0, 0x3B, 0x6C, 0xDe, 0x0B, 0x2d, 0x42, 0x7C, 0x64, + 0xa0, 0x4F, 0xeA, 0xfd, 0x82, 0x59, 0x38, 0x36, 0x8f, 0x1F}, + "PDATA ", + 18}, + {{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}, + {{0x2f, 0xa3, 0x2a, 0x39, 0xfc, 0x1c, 0x39, 0x9e, 0x0c, 0xc7, + 0xb2, 0x93, 0x58, 0x68, 0xf5, 0x16, 0x5d, 0xe7, 0xce, 0x97}, + "PFR ", + 8}, + {{0x13, 0xc2, 0xfa, 0xb6, 0x35, 0x4d, 0x37, 0x90, 0xd8, 0xec, + 0xe4, 0xf0, 0xf1, 0xa3, 0x28, 0x0b, 0x4a, 0x25, 0xad, 0x96}, + "PHI ", + 18}, + {{0xE6, 0x45, 0x09, 0xF0, 0xbf, 0x07, 0xce, 0x2d, 0x29, 0xA7, + 0xeF, 0x19, 0xA8, 0xA9, 0xbc, 0x06, 0x54, 0x77, 0xC1, 0xB4}, + "PIPL ", + 8}, + {{0x0f, 0xf1, 0x61, 0x07, 0x1e, 0x62, 0x7a, 0x0e, 0x6d, 0xe1, + 0x38, 0x10, 0x5c, 0x73, 0x97, 0x0f, 0x86, 0xca, 0x79, 0x22}, + "PIT ", + 18}, + {{0x8e, 0xFF, 0xd4, 0x94, 0xeB, 0x69, 0x8c, 0xc3, 0x99, 0xAF, + 0x62, 0x31, 0xfC, 0xcd, 0x39, 0xE0, 0x8f, 0xd2, 0x0B, 0x15}, + "PIX ", + 0}, + {{0x02, 0xf2, 0xd4, 0xa0, 0x4e, 0x6e, 0x01, 0xac, 0xe8, 0x8b, + 0xd2, 0xcd, 0x63, 0x28, 0x75, 0x54, 0x3b, 0x2e, 0xf5, 0x77}, + "PKG ", + 18}, + {{0x26, 0x04, 0xfa, 0x40, 0x6b, 0xe9, 0x57, 0xe5, 0x42, 0xbe, + 0xb8, 0x9e, 0x67, 0x54, 0xfc, 0xde, 0x68, 0x15, 0xe8, 0x3f}, + "PKT ", + 18}, + {{0x59, 0x41, 0x6A, 0x25, 0x62, 0x8A, 0x76, 0xb4, 0x73, 0x0e, + 0xC5, 0x14, 0x86, 0x11, 0x4c, 0x32, 0xE0, 0xB5, 0x82, 0xA1}, + "PLASMA ", + 6}, + {{0xE4, 0x77, 0x29, 0x2f, 0x1B, 0x32, 0x68, 0x68, 0x7A, 0x29, + 0x37, 0x61, 0x16, 0xB0, 0xED, 0x27, 0xA9, 0xc7, 0x61, 0x70}, + "PLAY ", + 18}, + {{0x0A, 0xfF, 0xa0, 0x6e, 0x7F, 0xbe, 0x5b, 0xC9, 0xa7, 0x64, + 0xC9, 0x79, 0xaA, 0x66, 0xE8, 0x25, 0x6A, 0x63, 0x1f, 0x02}, + "PLBT ", + 6}, + {{0xe3, 0x81, 0x85, 0x04, 0xc1, 0xB3, 0x2b, 0xF1, 0x55, 0x7b, + 0x16, 0xC2, 0x38, 0xB2, 0xE0, 0x1F, 0xd3, 0x14, 0x9C, 0x17}, + "PLR ", + 18}, + {{0xD8, 0x91, 0x2C, 0x10, 0x68, 0x1D, 0x8B, 0x21, 0xFd, 0x37, + 0x42, 0x24, 0x4f, 0x44, 0x65, 0x8d, 0xBA, 0x12, 0x26, 0x4E}, + "PLU ", + 18}, + {{0x84, 0x6c, 0x66, 0xcf, 0x71, 0xc4, 0x3f, 0x80, 0x40, 0x3b, + 0x51, 0xfe, 0x39, 0x06, 0xb3, 0x59, 0x9d, 0x63, 0x33, 0x6f}, + "PMA ", + 18}, + {{0x81, 0xb4, 0xd0, 0x86, 0x45, 0xda, 0x11, 0x37, 0x4a, 0x03, + 0x74, 0x9a, 0xb1, 0x70, 0x83, 0x6e, 0x4e, 0x53, 0x97, 0x67}, + "PMNT ", + 9}, + {{0x93, 0xed, 0x3f, 0xbe, 0x21, 0x20, 0x7e, 0xc2, 0xe8, 0xf2, + 0xd3, 0xc3, 0xde, 0x6e, 0x05, 0x8c, 0xb7, 0x3b, 0xc0, 0x4d}, + "PNK ", + 18}, + {{0x67, 0x58, 0xb7, 0xd4, 0x41, 0xa9, 0x73, 0x9b, 0x98, 0x55, + 0x2b, 0x37, 0x37, 0x03, 0xd8, 0xd3, 0xd1, 0x4f, 0x9e, 0x62}, + "POA20 ", + 18}, + {{0x0e, 0x09, 0x89, 0xb1, 0xf9, 0xb8, 0xa3, 0x89, 0x83, 0xc2, + 0xba, 0x80, 0x53, 0x26, 0x9c, 0xa6, 0x2e, 0xc9, 0xb1, 0x95}, + "POE ", + 8}, + {{0x43, 0xf6, 0xa1, 0xbe, 0x99, 0x2d, 0xee, 0x40, 0x87, 0x21, + 0x74, 0x84, 0x90, 0x77, 0x2b, 0x15, 0x14, 0x3c, 0xe0, 0xa7}, + "POIN ", + 0}, + {{0x70, 0x5E, 0xE9, 0x6c, 0x1c, 0x16, 0x08, 0x42, 0xC9, 0x2c, + 0x1a, 0xeC, 0xfC, 0xFf, 0xcc, 0xc9, 0xC4, 0x12, 0xe3, 0xD9}, + "POLL ", + 18}, + {{0x99, 0x92, 0xeC, 0x3c, 0xF6, 0xA5, 0x5b, 0x00, 0x97, 0x8c, + 0xdD, 0xF2, 0xb2, 0x7B, 0xC6, 0x88, 0x2d, 0x88, 0xD1, 0xeC}, + "POLY ", + 18}, + {{0x77, 0x9B, 0x7b, 0x71, 0x3C, 0x86, 0xe3, 0xE6, 0x77, 0x4f, + 0x50, 0x40, 0xD9, 0xcC, 0xC2, 0xD4, 0x3a, 0xd3, 0x75, 0xF8}, + "POOL ", + 8}, + {{0xee, 0x60, 0x9f, 0xe2, 0x92, 0x12, 0x8c, 0xad, 0x03, 0xb7, + 0x86, 0xdb, 0xb9, 0xbc, 0x26, 0x34, 0xcc, 0xdb, 0xe7, 0xfc}, + "POS ", + 18}, + {{0x59, 0x58, 0x32, 0xf8, 0xfc, 0x6b, 0xf5, 0x9c, 0x85, 0xc5, + 0x27, 0xfe, 0xc3, 0x74, 0x0a, 0x1b, 0x7a, 0x36, 0x12, 0x69}, + "POWR ", + 6}, + {{0xc4, 0x22, 0x09, 0xac, 0xcc, 0x14, 0x02, 0x9c, 0x10, 0x12, + 0xfb, 0x56, 0x80, 0xd9, 0x5f, 0xbd, 0x60, 0x36, 0xe2, 0xa0}, + "PPP ", + 18}, + {{0xd4, 0xfa, 0x14, 0x60, 0xF5, 0x37, 0xbb, 0x90, 0x85, 0xd2, + 0x2C, 0x7b, 0xcC, 0xB5, 0xDD, 0x45, 0x0E, 0xf2, 0x8e, 0x3a}, + "PPT ", + 8}, + {{0x88, 0xa3, 0xe4, 0xf3, 0x5d, 0x64, 0xaa, 0xd4, 0x1a, 0x6d, + 0x40, 0x30, 0xac, 0x9a, 0xfe, 0x43, 0x56, 0xcb, 0x84, 0xfa}, + "PRE ", + 18}, + {{0x77, 0x28, 0xdf, 0xef, 0x5a, 0xbd, 0x46, 0x86, 0x69, 0xeb, + 0x7f, 0x9b, 0x48, 0xa7, 0xf7, 0x0a, 0x50, 0x1e, 0xd2, 0x9d}, + "PRG ", + 6}, + {{0x3a, 0xdf, 0xc4, 0x99, 0x9f, 0x77, 0xd0, 0x4c, 0x83, 0x41, + 0xba, 0xc5, 0xf3, 0xa7, 0x6f, 0x58, 0xdf, 0xf5, 0xb3, 0x7a}, + "PRIX ", + 8}, + {{0x18, 0x44, 0xb2, 0x15, 0x93, 0x26, 0x26, 0x68, 0xb7, 0x24, + 0x8d, 0x0f, 0x57, 0xa2, 0x20, 0xca, 0xab, 0xa4, 0x6a, 0xb9}, + "PRL ", + 18}, + {{0x90, 0x41, 0xfe, 0x5b, 0x3f, 0xde, 0xa0, 0xf5, 0xe4, 0xaf, + 0xdc, 0x17, 0xe7, 0x51, 0x80, 0x73, 0x8d, 0x87, 0x7a, 0x01}, + "PRO ", + 18}, + {{0x22, 0x6b, 0xb5, 0x99, 0xa1, 0x2C, 0x82, 0x64, 0x76, 0xe3, + 0xA7, 0x71, 0x45, 0x46, 0x97, 0xEA, 0x52, 0xE9, 0xE2, 0x20}, + "PRO ", + 8}, + {{0xA3, 0x14, 0x9E, 0x0f, 0xA0, 0x06, 0x1A, 0x90, 0x07, 0xfA, + 0xf3, 0x07, 0x07, 0x4c, 0xdC, 0xd2, 0x90, 0xf0, 0xe2, 0xFd}, + "PRON ", + 8}, + {{0xE4, 0x0C, 0x37, 0x4d, 0x88, 0x05, 0xb1, 0xdD, 0x58, 0xCD, + 0xcE, 0xFf, 0x99, 0x8A, 0x2F, 0x69, 0x20, 0xCb, 0x52, 0xFD}, + "PRPS ", + 18}, + {{0x16, 0x37, 0x33, 0xbc, 0xc2, 0x8d, 0xbf, 0x26, 0xB4, 0x1a, + 0x8C, 0xfA, 0x83, 0xe3, 0x69, 0xb5, 0xB3, 0xaf, 0x74, 0x1b}, + "PRS ", + 18}, + {{0x0c, 0x04, 0xd4, 0xf3, 0x31, 0xda, 0x8d, 0xf7, 0x5f, 0x9e, + 0x2e, 0x27, 0x1e, 0x3f, 0x3f, 0x14, 0x94, 0xc6, 0x6c, 0x36}, + "PRSP ", + 9}, + {{0x5d, 0x4a, 0xbc, 0x77, 0xb8, 0x40, 0x5a, 0xd1, 0x77, 0xd8, + 0xac, 0x66, 0x82, 0xd5, 0x84, 0xec, 0xbf, 0xd4, 0x6c, 0xec}, + "PST ", + 18}, + {{0x66, 0x49, 0x7a, 0x28, 0x3e, 0x0a, 0x00, 0x7b, 0xa3, 0x97, + 0x4e, 0x83, 0x77, 0x84, 0xc6, 0xae, 0x32, 0x34, 0x47, 0xde}, + "PT ", + 18}, + {{0x2a, 0x8E, 0x98, 0xe2, 0x56, 0xf3, 0x22, 0x59, 0xb5, 0xE5, + 0xCb, 0x55, 0xDd, 0x63, 0xC8, 0xe8, 0x91, 0x95, 0x06, 0x66}, + "PTC ", + 18}, + {{0x49, 0x46, 0x58, 0x3c, 0x5b, 0x86, 0xe0, 0x1c, 0xcd, 0x30, + 0xc7, 0x1a, 0x05, 0x61, 0x7d, 0x06, 0xe3, 0xe7, 0x30, 0x60}, + "PTON ", + 18}, + {{0x8A, 0xe4, 0xBF, 0x2C, 0x33, 0xa8, 0xe6, 0x67, 0xde, 0x34, + 0xB5, 0x49, 0x38, 0xB0, 0xcc, 0xD0, 0x3E, 0xb8, 0xCC, 0x06}, + "PTOY ", + 8}, + {{0x46, 0x89, 0xa4, 0xe1, 0x69, 0xeb, 0x39, 0xcc, 0x90, 0x78, + 0xc0, 0x94, 0x0e, 0x21, 0xff, 0x1a, 0xa8, 0xa3, 0x9b, 0x9c}, + "PTT ", + 18}, + {{0x55, 0x12, 0xe1, 0xd6, 0xa7, 0xbe, 0x42, 0x4b, 0x43, 0x23, + 0x12, 0x6b, 0x4f, 0x9e, 0x86, 0xd0, 0x23, 0xf9, 0x57, 0x64}, + "PTWO ", + 18}, + {{0xef, 0x6b, 0x4c, 0xe8, 0xc9, 0xbc, 0x83, 0x74, 0x4f, 0xbc, + 0xde, 0x26, 0x57, 0xb3, 0x2e, 0xc1, 0x87, 0x90, 0x45, 0x8a}, + "PUC ", + 0}, + {{0xc1, 0x48, 0x30, 0xe5, 0x3a, 0xa3, 0x44, 0xe8, 0xc1, 0x46, + 0x03, 0xa9, 0x12, 0x29, 0xa0, 0xb9, 0x25, 0xb0, 0xb2, 0x62}, + "PXT ", + 8}, + {{0x77, 0x03, 0xc3, 0x5c, 0xff, 0xdc, 0x5c, 0xda, 0x8d, 0x27, + 0xaa, 0x3d, 0xf2, 0xf9, 0xba, 0x69, 0x64, 0x54, 0x4b, 0x6e}, + "PYLNT ", + 18}, + {{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}, + {{0xcb, 0x5e, 0xa3, 0xc1, 0x90, 0xd8, 0xf8, 0x2d, 0xea, 0xdf, + 0x7c, 0xe5, 0xaf, 0x85, 0x5d, 0xdb, 0xf3, 0x3e, 0x39, 0x62}, + "QBIT ", + 6}, + {{0x24, 0x67, 0xaa, 0x6b, 0x5a, 0x23, 0x51, 0x41, 0x6f, 0xd4, + 0xc3, 0xde, 0xf8, 0x46, 0x2d, 0x84, 0x1f, 0xee, 0xec, 0xec}, + "QBX ", + 18}, + {{0xea, 0x26, 0xc4, 0xac, 0x16, 0xd4, 0xa5, 0xa1, 0x06, 0x82, + 0x0b, 0xc8, 0xae, 0xe8, 0x5f, 0xd0, 0xb7, 0xb2, 0xb6, 0x64}, + "QKC ", + 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}, + {{0x2C, 0x3C, 0x1F, 0x05, 0x18, 0x7d, 0xBa, 0x7A, 0x5f, 0x2D, + 0xd4, 0x7D, 0xca, 0x57, 0x28, 0x1C, 0x4d, 0x4F, 0x18, 0x3F}, + "QTQ ", + 18}, + {{0x9a, 0x64, 0x2d, 0x6b, 0x33, 0x68, 0xdd, 0xc6, 0x62, 0xCA, + 0x24, 0x4b, 0xAd, 0xf3, 0x2c, 0xDA, 0x71, 0x60, 0x05, 0xBC}, + "QTUM ", + 18}, + {{0x26, 0x4d, 0xc2, 0xde, 0xdc, 0xdc, 0xbb, 0x89, 0x75, 0x61, + 0xa5, 0x7c, 0xba, 0x50, 0x85, 0xca, 0x41, 0x6f, 0xb7, 0xb4}, + "QUN ", + 18}, + {{0x11, 0x83, 0xf9, 0x2a, 0x56, 0x24, 0xd6, 0x8e, 0x85, 0xff, + 0xb9, 0x17, 0x0f, 0x16, 0xbf, 0x04, 0x43, 0xb4, 0xc2, 0x42}, + "QVT ", + 18}, + {{0x48, 0xf7, 0x75, 0xef, 0xbe, 0x4f, 0x5e, 0xce, 0x6e, 0x0d, + 0xf2, 0xf7, 0xb5, 0x93, 0x2d, 0xf5, 0x68, 0x23, 0xb9, 0x90}, + "R ", + 0}, + {{0x45, 0xed, 0xb5, 0x35, 0x94, 0x2a, 0x8c, 0x84, 0xd9, 0xf4, + 0xb5, 0xd3, 0x7e, 0x1b, 0x25, 0xf9, 0x1e, 0xa4, 0x80, 0x4c}, + "RAO ", + 18}, + {{0xfc, 0x2c, 0x4d, 0x8f, 0x95, 0x00, 0x2c, 0x14, 0xed, 0x0a, + 0x7a, 0xa6, 0x51, 0x02, 0xca, 0xc9, 0xe5, 0x95, 0x3b, 0x5e}, + "RBLX ", + 18}, + {{0xf9, 0x70, 0xb8, 0xe3, 0x6e, 0x23, 0xf7, 0xfc, 0x3f, 0xd7, + 0x52, 0xee, 0xa8, 0x6f, 0x8b, 0xe8, 0xd8, 0x33, 0x75, 0xa6}, + "RCN ", + 18}, + {{0x13, 0xf2, 0x5c, 0xd5, 0x2b, 0x21, 0x65, 0x0c, 0xaa, 0x82, + 0x25, 0xc9, 0x94, 0x23, 0x37, 0xd9, 0x14, 0xc9, 0xb0, 0x30}, + "RCT ", + 18}, + {{0x25, 0x5a, 0xa6, 0xdf, 0x07, 0x54, 0x0c, 0xb5, 0xd3, 0xd2, + 0x97, 0xf0, 0xd0, 0xd4, 0xd8, 0x4c, 0xb5, 0x2b, 0xc8, 0xe6}, + "RDN ", + 18}, + {{0x76, 0x7b, 0xA2, 0x91, 0x5E, 0xC3, 0x44, 0x01, 0x5a, 0x79, + 0x38, 0xE3, 0xeE, 0xDf, 0xeC, 0x27, 0x85, 0x19, 0x5D, 0x05}, + "REA ", + 18}, + {{0x92, 0x14, 0xec, 0x02, 0xcb, 0x71, 0xcb, 0xa0, 0xad, 0xa6, + 0x89, 0x6b, 0x8d, 0xa2, 0x60, 0x73, 0x6a, 0x67, 0xab, 0x10}, + "REAL ", + 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}, + {{0x89, 0x30, 0x35, 0x00, 0xa7, 0xab, 0xfb, 0x17, 0x8b, 0x27, + 0x4f, 0xd8, 0x9f, 0x24, 0x69, 0xc2, 0x64, 0x95, 0x1e, 0x1f}, + "REF ", + 8}, + {{0x83, 0x98, 0x4d, 0x61, 0x42, 0x93, 0x4b, 0xb5, 0x35, 0x79, + 0x3a, 0x82, 0xad, 0xb0, 0xa4, 0x6e, 0xf0, 0xf6, 0x6b, 0x6d}, + "REM ", + 4}, + {{0x40, 0x8e, 0x41, 0x87, 0x6c, 0xCC, 0xDC, 0x0F, 0x92, 0x21, + 0x06, 0x00, 0xef, 0x50, 0x37, 0x26, 0x56, 0x05, 0x2a, 0x38}, + "REN ", + 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}, + {{0x4c, 0x38, 0x3b, 0xdc, 0xae, 0x52, 0xa6, 0xe1, 0xcb, 0x81, + 0x0c, 0x76, 0xc7, 0x0d, 0x6f, 0x31, 0xa2, 0x49, 0xec, 0x9b}, + "RGS ", + 8}, + {{0x16, 0x82, 0x96, 0xbb, 0x09, 0xe2, 0x4a, 0x88, 0x80, 0x5c, + 0xb9, 0xc3, 0x33, 0x56, 0x53, 0x6b, 0x98, 0x0d, 0x3f, 0xc5}, + "RHOC ", + 8}, + {{0x94, 0x69, 0xD0, 0x13, 0x80, 0x5b, 0xFf, 0xB7, 0xD3, 0xDE, + 0xBe, 0x5E, 0x78, 0x39, 0x23, 0x7e, 0x53, 0x5e, 0xc4, 0x83}, + "RING ", + 18}, + {{0xdd, 0x00, 0x72, 0x78, 0xb6, 0x67, 0xf6, 0xbe, 0xf5, 0x2f, + 0xd0, 0xa4, 0xc2, 0x36, 0x04, 0xaa, 0x1f, 0x96, 0x03, 0x9a}, + "RIPT ", + 8}, + {{0x0b, 0x17, 0x24, 0xcc, 0x9f, 0xda, 0x01, 0x86, 0x91, 0x1e, + 0xf6, 0xa7, 0x59, 0x49, 0xe9, 0xc0, 0xd3, 0xf0, 0xf2, 0xf3}, + "RIYA ", + 8}, + {{0x10, 0x6a, 0xa4, 0x92, 0x95, 0xb5, 0x25, 0xfc, 0xf9, 0x59, + 0xaa, 0x75, 0xec, 0x3f, 0x7d, 0xcb, 0xf5, 0x35, 0x2f, 0x1c}, + "RKT ", + 18}, + {{0x60, 0x7F, 0x4C, 0x5B, 0xB6, 0x72, 0x23, 0x0e, 0x86, 0x72, + 0x08, 0x55, 0x32, 0xf7, 0xe9, 0x01, 0x54, 0x4a, 0x73, 0x75}, + "RLC ", + 9}, + {{0xcC, 0xeD, 0x5B, 0x82, 0x88, 0x08, 0x6B, 0xE8, 0xc3, 0x8E, + 0x23, 0x56, 0x7e, 0x68, 0x4C, 0x37, 0x40, 0xbe, 0x4D, 0x48}, + "RLT ", + 10}, + {{0xbe, 0x99, 0xB0, 0x97, 0x09, 0xfc, 0x75, 0x3b, 0x09, 0xBC, + 0xf5, 0x57, 0xA9, 0x92, 0xF6, 0x60, 0x5D, 0x59, 0x97, 0xB0}, + "RLTY ", + 8}, + {{0x4a, 0x42, 0xd2, 0xc5, 0x80, 0xf8, 0x3d, 0xce, 0x40, 0x4a, + 0xca, 0xd1, 0x8d, 0xab, 0x26, 0xdb, 0x11, 0xa1, 0x75, 0x0e}, + "RLX ", + 18}, + {{0x7d, 0xc4, 0xf4, 0x12, 0x94, 0x69, 0x7a, 0x79, 0x03, 0xc4, + 0x02, 0x7f, 0x6a, 0xc5, 0x28, 0xc5, 0xd1, 0x4c, 0xd7, 0xeb}, + "RMC ", + 8}, + {{0x8d, 0x56, 0x82, 0x94, 0x1c, 0xe4, 0x56, 0x90, 0x0b, 0x12, + 0xd4, 0x7a, 0xc0, 0x6a, 0x88, 0xb4, 0x7c, 0x76, 0x4c, 0xe1}, + "RMESH ", + 18}, + {{0x09, 0x96, 0xbf, 0xb5, 0xd0, 0x57, 0xfa, 0xa2, 0x37, 0x64, + 0x0e, 0x25, 0x06, 0xbe, 0x7b, 0x4f, 0x9c, 0x46, 0xde, 0x0b}, + "RNDR ", + 18}, + {{0xff, 0x60, 0x3f, 0x43, 0x94, 0x6a, 0x3a, 0x28, 0xdf, 0x5e, + 0x6a, 0x73, 0x17, 0x25, 0x55, 0xd8, 0xc8, 0xb0, 0x23, 0x86}, + "RNT ", + 18}, + {{0x1f, 0xe7, 0x0b, 0xe7, 0x34, 0xe4, 0x73, 0xe5, 0x72, 0x1e, + 0xa5, 0x7c, 0x8b, 0x5b, 0x01, 0xe6, 0xca, 0xa5, 0x26, 0x86}, + "RNTB ", + 18}, + {{0x1b, 0xcb, 0xc5, 0x41, 0x66, 0xf6, 0xba, 0x14, 0x99, 0x34, + 0x87, 0x0b, 0x60, 0x50, 0x61, 0x99, 0xb6, 0xc9, 0xdb, 0x6d}, + "ROC ", + 10}, + {{0xA4, 0x01, 0x06, 0x13, 0x4c, 0x5b, 0xF4, 0xc4, 0x14, 0x11, + 0x55, 0x4e, 0x6d, 0xb9, 0x9B, 0x95, 0xA1, 0x5e, 0xd9, 0xd8}, + "ROCK ", + 18}, + {{0xC1, 0x6b, 0x54, 0x2f, 0xf4, 0x90, 0xe0, 0x1f, 0xcc, 0x0D, + 0xC5, 0x8a, 0x60, 0xe1, 0xEF, 0xdc, 0x3e, 0x35, 0x7c, 0xA6}, + "ROCK2 ", + 0}, + {{0x0E, 0x3d, 0xe3, 0xB0, 0xE3, 0xD6, 0x17, 0xFD, 0x8D, 0x1D, + 0x80, 0x88, 0x63, 0x9b, 0xA8, 0x77, 0xfe, 0xb4, 0xd7, 0x42}, + "ROCK2PAY ", + 18}, + {{0xc9, 0xde, 0x4b, 0x7f, 0x0c, 0x3d, 0x99, 0x1e, 0x96, 0x71, + 0x58, 0xe4, 0xd4, 0xbf, 0xa4, 0xb5, 0x1e, 0xc0, 0xb1, 0x14}, + "ROK ", + 18}, + {{0x49, 0x93, 0xCB, 0x95, 0xc7, 0x44, 0x3b, 0xdC, 0x06, 0x15, + 0x5c, 0x5f, 0x56, 0x88, 0xBe, 0x9D, 0x8f, 0x69, 0x99, 0xa5}, + "ROUND ", + 18}, + {{0xb4, 0xef, 0xd8, 0x5c, 0x19, 0x99, 0x9d, 0x84, 0x25, 0x13, + 0x04, 0xbd, 0xa9, 0x9e, 0x90, 0xb9, 0x23, 0x00, 0xbd, 0x93}, + "RPL ", + 18}, + {{0xec, 0x49, 0x1c, 0x10, 0x88, 0xea, 0xe9, 0x92, 0xb7, 0xa2, + 0x14, 0xef, 0xb0, 0xa2, 0x66, 0xad, 0x09, 0x27, 0xa7, 0x2a}, + "RTB ", + 18}, + {{0x3f, 0xd8, 0xf3, 0x9a, 0x96, 0x2e, 0xfd, 0xa0, 0x49, 0x56, + 0x98, 0x1c, 0x31, 0xab, 0x89, 0xfa, 0xb5, 0xfb, 0x8b, 0xc8}, + "RTH ", + 18}, + {{0x54, 0xb2, 0x93, 0x22, 0x60, 0x00, 0xcc, 0xBF, 0xC0, 0x4D, + 0xF9, 0x02, 0xeE, 0xC5, 0x67, 0xCB, 0x4C, 0x35, 0xa9, 0x03}, + "RTN ", + 18}, + {{0xf2, 0x78, 0xc1, 0xca, 0x96, 0x90, 0x95, 0xff, 0xdd, 0xde, + 0xd0, 0x20, 0x29, 0x0c, 0xf8, 0xb5, 0xc4, 0x24, 0xac, 0xe2}, + "RUFF ", + 18}, + {{0xdE, 0xE0, 0x2D, 0x94, 0xbe, 0x49, 0x29, 0xd2, 0x6f, 0x67, + 0xB6, 0x4A, 0xda, 0x7a, 0xCf, 0x19, 0x14, 0x00, 0x7F, 0x10}, + "RUNE ", + 18}, + {{0x3d, 0x1b, 0xa9, 0xbe, 0x9f, 0x66, 0xb8, 0xee, 0x10, 0x19, + 0x11, 0xbc, 0x36, 0xd3, 0xfb, 0x56, 0x2e, 0xac, 0x22, 0x44}, + "RVT ", + 18}, + {{0xe8, 0x66, 0x3a, 0x64, 0xa9, 0x61, 0x69, 0xff, 0x4d, 0x95, + 0xb4, 0x29, 0x9e, 0x7a, 0xe9, 0xa7, 0x6b, 0x90, 0x5b, 0x31}, + "Rating ", + 8}, + {{0x1e, 0xc8, 0xfe, 0x51, 0xa9, 0xb6, 0xa3, 0xa6, 0xc4, 0x27, + 0xd1, 0x7d, 0x9e, 0xcc, 0x30, 0x60, 0xfb, 0xc4, 0xa4, 0x5c}, + "S-A-PAT ", + 18}, + {{0x3e, 0xb9, 0x1d, 0x23, 0x7e, 0x49, 0x1e, 0x0d, 0xee, 0x85, + 0x82, 0xc4, 0x02, 0xd8, 0x5c, 0xb4, 0x40, 0xfb, 0x6b, 0x54}, + "S-ETH ", + 18}, + {{0x41, 0x56, 0xD3, 0x34, 0x2D, 0x5c, 0x38, 0x5a, 0x87, 0xD2, + 0x64, 0xF9, 0x06, 0x53, 0x73, 0x35, 0x92, 0x00, 0x05, 0x81}, + "SALT ", + 8}, + {{0x7C, 0x5A, 0x0C, 0xE9, 0x26, 0x7E, 0xD1, 0x9B, 0x22, 0xF8, + 0xca, 0xe6, 0x53, 0xF1, 0x98, 0xe3, 0xE8, 0xda, 0xf0, 0x98}, + "SAN ", + 18}, + {{0x78, 0xfe, 0x18, 0xe4, 0x1f, 0x43, 0x6e, 0x19, 0x81, 0xa3, + 0xa6, 0x0d, 0x15, 0x57, 0xc8, 0xa7, 0xa9, 0x37, 0x04, 0x61}, + "SCANDI ", + 2}, + {{0xd7, 0x63, 0x17, 0x87, 0xb4, 0xdc, 0xc8, 0x7b, 0x12, 0x54, + 0xcf, 0xd1, 0xe5, 0xce, 0x48, 0xe9, 0x68, 0x23, 0xde, 0xe8}, + "SCL ", + 8}, + {{0x24, 0xdc, 0xc8, 0x81, 0xe7, 0xdd, 0x73, 0x05, 0x46, 0x83, + 0x44, 0x52, 0xf2, 0x18, 0x72, 0xd5, 0xcb, 0x4b, 0x52, 0x93}, + "SCRL ", + 18}, + {{0xa1, 0x3f, 0x07, 0x43, 0x95, 0x1b, 0x4f, 0x6e, 0x3e, 0x3a, + 0xa0, 0x39, 0xf6, 0x82, 0xe1, 0x72, 0x79, 0xf5, 0x2b, 0xc3}, + "SENC ", + 18}, + {{0x67, 0x45, 0xfA, 0xB6, 0x80, 0x1e, 0x37, 0x6c, 0xD2, 0x4F, + 0x03, 0x57, 0x2B, 0x9C, 0x9B, 0x0D, 0x4E, 0xdD, 0xDC, 0xcf}, + "SENSE ", + 8}, + {{0xa4, 0x4e, 0x51, 0x37, 0x29, 0x3e, 0x85, 0x5b, 0x1b, 0x7b, + 0xc7, 0xe2, 0xc6, 0xf8, 0xcd, 0x79, 0x6f, 0xfc, 0xb0, 0x37}, + "SENT ", + 8}, + {{0xe0, 0x6e, 0xda, 0x74, 0x35, 0xba, 0x74, 0x9b, 0x04, 0x73, + 0x80, 0xce, 0xd4, 0x91, 0x21, 0xdd, 0xe9, 0x33, 0x34, 0xae}, + "SET ", + 0}, + {{0x98, 0xf5, 0xe9, 0xb7, 0xf0, 0xe3, 0x39, 0x56, 0xc0, 0x44, + 0x3e, 0x81, 0xbf, 0x7d, 0xeb, 0x8b, 0x5b, 0x1e, 0xd5, 0x45}, + "SEXY ", + 18}, + {{0xa1, 0xcc, 0xc1, 0x66, 0xfa, 0xf0, 0xE9, 0x98, 0xb3, 0xE3, + 0x32, 0x25, 0xA1, 0xA0, 0x30, 0x1B, 0x1C, 0x86, 0x11, 0x9D}, + "SGEL ", + 18}, + {{0xb2, 0x13, 0x5a, 0xb9, 0x69, 0x5a, 0x76, 0x78, 0xdd, 0x59, + 0x0b, 0x1a, 0x99, 0x6c, 0xb0, 0xf3, 0x7b, 0xcb, 0x07, 0x18}, + "SGN ", + 9}, + {{0x33, 0xc6, 0x23, 0xa2, 0xba, 0xaf, 0xeb, 0x8d, 0x15, 0xdf, + 0xaf, 0x3c, 0xe4, 0x40, 0x95, 0xef, 0xec, 0x83, 0xd7, 0x2c}, + "SGP ", + 18}, + {{0xcb, 0x5a, 0x05, 0xbe, 0xf3, 0x25, 0x76, 0x13, 0xe9, 0x84, + 0xc1, 0x7d, 0xbc, 0xf0, 0x39, 0x95, 0x2b, 0x6d, 0x88, 0x3f}, + "SGR ", + 8}, + {{0x37, 0x42, 0x75, 0x76, 0x32, 0x4f, 0xE1, 0xf3, 0x62, 0x5c, + 0x91, 0x02, 0x67, 0x47, 0x72, 0xd7, 0xCF, 0x71, 0x37, 0x7d}, + "SelfieYo ", + 18}, + {{0xd2, 0x48, 0xB0, 0xD4, 0x8E, 0x44, 0xaa, 0xF9, 0xc4, 0x9a, + 0xea, 0x03, 0x12, 0xbe, 0x7E, 0x13, 0xa6, 0xdc, 0x14, 0x68}, + "StatusGn ", + 1}, + {{0xe2, 0x5b, 0x0b, 0xba, 0x01, 0xdc, 0x56, 0x30, 0x31, 0x2b, + 0x6a, 0x21, 0x92, 0x7e, 0x57, 0x80, 0x61, 0xa1, 0x3f, 0x55}, + "SHIP ", + 18}, + {{0xEF, 0x2E, 0x99, 0x66, 0xeb, 0x61, 0xBB, 0x49, 0x4E, 0x53, + 0x75, 0xd5, 0xDf, 0x8d, 0x67, 0xB7, 0xdB, 0x8A, 0x78, 0x0D}, + "SHIT ", + 0}, + {{0x85, 0x42, 0x32, 0x5b, 0x72, 0xc6, 0xd9, 0xfc, 0x0a, 0xd2, + 0xca, 0x96, 0x5a, 0x78, 0x43, 0x54, 0x13, 0xa9, 0x15, 0xa0}, + "SHL ", + 18}, + {{0xef, 0x24, 0x63, 0x09, 0x93, 0x60, 0xa0, 0x85, 0xf1, 0xf1, + 0x0b, 0x07, 0x6e, 0xd7, 0x2e, 0xf6, 0x25, 0x49, 0x7a, 0x06}, + "SHP ", + 18}, + {{0x8a, 0x18, 0x7d, 0x52, 0x85, 0xd3, 0x16, 0xbc, 0xbc, 0x9a, + 0xda, 0xfc, 0x08, 0xb5, 0x1d, 0x70, 0xa0, 0xd8, 0xe0, 0x00}, + "SIFT ", + 0}, + {{0x68, 0x88, 0xa1, 0x6e, 0xA9, 0x79, 0x2c, 0x15, 0xA4, 0xDC, + 0xF2, 0xf6, 0xC6, 0x23, 0xD0, 0x55, 0xc8, 0xeD, 0xe7, 0x92}, + "SIG ", + 18}, + {{0x4a, 0xf3, 0x28, 0xc5, 0x29, 0x21, 0x70, 0x6d, 0xcb, 0x73, + 0x9f, 0x25, 0x78, 0x62, 0x10, 0x49, 0x91, 0x69, 0xaf, 0xe6}, + "SKB ", + 8}, + {{0x13, 0xDB, 0x74, 0xB3, 0xcf, 0x51, 0x2F, 0x65, 0xC4, 0xb9, + 0x16, 0x83, 0x94, 0x0B, 0x4f, 0x39, 0x55, 0xE0, 0x50, 0x85}, + "SKE ", + 8}, + {{0x2b, 0xDC, 0x0D, 0x42, 0x99, 0x60, 0x17, 0xfC, 0xe2, 0x14, + 0xb2, 0x16, 0x07, 0xa5, 0x15, 0xDA, 0x41, 0xA9, 0xE0, 0xC5}, + "SKIN ", + 6}, + {{0xd9, 0x9b, 0x8a, 0x7f, 0xa4, 0x8e, 0x25, 0xcc, 0xe8, 0x3b, + 0x81, 0x81, 0x22, 0x20, 0xa3, 0xe0, 0x3b, 0xf6, 0x4e, 0x5f}, + "SKM ", + 18}, + {{0x49, 0x94, 0xe8, 0x18, 0x97, 0xa9, 0x20, 0xc0, 0xFE, 0xA2, + 0x35, 0xeb, 0x8C, 0xEd, 0xEE, 0xd3, 0xc6, 0xfF, 0xF6, 0x97}, + "SKO1 ", + 18}, + {{0x4c, 0x38, 0x2F, 0x8E, 0x09, 0x61, 0x5A, 0xC8, 0x6E, 0x08, + 0xCE, 0x58, 0x26, 0x6C, 0xC2, 0x27, 0xe7, 0xd4, 0xD9, 0x13}, + "SKR ", + 6}, + {{0xfd, 0xFE, 0x8b, 0x7a, 0xB6, 0xCF, 0x1b, 0xD1, 0xE3, 0xd1, + 0x45, 0x38, 0xEf, 0x40, 0x68, 0x62, 0x96, 0xC4, 0x20, 0x52}, + "SKRP ", + 18}, + {{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}, + {{0x39, 0x01, 0x3f, 0x96, 0x1c, 0x37, 0x8f, 0x02, 0xc2, 0xb8, + 0x2a, 0x6e, 0x1d, 0x31, 0xe9, 0x81, 0x27, 0x86, 0xfd, 0x9d}, + "SMS ", + 3}, + {{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}, + {{0x78, 0xEb, 0x8D, 0xC6, 0x41, 0x07, 0x7F, 0x04, 0x9f, 0x91, + 0x06, 0x59, 0xb6, 0xd5, 0x80, 0xE8, 0x0d, 0xC4, 0xd2, 0x37}, + "SocialMk ", + 8}, + {{0x19, 0x8a, 0x87, 0xb3, 0x11, 0x41, 0x43, 0x91, 0x3d, 0x42, + 0x29, 0xfb, 0x0f, 0x6d, 0x4b, 0xcb, 0x44, 0xaa, 0x8a, 0xff}, + "SNBL ", + 8}, + {{0xF4, 0x13, 0x41, 0x46, 0xAF, 0x2d, 0x51, 0x1D, 0xd5, 0xEA, + 0x8c, 0xDB, 0x1C, 0x4A, 0xC8, 0x8C, 0x57, 0xD6, 0x04, 0x04}, + "SNC ", + 18}, + {{0xf3, 0x33, 0xb2, 0xAc, 0xe9, 0x92, 0xac, 0x2b, 0xBD, 0x87, + 0x98, 0xbF, 0x57, 0xBc, 0x65, 0xa0, 0x61, 0x84, 0xaf, 0xBa}, + "SND ", + 0}, + {{0xcF, 0xD6, 0xAe, 0x8B, 0xF1, 0x3f, 0x42, 0xDE, 0x14, 0x86, + 0x73, 0x51, 0xeA, 0xff, 0x7A, 0x8A, 0x3b, 0x9F, 0xbB, 0xe7}, + "SNG ", + 8}, + {{0xae, 0xC2, 0xE8, 0x7E, 0x0A, 0x23, 0x52, 0x66, 0xD9, 0xC5, + 0xAD, 0xc9, 0xDE, 0xb4, 0xb2, 0xE2, 0x9b, 0x54, 0xD0, 0x09}, + "SNGLS ", + 0}, + {{0x44, 0xF5, 0x88, 0xaE, 0xeB, 0x8C, 0x44, 0x47, 0x14, 0x39, + 0xD1, 0x27, 0x0B, 0x36, 0x03, 0xc6, 0x6a, 0x92, 0x62, 0xF1}, + "SNIP ", + 18}, + {{0x98, 0x3F, 0x6d, 0x60, 0xdb, 0x79, 0xea, 0x8c, 0xA4, 0xeB, + 0x99, 0x68, 0xC6, 0xaF, 0xf8, 0xcf, 0xA0, 0x4B, 0x3c, 0x63}, + "SNM ", + 18}, + {{0xbd, 0xc5, 0xba, 0xc3, 0x9d, 0xbe, 0x13, 0x2b, 0x1e, 0x03, + 0x0e, 0x89, 0x8a, 0xe3, 0x83, 0x00, 0x17, 0xd7, 0xd9, 0x69}, + "SNOV ", + 18}, + {{0x74, 0x4d, 0x70, 0xFD, 0xBE, 0x2B, 0xa4, 0xCF, 0x95, 0x13, + 0x16, 0x26, 0x61, 0x4a, 0x17, 0x63, 0xDF, 0x80, 0x5B, 0x9E}, + "SNT ", + 18}, + {{0x28, 0x59, 0x02, 0x1e, 0xe7, 0xf2, 0xcb, 0x10, 0x16, 0x2e, + 0x67, 0xf3, 0x3a, 0xf2, 0xd2, 0x27, 0x64, 0xb3, 0x1a, 0xff}, + "SNTR ", + 4}, + {{0x2d, 0x0e, 0x95, 0xbd, 0x47, 0x95, 0xd7, 0xac, 0xe0, 0xda, + 0x3c, 0x0f, 0xf7, 0xb7, 0x06, 0xa5, 0x97, 0x0e, 0xb9, 0xd3}, + "SOC ", + 18}, + {{0x1f, 0x54, 0x63, 0x8b, 0x77, 0x37, 0x19, 0x3f, 0xfd, 0x86, + 0xc1, 0x9e, 0xc5, 0x19, 0x07, 0xa7, 0xc4, 0x17, 0x55, 0xd8}, + "SOL ", + 6}, + {{0x1c, 0x62, 0xac, 0xa2, 0xb7, 0x60, 0x5d, 0xb3, 0x60, 0x6e, + 0xac, 0xda, 0x7b, 0xc6, 0x7a, 0x18, 0x57, 0xdd, 0xb8, 0xff}, + "SONIQ ", + 18}, + {{0x42, 0xd6, 0x62, 0x2d, 0xec, 0xe3, 0x94, 0xb5, 0x49, 0x99, + 0xfb, 0xd7, 0x3d, 0x10, 0x81, 0x23, 0x80, 0x6f, 0x6a, 0x18}, + "SPANK ", + 18}, + {{0x58, 0xbf, 0x7d, 0xf5, 0x7d, 0x9D, 0xA7, 0x11, 0x3c, 0x4c, + 0xCb, 0x49, 0xd8, 0x46, 0x3D, 0x49, 0x08, 0xC7, 0x35, 0xcb}, + "SPARC ", + 18}, + {{0x24, 0xae, 0xf3, 0xbf, 0x1a, 0x47, 0x56, 0x15, 0x00, 0xf9, + 0x43, 0x0d, 0x74, 0xed, 0x40, 0x97, 0xc4, 0x7f, 0x51, 0xf2}, + "SPARTA ", + 4}, + {{0x1d, 0xea, 0x97, 0x9a, 0xe7, 0x6f, 0x26, 0x07, 0x18, 0x70, + 0xf8, 0x24, 0x08, 0x8d, 0xa7, 0x89, 0x79, 0xeb, 0x91, 0xc8}, + "SPD ", + 18}, + {{0x85, 0x08, 0x93, 0x89, 0xC1, 0x4B, 0xd9, 0xc7, 0x7F, 0xC2, + 0xb8, 0xF0, 0xc3, 0xd1, 0xdC, 0x33, 0x63, 0xBf, 0x06, 0xEf}, + "SPF ", + 18}, + {{0x38, 0x33, 0xdd, 0xa0, 0xae, 0xb6, 0x94, 0x7b, 0x98, 0xce, + 0x45, 0x4d, 0x89, 0x36, 0x6c, 0xba, 0x8c, 0xc5, 0x55, 0x28}, + "SPHTX ", + 18}, + {{0x03, 0x24, 0xdd, 0x19, 0x5d, 0x0c, 0xd5, 0x3f, 0x9f, 0x07, + 0xbe, 0xe6, 0xa4, 0x8e, 0xe7, 0xa2, 0x0b, 0xad, 0x73, 0x8f}, + "SPICE ", + 8}, + {{0x20, 0xF7, 0xA3, 0xDd, 0xF2, 0x44, 0xdc, 0x92, 0x99, 0x97, + 0x5b, 0x4D, 0xa1, 0xC3, 0x9F, 0x8D, 0x5D, 0x75, 0xf0, 0x5A}, + "SPN ", + 6}, + {{0x05, 0xaa, 0xaa, 0x82, 0x9a, 0xfa, 0x40, 0x7d, 0x83, 0x31, + 0x5c, 0xde, 0xd1, 0xd4, 0x5e, 0xb1, 0x60, 0x25, 0x91, 0x0c}, + "SPX ", + 18}, + {{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}, + {{0x62, 0x4d, 0x52, 0x0b, 0xab, 0x2e, 0x4a, 0xd8, 0x39, 0x35, + 0xfa, 0x50, 0x3f, 0xb1, 0x30, 0x61, 0x43, 0x74, 0xe8, 0x50}, + "SSP ", + 4}, + {{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}, + {{0x09, 0xbc, 0xa6, 0xeb, 0xab, 0x05, 0xee, 0x2a, 0xe9, 0x45, + 0xbe, 0x4e, 0xda, 0x51, 0x39, 0x3d, 0x94, 0xbf, 0x7b, 0x99}, + "STB ", + 4}, + {{0x62, 0x9a, 0xEe, 0x55, 0xed, 0x49, 0x58, 0x1C, 0x33, 0xab, + 0x27, 0xf9, 0x40, 0x3F, 0x79, 0x92, 0xA2, 0x89, 0xff, 0xd5}, + "STC ", + 18}, + {{0xaE, 0x73, 0xB3, 0x8d, 0x1c, 0x9A, 0x8b, 0x27, 0x41, 0x27, + 0xec, 0x30, 0x16, 0x0a, 0x49, 0x27, 0xC4, 0xd7, 0x18, 0x24}, + "STK ", + 18}, + {{0x59, 0x93, 0x46, 0x77, 0x9e, 0x90, 0xfc, 0x3F, 0x5F, 0x99, + 0x7b, 0x5e, 0xa7, 0x15, 0x34, 0x98, 0x20, 0xF9, 0x15, 0x71}, + "STN ", + 4}, + {{0xB6, 0x4e, 0xf5, 0x1C, 0x88, 0x89, 0x72, 0xc9, 0x08, 0xCF, + 0xac, 0xf5, 0x9B, 0x47, 0xC1, 0xAf, 0xBC, 0x0A, 0xb8, 0xaC}, + "STORJ ", + 8}, + {{0xD0, 0xa4, 0xb8, 0x94, 0x6C, 0xb5, 0x2f, 0x06, 0x61, 0x27, + 0x3b, 0xfb, 0xC6, 0xfD, 0x0E, 0x0C, 0x75, 0xFc, 0x64, 0x33}, + "STORM ", + 18}, + {{0xec, 0xd5, 0x70, 0xbB, 0xf7, 0x47, 0x61, 0xb9, 0x60, 0xFa, + 0x04, 0xCc, 0x10, 0xfe, 0x2c, 0x4e, 0x86, 0xFf, 0xDA, 0x36}, + "STP ", + 8}, + {{0x5c, 0x3a, 0x22, 0x85, 0x10, 0xd2, 0x46, 0xb7, 0x8a, 0x37, + 0x65, 0xc2, 0x02, 0x21, 0xcb, 0xf3, 0x08, 0x2b, 0x44, 0xa4}, + "STQ ", + 18}, + {{0xBA, 0xE2, 0x35, 0x82, 0x3D, 0x72, 0x55, 0xD9, 0xD4, 0x86, + 0x35, 0xcE, 0xd4, 0x73, 0x52, 0x27, 0x24, 0x4C, 0xd5, 0x83}, + "STR ", + 18}, + {{0x46, 0x49, 0x24, 0x73, 0x75, 0x5e, 0x8d, 0xF9, 0x60, 0xF8, + 0x03, 0x48, 0x77, 0xF6, 0x17, 0x32, 0xD7, 0x18, 0xCE, 0x96}, + "STRC ", + 8}, + {{0x03, 0x71, 0xa8, 0x2e, 0x4a, 0x9d, 0x0a, 0x43, 0x12, 0xf3, + 0xee, 0x2a, 0xc9, 0xc6, 0x95, 0x85, 0x12, 0x89, 0x13, 0x72}, + "STU ", + 18}, + {{0x00, 0x6B, 0xeA, 0x43, 0xBa, 0xa3, 0xf7, 0xA6, 0xf7, 0x65, + 0xF1, 0x4f, 0x10, 0xA1, 0xa1, 0xb0, 0x83, 0x34, 0xEF, 0x45}, + "STX ", + 18}, + {{0x12, 0x48, 0x0E, 0x24, 0xeb, 0x5b, 0xec, 0x1a, 0x9D, 0x43, + 0x69, 0xCa, 0xB6, 0xa8, 0x0c, 0xaD, 0x3c, 0x0A, 0x37, 0x7A}, + "SUB ", + 2}, + {{0xe1, 0x20, 0xc1, 0xec, 0xbf, 0xdf, 0xea, 0x7f, 0x0a, 0x8f, + 0x0e, 0xe3, 0x00, 0x63, 0x49, 0x1e, 0x8c, 0x26, 0xfe, 0xdf}, + "SUR ", + 8}, + {{0xbd, 0xeb, 0x4b, 0x83, 0x25, 0x1f, 0xb1, 0x46, 0x68, 0x7f, + 0xa1, 0x9d, 0x1c, 0x66, 0x0f, 0x99, 0x41, 0x1e, 0xef, 0xe3}, + "SVD ", + 18}, + {{0x0b, 0xb2, 0x17, 0xe4, 0x0f, 0x8a, 0x5c, 0xb7, 0x9a, 0xdf, + 0x04, 0xe1, 0xaa, 0xb6, 0x0e, 0x5a, 0xbd, 0x0d, 0xfc, 0x1e}, + "SWFTC ", + 8}, + {{0x9e, 0x88, 0x61, 0x34, 0x18, 0xcf, 0x03, 0xdc, 0xa5, 0x4d, + 0x6a, 0x2c, 0xf6, 0xad, 0x93, 0x4a, 0x78, 0xc7, 0xa1, 0x7a}, + "SWM ", + 18}, + {{0xB9, 0xe7, 0xF8, 0x56, 0x8e, 0x08, 0xd5, 0x65, 0x9f, 0x5D, + 0x29, 0xC4, 0x99, 0x71, 0x73, 0xd8, 0x4C, 0xdF, 0x26, 0x07}, + "SWT ", + 18}, + {{0x12, 0xb3, 0x06, 0xfa, 0x98, 0xf4, 0xcb, 0xb8, 0xd4, 0x45, + 0x7f, 0xdf, 0xf3, 0xa0, 0xa0, 0xa5, 0x6f, 0x07, 0xcc, 0xdf}, + "SXDT ", + 18}, + {{0x2c, 0x82, 0xc7, 0x3d, 0x5b, 0x34, 0xaa, 0x01, 0x59, 0x89, + 0x46, 0x2b, 0x29, 0x48, 0xcd, 0x61, 0x6a, 0x37, 0x64, 0x1f}, + "SXUT ", + 18}, + {{0x10, 0xb1, 0x23, 0xfd, 0xdd, 0xe0, 0x03, 0x24, 0x31, 0x99, + 0xaa, 0xd0, 0x35, 0x22, 0x06, 0x5d, 0xc0, 0x58, 0x27, 0xa0}, + "SYN ", + 18}, + {{0xb1, 0xee, 0xf1, 0x47, 0x02, 0x8e, 0x9f, 0x48, 0x0d, 0xbc, + 0x5c, 0xca, 0xa3, 0x27, 0x7d, 0x41, 0x7d, 0x1b, 0x85, 0xf0}, + "Seele ", + 18}, + {{0x4c, 0xa7, 0x41, 0x85, 0x53, 0x2d, 0xc1, 0x78, 0x95, 0x27, + 0x19, 0x4e, 0x5b, 0x9c, 0x86, 0x6d, 0xd3, 0x3f, 0x4e, 0x82}, + "SenSatoI ", + 18}, + {{0xD6, 0x59, 0x60, 0xFA, 0xcb, 0x8E, 0x4a, 0x2d, 0xFc, 0xb2, + 0xC2, 0x21, 0x2c, 0xb2, 0xe4, 0x4a, 0x02, 0xe2, 0xa5, 0x7E}, + "Soar ", + 6}, + {{0x1d, 0x4c, 0xcc, 0x31, 0xda, 0xb6, 0xea, 0x20, 0xf4, 0x61, + 0xd3, 0x29, 0xa0, 0x56, 0x2c, 0x1c, 0x58, 0x41, 0x25, 0x15}, + "TALAO ", + 18}, + {{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}, + {{0x3a, 0x92, 0xbd, 0x39, 0x6a, 0xef, 0x82, 0xaf, 0x98, 0xeb, + 0xc0, 0xaa, 0x90, 0x30, 0xd2, 0x5a, 0x23, 0xb1, 0x1c, 0x6b}, + "TBX ", + 18}, + {{0xfA, 0x0e, 0xF5, 0xE0, 0x34, 0xCa, 0xE1, 0xAE, 0x75, 0x2d, + 0x59, 0xbd, 0xb8, 0xaD, 0xcD, 0xe3, 0x7E, 0xd7, 0xaB, 0x97}, + "TCA ", + 18}, + {{0x99, 0x72, 0xa0, 0xf2, 0x41, 0x94, 0x44, 0x7e, 0x73, 0xa7, + 0xe8, 0xb6, 0xcd, 0x26, 0xa5, 0x2e, 0x02, 0xdd, 0xfa, 0xd5}, + "TCH ", + 0}, + {{0x2a, 0x1d, 0xba, 0xbe, 0x65, 0xc5, 0x95, 0xB0, 0x02, 0x2e, + 0x75, 0x20, 0x8C, 0x34, 0x01, 0x41, 0x39, 0xd5, 0xd3, 0x57}, + "TDH ", + 18}, + {{0x1c, 0x79, 0xab, 0x32, 0xc6, 0x6a, 0xca, 0xa1, 0xe9, 0xe8, + 0x19, 0x52, 0xb8, 0xaa, 0xa5, 0x81, 0xb4, 0x3e, 0x54, 0xe7}, + "TEAM ", + 4}, + {{0xEc, 0x32, 0xA9, 0x72, 0x5C, 0x59, 0x85, 0x5d, 0x84, 0x1b, + 0xa7, 0xd8, 0xD9, 0xc9, 0x9c, 0x84, 0xff, 0x75, 0x46, 0x88}, + "TEL Medi ", + 18}, + {{0x85, 0xe0, 0x76, 0x36, 0x1c, 0xc8, 0x13, 0xa9, 0x08, 0xff, + 0x67, 0x2f, 0x9b, 0xad, 0x15, 0x41, 0x47, 0x44, 0x02, 0xb2}, + "TEL ", + 2}, + {{0xdd, 0x16, 0xec, 0x0f, 0x66, 0xe5, 0x4d, 0x45, 0x3e, 0x67, + 0x56, 0x71, 0x3e, 0x53, 0x33, 0x55, 0x98, 0x90, 0x40, 0xe4}, + "TEN ", + 18}, + {{0xe5, 0xf1, 0x66, 0xc0, 0xd8, 0x87, 0x2b, 0x68, 0x79, 0x00, + 0x61, 0x31, 0x7b, 0xb6, 0xcc, 0xa0, 0x45, 0x82, 0xc9, 0x12}, + "TFD ", + 18}, + {{0xa7, 0xf9, 0x76, 0xC3, 0x60, 0xeb, 0xBe, 0xD4, 0x46, 0x5c, + 0x28, 0x55, 0x68, 0x4D, 0x1A, 0xAE, 0x52, 0x71, 0xeF, 0xa9}, + "TFL ", + 8}, + {{0xf8, 0xe0, 0x6e, 0x4e, 0x4a, 0x80, 0x28, 0x7f, 0xdc, 0xa5, + 0xb0, 0x2d, 0xcc, 0xec, 0xaa, 0x9d, 0x09, 0x54, 0x84, 0x0f}, + "TGAME ", + 18}, + {{0xac, 0x3d, 0xa5, 0x87, 0xea, 0xc2, 0x29, 0xc9, 0x89, 0x6d, + 0x91, 0x9a, 0xbc, 0x23, 0x5c, 0xa4, 0xfd, 0x7f, 0x72, 0xc1}, + "TGT ", + 1}, + {{0x38, 0x83, 0xf5, 0xe1, 0x81, 0xfc, 0xca, 0xf8, 0x41, 0x0f, + 0xa6, 0x1e, 0x12, 0xb5, 0x9b, 0xad, 0x96, 0x3f, 0xb6, 0x45}, + "THETA ", + 18}, + {{0x1c, 0xb3, 0x20, 0x9d, 0x45, 0xb2, 0xa6, 0x0b, 0x7f, 0xbc, + 0xa1, 0xcc, 0xdb, 0xf8, 0x7f, 0x67, 0x42, 0x37, 0xa4, 0xaa}, + "THR ", + 4}, + {{0x4f, 0x27, 0x05, 0x3f, 0x32, 0xed, 0xa8, 0xaf, 0x84, 0x95, + 0x64, 0x37, 0xbc, 0x00, 0xe5, 0xff, 0xa7, 0x00, 0x32, 0x87}, + "THRT ", + 18}, + {{0xfe, 0x7B, 0x91, 0x5A, 0x0b, 0xAA, 0x0E, 0x79, 0xf8, 0x5c, + 0x55, 0x53, 0x26, 0x65, 0x13, 0xF7, 0xC1, 0xc0, 0x3E, 0xd0}, + "THUG ", + 18}, + {{0x72, 0x43, 0x0a, 0x61, 0x2a, 0xdc, 0x00, 0x7c, 0x50, 0xe3, + 0xb6, 0x94, 0x6d, 0xbb, 0x1b, 0xb0, 0xfd, 0x31, 0x01, 0xd1}, + "TIC ", + 8}, + {{0x7F, 0x4B, 0x2A, 0x69, 0x06, 0x05, 0xA7, 0xcb, 0xb6, 0x6F, + 0x7A, 0xA6, 0x88, 0x5E, 0xbD, 0x90, 0x6a, 0x5e, 0x2E, 0x9E}, + "TICO ", + 8}, + {{0x99, 0x99, 0x67, 0xe2, 0xec, 0x8a, 0x74, 0xb7, 0xc8, 0xe9, + 0xdb, 0x19, 0xe0, 0x39, 0xd9, 0x20, 0xb3, 0x1d, 0x39, 0xd0}, + "TIE ", + 18}, + {{0xee, 0xe2, 0xd0, 0x0e, 0xb7, 0xde, 0xb8, 0xdd, 0x69, 0x24, + 0x18, 0x7f, 0x5a, 0xa3, 0x49, 0x6b, 0x7d, 0x06, 0xe6, 0x2a}, + "TIG ", + 18}, + {{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}, + {{0xda, 0xe1, 0xba, 0xf2, 0x49, 0x96, 0x4b, 0xc4, 0xb6, 0xac, + 0x98, 0xc3, 0x12, 0x2f, 0x0e, 0x3e, 0x78, 0x5f, 0xd2, 0x79}, + "TKA ", + 18}, + {{0x06, 0x75, 0xda, 0xa9, 0x47, 0x25, 0xa5, 0x28, 0xb0, 0x5a, + 0x3a, 0x88, 0x63, 0x5c, 0x03, 0xea, 0x96, 0x4b, 0xfa, 0x7e}, + "TKLN ", + 18}, + {{0xaA, 0xAf, 0x91, 0xD9, 0xb9, 0x0d, 0xF8, 0x00, 0xDf, 0x4F, + 0x55, 0xc2, 0x05, 0xfd, 0x69, 0x89, 0xc9, 0x77, 0xE7, 0x3a}, + "TKN ", + 8}, + {{0xb4, 0x5a, 0x50, 0x54, 0x5b, 0xee, 0xab, 0x73, 0xf3, 0x8f, + 0x31, 0xe5, 0x97, 0x37, 0x68, 0xc4, 0x21, 0x80, 0x5e, 0x5e}, + "TKR ", + 18}, + {{0xb3, 0x61, 0x65, 0x50, 0xab, 0xc8, 0xaf, 0x79, 0xc7, 0xa5, + 0x90, 0x2d, 0xef, 0x9e, 0xfa, 0x3b, 0xc9, 0xa9, 0x52, 0x00}, + "TLX ", + 8}, + {{0x32, 0x09, 0xf9, 0x8b, 0xeb, 0xf0, 0x14, 0x9b, 0x76, 0x9c, + 0xe2, 0x6d, 0x71, 0xf7, 0xae, 0xa8, 0xe4, 0x35, 0xef, 0xea}, + "TMT ", + 18}, + {{0xb0, 0x28, 0x07, 0x43, 0xb4, 0x4b, 0xf7, 0xdb, 0x4b, 0x6b, + 0xe4, 0x82, 0xb2, 0xba, 0x7b, 0x75, 0xe5, 0xda, 0x09, 0x6c}, + "TNS ", + 18}, + {{0x08, 0xf5, 0xa9, 0x23, 0x5b, 0x08, 0x17, 0x3b, 0x75, 0x69, + 0xf8, 0x36, 0x45, 0xd2, 0xc7, 0xfb, 0x55, 0xe8, 0xcc, 0xd8}, + "TNT ", + 8}, + {{0x8b, 0x35, 0x30, 0x21, 0x18, 0x93, 0x75, 0x59, 0x17, 0x23, + 0xe7, 0x38, 0x42, 0x62, 0xf4, 0x57, 0x09, 0xa3, 0xc3, 0xdc}, + "TOMO ", + 18}, + {{0x8e, 0xb9, 0x65, 0xee, 0x9c, 0xCF, 0xBC, 0xE7, 0x6c, 0x0a, + 0x06, 0x26, 0x44, 0x92, 0xc0, 0xaf, 0xEf, 0xc2, 0x82, 0x6d}, + "TOOR ", + 18}, + {{0xaa, 0x7a, 0x9c, 0xa8, 0x7d, 0x36, 0x94, 0xb5, 0x75, 0x5f, + 0x21, 0x3b, 0x5d, 0x04, 0x09, 0x4b, 0x8d, 0x0f, 0x0a, 0x6f}, + "TRAC ", + 18}, + {{0x12, 0x75, 0x95, 0x12, 0xd3, 0x26, 0x30, 0x3b, 0x45, 0xf1, + 0xce, 0xc8, 0xf7, 0xb6, 0xfd, 0x96, 0xf3, 0x87, 0x77, 0x8e}, + "TRAK ", + 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}, + {{0x30, 0xce, 0xCB, 0x54, 0x61, 0xA4, 0x49, 0xA9, 0x00, 0x81, + 0xF5, 0xa5, 0xF5, 0x5d, 0xb4, 0xe0, 0x48, 0x39, 0x7B, 0xAB}, + "TRCT ", + 8}, + {{0x33, 0xf9, 0x0d, 0xee, 0x07, 0xc6, 0xe8, 0xb9, 0x68, 0x2d, + 0xd2, 0x0f, 0x73, 0xe6, 0xc3, 0x58, 0xb2, 0xed, 0x0f, 0x03}, + "TRDT ", + 0}, + {{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}, + {{0xaa, 0xb6, 0x06, 0x81, 0x78, 0x09, 0x84, 0x1e, 0x8b, 0x11, + 0x68, 0xbe, 0x87, 0x79, 0xee, 0xaf, 0x67, 0x44, 0xef, 0x64}, + "TTA ", + 18}, + {{0x93, 0x89, 0x43, 0x48, 0x52, 0xb9, 0x4b, 0xba, 0xd4, 0xc8, + 0xaf, 0xed, 0x5b, 0x7b, 0xdb, 0xc5, 0xff, 0x0c, 0x22, 0x75}, + "TTC ", + 18}, + {{0x9c, 0xda, 0x8a, 0x60, 0xdd, 0x5a, 0xfa, 0x15, 0x6c, 0x95, + 0xbd, 0x97, 0x44, 0x28, 0xd9, 0x1a, 0x08, 0x12, 0xe0, 0x54}, + "TTU ", + 18}, + {{0x8d, 0xd5, 0xfb, 0xce, 0x2f, 0x6a, 0x95, 0x6c, 0x30, 0x22, + 0xba, 0x36, 0x63, 0x75, 0x90, 0x11, 0xdd, 0x51, 0xe7, 0x3e}, + "TUSD ", + 18}, + {{0x2e, 0xF1, 0xaB, 0x8a, 0x26, 0x18, 0x7C, 0x58, 0xBB, 0x8a, + 0xAe, 0xB1, 0x1B, 0x2f, 0xC6, 0xD2, 0x5C, 0x5c, 0x07, 0x16}, + "TWN ", + 18}, + {{0xE7, 0x77, 0x5A, 0x6e, 0x9B, 0xcf, 0x90, 0x4e, 0xb3, 0x9D, + 0xA2, 0xb6, 0x8c, 0x5e, 0xfb, 0x4F, 0x93, 0x60, 0xe0, 0x8C}, + "TaaS ", + 6}, + {{0x84, 0x00, 0xd9, 0x4a, 0x5c, 0xb0, 0xfa, 0x0d, 0x04, 0x1a, + 0x37, 0x88, 0xe3, 0x95, 0x28, 0x5d, 0x61, 0xc9, 0xee, 0x5e}, + "UBT ", + 8}, + {{0x92, 0xe5, 0x2a, 0x1a, 0x23, 0x5d, 0x9a, 0x10, 0x3d, 0x97, + 0x09, 0x01, 0x06, 0x6c, 0xe9, 0x10, 0xaa, 0xce, 0xfd, 0x37}, + "UCASH ", + 8}, + {{0xaa, 0xf3, 0x70, 0x55, 0x18, 0x8f, 0xee, 0xe4, 0x86, 0x9d, + 0xe6, 0x34, 0x64, 0x93, 0x7e, 0x68, 0x3d, 0x61, 0xb2, 0xa1}, + "UCN ", + 18}, + {{0xea, 0x09, 0x7a, 0x2b, 0x1d, 0xb0, 0x06, 0x27, 0xb2, 0xfa, + 0x17, 0x46, 0x0a, 0xd2, 0x60, 0xc0, 0x16, 0x01, 0x69, 0x77}, + "UFR ", + 18}, + {{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}, + {{0x6b, 0xa4, 0x60, 0xab, 0x75, 0xcd, 0x2c, 0x56, 0x34, 0x3b, + 0x35, 0x17, 0xff, 0xeb, 0xa6, 0x07, 0x48, 0x65, 0x4d, 0x26}, + "UP ", + 8}, + {{0xc8, 0x6d, 0x05, 0x48, 0x09, 0x62, 0x34, 0x32, 0x21, 0x0c, + 0x10, 0x7a, 0xf2, 0xe3, 0xf6, 0x19, 0xdc, 0xfb, 0xf6, 0x52}, + "UPP ", + 18}, + {{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}, + {{0xa0, 0xb8, 0x69, 0x91, 0xc6, 0x21, 0x8b, 0x36, 0xc1, 0xd1, + 0x9d, 0x4a, 0x2e, 0x9e, 0xb0, 0xce, 0x36, 0x06, 0xeb, 0x48}, + "USDC ", + 6}, + {{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}, + {{0x16, 0xf8, 0x12, 0xbe, 0x7f, 0xff, 0x02, 0xca, 0xf6, 0x62, + 0xb8, 0x5d, 0x5d, 0x58, 0xa5, 0xda, 0x65, 0x72, 0xd4, 0xdf}, + "UTT ", + 8}, + {{0x35, 0x43, 0x63, 0x8e, 0xD4, 0xa9, 0x00, 0x6E, 0x48, 0x40, + 0xB1, 0x05, 0x94, 0x42, 0x71, 0xBc, 0xea, 0x15, 0x60, 0x5D}, + "UUU ", + 18}, + {{0x89, 0x20, 0x5A, 0x3A, 0x3b, 0x2A, 0x69, 0xDe, 0x6D, 0xbf, + 0x7f, 0x01, 0xED, 0x13, 0xB2, 0x10, 0x8B, 0x2c, 0x43, 0xe7}, + "Unicorn ", + 0}, + {{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}, + {{0xD8, 0x50, 0x94, 0x2e, 0xF8, 0x81, 0x1f, 0x2A, 0x86, 0x66, + 0x92, 0xA6, 0x23, 0x01, 0x1b, 0xDE, 0x52, 0xa4, 0x62, 0xC1}, + "VEN ", + 18}, + {{0xEb, 0xeD, 0x4f, 0xF9, 0xfe, 0x34, 0x41, 0x3d, 0xb8, 0xfC, + 0x82, 0x94, 0x55, 0x6B, 0xBD, 0x15, 0x28, 0xa4, 0xDA, 0xca}, + "VENUS ", + 3}, + {{0x8f, 0x34, 0x70, 0xA7, 0x38, 0x8c, 0x05, 0xeE, 0x4e, 0x7A, + 0xF3, 0xd0, 0x1D, 0x8C, 0x72, 0x2b, 0x0F, 0xF5, 0x23, 0x74}, + "VERI ", + 18}, + {{0x2C, 0x97, 0x4B, 0x2d, 0x0B, 0xA1, 0x71, 0x6E, 0x64, 0x4c, + 0x1F, 0xC5, 0x99, 0x82, 0xa8, 0x9D, 0xDD, 0x2f, 0xF7, 0x24}, + "VIB ", + 18}, + {{0xe8, 0xff, 0x5c, 0x9c, 0x75, 0xde, 0xb3, 0x46, 0xac, 0xac, + 0x49, 0x3c, 0x46, 0x3c, 0x89, 0x50, 0xbe, 0x03, 0xdf, 0xba}, + "VIBE ", + 18}, + {{0x88, 0x24, 0x48, 0xf8, 0x3d, 0x90, 0xb2, 0xbf, 0x47, 0x7a, + 0xf2, 0xea, 0x79, 0x32, 0x7f, 0xde, 0xa1, 0x33, 0x5d, 0x93}, + "VIBEX ", + 18}, + {{0xf0, 0x3f, 0x8d, 0x65, 0xba, 0xfa, 0x59, 0x86, 0x11, 0xc3, + 0x49, 0x51, 0x24, 0x09, 0x3c, 0x56, 0xe8, 0xf6, 0x38, 0xf0}, + "VIEW ", + 18}, + {{0xd2, 0x94, 0x6b, 0xe7, 0x86, 0xf3, 0x5c, 0x3c, 0xc4, 0x02, + 0xc2, 0x9b, 0x32, 0x36, 0x47, 0xab, 0xda, 0x79, 0x90, 0x71}, + "VIKKY ", + 8}, + {{0xf3, 0xe0, 0x14, 0xfe, 0x81, 0x26, 0x78, 0x70, 0x62, 0x41, + 0x32, 0xef, 0x3a, 0x64, 0x6b, 0x8e, 0x83, 0x85, 0x3a, 0x96}, + "VIN ", + 18}, + {{0x23, 0xb7, 0x5B, 0xc7, 0xAa, 0xF2, 0x8e, 0x2d, 0x66, 0x28, + 0xC3, 0xf4, 0x24, 0xB3, 0x88, 0x2F, 0x8f, 0x07, 0x2a, 0x3c}, + "VIT ", + 18}, + {{0x1b, 0x79, 0x3e, 0x49, 0x23, 0x77, 0x58, 0xdb, 0xd8, 0xb7, + 0x52, 0xaf, 0xc9, 0xeb, 0x4b, 0x32, 0x9d, 0x5d, 0xa0, 0x16}, + "VITE ", + 18}, + {{0x51, 0x94, 0x75, 0xb3, 0x16, 0x53, 0xe4, 0x6d, 0x20, 0xcd, + 0x09, 0xf9, 0xfd, 0xcf, 0x3b, 0x12, 0xbd, 0xac, 0xb4, 0xf5}, + "VIU ", + 18}, + {{0x92, 0x2a, 0xc4, 0x73, 0xa3, 0xcc, 0x24, 0x1f, 0xd3, 0xa0, + 0x04, 0x9e, 0xd1, 0x45, 0x36, 0x45, 0x2d, 0x58, 0xd7, 0x3c}, + "VLD ", + 18}, + {{0xc3, 0xbc, 0x9e, 0xb7, 0x1f, 0x75, 0xec, 0x43, 0x9a, 0x6b, + 0x6c, 0x8e, 0x8b, 0x74, 0x6f, 0xcf, 0x5b, 0x62, 0xf7, 0x03}, + "VOC ", + 18}, + {{0x83, 0xeE, 0xA0, 0x0D, 0x83, 0x8f, 0x92, 0xdE, 0xC4, 0xD1, + 0x47, 0x56, 0x97, 0xB9, 0xf4, 0xD3, 0x53, 0x7b, 0x56, 0xE3}, + "VOISE ", + 8}, + {{0xeD, 0xBa, 0xF3, 0xc5, 0x10, 0x03, 0x02, 0xdC, 0xdd, 0xA5, + 0x32, 0x69, 0x32, 0x2f, 0x37, 0x30, 0xb1, 0xF0, 0x41, 0x6d}, + "VRS ", + 5}, + {{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}, + {{0x97, 0x20, 0xb4, 0x67, 0xa7, 0x10, 0x38, 0x2A, 0x23, 0x2a, + 0x32, 0xF5, 0x40, 0xbD, 0xCe, 0xd7, 0xd6, 0x62, 0xa1, 0x0B}, + "VZT ", + 18}, + {{0x4b, 0xbb, 0xc5, 0x7a, 0xf2, 0x70, 0x13, 0x8e, 0xf2, 0xff, + 0x2c, 0x50, 0xdb, 0xfa, 0xd6, 0x84, 0xe9, 0xe0, 0xe6, 0x04}, + "WAB ", + 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}, + {{0x84, 0x0f, 0xe7, 0x5a, 0xbf, 0xad, 0xc0, 0xf2, 0xd5, 0x40, + 0x37, 0x82, 0x95, 0x71, 0xb2, 0x78, 0x2e, 0x91, 0x9c, 0xe4}, + "WEB ", + 18}, + {{0xC0, 0x2a, 0xaA, 0x39, 0xb2, 0x23, 0xFE, 0x8D, 0x0A, 0x0e, + 0x5C, 0x4F, 0x27, 0xeA, 0xD9, 0x08, 0x3C, 0x75, 0x6C, 0xc2}, + "WETH ", + 18}, + {{0xf4, 0xfe, 0x95, 0x60, 0x38, 0x81, 0xd0, 0xe0, 0x79, 0x54, + 0xfd, 0x76, 0x05, 0xe0, 0xe9, 0xa9, 0x16, 0xe4, 0x2c, 0x44}, + "WHEN ", + 18}, + {{0xe9, 0x33, 0xc0, 0xCd, 0x97, 0x84, 0x41, 0x4d, 0x5F, 0x27, + 0x8C, 0x11, 0x49, 0x04, 0xF5, 0xA8, 0x4b, 0x39, 0x69, 0x19}, + "WHO ", + 18}, + {{0x62, 0xcd, 0x07, 0xd4, 0x14, 0xec, 0x50, 0xb6, 0x8c, 0x7e, + 0xca, 0xa8, 0x63, 0xa2, 0x3d, 0x34, 0x4f, 0x2d, 0x06, 0x2f}, + "WIC ", + 0}, + {{0xD3, 0xC0, 0x07, 0x72, 0xB2, 0x4D, 0x99, 0x7A, 0x81, 0x22, + 0x49, 0xca, 0x63, 0x7a, 0x92, 0x1e, 0x81, 0x35, 0x77, 0x01}, + "WILD ", + 18}, + {{0x89, 0x93, 0x38, 0xb8, 0x4d, 0x25, 0xac, 0x50, 0x5a, 0x33, + 0x2a, 0xdc, 0xe7, 0x40, 0x2d, 0x69, 0x7d, 0x94, 0x74, 0x94}, + "WIN ", + 8}, + {{0x66, 0x70, 0x88, 0xb2, 0x12, 0xce, 0x3d, 0x06, 0xa1, 0xb5, + 0x53, 0xa7, 0x22, 0x1E, 0x1f, 0xD1, 0x90, 0x00, 0xd9, 0xaF}, + "WINGS ", + 18}, + {{0x1b, 0x22, 0xc3, 0x2c, 0xd9, 0x36, 0xcb, 0x97, 0xc2, 0x8c, + 0x56, 0x90, 0xa0, 0x69, 0x5a, 0x82, 0xab, 0xf6, 0x88, 0xe6}, + "WISH ", + 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}, + {{0xa6, 0x86, 0x51, 0x4f, 0xaf, 0x7d, 0x54, 0x28, 0x92, 0x66, + 0xf4, 0x83, 0xd1, 0xe4, 0x85, 0x2c, 0x99, 0xe1, 0x3e, 0xc7}, + "WORK ", + 8}, + {{0x4C, 0xF4, 0x88, 0x38, 0x7F, 0x03, 0x5F, 0xF0, 0x8c, 0x37, + 0x15, 0x15, 0x56, 0x2C, 0xBa, 0x71, 0x2f, 0x90, 0x15, 0xd4}, + "WPR ", + 18}, + {{0x72, 0xad, 0xad, 0xb4, 0x47, 0x78, 0x4d, 0xd7, 0xab, 0x1f, + 0x47, 0x24, 0x67, 0x75, 0x0f, 0xc4, 0x85, 0xe4, 0xcb, 0x2d}, + "WRC ", + 6}, + {{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}, + {{0x84, 0x11, 0x9c, 0xb3, 0x3e, 0x8f, 0x59, 0x0d, 0x75, 0xc2, + 0xd6, 0xea, 0x4e, 0x6b, 0x07, 0x41, 0xa7, 0x49, 0x4e, 0xda}, + "WTT ", + 0}, + {{0xd8, 0x95, 0x0f, 0xDe, 0xaa, 0x10, 0x30, 0x4B, 0x7A, 0x7F, + 0xd0, 0x3a, 0x2F, 0xC6, 0x6B, 0xC3, 0x9f, 0x3c, 0x71, 0x1a}, + "WYS ", + 18}, + {{0x05, 0x60, 0x17, 0xc5, 0x5a, 0xE7, 0xAE, 0x32, 0xd1, 0x2A, + 0xeF, 0x7C, 0x67, 0x9d, 0xF8, 0x3A, 0x85, 0xca, 0x75, 0xFf}, + "WYV ", + 18}, + {{0x28, 0x6B, 0xDA, 0x14, 0x13, 0xa2, 0xDf, 0x81, 0x73, 0x1D, + 0x49, 0x30, 0xce, 0x2F, 0x86, 0x2a, 0x35, 0xA6, 0x09, 0xfE}, + "WaBi ", + 18}, + {{0x5e, 0x4A, 0xBE, 0x64, 0x19, 0x65, 0x0C, 0xA8, 0x39, 0xCe, + 0x5B, 0xB7, 0xDb, 0x42, 0x2b, 0x88, 0x1a, 0x60, 0x64, 0xbB}, + "WiC ", + 18}, + {{0x91, 0x0D, 0xfc, 0x18, 0xD6, 0xEA, 0x3D, 0x6a, 0x71, 0x24, + 0xA6, 0xF8, 0xB5, 0x45, 0x8F, 0x28, 0x10, 0x60, 0xfa, 0x4c}, + "X8X ", + 18}, + {{0x4D, 0xF8, 0x12, 0xF6, 0x06, 0x4d, 0xef, 0x1e, 0x5e, 0x02, + 0x9f, 0x1c, 0xa8, 0x58, 0x77, 0x7C, 0xC9, 0x8D, 0x2D, 0x81}, + "XAUR ", + 8}, + {{0x49, 0xae, 0xc0, 0x75, 0x2e, 0x68, 0xd0, 0x28, 0x2d, 0xb5, + 0x44, 0xc6, 0x77, 0xf6, 0xba, 0x40, 0x7b, 0xa1, 0x7e, 0xd7}, + "XBL ", + 18}, + {{0x28, 0xde, 0xe0, 0x1d, 0x53, 0xfe, 0xd0, 0xed, 0xf5, 0xf6, + 0xe3, 0x10, 0xbf, 0x8e, 0xf9, 0x31, 0x15, 0x13, 0xae, 0x40}, + "XBP ", + 18}, + {{0x4d, 0x82, 0x9f, 0x8c, 0x92, 0xa6, 0x69, 0x1c, 0x56, 0x30, + 0x0d, 0x02, 0x0c, 0x9e, 0x0d, 0xb9, 0x84, 0xcf, 0xe2, 0xba}, + "XCC ", + 18}, + {{0x1e, 0x26, 0xb3, 0xd0, 0x7e, 0x57, 0xf4, 0x53, 0xca, 0xe3, + 0x0f, 0x7d, 0xdd, 0x2f, 0x94, 0x5f, 0x5b, 0xf3, 0xef, 0x33}, + "XCLR ", + 8}, + {{0x41, 0xab, 0x1b, 0x6f, 0xcb, 0xb2, 0xfa, 0x9d, 0xce, 0xd8, + 0x1a, 0xcb, 0xde, 0xc1, 0x3e, 0xa6, 0x31, 0x5f, 0x2b, 0xf2}, + "XDCE ", + 18}, + {{0xa0, 0x17, 0xac, 0x5f, 0xac, 0x59, 0x41, 0xf9, 0x50, 0x10, + 0xb1, 0x25, 0x70, 0xb8, 0x12, 0xc9, 0x74, 0x46, 0x9c, 0x2c}, + "XES ", + 18}, + {{0x05, 0x4c, 0x64, 0x74, 0x1d, 0xba, 0xfd, 0xc1, 0x97, 0x84, + 0x50, 0x54, 0x94, 0x02, 0x98, 0x23, 0xd8, 0x9c, 0x3b, 0x13}, + "XET ", + 8}, + {{0x16, 0xaF, 0x5b, 0xfb, 0x4A, 0xe7, 0xE4, 0x75, 0xb9, 0xaD, + 0xC3, 0xBf, 0x5C, 0xb2, 0xf1, 0xE6, 0xa5, 0x0d, 0x79, 0x40}, + "XFS ", + 8}, + {{0xf6, 0xb6, 0xaa, 0x0e, 0xf0, 0xf5, 0xed, 0xc2, 0xc1, 0xc5, + 0xd9, 0x25, 0x47, 0x7f, 0x97, 0xea, 0xf6, 0x63, 0x03, 0xe7}, + "XGG ", + 8}, + {{0x53, 0x3e, 0xf0, 0x98, 0x4b, 0x2F, 0xAA, 0x22, 0x7A, 0xcC, + 0x62, 0x0C, 0x67, 0xcc, 0xe1, 0x2a, 0xA3, 0x9C, 0xD8, 0xCD}, + "XGM ", + 8}, + {{0x30, 0xf4, 0xA3, 0xe0, 0xaB, 0x7a, 0x76, 0x73, 0x3D, 0x8b, + 0x60, 0xb8, 0x9D, 0xD9, 0x3c, 0x3D, 0x0b, 0x4c, 0x9E, 0x2f}, + "XGT ", + 18}, + {{0xB1, 0x10, 0xeC, 0x7B, 0x1d, 0xcb, 0x8F, 0xAB, 0x8d, 0xED, + 0xbf, 0x28, 0xf5, 0x3B, 0xc6, 0x3e, 0xA5, 0xBE, 0xdd, 0x84}, + "XID ", + 8}, + {{0x44, 0x44, 0x9F, 0xa4, 0xd6, 0x07, 0xF8, 0x07, 0xd1, 0xeD, + 0x4a, 0x69, 0xad, 0x94, 0x29, 0x71, 0x72, 0x83, 0x91, 0xC8}, + "XMCT ", + 18}, + {{0x0f, 0x8c, 0x45, 0xb8, 0x96, 0x78, 0x4a, 0x1e, 0x40, 0x85, + 0x26, 0xb9, 0x30, 0x05, 0x19, 0xef, 0x86, 0x60, 0x20, 0x9c}, + "XMX ", + 8}, + {{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}, + {{0x15, 0x3e, 0xd9, 0xcc, 0x1b, 0x79, 0x29, 0x79, 0xd2, 0xbd, + 0xe0, 0xbb, 0xf4, 0x5c, 0xc2, 0xa7, 0xe4, 0x36, 0xa5, 0xf9}, + "XOV ", + 18}, + {{0x90, 0x52, 0x8a, 0xeb, 0x3a, 0x2b, 0x73, 0x6b, 0x78, 0x0f, + 0xd1, 0xb6, 0xc4, 0x78, 0xbb, 0x7e, 0x1d, 0x64, 0x31, 0x70}, + "XPA ", + 18}, + {{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}, + {{0x55, 0x29, 0x6f, 0x69, 0xf4, 0x0e, 0xa6, 0xd2, 0x0e, 0x47, + 0x85, 0x33, 0xc1, 0x5a, 0x6b, 0x08, 0xb6, 0x54, 0xe7, 0x58}, + "XYO ", + 18}, + {{0x92, 0x21, 0x05, 0xfa, 0xd8, 0x15, 0x3f, 0x51, 0x6b, 0xcf, + 0xb8, 0x29, 0xf5, 0x6d, 0xc0, 0x97, 0xa0, 0xe1, 0xd7, 0x05}, + "YEE ", + 18}, + {{0xca, 0x27, 0x96, 0xf9, 0xf6, 0x1d, 0xc7, 0xb2, 0x38, 0xaa, + 0xb0, 0x43, 0x97, 0x1e, 0x49, 0xc6, 0x16, 0x4d, 0xf3, 0x75}, + "YEED ", + 18}, + {{0xcb, 0xea, 0xec, 0x69, 0x94, 0x31, 0x85, 0x7f, 0xdb, 0x4d, + 0x37, 0xad, 0xdb, 0xbd, 0xc2, 0x0e, 0x13, 0x2d, 0x49, 0x03}, + "YOYOW ", + 18}, + {{0xd9, 0xa1, 0x2c, 0xde, 0x03, 0xa8, 0x6e, 0x80, 0x04, 0x96, + 0x46, 0x98, 0x58, 0xde, 0x85, 0x81, 0xd3, 0xa5, 0x35, 0x3d}, + "YUP ", + 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}, + {{0xb9, 0xEF, 0x77, 0x0B, 0x6A, 0x5e, 0x12, 0xE4, 0x59, 0x83, + 0xC5, 0xD8, 0x05, 0x45, 0x25, 0x8a, 0xA3, 0x8F, 0x3B, 0x78}, + "ZCN ", + 10}, + {{0x20, 0x08, 0xe3, 0x05, 0x7b, 0xd7, 0x34, 0xe1, 0x0a, 0xd1, + 0x3c, 0x9e, 0xae, 0x45, 0xff, 0x13, 0x2a, 0xbc, 0x17, 0x22}, + "ZCO ", + 8}, + {{0x05, 0xf4, 0xa4, 0x2e, 0x25, 0x1f, 0x2d, 0x52, 0xb8, 0xed, + 0x15, 0xE9, 0xFE, 0xdA, 0xac, 0xFc, 0xEF, 0x1F, 0xAD, 0x27}, + "ZIL ", + 12}, + {{0x4a, 0xac, 0x46, 0x1c, 0x86, 0xab, 0xfa, 0x71, 0xe9, 0xd0, + 0x0d, 0x9a, 0x2c, 0xde, 0x8d, 0x74, 0xe4, 0xe1, 0xae, 0xea}, + "ZINC ", + 18}, + {{0xa9, 0xd2, 0x92, 0x7d, 0x3a, 0x04, 0x30, 0x9e, 0x00, 0x8b, + 0x6a, 0xf6, 0xe2, 0xe2, 0x82, 0xae, 0x29, 0x52, 0xe7, 0xfd}, + "ZIP ", + 18}, + {{0xed, 0xd7, 0xc9, 0x4f, 0xd7, 0xb4, 0x97, 0x1b, 0x91, 0x6d, + 0x15, 0x06, 0x7b, 0xc4, 0x54, 0xb9, 0xe1, 0xba, 0xd9, 0x80}, + "ZIPT ", + 18}, + {{0xfd, 0x89, 0x71, 0xd5, 0xe8, 0xe1, 0x74, 0x0c, 0xe2, 0xd0, + 0xa8, 0x40, 0x95, 0xfc, 0xa4, 0xde, 0x72, 0x9d, 0x0c, 0x16}, + "ZLA ", + 18}, + {{0x55, 0x4f, 0xfc, 0x77, 0xf4, 0x25, 0x1a, 0x9f, 0xb3, 0xc0, + 0xe3, 0x59, 0x0a, 0x6a, 0x20, 0x5f, 0x8d, 0x4e, 0x06, 0x7d}, + "ZMN ", + 18}, + {{0xb5, 0xb8, 0xf5, 0x61, 0x6f, 0xe4, 0x2d, 0x5c, 0xec, 0xa3, + 0xe8, 0x7f, 0x3f, 0xdd, 0xbd, 0xd8, 0xf4, 0x96, 0xd7, 0x60}, + "ZPR ", + 18}, + {{0xE4, 0x1d, 0x24, 0x89, 0x57, 0x1d, 0x32, 0x21, 0x89, 0x24, + 0x6D, 0xaF, 0xA5, 0xeb, 0xDe, 0x1F, 0x46, 0x99, 0xF4, 0x98}, + "ZRX ", + 18}, + {{0x7A, 0x41, 0xe0, 0x51, 0x7a, 0x5e, 0xcA, 0x4F, 0xdb, 0xC7, + 0xFb, 0xeb, 0xA4, 0xD4, 0xc4, 0x7B, 0x9f, 0xF6, 0xDC, 0x63}, + "ZSC ", + 18}, + {{0xe3, 0x86, 0xb1, 0x39, 0xed, 0x37, 0x15, 0xca, 0x4b, 0x18, + 0xfd, 0x52, 0x67, 0x1b, 0xdc, 0xea, 0x1c, 0xdf, 0xe4, 0xb1}, + "ZST ", + 8}, + {{0xE8, 0xF9, 0xfa, 0x97, 0x7e, 0xa5, 0x85, 0x59, 0x1d, 0x9F, + 0x39, 0x46, 0x81, 0x31, 0x8C, 0x16, 0x55, 0x25, 0x77, 0xfB}, + "ZTX ", + 18}, + {{0x83, 0xe2, 0xbe, 0x8d, 0x11, 0x4f, 0x96, 0x61, 0x22, 0x13, + 0x84, 0xb3, 0xa5, 0x0d, 0x24, 0xb9, 0x6a, 0x56, 0x53, 0xf5}, + "ZXC ", + 18}, + {{0xab, 0xC1, 0x28, 0x0A, 0x01, 0x87, 0xa2, 0x02, 0x0c, 0xC6, + 0x75, 0x43, 0x7a, 0xed, 0x40, 0x01, 0x85, 0xF8, 0x6D, 0xb6}, + "SAC ", + 18}, + {{0xf3, 0xC0, 0x92, 0xcA, 0x8C, 0xD6, 0xD3, 0xd4, 0xca, 0x00, + 0x4D, 0xc1, 0xd0, 0xf1, 0xfe, 0x8C, 0xcA, 0xB5, 0x35, 0x99}, + "ZIX ", + 18}, }; const tokenDefinition_t const TOKENS_ELLAISM[NUM_TOKENS_ELLAISM] = { - {{0x99,0x1e,0x7f,0xe4,0xb0,0x5f,0x2b,0x3d,0xb1,0xd7,0x88,0xe7,0x05,0x96,0x3f,0x5d,0x64,0x7b,0x00,0x44}, "MINING", 18}, + {{0x99, 0x1e, 0x7f, 0xe4, 0xb0, 0x5f, 0x2b, 0x3d, 0xb1, 0xd7, + 0x88, 0xe7, 0x05, 0x96, 0x3f, 0x5d, 0x64, 0x7b, 0x00, 0x44}, + "MINING", + 18}, }; const tokenDefinition_t const TOKENS_ETHEREUM_CLASSIC[NUM_TOKENS_ETHEREUM_CLASSIC] = { - {{0x6F,0x6D,0xEb,0x5d,0xb0,0xC4,0x99,0x4A,0x82,0x83,0xA0,0x1D,0x6C,0xFe,0xEB,0x27,0xFc,0x3b,0xBe,0x9C}, "Smart ", 0}, - {{0x08,0x5f,0xb4,0xf2,0x40,0x31,0xea,0xed,0xbc,0x2b,0x61,0x1a,0xa5,0x28,0xf2,0x23,0x43,0xeb,0x52,0xdb}, "BEC ", 8}, - {{0x5a,0xce,0x17,0xf8,0x7c,0x73,0x91,0xe5,0x79,0x2a,0x76,0x83,0x06,0x9a,0x80,0x25,0xb8,0x3b,0xbd,0x85}, "PLAY ", 0}, - {{0x6A,0xDa,0x6F,0x48,0xC8,0x15,0x68,0x95,0x02,0xC4,0x3e,0xC1,0xa5,0x9F,0x1b,0x5D,0xD3,0xC0,0x4E,0x1F}, "UNV ", 18}, + {{0x6F, 0x6D, 0xEb, 0x5d, 0xb0, 0xC4, 0x99, 0x4A, 0x82, 0x83, + 0xA0, 0x1D, 0x6C, 0xFe, 0xEB, 0x27, 0xFc, 0x3b, 0xBe, 0x9C}, + "Smart ", + 0}, + {{0x08, 0x5f, 0xb4, 0xf2, 0x40, 0x31, 0xea, 0xed, 0xbc, 0x2b, + 0x61, 0x1a, 0xa5, 0x28, 0xf2, 0x23, 0x43, 0xeb, 0x52, 0xdb}, + "BEC ", + 8}, + {{0x5a, 0xce, 0x17, 0xf8, 0x7c, 0x73, 0x91, 0xe5, 0x79, 0x2a, + 0x76, 0x83, 0x06, 0x9a, 0x80, 0x25, 0xb8, 0x3b, 0xbd, 0x85}, + "PLAY ", + 0}, + {{0x6A, 0xDa, 0x6F, 0x48, 0xC8, 0x15, 0x68, 0x95, 0x02, 0xC4, + 0x3e, 0xC1, 0xa5, 0x9F, 0x1b, 0x5D, 0xD3, 0xC0, 0x4E, 0x1F}, + "UNV ", + 18}, }; const tokenDefinition_t const TOKENS_ETHERSOCIAL[NUM_TOKENS_ETHERSOCIAL] = {}; @@ -1164,12 +4496,30 @@ const tokenDefinition_t const TOKENS_POA[NUM_TOKENS_POA] = {}; const tokenDefinition_t const TOKENS_RSK[NUM_TOKENS_RSK] = {}; const tokenDefinition_t const TOKENS_UBIQ[NUM_TOKENS_UBIQ] = { - {{0xd2,0x45,0x20,0x7c,0xfb,0xf6,0xeb,0x6f,0x34,0x97,0x0d,0xb2,0xa8,0x07,0xab,0x1d,0x17,0x8f,0xde,0x6c}, "APX ", 8}, - {{0xff,0x3b,0xf0,0x57,0xad,0xf3,0xb0,0xe0,0x15,0xb6,0x46,0x53,0x31,0xa6,0x23,0x6e,0x55,0x68,0x82,0x74}, "BEER ", 0}, - {{0x08,0x53,0x3d,0x6a,0x06,0xce,0x36,0x52,0x98,0xb1,0x2e,0xf9,0x2e,0xb4,0x07,0xcb,0xa8,0xaa,0x82,0x73}, "CEFS ", 8}, - {{0x94,0xad,0x7e,0x41,0xc1,0xd4,0x40,0x22,0xc4,0xf4,0x7c,0xb1,0xba,0x01,0x9f,0xd1,0xa0,0x22,0xc5,0x36}, "DOT ", 8}, - {{0x4b,0x48,0x99,0xa1,0x0f,0x3e,0x50,0x7d,0xb2,0x07,0xb0,0xee,0x24,0x26,0x02,0x9e,0xfa,0x16,0x8a,0x67}, "QWARK ", 8}, - {{0x5e,0x17,0x15,0xbb,0x79,0x80,0x5b,0xd6,0x72,0x72,0x97,0x60,0xb3,0xf7,0xf3,0x4d,0x6f,0x48,0x50,0x98}, "RICKS ", 8}, + {{0xd2, 0x45, 0x20, 0x7c, 0xfb, 0xf6, 0xeb, 0x6f, 0x34, 0x97, + 0x0d, 0xb2, 0xa8, 0x07, 0xab, 0x1d, 0x17, 0x8f, 0xde, 0x6c}, + "APX ", + 8}, + {{0xff, 0x3b, 0xf0, 0x57, 0xad, 0xf3, 0xb0, 0xe0, 0x15, 0xb6, + 0x46, 0x53, 0x31, 0xa6, 0x23, 0x6e, 0x55, 0x68, 0x82, 0x74}, + "BEER ", + 0}, + {{0x08, 0x53, 0x3d, 0x6a, 0x06, 0xce, 0x36, 0x52, 0x98, 0xb1, + 0x2e, 0xf9, 0x2e, 0xb4, 0x07, 0xcb, 0xa8, 0xaa, 0x82, 0x73}, + "CEFS ", + 8}, + {{0x94, 0xad, 0x7e, 0x41, 0xc1, 0xd4, 0x40, 0x22, 0xc4, 0xf4, + 0x7c, 0xb1, 0xba, 0x01, 0x9f, 0xd1, 0xa0, 0x22, 0xc5, 0x36}, + "DOT ", + 8}, + {{0x4b, 0x48, 0x99, 0xa1, 0x0f, 0x3e, 0x50, 0x7d, 0xb2, 0x07, + 0xb0, 0xee, 0x24, 0x26, 0x02, 0x9e, 0xfa, 0x16, 0x8a, 0x67}, + "QWARK ", + 8}, + {{0x5e, 0x17, 0x15, 0xbb, 0x79, 0x80, 0x5b, 0xd6, 0x72, 0x72, + 0x97, 0x60, 0xb3, 0xf7, 0xf3, 0x4d, 0x6f, 0x48, 0x50, 0x98}, + "RICKS ", + 8}, }; const tokenDefinition_t const TOKENS_EXPANSE[NUM_TOKENS_EXPANSE] = {}; diff --git a/src/tokens.h b/src/tokens.h index f103576..06a6677 100644 --- a/src/tokens.h +++ b/src/tokens.h @@ -1,26 +1,26 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ #ifndef _TOKENS_H_ #define _TOKENS_H_ #include -#define MAX_TICKER_LEN 12 // 10 characters + ' ' + '\0' +#define MAX_TICKER_LEN 12 // 10 characters + ' ' + '\0' typedef struct tokenDefinition_t { #ifdef HAVE_CONTRACT_NAME_IN_DESCRIPTOR @@ -33,7 +33,7 @@ typedef struct tokenDefinition_t { #ifdef HAVE_TOKENS_EXTRA_LIST -#define NUM_TOKENS_EXTRA 4 +#define NUM_TOKENS_EXTRA 4 extern tokenDefinition_t const TOKENS_EXTRA[NUM_TOKENS_EXTRA]; @@ -41,36 +41,36 @@ extern tokenDefinition_t const TOKENS_EXTRA[NUM_TOKENS_EXTRA]; #ifdef HAVE_TOKENS_LIST -#define NUM_TOKENS_AKROMA 0 -#define NUM_TOKENS_ELLAISM 1 -#define NUM_TOKENS_ETHEREUM 1102 +#define NUM_TOKENS_AKROMA 0 +#define NUM_TOKENS_ELLAISM 1 +#define NUM_TOKENS_ETHEREUM 1102 #define NUM_TOKENS_ETHEREUM_CLASSIC 4 -#define NUM_TOKENS_ETHERSOCIAL 0 -#define NUM_TOKENS_ETHER1 0 -#define NUM_TOKENS_PIRL 0 -#define NUM_TOKENS_POA 0 -#define NUM_TOKENS_RSK 0 -#define NUM_TOKENS_UBIQ 6 -#define NUM_TOKENS_EXPANSE 0 -#define NUM_TOKENS_WANCHAIN 0 -#define NUM_TOKENS_KUSD 0 -#define NUM_TOKENS_MUSICOIN 0 -#define NUM_TOKENS_CALLISTO 0 -#define NUM_TOKENS_ETHERGEM 0 -#define NUM_TOKENS_ATHEIOS 0 -#define NUM_TOKENS_GOCHAIN 0 -#define NUM_TOKENS_MIX 0 -#define NUM_TOKENS_REOSC 0 -#define NUM_TOKENS_HPB 0 -#define NUM_TOKENS_TOMOCHAIN 0 -#define NUM_TOKENS_TOBALABA 0 -#define NUM_TOKENS_DEXON 0 -#define NUM_TOKENS_VOLTA 0 -#define NUM_TOKENS_EWC 0 -#define NUM_TOKENS_ARTIS_SIGMA1 0 -#define NUM_TOKENS_ARTIS_TAU1 0 -#define NUM_TOKENS_WEBCHAIN 0 -#define NUM_TOKENS_THUNDERCORE 0 +#define NUM_TOKENS_ETHERSOCIAL 0 +#define NUM_TOKENS_ETHER1 0 +#define NUM_TOKENS_PIRL 0 +#define NUM_TOKENS_POA 0 +#define NUM_TOKENS_RSK 0 +#define NUM_TOKENS_UBIQ 6 +#define NUM_TOKENS_EXPANSE 0 +#define NUM_TOKENS_WANCHAIN 0 +#define NUM_TOKENS_KUSD 0 +#define NUM_TOKENS_MUSICOIN 0 +#define NUM_TOKENS_CALLISTO 0 +#define NUM_TOKENS_ETHERGEM 0 +#define NUM_TOKENS_ATHEIOS 0 +#define NUM_TOKENS_GOCHAIN 0 +#define NUM_TOKENS_MIX 0 +#define NUM_TOKENS_REOSC 0 +#define NUM_TOKENS_HPB 0 +#define NUM_TOKENS_TOMOCHAIN 0 +#define NUM_TOKENS_TOBALABA 0 +#define NUM_TOKENS_DEXON 0 +#define NUM_TOKENS_VOLTA 0 +#define NUM_TOKENS_EWC 0 +#define NUM_TOKENS_ARTIS_SIGMA1 0 +#define NUM_TOKENS_ARTIS_TAU1 0 +#define NUM_TOKENS_WEBCHAIN 0 +#define NUM_TOKENS_THUNDERCORE 0 extern tokenDefinition_t const TOKENS_AKROMA[NUM_TOKENS_AKROMA]; extern tokenDefinition_t const TOKENS_ELLAISM[NUM_TOKENS_ELLAISM]; diff --git a/src/ui_callbacks.h b/src/ui_callbacks.h index d25b737..5fc97a9 100644 --- a/src/ui_callbacks.h +++ b/src/ui_callbacks.h @@ -17,7 +17,6 @@ unsigned int io_seproxyhal_touch_eth2_address_ok(const bagl_element_t *e); void ui_idle(void); void io_seproxyhal_send_status(uint32_t sw); -void format_signature_out(const uint8_t* signature); +void format_signature_out(const uint8_t *signature); void finalizeParsing(bool direct); -tokenDefinition_t* getKnownToken(uint8_t *contractAddress); - +tokenDefinition_t *getKnownToken(uint8_t *contractAddress); diff --git a/src/ui_flow.c b/src/ui_flow.c index 3b57d02..26f8c7c 100644 --- a/src/ui_flow.c +++ b/src/ui_flow.c @@ -6,6 +6,7 @@ void switch_settings_contract_data(void); void switch_settings_display_data(void); ////////////////////////////////////////////////////////////////////// +// clang-format off UX_STEP_NOCB( ux_idle_flow_1_step, nn, //pnn, @@ -37,16 +38,18 @@ UX_STEP_CB( &C_icon_dashboard_x, "Quit", }); +// clang-format on + UX_FLOW(ux_idle_flow, - &ux_idle_flow_1_step, - &ux_idle_flow_2_step, - &ux_idle_flow_3_step, - &ux_idle_flow_4_step, - FLOW_LOOP -); + &ux_idle_flow_1_step, + &ux_idle_flow_2_step, + &ux_idle_flow_3_step, + &ux_idle_flow_4_step, + FLOW_LOOP); #if defined(TARGET_NANOS) +// clang-format off UX_STEP_CB( ux_settings_flow_1_step, bnnn_paging, @@ -99,28 +102,28 @@ UX_STEP_CB( &C_icon_back_x, "Back", }); +// clang-format on UX_FLOW(ux_settings_flow, - &ux_settings_flow_1_step, - &ux_settings_flow_2_step, - &ux_settings_flow_3_step -); + &ux_settings_flow_1_step, + &ux_settings_flow_2_step, + &ux_settings_flow_3_step); void display_settings() { - strcpy(strings.common.fullAddress, (N_storage.dataAllowed ? "Allowed" : "NOT Allowed")); - strcpy(strings.common.fullAddress + 20, (N_storage.contractDetails ? "Displayed" : "NOT Displayed")); - ux_flow_init(0, ux_settings_flow, NULL); + strcpy(strings.common.fullAddress, (N_storage.dataAllowed ? "Allowed" : "NOT Allowed")); + strcpy(strings.common.fullAddress + 20, + (N_storage.contractDetails ? "Displayed" : "NOT Displayed")); + ux_flow_init(0, ux_settings_flow, NULL); } void switch_settings_contract_data() { - uint8_t value = (N_storage.dataAllowed ? 0 : 1); - nvm_write((void*)&N_storage.dataAllowed, (void*)&value, sizeof(uint8_t)); - display_settings(); + uint8_t value = (N_storage.dataAllowed ? 0 : 1); + nvm_write((void*) &N_storage.dataAllowed, (void*) &value, sizeof(uint8_t)); + display_settings(); } void switch_settings_display_data() { - uint8_t value = (N_storage.contractDetails ? 0 : 1); - nvm_write((void*)&N_storage.contractDetails, (void*)&value, sizeof(uint8_t)); - display_settings(); + uint8_t value = (N_storage.contractDetails ? 0 : 1); + nvm_write((void*) &N_storage.contractDetails, (void*) &value, sizeof(uint8_t)); + display_settings(); } - diff --git a/src/ui_flow.h b/src/ui_flow.h index f768b54..cd06ff0 100644 --- a/src/ui_flow.h +++ b/src/ui_flow.h @@ -2,55 +2,54 @@ #include "os_io_seproxyhal.h" -extern const ux_flow_step_t * const ux_idle_flow []; +extern const ux_flow_step_t* const ux_idle_flow[]; -extern const ux_flow_step_t * const ux_settings_flow []; +extern const ux_flow_step_t* const ux_settings_flow[]; -extern const ux_flow_step_t * const ux_display_public_flow []; +extern const ux_flow_step_t* const ux_display_public_flow[]; -extern const ux_flow_step_t * const ux_confirm_selector_flow []; +extern const ux_flow_step_t* const ux_confirm_selector_flow[]; -extern const ux_flow_step_t * const ux_confirm_parameter_flow []; +extern const ux_flow_step_t* const ux_confirm_parameter_flow[]; -extern const ux_flow_step_t * const ux_approval_tx_flow []; +extern const ux_flow_step_t* const ux_approval_tx_flow[]; -extern const ux_flow_step_t * const ux_approval_tx_data_warning_flow []; +extern const ux_flow_step_t* const ux_approval_tx_data_warning_flow[]; -extern const ux_flow_step_t * const ux_approval_allowance_flow []; +extern const ux_flow_step_t* const ux_approval_allowance_flow[]; -extern const ux_flow_step_t * const ux_sign_flow []; +extern const ux_flow_step_t* const ux_sign_flow[]; -extern const ux_flow_step_t * const ux_sign_712_v0_flow []; +extern const ux_flow_step_t* const ux_sign_712_v0_flow[]; -extern const ux_flow_step_t * const ux_display_public_eth2_flow []; +extern const ux_flow_step_t* const ux_display_public_eth2_flow[]; #ifdef HAVE_STARKWARE -extern const ux_flow_step_t * const ux_display_stark_public_flow []; +extern const ux_flow_step_t* const ux_display_stark_public_flow[]; -extern const ux_flow_step_t * const ux_stark_limit_order_flow []; +extern const ux_flow_step_t* const ux_stark_limit_order_flow[]; -extern const ux_flow_step_t * const ux_stark_transfer_flow []; +extern const ux_flow_step_t* const ux_stark_transfer_flow[]; -extern const ux_flow_step_t * const ux_stark_self_transfer_flow []; +extern const ux_flow_step_t* const ux_stark_self_transfer_flow[]; -extern const ux_flow_step_t * const ux_stark_transfer_conditional_flow []; +extern const ux_flow_step_t* const ux_stark_transfer_conditional_flow[]; -extern const ux_flow_step_t * const ux_stark_self_transfer_conditional_flow []; +extern const ux_flow_step_t* const ux_stark_self_transfer_conditional_flow[]; -extern const ux_flow_step_t * const ux_approval_starkware_register_flow []; +extern const ux_flow_step_t* const ux_approval_starkware_register_flow[]; -extern const ux_flow_step_t * const ux_approval_starkware_deposit_flow []; +extern const ux_flow_step_t* const ux_approval_starkware_deposit_flow[]; -extern const ux_flow_step_t * const ux_approval_starkware_withdraw_flow []; +extern const ux_flow_step_t* const ux_approval_starkware_withdraw_flow[]; -extern const ux_flow_step_t * const ux_approval_starkware_verify_vault_id_flow []; +extern const ux_flow_step_t* const ux_approval_starkware_verify_vault_id_flow[]; -extern const ux_flow_step_t * const ux_approval_starkware_escape_flow []; +extern const ux_flow_step_t* const ux_approval_starkware_escape_flow[]; -extern const ux_flow_step_t * const ux_approval_starkware_verify_escape_flow []; +extern const ux_flow_step_t* const ux_approval_starkware_verify_escape_flow[]; -extern const ux_flow_step_t * const ux_stark_unsafe_sign_flow []; +extern const ux_flow_step_t* const ux_stark_unsafe_sign_flow[]; #endif - diff --git a/src/utils.c b/src/utils.c index 8747f3c..43ccc61 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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 #include @@ -23,16 +23,16 @@ #include "uint256.h" #include "tokens.h" -static const unsigned char hex_digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; +static const unsigned char hex_digits[] = + {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; void array_hexstr(char *strbuf, const void *bin, unsigned int len) { while (len--) { - *strbuf++ = hex_digits[((*((char *)bin)) >> 4) & 0xF]; - *strbuf++ = hex_digits[(*((char *)bin)) & 0xF]; - bin = (const void *)((unsigned int)bin + 1); + *strbuf++ = hex_digits[((*((char *) bin)) >> 4) & 0xF]; + *strbuf++ = hex_digits[(*((char *) bin)) & 0xF]; + bin = (const void *) ((unsigned int) bin + 1); } - *strbuf = 0; // EOS + *strbuf = 0; // EOS } void convertUint256BE(uint8_t *data, uint32_t length, uint256_t *target) { @@ -45,7 +45,7 @@ void convertUint256BE(uint8_t *data, uint32_t length, uint256_t *target) { int local_strchr(char *string, char ch) { unsigned int length = strlen(string); unsigned int i; - for (i=0; ivLength == 1) { - v = txContent->v[0]; - } - else - if (txContent->vLength == 2) { - v = (txContent->v[0] << 8) | txContent->v[1]; - } - else - if (txContent->vLength == 3) { - v = (txContent->v[0] << 16) | (txContent->v[1] << 8) | txContent->v[2]; - } - else - if (txContent->vLength == 4) { - v = (txContent->v[0] << 24) | (txContent->v[1] << 16) | - (txContent->v[2] << 8) | txContent->v[3]; - } - else - if (txContent->vLength != 0) { + v = txContent->v[0]; + } else if (txContent->vLength == 2) { + v = (txContent->v[0] << 8) | txContent->v[1]; + } else if (txContent->vLength == 3) { + v = (txContent->v[0] << 16) | (txContent->v[1] << 8) | txContent->v[2]; + } else if (txContent->vLength == 4) { + v = (txContent->v[0] << 24) | (txContent->v[1] << 16) | (txContent->v[2] << 8) | + txContent->v[3]; + } else if (txContent->vLength != 0) { PRINTF("Unexpected v format\n"); THROW(EXCEPTION); } return v; } -void amountToString(uint8_t* amount, uint8_t amount_size, uint8_t decimals, char* ticker, char* out_buffer, uint8_t out_buffer_size){ +void amountToString(uint8_t *amount, + uint8_t amount_size, + uint8_t decimals, + char *ticker, + char *out_buffer, + uint8_t out_buffer_size) { uint256_t amount_256; char tmp_buffer[100]; convertUint256BE(amount, amount_size, &amount_256); @@ -90,25 +87,29 @@ void amountToString(uint8_t* amount, uint8_t amount_size, uint8_t decimals, char memcpy(out_buffer, ticker, MIN(out_buffer_size, ticker_len)); - adjustDecimals(tmp_buffer, amount_len, out_buffer + ticker_len, out_buffer_size - ticker_len -1, decimals); - out_buffer[out_buffer_size-1] = '\0'; + adjustDecimals(tmp_buffer, + amount_len, + out_buffer + ticker_len, + out_buffer_size - ticker_len - 1, + decimals); + out_buffer[out_buffer_size - 1] = '\0'; } -bool parse_swap_config(uint8_t* config, uint8_t config_len, char* ticker, uint8_t* decimals){ +bool parse_swap_config(uint8_t *config, uint8_t config_len, char *ticker, uint8_t *decimals) { uint8_t ticker_len, offset = 0; - if (config_len == 0){ + if (config_len == 0) { return false; } ticker_len = config[offset++]; - if(ticker_len == 0 || ticker_len > MAX_TICKER_LEN - 2 || config_len - offset < ticker_len){ + if (ticker_len == 0 || ticker_len > MAX_TICKER_LEN - 2 || config_len - offset < ticker_len) { return false; } - memcpy(ticker, config+offset, ticker_len); + memcpy(ticker, config + offset, ticker_len); offset += ticker_len; ticker[ticker_len] = ' '; - ticker[ticker_len+1] = '\0'; + ticker[ticker_len + 1] = '\0'; - if(config_len - offset < 1){ + if (config_len - offset < 1) { return false; } *decimals = config[offset]; diff --git a/src/utils.h b/src/utils.h index ea8b5de..46dfa5d 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ #ifndef _UTILS_H_ #define _UTILS_H_ @@ -22,15 +22,20 @@ #include "uint256.h" -void array_hexstr(char *strbuf, const void *bin, unsigned int len); +void array_hexstr(char* strbuf, const void* bin, unsigned int len); -void convertUint256BE(uint8_t *data, uint32_t length, uint256_t *target); +void convertUint256BE(uint8_t* data, uint32_t length, uint256_t* target); -int local_strchr(char *string, char ch); +int local_strchr(char* string, char ch); -uint32_t getV(txContent_t *txContent); +uint32_t getV(txContent_t* txContent); -void amountToString(uint8_t* amount, uint8_t amount_len, uint8_t decimals, char* ticker, char* out_buffer, uint8_t out_buffer_size); +void amountToString(uint8_t* amount, + uint8_t amount_len, + uint8_t decimals, + char* ticker, + char* out_buffer, + uint8_t out_buffer_size); bool parse_swap_config(uint8_t* config, uint8_t config_len, char* ticker, uint8_t* decimals); diff --git a/src_common/ethUstream.c b/src_common/ethUstream.c index a024986..f6f0ecd 100644 --- a/src_common/ethUstream.c +++ b/src_common/ethUstream.c @@ -1,31 +1,34 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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 #include "ethUstream.h" #include "ethUtils.h" -#define MAX_INT256 32 +#define MAX_INT256 32 #define MAX_ADDRESS 20 -#define MAX_V 4 +#define MAX_V 4 -void initTx(txContext_t *context, cx_sha3_t *sha3, txContent_t *content, - ustreamProcess_t customProcessor, void *extra) { +void initTx(txContext_t *context, + cx_sha3_t *sha3, + txContent_t *content, + ustreamProcess_t customProcessor, + void *extra) { memset(context, 0, sizeof(txContext_t)); context->sha3 = sha3; context->content = content; @@ -48,7 +51,7 @@ uint8_t readTxByte(txContext_t *context) { context->currentFieldPos++; } if (!(context->processingField && context->fieldSingleByte)) { - cx_hash((cx_hash_t*)context->sha3, 0, &data, 1, NULL, 0); + cx_hash((cx_hash_t *) context->sha3, 0, &data, 1, NULL, 0); } return data; } @@ -62,7 +65,7 @@ void copyTxData(txContext_t *context, uint8_t *out, uint32_t length) { memmove(out, context->workBuffer, length); } if (!(context->processingField && context->fieldSingleByte)) { - cx_hash((cx_hash_t*)context->sha3, 0, context->workBuffer, length, NULL, 0); + cx_hash((cx_hash_t *) context->sha3, 0, context->workBuffer, length, NULL, 0); } context->workBuffer += length; context->commandLength -= length; @@ -82,7 +85,6 @@ static void processContent(txContext_t *context) { context->processingField = false; } - static void processType(txContext_t *context) { if (context->currentFieldIsList) { PRINTF("Invalid type for RLP_TYPE\n"); @@ -93,8 +95,8 @@ static void processType(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); copyTxData(context, NULL, copySize); } if (context->currentFieldPos == context->currentFieldLength) { @@ -113,8 +115,8 @@ static void processNonce(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); copyTxData(context, NULL, copySize); } if (context->currentFieldPos == context->currentFieldLength) { @@ -129,16 +131,13 @@ static void processStartGas(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldLength > MAX_INT256) { - PRINTF("Invalid length for RLP_STARTGAS %d\n", - context->currentFieldLength); + PRINTF("Invalid length for RLP_STARTGAS %d\n", context->currentFieldLength); THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); - copyTxData(context, - context->content->startgas.value + context->currentFieldPos, - copySize); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); + copyTxData(context, context->content->startgas.value + context->currentFieldPos, copySize); } if (context->currentFieldPos == context->currentFieldLength) { context->content->startgas.length = context->currentFieldLength; @@ -157,11 +156,9 @@ static void processGasprice(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); - copyTxData(context, - context->content->gasprice.value + context->currentFieldPos, - copySize); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); + copyTxData(context, context->content->gasprice.value + context->currentFieldPos, copySize); } if (context->currentFieldPos == context->currentFieldLength) { context->content->gasprice.length = context->currentFieldLength; @@ -180,11 +177,9 @@ static void processValue(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); - copyTxData(context, - context->content->value.value + context->currentFieldPos, - copySize); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); + copyTxData(context, context->content->value.value + context->currentFieldPos, copySize); } if (context->currentFieldPos == context->currentFieldLength) { context->content->value.length = context->currentFieldLength; @@ -203,11 +198,9 @@ static void processTo(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); - copyTxData(context, - context->content->destination + context->currentFieldPos, - copySize); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); + copyTxData(context, context->content->destination + context->currentFieldPos, copySize); } if (context->currentFieldPos == context->currentFieldLength) { context->content->destinationLength = context->currentFieldLength; @@ -222,8 +215,8 @@ static void processData(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); copyTxData(context, NULL, copySize); } if (context->currentFieldPos == context->currentFieldLength) { @@ -242,11 +235,9 @@ static void processV(txContext_t *context) { THROW(EXCEPTION); } if (context->currentFieldPos < context->currentFieldLength) { - uint32_t copySize = MIN(context->commandLength, - context->currentFieldLength - context->currentFieldPos); - copyTxData(context, - context->content->v + context->currentFieldPos, - copySize); + uint32_t copySize = + MIN(context->commandLength, context->currentFieldLength - context->currentFieldPos); + copyTxData(context, context->content->v + context->currentFieldPos, copySize); } if (context->currentFieldPos == context->currentFieldLength) { context->content->vLength = context->currentFieldLength; @@ -255,7 +246,6 @@ static void processV(txContext_t *context) { } } - static parserStatus_e processTxInternal(txContext_t *context) { for (;;) { customStatus_e customStatus = CUSTOM_NOT_HANDLED; @@ -277,10 +267,8 @@ static parserStatus_e processTxInternal(txContext_t *context) { while (context->commandLength != 0) { bool valid; // Feed the RLP buffer until the length can be decoded - context->rlpBuffer[context->rlpBufferPos++] = - readTxByte(context); - if (rlpCanDecode(context->rlpBuffer, context->rlpBufferPos, - &valid)) { + context->rlpBuffer[context->rlpBufferPos++] = readTxByte(context); + if (rlpCanDecode(context->rlpBuffer, context->rlpBufferPos, &valid)) { // Can decode now, if valid if (!valid) { PRINTF("RLP pre-decode error\n"); @@ -300,8 +288,10 @@ static parserStatus_e processTxInternal(txContext_t *context) { return USTREAM_PROCESSING; } // Ready to process this field - if (!rlpDecodeLength(context->rlpBuffer, context->rlpBufferPos, - &context->currentFieldLength, &offset, + if (!rlpDecodeLength(context->rlpBuffer, + context->rlpBufferPos, + &context->currentFieldLength, + &offset, &context->currentFieldIsList)) { PRINTF("RLP decode error\n"); return USTREAM_FAULT; @@ -320,7 +310,7 @@ static parserStatus_e processTxInternal(txContext_t *context) { } if (context->customProcessor != NULL) { customStatus = context->customProcessor(context); - switch(customStatus) { + switch (customStatus) { case CUSTOM_NOT_HANDLED: case CUSTOM_HANDLED: break; @@ -336,48 +326,50 @@ static parserStatus_e processTxInternal(txContext_t *context) { } if (customStatus == CUSTOM_NOT_HANDLED) { switch (context->currentField) { - case TX_RLP_CONTENT: - processContent(context); - if ((context->processingFlags & TX_FLAG_TYPE) == 0) { - context->currentField++; - } - break; - case TX_RLP_TYPE: - processType(context); - break; - case TX_RLP_NONCE: - processNonce(context); - break; - case TX_RLP_GASPRICE: - processGasprice(context); - break; - case TX_RLP_STARTGAS: - processStartGas(context); - break; - case TX_RLP_VALUE: - processValue(context); - break; - case TX_RLP_TO: - processTo(context); - break; - case TX_RLP_DATA: - case TX_RLP_R: - case TX_RLP_S: - processData(context); - break; - case TX_RLP_V: - processV(context); - break; - default: - PRINTF("Invalid RLP decoder context\n"); - return USTREAM_FAULT; + case TX_RLP_CONTENT: + processContent(context); + if ((context->processingFlags & TX_FLAG_TYPE) == 0) { + context->currentField++; + } + break; + case TX_RLP_TYPE: + processType(context); + break; + case TX_RLP_NONCE: + processNonce(context); + break; + case TX_RLP_GASPRICE: + processGasprice(context); + break; + case TX_RLP_STARTGAS: + processStartGas(context); + break; + case TX_RLP_VALUE: + processValue(context); + break; + case TX_RLP_TO: + processTo(context); + break; + case TX_RLP_DATA: + case TX_RLP_R: + case TX_RLP_S: + processData(context); + break; + case TX_RLP_V: + processV(context); + break; + default: + PRINTF("Invalid RLP decoder context\n"); + return USTREAM_FAULT; } } } } -parserStatus_e processTx(txContext_t *context, uint8_t *buffer, - uint32_t length, uint32_t processingFlags) { +parserStatus_e processTx(txContext_t *context, + uint8_t *buffer, + uint32_t length, + uint32_t processingFlags) { parserStatus_e result; BEGIN_TRY { TRY { diff --git a/src_common/ethUstream.h b/src_common/ethUstream.h index c630596..80f57f9 100644 --- a/src_common/ethUstream.h +++ b/src_common/ethUstream.h @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ #ifndef _ETHUSTREAM_H_ #define _ETHUSTREAM_H_ @@ -94,10 +94,15 @@ typedef struct txContext_t { void *extra; } txContext_t; -void initTx(txContext_t *context, cx_sha3_t *sha3, txContent_t *content, - ustreamProcess_t customProcessor, void *extra); -parserStatus_e processTx(txContext_t *context, uint8_t *buffer, - uint32_t length, uint32_t processingFlags); +void initTx(txContext_t *context, + cx_sha3_t *sha3, + txContent_t *content, + ustreamProcess_t customProcessor, + void *extra); +parserStatus_e processTx(txContext_t *context, + uint8_t *buffer, + uint32_t length, + uint32_t processingFlags); parserStatus_e continueTx(txContext_t *context); void copyTxData(txContext_t *context, uint8_t *out, uint32_t length); uint8_t readTxByte(txContext_t *context); diff --git a/src_common/ethUtils.c b/src_common/ethUtils.c index 3da9087..0c98784 100644 --- a/src_common/ethUtils.c +++ b/src_common/ethUtils.c @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ /** * @brief Utilities for an Ethereum Hardware Wallet logic @@ -40,7 +40,7 @@ bool rlpCanDecode(uint8_t *buffer, uint32_t bufferLength, bool *valid) { return false; } if (*buffer > 0xbb) { - *valid = false; // arbitrary 32 bits length limitation + *valid = false; // arbitrary 32 bits length limitation return true; } } else if (*buffer <= 0xf7) { @@ -49,7 +49,7 @@ bool rlpCanDecode(uint8_t *buffer, uint32_t bufferLength, bool *valid) { return false; } if (*buffer > 0xfb) { - *valid = false; // arbitrary 32 bits length limitation + *valid = false; // arbitrary 32 bits length limitation return true; } } @@ -57,8 +57,11 @@ bool rlpCanDecode(uint8_t *buffer, uint32_t bufferLength, bool *valid) { return true; } -bool rlpDecodeLength(uint8_t *buffer, uint32_t bufferLength, - uint32_t *fieldLength, uint32_t *offset, bool *list) { +bool rlpDecodeLength(uint8_t *buffer, + uint32_t bufferLength, + uint32_t *fieldLength, + uint32_t *offset, + bool *list) { if (*buffer <= 0x7f) { *offset = 0; *fieldLength = 1; @@ -71,22 +74,21 @@ bool rlpDecodeLength(uint8_t *buffer, uint32_t bufferLength, *offset = 1 + (*buffer - 0xb7); *list = false; switch (*buffer) { - case 0xb8: - *fieldLength = *(buffer + 1); - break; - case 0xb9: - *fieldLength = (*(buffer + 1) << 8) + *(buffer + 2); - break; - case 0xba: - *fieldLength = - (*(buffer + 1) << 16) + (*(buffer + 2) << 8) + *(buffer + 3); - break; - case 0xbb: - *fieldLength = (*(buffer + 1) << 24) + (*(buffer + 2) << 16) + - (*(buffer + 3) << 8) + *(buffer + 4); - break; - default: - return false; // arbitrary 32 bits length limitation + case 0xb8: + *fieldLength = *(buffer + 1); + break; + case 0xb9: + *fieldLength = (*(buffer + 1) << 8) + *(buffer + 2); + break; + case 0xba: + *fieldLength = (*(buffer + 1) << 16) + (*(buffer + 2) << 8) + *(buffer + 3); + break; + case 0xbb: + *fieldLength = (*(buffer + 1) << 24) + (*(buffer + 2) << 16) + + (*(buffer + 3) << 8) + *(buffer + 4); + break; + default: + return false; // arbitrary 32 bits length limitation } } else if (*buffer <= 0xf7) { *offset = 1; @@ -96,43 +98,39 @@ bool rlpDecodeLength(uint8_t *buffer, uint32_t bufferLength, *offset = 1 + (*buffer - 0xf7); *list = true; switch (*buffer) { - case 0xf8: - *fieldLength = *(buffer + 1); - break; - case 0xf9: - *fieldLength = (*(buffer + 1) << 8) + *(buffer + 2); - break; - case 0xfa: - *fieldLength = - (*(buffer + 1) << 16) + (*(buffer + 2) << 8) + *(buffer + 3); - break; - case 0xfb: - *fieldLength = (*(buffer + 1) << 24) + (*(buffer + 2) << 16) + - (*(buffer + 3) << 8) + *(buffer + 4); - break; - default: - return false; // arbitrary 32 bits length limitation + case 0xf8: + *fieldLength = *(buffer + 1); + break; + case 0xf9: + *fieldLength = (*(buffer + 1) << 8) + *(buffer + 2); + break; + case 0xfa: + *fieldLength = (*(buffer + 1) << 16) + (*(buffer + 2) << 8) + *(buffer + 3); + break; + case 0xfb: + *fieldLength = (*(buffer + 1) << 24) + (*(buffer + 2) << 16) + + (*(buffer + 3) << 8) + *(buffer + 4); + break; + default: + return false; // arbitrary 32 bits length limitation } } return true; } -void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, - cx_sha3_t *sha3Context) { +void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3_t *sha3Context) { uint8_t hashAddress[32]; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t*)sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress, 32); + cx_hash((cx_hash_t *) sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress, 32); memmove(out, hashAddress + 12, 20); } - #ifdef CHECKSUM_1 static const uint8_t const HEXDIGITS[] = "0123456789ABCDEF"; -static const uint8_t const MASK[] = {0x80, 0x40, 0x20, 0x10, - 0x08, 0x04, 0x02, 0x01}; +static const uint8_t const MASK[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; char convertDigit(uint8_t *address, uint8_t index, uint8_t *hash) { unsigned char digit = address[index / 2]; @@ -153,21 +151,25 @@ char convertDigit(uint8_t *address, uint8_t index, uint8_t *hash) { } } -void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, - cx_sha3_t *sha3Context, chain_config_t* chain_config) { +void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, + uint8_t *out, + cx_sha3_t *sha3Context, + chain_config_t *chain_config) { uint8_t hashAddress[32]; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t*)sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress, 32); + cx_hash((cx_hash_t *) sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress, 32); getEthAddressStringFromBinary(hashAddress + 12, out, sha3Context, chain_config); } -void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, - cx_sha3_t *sha3Context, chain_config_t* chain_config) { +void getEthAddressStringFromBinary(uint8_t *address, + uint8_t *out, + cx_sha3_t *sha3Context, + chain_config_t *chain_config) { UNUSED(chain_config); uint8_t hashChecksum[32]; uint8_t i; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t*)sha3Context, CX_LAST, address, 20, hashChecksum, 32); + cx_hash((cx_hash_t *) sha3Context, CX_LAST, address, 20, hashChecksum, 32); for (i = 0; i < 40; i++) { out[i] = convertDigit(address, i, hashChecksum); } @@ -178,20 +180,22 @@ void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, static const uint8_t const HEXDIGITS[] = "0123456789abcdef"; -void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, - cx_sha3_t *sha3Context, chain_config_t* chain_config) { +void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, + uint8_t *out, + cx_sha3_t *sha3Context, + chain_config_t *chain_config) { uint8_t hashAddress[32]; cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t*)sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress, 32); + cx_hash((cx_hash_t *) sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress, 32); getEthAddressStringFromBinary(hashAddress + 12, out, sha3Context, chain_config); } -void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, - cx_sha3_t *sha3Context, chain_config_t* chain_config) { - +void getEthAddressStringFromBinary(uint8_t *address, + uint8_t *out, + cx_sha3_t *sha3Context, + chain_config_t *chain_config) { // save some precious stack space - union locals_union - { + union locals_union { uint8_t hashChecksum[32]; uint8_t tmp[51]; } locals_union; @@ -199,15 +203,18 @@ void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, uint8_t i; bool eip1191 = false; uint32_t offset = 0; - switch(chain_config->chainId) { + switch (chain_config->chainId) { case 30: case 31: eip1191 = true; break; } if (eip1191) { - snprintf((char*)locals_union.tmp, sizeof(locals_union.tmp), "%d0x", chain_config->chainId); - offset = strlen((char*)locals_union.tmp); + snprintf((char *) locals_union.tmp, + sizeof(locals_union.tmp), + "%d0x", + chain_config->chainId); + offset = strlen((char *) locals_union.tmp); } for (i = 0; i < 20; i++) { uint8_t digit = address[i]; @@ -215,7 +222,12 @@ void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, locals_union.tmp[offset + 2 * i + 1] = HEXDIGITS[digit & 0x0f]; } cx_keccak_init(sha3Context, 256); - cx_hash((cx_hash_t*)sha3Context, CX_LAST, locals_union.tmp, offset + 40, locals_union.hashChecksum, 32); + cx_hash((cx_hash_t *) sha3Context, + CX_LAST, + locals_union.tmp, + offset + 40, + locals_union.hashChecksum, + 32); for (i = 0; i < 40; i++) { uint8_t digit = address[i / 2]; if ((i % 2) == 0) { @@ -225,13 +237,11 @@ void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, } if (digit < 10) { out[i] = HEXDIGITS[digit]; - } - else { + } else { int v = (locals_union.hashChecksum[i / 2] >> (4 * (1 - i % 2))) & 0x0f; if (v >= 8) { out[i] = HEXDIGITS[digit] - 'a' + 'A'; - } - else { + } else { out[i] = HEXDIGITS[digit]; } } @@ -241,14 +251,17 @@ void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, #endif -bool adjustDecimals(char *src, uint32_t srcLength, char *target, - uint32_t targetLength, uint8_t decimals) { +bool adjustDecimals(char *src, + uint32_t srcLength, + char *target, + uint32_t targetLength, + uint8_t decimals) { uint32_t startOffset; uint32_t lastZeroOffset = 0; uint32_t offset = 0; if ((srcLength == 1) && (*src == '0')) { if (targetLength < 2) { - return false; + return false; } target[0] = '0'; target[1] = '\0'; @@ -285,7 +298,7 @@ bool adjustDecimals(char *src, uint32_t srcLength, char *target, while (sourceOffset < srcLength) { target[offset++] = src[sourceOffset++]; } - target[offset] = '\0'; + target[offset] = '\0'; } for (uint32_t i = startOffset; i < offset; i++) { if (target[i] == '0') { @@ -299,7 +312,7 @@ bool adjustDecimals(char *src, uint32_t srcLength, char *target, if (lastZeroOffset != 0) { target[lastZeroOffset] = '\0'; if (target[lastZeroOffset - 1] == '.') { - target[lastZeroOffset - 1] = '\0'; + target[lastZeroOffset - 1] = '\0'; } } return true; diff --git a/src_common/ethUtils.h b/src_common/ethUtils.h index 75eb2b3..a863add 100644 --- a/src_common/ethUtils.h +++ b/src_common/ethUtils.h @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ #ifndef _ETHUTILS_H_ #define _ETHUTILS_H_ @@ -34,42 +34,47 @@ * string * @return true if the RLP header is consistent */ -bool rlpDecodeLength(uint8_t *buffer, uint32_t bufferLength, - uint32_t *fieldLength, uint32_t *offset, bool *list); +bool rlpDecodeLength(uint8_t *buffer, + uint32_t bufferLength, + uint32_t *fieldLength, + uint32_t *offset, + bool *list); bool rlpCanDecode(uint8_t *buffer, uint32_t bufferLength, bool *valid); -void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, - cx_sha3_t *sha3Context); +void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3_t *sha3Context); -void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, +void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, + uint8_t *out, cx_sha3_t *sha3Context, - chain_config_t* chain_config); + chain_config_t *chain_config); -void getEthAddressStringFromBinary(uint8_t *address, uint8_t *out, - cx_sha3_t *sha3Context, - chain_config_t* chain_config); +void getEthAddressStringFromBinary(uint8_t *address, + uint8_t *out, + cx_sha3_t *sha3Context, + chain_config_t *chain_config); -bool adjustDecimals(char *src, uint32_t srcLength, char *target, - uint32_t targetLength, uint8_t decimals); +bool adjustDecimals(char *src, + uint32_t srcLength, + char *target, + uint32_t targetLength, + uint8_t decimals); -__attribute__((no_instrument_function)) -inline int allzeroes(uint8_t *buf, int n) { - for (int i = 0; i < n; ++i) { - if (buf[i]) { - return 0; +__attribute__((no_instrument_function)) inline int allzeroes(uint8_t *buf, int n) { + for (int i = 0; i < n; ++i) { + if (buf[i]) { + return 0; + } } - } - return 1; + return 1; } -__attribute__((no_instrument_function)) -inline int ismaxint(uint8_t *buf, int n) { - for (int i = 0; i < n; ++i) { - if (buf[i] != 0xff) { - return 0; +__attribute__((no_instrument_function)) inline int ismaxint(uint8_t *buf, int n) { + for (int i = 0; i < n; ++i) { + if (buf[i] != 0xff) { + return 0; + } } - } - return 1; + return 1; } #endif /* _ETHUTILS_H_ */ diff --git a/src_common/uint256.c b/src_common/uint256.c index 6d585a4..0b32603 100644 --- a/src_common/uint256.c +++ b/src_common/uint256.c @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ // Adapted from https://github.com/calccrypto/uint256_t @@ -25,10 +25,10 @@ static const char HEXDIGITS[] = "0123456789abcdef"; static uint64_t readUint64BE(uint8_t *buffer) { - return (((uint64_t)buffer[0]) << 56) | (((uint64_t)buffer[1]) << 48) | - (((uint64_t)buffer[2]) << 40) | (((uint64_t)buffer[3]) << 32) | - (((uint64_t)buffer[4]) << 24) | (((uint64_t)buffer[5]) << 16) | - (((uint64_t)buffer[6]) << 8) | (((uint64_t)buffer[7])); + return (((uint64_t) buffer[0]) << 56) | (((uint64_t) buffer[1]) << 48) | + (((uint64_t) buffer[2]) << 40) | (((uint64_t) buffer[3]) << 32) | + (((uint64_t) buffer[4]) << 24) | (((uint64_t) buffer[5]) << 16) | + (((uint64_t) buffer[6]) << 8) | (((uint64_t) buffer[7])); } void readu128BE(uint8_t *buffer, uint128_t *target) { @@ -78,8 +78,7 @@ void shiftl128(uint128_t *number, uint32_t value, uint128_t *target) { } else if (value == 0) { copy128(target, number); } else if (value < 64) { - UPPER_P(target) = - (UPPER_P(number) << value) + (LOWER_P(number) >> (64 - value)); + UPPER_P(target) = (UPPER_P(number) << value) + (LOWER_P(number) >> (64 - value)); LOWER_P(target) = (LOWER_P(number) << value); } else if ((128 > value) && (value > 64)) { UPPER_P(target) = LOWER_P(number) << (value - 64); @@ -125,8 +124,7 @@ void shiftr128(uint128_t *number, uint32_t value, uint128_t *target) { } else if (value < 64) { uint128_t result; UPPER(result) = UPPER_P(number) >> value; - LOWER(result) = - (UPPER_P(number) << (64 - value)) + (LOWER_P(number) >> value); + LOWER(result) = (UPPER_P(number) << (64 - value)) + (LOWER_P(number) >> value); copy128(target, &result); } else if ((128 > value) && (value > 64)) { LOWER_P(target) = UPPER_P(number) >> (value - 64); @@ -202,8 +200,7 @@ uint32_t bits256(uint256_t *number) { } bool equal128(uint128_t *number1, uint128_t *number2) { - return (UPPER_P(number1) == UPPER_P(number2)) && - (LOWER_P(number1) == LOWER_P(number2)); + return (UPPER_P(number1) == UPPER_P(number2)) && (LOWER_P(number1) == LOWER_P(number2)); } bool equal256(uint256_t *number1, uint256_t *number2) { @@ -234,9 +231,8 @@ bool gte256(uint256_t *number1, uint256_t *number2) { } void add128(uint128_t *number1, uint128_t *number2, uint128_t *target) { - UPPER_P(target) = - UPPER_P(number1) + UPPER_P(number2) + - ((LOWER_P(number1) + LOWER_P(number2)) < LOWER_P(number1)); + UPPER_P(target) = UPPER_P(number1) + UPPER_P(number2) + + ((LOWER_P(number1) + LOWER_P(number2)) < LOWER_P(number1)); LOWER_P(target) = LOWER_P(number1) + LOWER_P(number2); } @@ -254,9 +250,8 @@ void add256(uint256_t *number1, uint256_t *number2, uint256_t *target) { } void minus128(uint128_t *number1, uint128_t *number2, uint128_t *target) { - UPPER_P(target) = - UPPER_P(number1) - UPPER_P(number2) - - ((LOWER_P(number1) - LOWER_P(number2)) > LOWER_P(number1)); + UPPER_P(target) = UPPER_P(number1) - UPPER_P(number2) - + ((LOWER_P(number1) - LOWER_P(number2)) > LOWER_P(number1)); LOWER_P(target) = LOWER_P(number1) - LOWER_P(number2); } @@ -284,9 +279,12 @@ void or256(uint256_t *number1, uint256_t *number2, uint256_t *target) { } void mul128(uint128_t *number1, uint128_t *number2, uint128_t *target) { - uint64_t top[4] = {UPPER_P(number1) >> 32, UPPER_P(number1) & 0xffffffff, - LOWER_P(number1) >> 32, LOWER_P(number1) & 0xffffffff}; - uint64_t bottom[4] = {UPPER_P(number2) >> 32, UPPER_P(number2) & 0xffffffff, + uint64_t top[4] = {UPPER_P(number1) >> 32, + UPPER_P(number1) & 0xffffffff, + LOWER_P(number1) >> 32, + LOWER_P(number1) & 0xffffffff}; + uint64_t bottom[4] = {UPPER_P(number2) >> 32, + UPPER_P(number2) & 0xffffffff, LOWER_P(number2) >> 32, LOWER_P(number2) & 0xffffffff}; uint64_t products[4][4]; @@ -337,7 +335,7 @@ void write_u64_be(uint8_t *buffer, uint64_t value) { } void read_u64_be(uint8_t *in, uint64_t *out) { - uint8_t *out_ptr = (uint8_t*)out; + uint8_t *out_ptr = (uint8_t *) out; *out_ptr++ = in[7]; *out_ptr++ = in[6]; *out_ptr++ = in[5]; @@ -351,18 +349,17 @@ void read_u64_be(uint8_t *in, uint64_t *out) { void mul256(uint256_t *number1, uint256_t *number2, uint256_t *target) { uint8_t num1[32], num2[32], result[64]; memset(&result, 0, sizeof(result)); - for(uint8_t i = 0; i<4; i++){ - write_u64_be(num1+i*sizeof(uint64_t), number1->elements[i/2].elements[i%2]); - write_u64_be(num2+i*sizeof(uint64_t), number2->elements[i/2].elements[i%2]); + for (uint8_t i = 0; i < 4; i++) { + write_u64_be(num1 + i * sizeof(uint64_t), number1->elements[i / 2].elements[i % 2]); + write_u64_be(num2 + i * sizeof(uint64_t), number2->elements[i / 2].elements[i % 2]); } cx_math_mult(result, num1, num2, sizeof(num1)); - for(uint8_t i = 0; i<4; i++){ - read_u64_be(result+32+i*sizeof(uint64_t), &target->elements[i/2].elements[i%2]); + for (uint8_t i = 0; i < 4; i++) { + read_u64_be(result + 32 + i * sizeof(uint64_t), &target->elements[i / 2].elements[i % 2]); } } -void divmod128(uint128_t *l, uint128_t *r, uint128_t *retDiv, - uint128_t *retMod) { +void divmod128(uint128_t *l, uint128_t *r, uint128_t *retDiv, uint128_t *retMod) { uint128_t copyd, adder, resDiv, resMod; uint128_t one; UPPER(one) = 0; @@ -393,8 +390,7 @@ void divmod128(uint128_t *l, uint128_t *r, uint128_t *retDiv, } } -void divmod256(uint256_t *l, uint256_t *r, uint256_t *retDiv, - uint256_t *retMod) { +void divmod256(uint256_t *l, uint256_t *r, uint256_t *retDiv, uint256_t *retMod) { uint256_t copyd, adder, resDiv, resMod; uint256_t one; clear256(&one); @@ -436,8 +432,7 @@ static void reverseString(char *str, uint32_t length) { } } -bool tostring128(uint128_t *number, uint32_t baseParam, char *out, - uint32_t outLength) { +bool tostring128(uint128_t *number, uint32_t baseParam, char *out, uint32_t outLength) { uint128_t rDiv; uint128_t rMod; uint128_t base; @@ -454,15 +449,14 @@ bool tostring128(uint128_t *number, uint32_t baseParam, char *out, return false; } divmod128(&rDiv, &base, &rDiv, &rMod); - out[offset++] = HEXDIGITS[(uint8_t)LOWER(rMod)]; + out[offset++] = HEXDIGITS[(uint8_t) LOWER(rMod)]; } while (!zero128(&rDiv)); out[offset] = '\0'; reverseString(out, offset); return true; } -bool tostring256(uint256_t *number, uint32_t baseParam, char *out, - uint32_t outLength) { +bool tostring256(uint256_t *number, uint32_t baseParam, char *out, uint32_t outLength) { uint256_t rDiv; uint256_t rMod; uint256_t base; @@ -480,7 +474,7 @@ bool tostring256(uint256_t *number, uint32_t baseParam, char *out, return false; } divmod256(&rDiv, &base, &rDiv, &rMod); - out[offset++] = HEXDIGITS[(uint8_t)LOWER(LOWER(rMod))]; + out[offset++] = HEXDIGITS[(uint8_t) LOWER(LOWER(rMod))]; } while (!zero256(&rDiv)); out[offset] = '\0'; reverseString(out, offset); diff --git a/src_common/uint256.h b/src_common/uint256.h index db054ec..5a61d28 100644 --- a/src_common/uint256.h +++ b/src_common/uint256.h @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Ethereum App -* (c) 2016-2019 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. -********************************************************************************/ + * Ledger Ethereum App + * (c) 2016-2019 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. + ********************************************************************************/ // Adapted from https://github.com/calccrypto/uint256_t @@ -25,14 +25,18 @@ #include "os.h" #include "cx.h" -typedef struct uint128_t { uint64_t elements[2]; } uint128_t; +typedef struct uint128_t { + uint64_t elements[2]; +} uint128_t; -typedef struct uint256_t { uint128_t elements[2]; } uint256_t; +typedef struct uint256_t { + uint128_t elements[2]; +} uint256_t; #define UPPER_P(x) x->elements[0] #define LOWER_P(x) x->elements[1] -#define UPPER(x) x.elements[0] -#define LOWER(x) x.elements[1] +#define UPPER(x) x.elements[0] +#define LOWER(x) x.elements[1] void readu128BE(uint8_t *buffer, uint128_t *target); void readu256BE(uint8_t *buffer, uint256_t *target); @@ -64,9 +68,7 @@ void mul128(uint128_t *number1, uint128_t *number2, uint128_t *target); void mul256(uint256_t *number1, uint256_t *number2, uint256_t *target); void divmod128(uint128_t *l, uint128_t *r, uint128_t *div, uint128_t *mod); void divmod256(uint256_t *l, uint256_t *r, uint256_t *div, uint256_t *mod); -bool tostring128(uint128_t *number, uint32_t base, char *out, - uint32_t outLength); -bool tostring256(uint256_t *number, uint32_t base, char *out, - uint32_t outLength); +bool tostring128(uint128_t *number, uint32_t base, char *out, uint32_t outLength); +bool tostring256(uint256_t *number, uint32_t base, char *out, uint32_t outLength); #endif /* _UINT256_H_ */ \ No newline at end of file diff --git a/src_features/erc20_approval/ui_flow_erc20_approval.c b/src_features/erc20_approval/ui_flow_erc20_approval.c index a6ac814..91e78f1 100644 --- a/src_features/erc20_approval/ui_flow_erc20_approval.c +++ b/src_features/erc20_approval/ui_flow_erc20_approval.c @@ -1,6 +1,7 @@ #include "shared_context.h" #include "ui_callbacks.h" +// clang-format off UX_STEP_NOCB(ux_approval_allowance_1_step, pnn, { @@ -59,14 +60,13 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on UX_FLOW(ux_approval_allowance_flow, - &ux_approval_allowance_1_step, - &ux_approval_allowance_2_step, - &ux_approval_allowance_3_step, - &ux_approval_allowance_4_step, - &ux_approval_allowance_5_step, - &ux_approval_allowance_6_step, - &ux_approval_allowance_7_step -); - + &ux_approval_allowance_1_step, + &ux_approval_allowance_2_step, + &ux_approval_allowance_3_step, + &ux_approval_allowance_4_step, + &ux_approval_allowance_5_step, + &ux_approval_allowance_6_step, + &ux_approval_allowance_7_step); diff --git a/src_features/getAppConfiguration/cmd_getAppConfiguration.c b/src_features/getAppConfiguration/cmd_getAppConfiguration.c index f6a34a7..c67b7f3 100644 --- a/src_features/getAppConfiguration/cmd_getAppConfiguration.c +++ b/src_features/getAppConfiguration/cmd_getAppConfiguration.c @@ -3,24 +3,28 @@ #include "ui_flow.h" -void handleGetAppConfiguration(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(p1); - UNUSED(p2); - UNUSED(workBuffer); - UNUSED(dataLength); - UNUSED(flags); - G_io_apdu_buffer[0] = (N_storage.dataAllowed ? APP_FLAG_DATA_ALLOWED : 0x00); +void handleGetAppConfiguration(uint8_t p1, + uint8_t p2, + uint8_t *workBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(p1); + UNUSED(p2); + UNUSED(workBuffer); + UNUSED(dataLength); + UNUSED(flags); + G_io_apdu_buffer[0] = (N_storage.dataAllowed ? APP_FLAG_DATA_ALLOWED : 0x00); #ifndef HAVE_TOKENS_LIST - G_io_apdu_buffer[0] |= APP_FLAG_EXTERNAL_TOKEN_NEEDED; + G_io_apdu_buffer[0] |= APP_FLAG_EXTERNAL_TOKEN_NEEDED; #endif #ifdef HAVE_STARKWARE - G_io_apdu_buffer[0] |= APP_FLAG_STARKWARE; - G_io_apdu_buffer[0] |= APP_FLAG_STARKWARE_V2; + G_io_apdu_buffer[0] |= APP_FLAG_STARKWARE; + G_io_apdu_buffer[0] |= APP_FLAG_STARKWARE_V2; #endif - G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; - G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; - G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; - *tx = 4; - THROW(0x9000); + G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; + G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; + G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; + *tx = 4; + THROW(0x9000); } - diff --git a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c index b6c5618..d2845b3 100644 --- a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c @@ -6,75 +6,81 @@ #include "ui_flow.h" #include "feature_getEth2PublicKey.h" -static const uint8_t BLS12_381_FIELD_MODULUS[] = { 0x1a, 0x01, 0x11, 0xea, 0x39, 0x7f, 0xe6, 0x9a, 0x4b, 0x1b, 0xa7, 0xb6, 0x43, 0x4b, 0xac, 0xd7, 0x64, 0x77, 0x4b, 0x84, 0xf3, 0x85, 0x12, 0xbf, 0x67, 0x30, 0xd2, 0xa0, 0xf6, 0xb0, 0xf6, 0x24, 0x1e, 0xab, 0xff, 0xfe, 0xb1, 0x53, 0xff, 0xff, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab }; +static const uint8_t BLS12_381_FIELD_MODULUS[] = { + 0x1a, 0x01, 0x11, 0xea, 0x39, 0x7f, 0xe6, 0x9a, 0x4b, 0x1b, 0xa7, 0xb6, 0x43, 0x4b, 0xac, 0xd7, + 0x64, 0x77, 0x4b, 0x84, 0xf3, 0x85, 0x12, 0xbf, 0x67, 0x30, 0xd2, 0xa0, 0xf6, 0xb0, 0xf6, 0x24, + 0x1e, 0xab, 0xff, 0xfe, 0xb1, 0x53, 0xff, 0xff, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab}; void getEth2PublicKey(uint32_t *bip32Path, uint8_t bip32PathLength, uint8_t *out) { - uint8_t privateKeyData[32]; - cx_ecfp_256_extended_private_key_t privateKey; - cx_ecfp_384_public_key_t publicKey; - uint8_t yFlag = 0; - uint8_t tmp[96]; + uint8_t privateKeyData[32]; + cx_ecfp_256_extended_private_key_t privateKey; + cx_ecfp_384_public_key_t publicKey; + uint8_t yFlag = 0; + uint8_t tmp[96]; - io_seproxyhal_io_heartbeat(); - os_perso_derive_eip2333(CX_CURVE_BLS12_381_G1, bip32Path, bip32PathLength, privateKeyData); - io_seproxyhal_io_heartbeat(); - memset(tmp, 0, 48); - memmove(tmp + 16, privateKeyData, 32); - cx_ecfp_init_private_key(CX_CURVE_BLS12_381_G1, tmp, 48, &privateKey); - cx_ecfp_generate_pair(CX_CURVE_BLS12_381_G1, &publicKey, &privateKey, 1); - explicit_bzero(tmp, 96); - explicit_bzero((void*)&privateKey, sizeof(cx_ecfp_256_extended_private_key_t)); - tmp[47] = 2; - cx_math_mult(tmp, publicKey.W + 1 + 48, tmp, 48); - if (cx_math_cmp(tmp + 48, BLS12_381_FIELD_MODULUS, 48) > 0) { - yFlag = 0x20; - } - publicKey.W[1] &= 0x1f; - publicKey.W[1] |= 0x80 | yFlag; - memmove(out, publicKey.W + 1, 48); + io_seproxyhal_io_heartbeat(); + os_perso_derive_eip2333(CX_CURVE_BLS12_381_G1, bip32Path, bip32PathLength, privateKeyData); + io_seproxyhal_io_heartbeat(); + memset(tmp, 0, 48); + memmove(tmp + 16, privateKeyData, 32); + cx_ecfp_init_private_key(CX_CURVE_BLS12_381_G1, tmp, 48, &privateKey); + cx_ecfp_generate_pair(CX_CURVE_BLS12_381_G1, &publicKey, &privateKey, 1); + explicit_bzero(tmp, 96); + explicit_bzero((void *) &privateKey, sizeof(cx_ecfp_256_extended_private_key_t)); + tmp[47] = 2; + cx_math_mult(tmp, publicKey.W + 1 + 48, tmp, 48); + if (cx_math_cmp(tmp + 48, BLS12_381_FIELD_MODULUS, 48) > 0) { + yFlag = 0x20; + } + publicKey.W[1] &= 0x1f; + publicKey.W[1] |= 0x80 | yFlag; + memmove(out, publicKey.W + 1, 48); } -void handleGetEth2PublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(dataLength); - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = *(dataBuffer++); +void handleGetEth2PublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(dataLength); + uint32_t bip32Path[MAX_BIP32_PATH]; + uint32_t i; + uint8_t bip32PathLength = *(dataBuffer++); - if(!called_from_swap){ - reset_app_context(); - } - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { - THROW(0x6B00); - } - if (p2 != 0) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = U4BE(dataBuffer, 0); - dataBuffer += 4; - } - getEth2PublicKey(bip32Path, bip32PathLength, tmpCtx.publicKeyContext.publicKey.W); + if (!called_from_swap) { + reset_app_context(); + } + if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { + THROW(0x6B00); + } + if (p2 != 0) { + THROW(0x6B00); + } + for (i = 0; i < bip32PathLength; i++) { + bip32Path[i] = U4BE(dataBuffer, 0); + dataBuffer += 4; + } + getEth2PublicKey(bip32Path, bip32PathLength, tmpCtx.publicKeyContext.publicKey.W); #ifndef NO_CONSENT - if (p1 == P1_NON_CONFIRM) -#endif // NO_CONSENT - { - *tx = set_result_get_eth2_publicKey(); - THROW(0x9000); - } + if (p1 == P1_NON_CONFIRM) +#endif // NO_CONSENT + { + *tx = set_result_get_eth2_publicKey(); + THROW(0x9000); + } #ifndef NO_CONSENT - else - { - ux_flow_init(0, ux_display_public_eth2_flow, NULL); + else { + ux_flow_init(0, ux_display_public_eth2_flow, NULL); - *flags |= IO_ASYNCH_REPLY; - } -#endif // NO_CONSENT + *flags |= IO_ASYNCH_REPLY; + } +#endif // NO_CONSENT } #endif diff --git a/src_features/getEth2PublicKey/feature_getEth2PublicKey.h b/src_features/getEth2PublicKey/feature_getEth2PublicKey.h index f6a9f69..3b6dbe2 100644 --- a/src_features/getEth2PublicKey/feature_getEth2PublicKey.h +++ b/src_features/getEth2PublicKey/feature_getEth2PublicKey.h @@ -1,4 +1,3 @@ #include "shared_context.h" uint32_t set_result_get_eth2_publicKey(void); - diff --git a/src_features/getEth2PublicKey/logic_getEth2PublicKey.c b/src_features/getEth2PublicKey/logic_getEth2PublicKey.c index 33d005a..9b112e2 100644 --- a/src_features/getEth2PublicKey/logic_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/logic_getEth2PublicKey.c @@ -10,4 +10,3 @@ uint32_t set_result_get_eth2_publicKey() { } #endif - diff --git a/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c b/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c index 752fdcd..4bc4e76 100644 --- a/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/ui_common_getEth2PublicKey.c @@ -13,7 +13,7 @@ unsigned int io_seproxyhal_touch_eth2_address_ok(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } #if 0 diff --git a/src_features/getEth2PublicKey/ui_flow_getEth2PublicKey.c b/src_features/getEth2PublicKey/ui_flow_getEth2PublicKey.c index 8a06547..af2142f 100644 --- a/src_features/getEth2PublicKey/ui_flow_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/ui_flow_getEth2PublicKey.c @@ -4,9 +4,10 @@ #include "ui_callbacks.h" void prepare_eth2_public_key() { - snprintf(strings.tmp.tmp, 100, "0x%.*H", 48, tmpCtx.publicKeyContext.publicKey.W); + snprintf(strings.tmp.tmp, 100, "0x%.*H", 48, tmpCtx.publicKeyContext.publicKey.W); } +// clang-format off UX_STEP_NOCB( ux_display_public_eth2_flow_1_step, pnn, @@ -39,12 +40,12 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on UX_FLOW(ux_display_public_eth2_flow, - &ux_display_public_eth2_flow_1_step, - &ux_display_public_eth2_flow_2_step, - &ux_display_public_eth2_flow_3_step, - &ux_display_public_eth2_flow_4_step -); + &ux_display_public_eth2_flow_1_step, + &ux_display_public_eth2_flow_2_step, + &ux_display_public_eth2_flow_3_step, + &ux_display_public_eth2_flow_4_step); #endif diff --git a/src_features/getPublicKey/cmd_getPublicKey.c b/src_features/getPublicKey/cmd_getPublicKey.c index 9a2aa60..d1c0250 100644 --- a/src_features/getPublicKey/cmd_getPublicKey.c +++ b/src_features/getPublicKey/cmd_getPublicKey.c @@ -4,56 +4,70 @@ #include "ui_flow.h" #include "feature_getPublicKey.h" -void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(dataLength); - uint8_t privateKeyData[32]; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = *(dataBuffer++); - cx_ecfp_private_key_t privateKey; - if(!called_from_swap){ - reset_app_context(); - } - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { - THROW(0x6B00); - } - if ((p2 != P2_CHAINCODE) && (p2 != P2_NO_CHAINCODE)) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = U4BE(dataBuffer, 0); - dataBuffer += 4; - } - tmpCtx.publicKeyContext.getChaincode = (p2 == P2_CHAINCODE); - io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, privateKeyData, (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL)); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - io_seproxyhal_io_heartbeat(); - cx_ecfp_generate_pair(CX_CURVE_256K1, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); - explicit_bzero(&privateKey, sizeof(privateKey)); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); - io_seproxyhal_io_heartbeat(); - getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey, tmpCtx.publicKeyContext.address, &global_sha3, chainConfig); +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(dataLength); + uint8_t privateKeyData[32]; + uint32_t bip32Path[MAX_BIP32_PATH]; + uint32_t i; + uint8_t bip32PathLength = *(dataBuffer++); + cx_ecfp_private_key_t privateKey; + if (!called_from_swap) { + reset_app_context(); + } + if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { + THROW(0x6B00); + } + if ((p2 != P2_CHAINCODE) && (p2 != P2_NO_CHAINCODE)) { + THROW(0x6B00); + } + for (i = 0; i < bip32PathLength; i++) { + bip32Path[i] = U4BE(dataBuffer, 0); + dataBuffer += 4; + } + tmpCtx.publicKeyContext.getChaincode = (p2 == P2_CHAINCODE); + io_seproxyhal_io_heartbeat(); + os_perso_derive_node_bip32( + CX_CURVE_256K1, + bip32Path, + bip32PathLength, + privateKeyData, + (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL)); + cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); + io_seproxyhal_io_heartbeat(); + cx_ecfp_generate_pair(CX_CURVE_256K1, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); + explicit_bzero(&privateKey, sizeof(privateKey)); + explicit_bzero(privateKeyData, sizeof(privateKeyData)); + io_seproxyhal_io_heartbeat(); + getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey, + tmpCtx.publicKeyContext.address, + &global_sha3, + chainConfig); #ifndef NO_CONSENT - if (p1 == P1_NON_CONFIRM) -#endif // NO_CONSENT - { - *tx = set_result_get_publicKey(); - THROW(0x9000); - } + if (p1 == P1_NON_CONFIRM) +#endif // NO_CONSENT + { + *tx = set_result_get_publicKey(); + THROW(0x9000); + } #ifndef NO_CONSENT - else - { - snprintf(strings.common.fullAddress, sizeof(strings.common.fullAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); - ux_flow_init(0, ux_display_public_flow, NULL); + else { + snprintf(strings.common.fullAddress, + sizeof(strings.common.fullAddress), + "0x%.*s", + 40, + tmpCtx.publicKeyContext.address); + ux_flow_init(0, ux_display_public_flow, NULL); - *flags |= IO_ASYNCH_REPLY; - } -#endif // NO_CONSENT + *flags |= IO_ASYNCH_REPLY; + } +#endif // NO_CONSENT } - diff --git a/src_features/getPublicKey/feature_getPublicKey.h b/src_features/getPublicKey/feature_getPublicKey.h index 392dda8..e8e041a 100644 --- a/src_features/getPublicKey/feature_getPublicKey.h +++ b/src_features/getPublicKey/feature_getPublicKey.h @@ -1,4 +1,3 @@ #include "shared_context.h" uint32_t set_result_get_publicKey(void); - diff --git a/src_features/getPublicKey/logic_getPublicKey.c b/src_features/getPublicKey/logic_getPublicKey.c index a538d96..d80896c 100644 --- a/src_features/getPublicKey/logic_getPublicKey.c +++ b/src_features/getPublicKey/logic_getPublicKey.c @@ -9,9 +9,8 @@ uint32_t set_result_get_publicKey() { memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.address, 40); tx += 40; if (tmpCtx.publicKeyContext.getChaincode) { - memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.chainCode, 32); - tx += 32; + memmove(G_io_apdu_buffer + tx, tmpCtx.publicKeyContext.chainCode, 32); + tx += 32; } return tx; } - diff --git a/src_features/getPublicKey/ui_common_getPublicKey.c b/src_features/getPublicKey/ui_common_getPublicKey.c index cbe6a27..23a0f66 100644 --- a/src_features/getPublicKey/ui_common_getPublicKey.c +++ b/src_features/getPublicKey/ui_common_getPublicKey.c @@ -11,7 +11,7 @@ unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e) { @@ -22,6 +22,5 @@ unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } - diff --git a/src_features/getPublicKey/ui_flow_getPublicKey.c b/src_features/getPublicKey/ui_flow_getPublicKey.c index fee2f18..9bd6620 100644 --- a/src_features/getPublicKey/ui_flow_getPublicKey.c +++ b/src_features/getPublicKey/ui_flow_getPublicKey.c @@ -1,6 +1,7 @@ #include "shared_context.h" #include "ui_callbacks.h" +// clang-format off UX_STEP_NOCB( ux_display_public_flow_1_step, pnn, @@ -32,10 +33,10 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on UX_FLOW(ux_display_public_flow, - &ux_display_public_flow_1_step, - &ux_display_public_flow_2_step, - &ux_display_public_flow_3_step, - &ux_display_public_flow_4_step -); + &ux_display_public_flow_1_step, + &ux_display_public_flow_2_step, + &ux_display_public_flow_3_step, + &ux_display_public_flow_4_step); diff --git a/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c b/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c index 1b825dd..dba49fd 100644 --- a/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c +++ b/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c @@ -3,172 +3,212 @@ #include "ui_flow.h" static const uint8_t const TOKEN_SIGNATURE_PUBLIC_KEY[] = { -// production key 2019-01-11 03:07PM (erc20signer) - 0x04, + // production key 2019-01-11 03:07PM (erc20signer) + 0x04, - 0x5e,0x6c,0x10,0x20,0xc1,0x4d,0xc4,0x64, - 0x42,0xfe,0x89,0xf9,0x7c,0x0b,0x68,0xcd, - 0xb1,0x59,0x76,0xdc,0x24,0xf2,0x4c,0x31, - 0x6e,0x7b,0x30,0xfe,0x4e,0x8c,0xc7,0x6b, + 0x5e, 0x6c, 0x10, 0x20, 0xc1, 0x4d, 0xc4, 0x64, 0x42, 0xfe, 0x89, 0xf9, 0x7c, 0x0b, 0x68, 0xcd, + 0xb1, 0x59, 0x76, 0xdc, 0x24, 0xf2, 0x4c, 0x31, 0x6e, 0x7b, 0x30, 0xfe, 0x4e, 0x8c, 0xc7, 0x6b, - 0x14,0x89,0x15,0x0c,0x21,0x51,0x4e,0xbf, - 0x44,0x0f,0xf5,0xde,0xa5,0x39,0x3d,0x83, - 0xde,0x53,0x58,0xcd,0x09,0x8f,0xce,0x8f, - 0xd0,0xf8,0x1d,0xaa,0x94,0x97,0x91,0x83 -}; + 0x14, 0x89, 0x15, 0x0c, 0x21, 0x51, 0x4e, 0xbf, 0x44, 0x0f, 0xf5, 0xde, 0xa5, 0x39, 0x3d, 0x83, + 0xde, 0x53, 0x58, 0xcd, 0x09, 0x8f, 0xce, 0x8f, 0xd0, 0xf8, 0x1d, 0xaa, 0x94, 0x97, 0x91, 0x83}; #ifdef HAVE_CONTRACT_NAME_IN_DESCRIPTOR -void handleProvideErc20TokenInformation(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(p1); - UNUSED(p2); - UNUSED(flags); - uint32_t offset = 0; - uint8_t tickerLength, contractNameLength; - uint32_t chainId; - uint8_t hash[32]; - cx_sha256_t sha256; - cx_ecfp_public_key_t tokenKey; +void handleProvideErc20TokenInformation(uint8_t p1, + uint8_t p2, + uint8_t *workBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(p1); + UNUSED(p2); + UNUSED(flags); + uint32_t offset = 0; + uint8_t tickerLength, contractNameLength; + uint32_t chainId; + uint8_t hash[32]; + cx_sha256_t sha256; + cx_ecfp_public_key_t tokenKey; - cx_sha256_init(&sha256); + cx_sha256_init(&sha256); - tmpCtx.transactionContext.currentTokenIndex = (tmpCtx.transactionContext.currentTokenIndex + 1) % MAX_TOKEN; - tokenDefinition_t* token = &tmpCtx.transactionContext.tokens[tmpCtx.transactionContext.currentTokenIndex]; + tmpCtx.transactionContext.currentTokenIndex = + (tmpCtx.transactionContext.currentTokenIndex + 1) % MAX_TOKEN; + tokenDefinition_t *token = + &tmpCtx.transactionContext.tokens[tmpCtx.transactionContext.currentTokenIndex]; - if (dataLength < 1) { - THROW(0x6A80); - } - tickerLength = workBuffer[offset++]; - dataLength--; - if ((tickerLength + 2) >= sizeof(token->ticker)) { // +2 because ' \0' is appended to ticker - THROW(0x6A80); - } - if (dataLength < tickerLength + 1) { - THROW(0x6A80); - } - cx_hash((cx_hash_t*)&sha256, 0, workBuffer + offset, tickerLength, NULL, 0); - memmove(token->ticker, workBuffer + offset, tickerLength); - token->ticker[tickerLength] = ' '; - token->ticker[tickerLength + 1] = '\0'; - offset += tickerLength; - dataLength -= tickerLength; + if (dataLength < 1) { + THROW(0x6A80); + } + tickerLength = workBuffer[offset++]; + dataLength--; + if ((tickerLength + 2) >= sizeof(token->ticker)) { // +2 because ' \0' is appended to ticker + THROW(0x6A80); + } + if (dataLength < tickerLength + 1) { + THROW(0x6A80); + } + cx_hash((cx_hash_t *) &sha256, 0, workBuffer + offset, tickerLength, NULL, 0); + memmove(token->ticker, workBuffer + offset, tickerLength); + token->ticker[tickerLength] = ' '; + token->ticker[tickerLength + 1] = '\0'; + offset += tickerLength; + dataLength -= tickerLength; - contractNameLength = workBuffer[offset++]; - dataLength--; - if (dataLength < contractNameLength + 20 + 4 + 4) { - THROW(0x6A80); - } - cx_hash((cx_hash_t*)&sha256, CX_LAST, workBuffer + offset, contractNameLength + 20 + 4 + 4, hash, 32); - memmove(token->contractName, workBuffer + offset, MIN(contractNameLength, sizeof(token->contractName)-1)); - token->contractName[MIN(contractNameLength, sizeof(token->contractName)-1)] = '\0'; - offset += contractNameLength; - dataLength -= contractNameLength; + contractNameLength = workBuffer[offset++]; + dataLength--; + if (dataLength < contractNameLength + 20 + 4 + 4) { + THROW(0x6A80); + } + cx_hash((cx_hash_t *) &sha256, + CX_LAST, + workBuffer + offset, + contractNameLength + 20 + 4 + 4, + hash, + 32); + memmove(token->contractName, + workBuffer + offset, + MIN(contractNameLength, sizeof(token->contractName) - 1)); + token->contractName[MIN(contractNameLength, sizeof(token->contractName) - 1)] = '\0'; + offset += contractNameLength; + dataLength -= contractNameLength; - memmove(token->address, workBuffer + offset, 20); - offset += 20; - dataLength -= 20; - token->decimals = U4BE(workBuffer, offset); - offset += 4; - dataLength -= 4; - chainId = U4BE(workBuffer, offset); - if ((chainConfig->chainId != 0) && (chainConfig->chainId != chainId)) { - PRINTF("ChainId token mismatch\n"); - THROW(0x6A80); - } - offset += 4; - dataLength -= 4; - cx_ecfp_init_public_key(CX_CURVE_256K1, TOKEN_SIGNATURE_PUBLIC_KEY, sizeof(TOKEN_SIGNATURE_PUBLIC_KEY), &tokenKey); - if (!cx_ecdsa_verify(&tokenKey, CX_LAST, CX_SHA256, hash, 32, workBuffer + offset, dataLength)) { - PRINTF("Invalid token signature\n"); - THROW(0x6A80); - } - tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentTokenIndex] = 1; - THROW(0x9000); + memmove(token->address, workBuffer + offset, 20); + offset += 20; + dataLength -= 20; + token->decimals = U4BE(workBuffer, offset); + offset += 4; + dataLength -= 4; + chainId = U4BE(workBuffer, offset); + if ((chainConfig->chainId != 0) && (chainConfig->chainId != chainId)) { + PRINTF("ChainId token mismatch\n"); + THROW(0x6A80); + } + offset += 4; + dataLength -= 4; + cx_ecfp_init_public_key(CX_CURVE_256K1, + TOKEN_SIGNATURE_PUBLIC_KEY, + sizeof(TOKEN_SIGNATURE_PUBLIC_KEY), + &tokenKey); + if (!cx_ecdsa_verify(&tokenKey, + CX_LAST, + CX_SHA256, + hash, + 32, + workBuffer + offset, + dataLength)) { + PRINTF("Invalid token signature\n"); + THROW(0x6A80); + } + tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentTokenIndex] = 1; + THROW(0x9000); } #else -void handleProvideErc20TokenInformation(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(p1); - UNUSED(p2); - UNUSED(flags); - uint32_t offset = 0; - uint8_t tickerLength; - uint32_t chainId; - uint8_t hash[32]; - cx_ecfp_public_key_t tokenKey; +void handleProvideErc20TokenInformation(uint8_t p1, + uint8_t p2, + uint8_t *workBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(p1); + UNUSED(p2); + UNUSED(flags); + uint32_t offset = 0; + uint8_t tickerLength; + uint32_t chainId; + uint8_t hash[32]; + cx_ecfp_public_key_t tokenKey; + tmpCtx.transactionContext.currentTokenIndex = + (tmpCtx.transactionContext.currentTokenIndex + 1) % MAX_TOKEN; + tokenDefinition_t *token = + &tmpCtx.transactionContext.tokens[tmpCtx.transactionContext.currentTokenIndex]; - tmpCtx.transactionContext.currentTokenIndex = (tmpCtx.transactionContext.currentTokenIndex + 1) % MAX_TOKEN; - tokenDefinition_t* token = &tmpCtx.transactionContext.tokens[tmpCtx.transactionContext.currentTokenIndex]; + PRINTF("Provisioning currentTokenIndex %d\n", tmpCtx.transactionContext.currentTokenIndex); - PRINTF("Provisioning currentTokenIndex %d\n", tmpCtx.transactionContext.currentTokenIndex); - - if (dataLength < 1) { - THROW(0x6A80); - } - tickerLength = workBuffer[offset++]; - dataLength--; - if ((tickerLength + 1) >= sizeof(token->ticker)) { - THROW(0x6A80); - } - if (dataLength < tickerLength + 20 + 4 + 4) { - THROW(0x6A80); - } - cx_hash_sha256(workBuffer + offset, tickerLength + 20 + 4 + 4, hash, 32); - memmove(token->ticker, workBuffer + offset, tickerLength); - token->ticker[tickerLength] = ' '; - token->ticker[tickerLength + 1] = '\0'; - offset += tickerLength; - dataLength -= tickerLength; - memmove(token->address, workBuffer + offset, 20); - offset += 20; - dataLength -= 20; - token->decimals = U4BE(workBuffer, offset); - offset += 4; - dataLength -= 4; - chainId = U4BE(workBuffer, offset); - if ((chainConfig->chainId != 0) && (chainConfig->chainId != chainId)) { - PRINTF("ChainId token mismatch\n"); - THROW(0x6A80); - } - offset += 4; - dataLength -= 4; + if (dataLength < 1) { + THROW(0x6A80); + } + tickerLength = workBuffer[offset++]; + dataLength--; + if ((tickerLength + 1) >= sizeof(token->ticker)) { + THROW(0x6A80); + } + if (dataLength < tickerLength + 20 + 4 + 4) { + THROW(0x6A80); + } + cx_hash_sha256(workBuffer + offset, tickerLength + 20 + 4 + 4, hash, 32); + memmove(token->ticker, workBuffer + offset, tickerLength); + token->ticker[tickerLength] = ' '; + token->ticker[tickerLength + 1] = '\0'; + offset += tickerLength; + dataLength -= tickerLength; + memmove(token->address, workBuffer + offset, 20); + offset += 20; + dataLength -= 20; + token->decimals = U4BE(workBuffer, offset); + offset += 4; + dataLength -= 4; + chainId = U4BE(workBuffer, offset); + if ((chainConfig->chainId != 0) && (chainConfig->chainId != chainId)) { + PRINTF("ChainId token mismatch\n"); + THROW(0x6A80); + } + offset += 4; + dataLength -= 4; #ifdef HAVE_TOKENS_EXTRA_LIST tokenDefinition_t *currentToken = NULL; uint32_t index; - for (index=0; index < NUM_TOKENS_EXTRA; index++) { - currentToken = (tokenDefinition_t *)PIC(&TOKENS_EXTRA[index]); - if (memcmp(currentToken->address, token->address, 20) == 0) { - strcpy((char*)token->ticker, (char*)currentToken->ticker); - token->decimals = currentToken->decimals; - break; - } + for (index = 0; index < NUM_TOKENS_EXTRA; index++) { + currentToken = (tokenDefinition_t *) PIC(&TOKENS_EXTRA[index]); + if (memcmp(currentToken->address, token->address, 20) == 0) { + strcpy((char *) token->ticker, (char *) currentToken->ticker); + token->decimals = currentToken->decimals; + break; + } } if (index < NUM_TOKENS_EXTRA) { - PRINTF("Descriptor whitelisted\n"); - } - else { - cx_ecfp_init_public_key(CX_CURVE_256K1, TOKEN_SIGNATURE_PUBLIC_KEY, sizeof(TOKEN_SIGNATURE_PUBLIC_KEY), &tokenKey); - if (!cx_ecdsa_verify(&tokenKey, CX_LAST, CX_SHA256, hash, 32, workBuffer + offset, dataLength)) { - PRINTF("Invalid token signature\n"); - THROW(0x6A80); - } + PRINTF("Descriptor whitelisted\n"); + } else { + cx_ecfp_init_public_key(CX_CURVE_256K1, + TOKEN_SIGNATURE_PUBLIC_KEY, + sizeof(TOKEN_SIGNATURE_PUBLIC_KEY), + &tokenKey); + if (!cx_ecdsa_verify(&tokenKey, + CX_LAST, + CX_SHA256, + hash, + 32, + workBuffer + offset, + dataLength)) { + PRINTF("Invalid token signature\n"); + THROW(0x6A80); + } } #else - cx_ecfp_init_public_key(CX_CURVE_256K1, TOKEN_SIGNATURE_PUBLIC_KEY, sizeof(TOKEN_SIGNATURE_PUBLIC_KEY), &tokenKey); - if (!cx_ecdsa_verify(&tokenKey, CX_LAST, CX_SHA256, hash, 32, workBuffer + offset, dataLength)) { - PRINTF("Invalid token signature\n"); - THROW(0x6A80); - } + cx_ecfp_init_public_key(CX_CURVE_256K1, + TOKEN_SIGNATURE_PUBLIC_KEY, + sizeof(TOKEN_SIGNATURE_PUBLIC_KEY), + &tokenKey); + if (!cx_ecdsa_verify(&tokenKey, + CX_LAST, + CX_SHA256, + hash, + 32, + workBuffer + offset, + dataLength)) { + PRINTF("Invalid token signature\n"); + THROW(0x6A80); + } #endif - tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentTokenIndex] = 1; - THROW(0x9000); + tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentTokenIndex] = 1; + THROW(0x9000); } #endif - diff --git a/src_features/setEth2WithdrawalIndex/cmd_setEth2WithdrawalIndex.c b/src_features/setEth2WithdrawalIndex/cmd_setEth2WithdrawalIndex.c index ff1bc03..ea99f03 100644 --- a/src_features/setEth2WithdrawalIndex/cmd_setEth2WithdrawalIndex.c +++ b/src_features/setEth2WithdrawalIndex/cmd_setEth2WithdrawalIndex.c @@ -3,19 +3,23 @@ #include "shared_context.h" #include "apdu_constants.h" +void handleSetEth2WithdrawalIndex(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + if (dataLength != 4) { + THROW(0x6700); + } -void handleSetEth2WithdrawalIndex(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - if (dataLength != 4) { - THROW(0x6700); - } + if ((p1 != 0) || (p2 != 0)) { + THROW(0x6B00); + } - if ((p1 != 0) || (p2 != 0)) { - THROW(0x6B00); - } + eth2WithdrawalIndex = U4BE(dataBuffer, 0); - eth2WithdrawalIndex = U4BE(dataBuffer, 0); - - THROW(0x9000); + THROW(0x9000); } #endif diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 8e89efd..ecf377b 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -3,94 +3,113 @@ #include "utils.h" #include "ui_flow.h" -static const char const SIGN_MAGIC[] = "\x19" - "Ethereum Signed Message:\n"; +static const char const SIGN_MAGIC[] = + "\x19" + "Ethereum Signed Message:\n"; -void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(tx); - uint8_t hashMessage[32]; - if (p1 == P1_FIRST) { - char tmp[11]; - uint32_t index; - uint32_t base = 10; - uint8_t pos = 0; - uint32_t i; - if (dataLength < 1) { - PRINTF("Invalid data\n"); - THROW(0x6a80); - } - if (appState != APP_STATE_IDLE) { - reset_app_context(); - } - appState = APP_STATE_SIGNING_MESSAGE; - tmpCtx.messageSigningContext.pathLength = workBuffer[0]; - if ((tmpCtx.messageSigningContext.pathLength < 0x01) || - (tmpCtx.messageSigningContext.pathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - workBuffer++; - dataLength--; - for (i = 0; i < tmpCtx.messageSigningContext.pathLength; i++) { - if (dataLength < 4) { - PRINTF("Invalid data\n"); - THROW(0x6a80); +void handleSignPersonalMessage(uint8_t p1, + uint8_t p2, + uint8_t *workBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(tx); + uint8_t hashMessage[32]; + if (p1 == P1_FIRST) { + char tmp[11]; + uint32_t index; + uint32_t base = 10; + uint8_t pos = 0; + uint32_t i; + if (dataLength < 1) { + PRINTF("Invalid data\n"); + THROW(0x6a80); } - tmpCtx.messageSigningContext.bip32Path[i] = U4BE(workBuffer, 0); + if (appState != APP_STATE_IDLE) { + reset_app_context(); + } + appState = APP_STATE_SIGNING_MESSAGE; + tmpCtx.messageSigningContext.pathLength = workBuffer[0]; + if ((tmpCtx.messageSigningContext.pathLength < 0x01) || + (tmpCtx.messageSigningContext.pathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + workBuffer++; + dataLength--; + for (i = 0; i < tmpCtx.messageSigningContext.pathLength; i++) { + if (dataLength < 4) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + tmpCtx.messageSigningContext.bip32Path[i] = U4BE(workBuffer, 0); + workBuffer += 4; + dataLength -= 4; + } + if (dataLength < 4) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + tmpCtx.messageSigningContext.remainingLength = U4BE(workBuffer, 0); workBuffer += 4; dataLength -= 4; - } - if (dataLength < 4) { - PRINTF("Invalid data\n"); - THROW(0x6a80); - } - tmpCtx.messageSigningContext.remainingLength = U4BE(workBuffer, 0); - workBuffer += 4; - dataLength -= 4; - // Initialize message header + length - cx_keccak_init(&global_sha3, 256); - cx_hash((cx_hash_t *)&global_sha3, 0, (uint8_t*)SIGN_MAGIC, sizeof(SIGN_MAGIC) - 1, NULL, 0); - for (index = 1; (((index * base) <= tmpCtx.messageSigningContext.remainingLength) && + // Initialize message header + length + cx_keccak_init(&global_sha3, 256); + cx_hash((cx_hash_t *) &global_sha3, + 0, + (uint8_t *) SIGN_MAGIC, + sizeof(SIGN_MAGIC) - 1, + NULL, + 0); + for (index = 1; (((index * base) <= tmpCtx.messageSigningContext.remainingLength) && (((index * base) / base) == index)); - index *= base); - for (; index; index /= base) { - tmp[pos++] = '0' + ((tmpCtx.messageSigningContext.remainingLength / index) % base); + index *= base) + ; + for (; index; index /= base) { + tmp[pos++] = '0' + ((tmpCtx.messageSigningContext.remainingLength / index) % base); + } + tmp[pos] = '\0'; + cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) tmp, pos, NULL, 0); + cx_sha256_init(&tmpContent.sha2); + } else if (p1 != P1_MORE) { + THROW(0x6B00); } - tmp[pos] = '\0'; - cx_hash((cx_hash_t *)&global_sha3, 0, (uint8_t*)tmp, pos, NULL, 0); - cx_sha256_init(&tmpContent.sha2); - } - else if (p1 != P1_MORE) { - THROW(0x6B00); - } - if (p2 != 0) { - THROW(0x6B00); - } - if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_MESSAGE)) { - PRINTF("Signature not initialized\n"); - THROW(0x6985); - } - if (dataLength > tmpCtx.messageSigningContext.remainingLength) { - THROW(0x6A80); - } - cx_hash((cx_hash_t *)&global_sha3, 0, workBuffer, dataLength, NULL, 0); - cx_hash((cx_hash_t *)&tmpContent.sha2, 0, workBuffer, dataLength, NULL, 0); - tmpCtx.messageSigningContext.remainingLength -= dataLength; - if (tmpCtx.messageSigningContext.remainingLength == 0) { - cx_hash((cx_hash_t *)&global_sha3, CX_LAST, workBuffer, 0, tmpCtx.messageSigningContext.hash, 32); - cx_hash((cx_hash_t *)&tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage, 32); - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "%.*H", sizeof(hashMessage), hashMessage); + if (p2 != 0) { + THROW(0x6B00); + } + if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_MESSAGE)) { + PRINTF("Signature not initialized\n"); + THROW(0x6985); + } + if (dataLength > tmpCtx.messageSigningContext.remainingLength) { + THROW(0x6A80); + } + cx_hash((cx_hash_t *) &global_sha3, 0, workBuffer, dataLength, NULL, 0); + cx_hash((cx_hash_t *) &tmpContent.sha2, 0, workBuffer, dataLength, NULL, 0); + tmpCtx.messageSigningContext.remainingLength -= dataLength; + if (tmpCtx.messageSigningContext.remainingLength == 0) { + cx_hash((cx_hash_t *) &global_sha3, + CX_LAST, + workBuffer, + 0, + tmpCtx.messageSigningContext.hash, + 32); + cx_hash((cx_hash_t *) &tmpContent.sha2, CX_LAST, workBuffer, 0, hashMessage, 32); + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "%.*H", + sizeof(hashMessage), + hashMessage); #ifdef NO_CONSENT - io_seproxyhal_touch_signMessage_ok(NULL); -#else //NO_CONSENT - ux_flow_init(0, ux_sign_flow, NULL); -#endif // NO_CONSENT + io_seproxyhal_touch_signMessage_ok(NULL); +#else // NO_CONSENT + ux_flow_init(0, ux_sign_flow, NULL); +#endif // NO_CONSENT - *flags |= IO_ASYNCH_REPLY; + *flags |= IO_ASYNCH_REPLY; - } else { - THROW(0x9000); - } + } else { + THROW(0x9000); + } } - diff --git a/src_features/signMessage/ui_common_signMessage.c b/src_features/signMessage/ui_common_signMessage.c index 306cca9..7dac4d6 100644 --- a/src_features/signMessage/ui_common_signMessage.c +++ b/src_features/signMessage/ui_common_signMessage.c @@ -8,25 +8,31 @@ unsigned int io_seproxyhal_touch_signMessage_ok(const bagl_element_t *e) { cx_ecfp_private_key_t privateKey; uint32_t tx = 0; io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32( - CX_CURVE_256K1, tmpCtx.messageSigningContext.bip32Path, - tmpCtx.messageSigningContext.pathLength, privateKeyData, NULL); + os_perso_derive_node_bip32(CX_CURVE_256K1, + tmpCtx.messageSigningContext.bip32Path, + tmpCtx.messageSigningContext.pathLength, + privateKeyData, + NULL); io_seproxyhal_io_heartbeat(); cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); explicit_bzero(privateKeyData, sizeof(privateKeyData)); unsigned int info = 0; io_seproxyhal_io_heartbeat(); - signatureLength = - cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - tmpCtx.messageSigningContext.hash, - sizeof(tmpCtx.messageSigningContext.hash), signature, sizeof(signature), &info); + signatureLength = cx_ecdsa_sign(&privateKey, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + tmpCtx.messageSigningContext.hash, + sizeof(tmpCtx.messageSigningContext.hash), + signature, + sizeof(signature), + &info); explicit_bzero(&privateKey, sizeof(privateKey)); G_io_apdu_buffer[0] = 27; if (info & CX_ECCINFO_PARITY_ODD) { - G_io_apdu_buffer[0]++; + G_io_apdu_buffer[0]++; } if (info & CX_ECCINFO_xGTn) { - G_io_apdu_buffer[0] += 2; + G_io_apdu_buffer[0] += 2; } format_signature_out(signature); tx = 65; @@ -37,7 +43,7 @@ unsigned int io_seproxyhal_touch_signMessage_ok(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } unsigned int io_seproxyhal_touch_signMessage_cancel(const bagl_element_t *e) { @@ -48,6 +54,5 @@ unsigned int io_seproxyhal_touch_signMessage_cancel(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } - diff --git a/src_features/signMessage/ui_flow_signMessage.c b/src_features/signMessage/ui_flow_signMessage.c index fe47dc2..6672977 100644 --- a/src_features/signMessage/ui_flow_signMessage.c +++ b/src_features/signMessage/ui_flow_signMessage.c @@ -1,6 +1,7 @@ #include "shared_context.h" #include "ui_callbacks.h" +// clang-format off UX_STEP_NOCB( ux_sign_flow_1_step, pnn, @@ -34,11 +35,10 @@ UX_STEP_CB( "Cancel", "signature", }); +// clang-format on UX_FLOW(ux_sign_flow, - &ux_sign_flow_1_step, - &ux_sign_flow_2_step, - &ux_sign_flow_3_step, - &ux_sign_flow_4_step -); - + &ux_sign_flow_1_step, + &ux_sign_flow_2_step, + &ux_sign_flow_3_step, + &ux_sign_flow_4_step); diff --git a/src_features/signMessageEIP712/cmd_signMessage712.c b/src_features/signMessageEIP712/cmd_signMessage712.c index 31e1ec3..d269909 100644 --- a/src_features/signMessageEIP712/cmd_signMessage712.c +++ b/src_features/signMessageEIP712/cmd_signMessage712.c @@ -3,52 +3,58 @@ #include "utils.h" #include "ui_flow.h" -static const char const SIGN_MAGIC[] = "\x19" - "Ethereum Signed Message:\n"; +static const char const SIGN_MAGIC[] = + "\x19" + "Ethereum Signed Message:\n"; -void handleSignEIP712Message(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - uint8_t i; +void handleSignEIP712Message(uint8_t p1, + uint8_t p2, + uint8_t *workBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + uint8_t i; - UNUSED(tx); - if ((p1 != 00) || (p2 != 00)) { - THROW(0x6B00); - } - if (appState != APP_STATE_IDLE) { - reset_app_context(); - } - if (dataLength < 1) { - PRINTF("Invalid data\n"); - THROW(0x6a80); - } - tmpCtx.messageSigningContext712.pathLength = workBuffer[0]; - if ((tmpCtx.messageSigningContext712.pathLength < 0x01) || - (tmpCtx.messageSigningContext712.pathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - workBuffer++; - dataLength--; - for (i = 0; i < tmpCtx.messageSigningContext712.pathLength; i++) { - if (dataLength < 4) { - PRINTF("Invalid data\n"); - THROW(0x6a80); + UNUSED(tx); + if ((p1 != 00) || (p2 != 00)) { + THROW(0x6B00); } - tmpCtx.messageSigningContext712.bip32Path[i] = U4BE(workBuffer, 0); - workBuffer += 4; - dataLength -= 4; - } - if (dataLength < 32 + 32) { - PRINTF("Invalid data\n"); - THROW(0x6a80); - } - memmove(tmpCtx.messageSigningContext712.domainHash, workBuffer, 32); - memmove(tmpCtx.messageSigningContext712.messageHash, workBuffer + 32, 32); + if (appState != APP_STATE_IDLE) { + reset_app_context(); + } + if (dataLength < 1) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + tmpCtx.messageSigningContext712.pathLength = workBuffer[0]; + if ((tmpCtx.messageSigningContext712.pathLength < 0x01) || + (tmpCtx.messageSigningContext712.pathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + workBuffer++; + dataLength--; + for (i = 0; i < tmpCtx.messageSigningContext712.pathLength; i++) { + if (dataLength < 4) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + tmpCtx.messageSigningContext712.bip32Path[i] = U4BE(workBuffer, 0); + workBuffer += 4; + dataLength -= 4; + } + if (dataLength < 32 + 32) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + memmove(tmpCtx.messageSigningContext712.domainHash, workBuffer, 32); + memmove(tmpCtx.messageSigningContext712.messageHash, workBuffer + 32, 32); #ifdef NO_CONSENT io_seproxyhal_touch_signMessage_ok(NULL); -#else //NO_CONSENT +#else // NO_CONSENT ux_flow_init(0, ux_sign_712_v0_flow, NULL); -#endif // NO_CONSENT +#endif // NO_CONSENT *flags |= IO_ASYNCH_REPLY; } diff --git a/src_features/signMessageEIP712/ui_common_signMessage712.c b/src_features/signMessageEIP712/ui_common_signMessage712.c index e503642..fa88828 100644 --- a/src_features/signMessageEIP712/ui_common_signMessage712.c +++ b/src_features/signMessageEIP712/ui_common_signMessage712.c @@ -1,7 +1,7 @@ #include "shared_context.h" #include "ui_callbacks.h" -static const uint8_t const EIP_712_MAGIC[] = { 0x19, 0x01 }; +static const uint8_t const EIP_712_MAGIC[] = {0x19, 0x01}; unsigned int io_seproxyhal_touch_signMessage712_v0_ok(const bagl_element_t *e) { uint8_t privateKeyData[32]; @@ -12,32 +12,51 @@ unsigned int io_seproxyhal_touch_signMessage712_v0_ok(const bagl_element_t *e) { uint32_t tx = 0; io_seproxyhal_io_heartbeat(); cx_keccak_init(&global_sha3, 256); - cx_hash((cx_hash_t *)&global_sha3, 0, (uint8_t*)EIP_712_MAGIC, sizeof(EIP_712_MAGIC), NULL, 0); - cx_hash((cx_hash_t *)&global_sha3, 0, tmpCtx.messageSigningContext712.domainHash, - sizeof(tmpCtx.messageSigningContext712.domainHash), NULL, 0); - cx_hash((cx_hash_t *)&global_sha3, CX_LAST, tmpCtx.messageSigningContext712.messageHash, - sizeof(tmpCtx.messageSigningContext712.messageHash), hash, sizeof(hash)); + cx_hash((cx_hash_t *) &global_sha3, + 0, + (uint8_t *) EIP_712_MAGIC, + sizeof(EIP_712_MAGIC), + NULL, + 0); + cx_hash((cx_hash_t *) &global_sha3, + 0, + tmpCtx.messageSigningContext712.domainHash, + sizeof(tmpCtx.messageSigningContext712.domainHash), + NULL, + 0); + cx_hash((cx_hash_t *) &global_sha3, + CX_LAST, + tmpCtx.messageSigningContext712.messageHash, + sizeof(tmpCtx.messageSigningContext712.messageHash), + hash, + sizeof(hash)); PRINTF("EIP712 hash to sign %.*H\n", 32, hash); io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32( - CX_CURVE_256K1, tmpCtx.messageSigningContext712.bip32Path, - tmpCtx.messageSigningContext712.pathLength, privateKeyData, NULL); + os_perso_derive_node_bip32(CX_CURVE_256K1, + tmpCtx.messageSigningContext712.bip32Path, + tmpCtx.messageSigningContext712.pathLength, + privateKeyData, + NULL); io_seproxyhal_io_heartbeat(); cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); explicit_bzero(privateKeyData, sizeof(privateKeyData)); unsigned int info = 0; io_seproxyhal_io_heartbeat(); - signatureLength = - cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - hash, - sizeof(hash), signature, sizeof(signature), &info); + signatureLength = cx_ecdsa_sign(&privateKey, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + hash, + sizeof(hash), + signature, + sizeof(signature), + &info); explicit_bzero(&privateKey, sizeof(privateKey)); G_io_apdu_buffer[0] = 27; if (info & CX_ECCINFO_PARITY_ODD) { - G_io_apdu_buffer[0]++; + G_io_apdu_buffer[0]++; } if (info & CX_ECCINFO_xGTn) { - G_io_apdu_buffer[0] += 2; + G_io_apdu_buffer[0] += 2; } format_signature_out(signature); tx = 65; @@ -48,7 +67,7 @@ unsigned int io_seproxyhal_touch_signMessage712_v0_ok(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } unsigned int io_seproxyhal_touch_signMessage712_v0_cancel(const bagl_element_t *e) { @@ -59,6 +78,5 @@ unsigned int io_seproxyhal_touch_signMessage712_v0_cancel(const bagl_element_t * io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } - diff --git a/src_features/signMessageEIP712/ui_flow_signMessage712.c b/src_features/signMessageEIP712/ui_flow_signMessage712.c index 103fa39..ac239d7 100644 --- a/src_features/signMessageEIP712/ui_flow_signMessage712.c +++ b/src_features/signMessageEIP712/ui_flow_signMessage712.c @@ -2,13 +2,14 @@ #include "ui_callbacks.h" void prepare_domain_hash_v0() { - snprintf(strings.tmp.tmp, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.domainHash); + snprintf(strings.tmp.tmp, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.domainHash); } void prepare_message_hash_v0() { - snprintf(strings.tmp.tmp, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.messageHash); + snprintf(strings.tmp.tmp, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.messageHash); } +// clang-format off UX_STEP_NOCB( ux_sign_712_v0_flow_1_step, pnn, @@ -51,12 +52,11 @@ UX_STEP_CB( "Cancel", "signature", }); +// clang-format on UX_FLOW(ux_sign_712_v0_flow, - &ux_sign_712_v0_flow_1_step, - &ux_sign_712_v0_flow_2_step, - &ux_sign_712_v0_flow_3_step, - &ux_sign_712_v0_flow_4_step, - &ux_sign_712_v0_flow_5_step -); - + &ux_sign_712_v0_flow_1_step, + &ux_sign_712_v0_flow_2_step, + &ux_sign_712_v0_flow_3_step, + &ux_sign_712_v0_flow_4_step, + &ux_sign_712_v0_flow_5_step); diff --git a/src_features/signTx/cmd_signTx.c b/src_features/signTx/cmd_signTx.c index ac35fcd..e721d06 100644 --- a/src_features/signTx/cmd_signTx.c +++ b/src_features/signTx/cmd_signTx.c @@ -3,74 +3,79 @@ #include "ui_flow.h" #include "feature_signTx.h" -void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(tx); - parserStatus_e txResult; - uint32_t i; - if (p1 == P1_FIRST) { - if (dataLength < 1) { - PRINTF("Invalid data\n"); - THROW(0x6a80); +void handleSign(uint8_t p1, + uint8_t p2, + uint8_t *workBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(tx); + parserStatus_e txResult; + uint32_t i; + if (p1 == P1_FIRST) { + if (dataLength < 1) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + if (appState != APP_STATE_IDLE) { + reset_app_context(); + } + appState = APP_STATE_SIGNING_TX; + tmpCtx.transactionContext.pathLength = workBuffer[0]; + if ((tmpCtx.transactionContext.pathLength < 0x01) || + (tmpCtx.transactionContext.pathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + workBuffer++; + dataLength--; + for (i = 0; i < tmpCtx.transactionContext.pathLength; i++) { + if (dataLength < 4) { + PRINTF("Invalid data\n"); + THROW(0x6a80); + } + tmpCtx.transactionContext.bip32Path[i] = U4BE(workBuffer, 0); + workBuffer += 4; + dataLength -= 4; + } + dataPresent = false; + dataContext.tokenContext.pluginAvailable = 0; + initTx(&txContext, &global_sha3, &tmpContent.txContent, customProcessor, NULL); + } else if (p1 != P1_MORE) { + THROW(0x6B00); } - if (appState != APP_STATE_IDLE) { - reset_app_context(); + if (p2 != 0) { + THROW(0x6B00); } - appState = APP_STATE_SIGNING_TX; - tmpCtx.transactionContext.pathLength = workBuffer[0]; - if ((tmpCtx.transactionContext.pathLength < 0x01) || - (tmpCtx.transactionContext.pathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); + if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_TX)) { + PRINTF("Signature not initialized\n"); + THROW(0x6985); } - workBuffer++; - dataLength--; - for (i = 0; i < tmpCtx.transactionContext.pathLength; i++) { - if (dataLength < 4) { - PRINTF("Invalid data\n"); - THROW(0x6a80); - } - tmpCtx.transactionContext.bip32Path[i] = U4BE(workBuffer, 0); - workBuffer += 4; - dataLength -= 4; + if (txContext.currentField == TX_RLP_NONE) { + PRINTF("Parser not initialized\n"); + THROW(0x6985); + } + txResult = processTx(&txContext, + workBuffer, + dataLength, + (chainConfig->kind == CHAIN_KIND_WANCHAIN ? TX_FLAG_TYPE : 0)); + switch (txResult) { + case USTREAM_SUSPENDED: + break; + case USTREAM_FINISHED: + break; + case USTREAM_PROCESSING: + THROW(0x9000); + case USTREAM_FAULT: + THROW(0x6A80); + default: + PRINTF("Unexpected parser status\n"); + THROW(0x6A80); } - dataPresent = false; - dataContext.tokenContext.pluginAvailable = 0; - initTx(&txContext, &global_sha3, &tmpContent.txContent, customProcessor, NULL); - } - else - if (p1 != P1_MORE) { - THROW(0x6B00); - } - if (p2 != 0) { - THROW(0x6B00); - } - if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_TX)) { - PRINTF("Signature not initialized\n"); - THROW(0x6985); - } - if (txContext.currentField == TX_RLP_NONE) { - PRINTF("Parser not initialized\n"); - THROW(0x6985); - } - txResult = processTx(&txContext, workBuffer, dataLength, (chainConfig->kind == CHAIN_KIND_WANCHAIN ? TX_FLAG_TYPE : 0)); - switch (txResult) { - case USTREAM_SUSPENDED: - break; - case USTREAM_FINISHED: - break; - case USTREAM_PROCESSING: - THROW(0x9000); - case USTREAM_FAULT: - THROW(0x6A80); - default: - PRINTF("Unexpected parser status\n"); - THROW(0x6A80); - } - if (txResult == USTREAM_FINISHED) { - finalizeParsing(false); - } + if (txResult == USTREAM_FINISHED) { + finalizeParsing(false); + } - *flags |= IO_ASYNCH_REPLY; + *flags |= IO_ASYNCH_REPLY; } - diff --git a/src_features/signTx/feature_signTx.h b/src_features/signTx/feature_signTx.h index 0301d14..a25a650 100644 --- a/src_features/signTx/feature_signTx.h +++ b/src_features/signTx/feature_signTx.h @@ -2,4 +2,3 @@ customStatus_e customProcessor(txContext_t *context); void finalizeParsing(bool direct); - diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index cc1336b..cfbb8b7 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -11,7 +11,7 @@ uint32_t splitBinaryParameterPart(char *result, uint8_t *parameter) { uint32_t i; - for (i=0; i<8; i++) { + for (i = 0; i < 8; i++) { if (parameter[i] != 0x00) { break; } @@ -21,16 +21,14 @@ uint32_t splitBinaryParameterPart(char *result, uint8_t *parameter) { result[1] = '0'; result[2] = '\0'; return 2; - } - else { + } else { array_hexstr(result, parameter + i, 8 - i); return ((8 - i) * 2); } } customStatus_e customProcessor(txContext_t *context) { - if ((context->currentField == TX_RLP_DATA) && - (context->currentFieldLength != 0)) { + if ((context->currentField == TX_RLP_DATA) && (context->currentFieldLength != 0)) { dataPresent = true; // If handling a new contract rather than a function call, abort immediately if (tmpContent.txContent.destinationLength == 0) { @@ -38,320 +36,341 @@ customStatus_e customProcessor(txContext_t *context) { } if (context->currentFieldPos == 0) { ethPluginInitContract_t pluginInit; - // If handling the beginning of the data field, assume that the function selector is present + // If handling the beginning of the data field, assume that the function selector is + // present if (context->commandLength < 4) { PRINTF("Missing function selector\n"); return CUSTOM_FAULT; } eth_plugin_prepare_init(&pluginInit, context->workBuffer, context->currentFieldLength); - dataContext.tokenContext.pluginAvailable = eth_plugin_perform_init(tmpContent.txContent.destination, &pluginInit); + dataContext.tokenContext.pluginAvailable = + eth_plugin_perform_init(tmpContent.txContent.destination, &pluginInit); PRINTF("pluginAvailable %d\n", dataContext.tokenContext.pluginAvailable); if (dataContext.tokenContext.pluginAvailable) { - dataContext.tokenContext.fieldIndex = 0; - dataContext.tokenContext.fieldOffset = 0; - copyTxData(context, NULL, 4); - if (context->currentFieldLength == 4) { - return CUSTOM_NOT_HANDLED; - } + dataContext.tokenContext.fieldIndex = 0; + dataContext.tokenContext.fieldOffset = 0; + copyTxData(context, NULL, 4); + if (context->currentFieldLength == 4) { + return CUSTOM_NOT_HANDLED; + } } } - uint32_t blockSize; - uint32_t copySize; - uint32_t fieldPos = context->currentFieldPos; - if (fieldPos == 0) { // not reached if a plugin is available - if (!N_storage.dataAllowed) { + uint32_t blockSize; + uint32_t copySize; + uint32_t fieldPos = context->currentFieldPos; + if (fieldPos == 0) { // not reached if a plugin is available + if (!N_storage.dataAllowed) { PRINTF("Data field forbidden\n"); return CUSTOM_FAULT; - } - if (!N_storage.contractDetails) { + } + if (!N_storage.contractDetails) { return CUSTOM_NOT_HANDLED; - } - dataContext.tokenContext.fieldIndex = 0; - dataContext.tokenContext.fieldOffset = 0; - blockSize = 4; - } - else { - if (!N_storage.contractDetails && !dataContext.tokenContext.pluginAvailable) { + } + dataContext.tokenContext.fieldIndex = 0; + dataContext.tokenContext.fieldOffset = 0; + blockSize = 4; + } else { + if (!N_storage.contractDetails && !dataContext.tokenContext.pluginAvailable) { return CUSTOM_NOT_HANDLED; - } - blockSize = 32 - (dataContext.tokenContext.fieldOffset % 32); - } + } + blockSize = 32 - (dataContext.tokenContext.fieldOffset % 32); + } - // Sanity check - if ((context->currentFieldLength - fieldPos) < blockSize) { - PRINTF("Unconsistent data\n"); - return CUSTOM_FAULT; - } + // Sanity check + if ((context->currentFieldLength - fieldPos) < blockSize) { + PRINTF("Unconsistent data\n"); + return CUSTOM_FAULT; + } - copySize = (context->commandLength < blockSize ? context->commandLength : blockSize); + copySize = (context->commandLength < blockSize ? context->commandLength : blockSize); - PRINTF("currentFieldPos %d copySize %d\n", context->currentFieldPos, copySize); + PRINTF("currentFieldPos %d copySize %d\n", context->currentFieldPos, copySize); - copyTxData(context, - dataContext.tokenContext.data + dataContext.tokenContext.fieldOffset, - copySize); + copyTxData(context, + dataContext.tokenContext.data + dataContext.tokenContext.fieldOffset, + copySize); - if (context->currentFieldPos == context->currentFieldLength) { - context->currentField++; - context->processingField = false; - } + if (context->currentFieldPos == context->currentFieldLength) { + context->currentField++; + context->processingField = false; + } - dataContext.tokenContext.fieldOffset += copySize; + dataContext.tokenContext.fieldOffset += copySize; - if (copySize == blockSize) { - // Can process or display - if (dataContext.tokenContext.pluginAvailable) { + if (copySize == blockSize) { + // Can process or display + if (dataContext.tokenContext.pluginAvailable) { ethPluginProvideParameter_t pluginProvideParameter; - eth_plugin_prepare_provide_parameter(&pluginProvideParameter, - dataContext.tokenContext.data, - dataContext.tokenContext.fieldIndex * 32 + 4); - if (!eth_plugin_call(NULL, ETH_PLUGIN_PROVIDE_PARAMETER, (void*)&pluginProvideParameter)) { - PRINTF("Plugin parameter call failed\n"); - return CUSTOM_FAULT; + eth_plugin_prepare_provide_parameter(&pluginProvideParameter, + dataContext.tokenContext.data, + dataContext.tokenContext.fieldIndex * 32 + 4); + if (!eth_plugin_call(NULL, + ETH_PLUGIN_PROVIDE_PARAMETER, + (void *) &pluginProvideParameter)) { + PRINTF("Plugin parameter call failed\n"); + return CUSTOM_FAULT; } dataContext.tokenContext.fieldIndex++; dataContext.tokenContext.fieldOffset = 0; return CUSTOM_HANDLED; - } + } - if (fieldPos != 0) { - dataContext.tokenContext.fieldIndex++; - } - dataContext.tokenContext.fieldOffset = 0; - if (fieldPos == 0) { - array_hexstr(strings.tmp.tmp, dataContext.tokenContext.data, 4); - ux_flow_init(0, ux_confirm_selector_flow, NULL); - } - else { - uint32_t offset = 0; - uint32_t i; - snprintf(strings.tmp.tmp2, sizeof(strings.tmp.tmp2), "Field %d", dataContext.tokenContext.fieldIndex); - for (i=0; i<4; i++) { - offset += splitBinaryParameterPart(strings.tmp.tmp + offset, dataContext.tokenContext.data + 8 * i); - if (i != 3) { - strings.tmp.tmp[offset++] = ':'; - } - } - ux_flow_init(0, ux_confirm_parameter_flow, NULL); - } - } - else { - return CUSTOM_HANDLED; - } + if (fieldPos != 0) { + dataContext.tokenContext.fieldIndex++; + } + dataContext.tokenContext.fieldOffset = 0; + if (fieldPos == 0) { + array_hexstr(strings.tmp.tmp, dataContext.tokenContext.data, 4); + ux_flow_init(0, ux_confirm_selector_flow, NULL); + } else { + uint32_t offset = 0; + uint32_t i; + snprintf(strings.tmp.tmp2, + sizeof(strings.tmp.tmp2), + "Field %d", + dataContext.tokenContext.fieldIndex); + for (i = 0; i < 4; i++) { + offset += splitBinaryParameterPart(strings.tmp.tmp + offset, + dataContext.tokenContext.data + 8 * i); + if (i != 3) { + strings.tmp.tmp[offset++] = ':'; + } + } + ux_flow_init(0, ux_confirm_parameter_flow, NULL); + } + } else { + return CUSTOM_HANDLED; + } - return CUSTOM_SUSPENDED; + return CUSTOM_SUSPENDED; } return CUSTOM_NOT_HANDLED; } - -void to_uppercase(char* str, unsigned char size){ - for (unsigned char i = 0; i < size && str[i] != 0; i++) - { +void to_uppercase(char *str, unsigned char size) { + for (unsigned char i = 0; i < size && str[i] != 0; i++) { str[i] = str[i] >= 'a' ? str[i] - ('a' - 'A') : str[i]; } } -void compareOrCopy(char* preapproved_string, char* parsed_string, bool silent_mode){ - if(silent_mode){ - /* ETH address are not fundamentally case sensitive but might - have some for checksum purpose, so let's get rid of these diffs */ - to_uppercase(preapproved_string, strlen(preapproved_string)); - to_uppercase(parsed_string, strlen(parsed_string)); - if(memcmp(preapproved_string, parsed_string, strlen(preapproved_string))){ - THROW(ERR_SILENT_MODE_CHECK_FAILED); +void compareOrCopy(char *preapproved_string, char *parsed_string, bool silent_mode) { + if (silent_mode) { + /* ETH address are not fundamentally case sensitive but might + have some for checksum purpose, so let's get rid of these diffs */ + to_uppercase(preapproved_string, strlen(preapproved_string)); + to_uppercase(parsed_string, strlen(parsed_string)); + if (memcmp(preapproved_string, parsed_string, strlen(preapproved_string))) { + THROW(ERR_SILENT_MODE_CHECK_FAILED); + } + } else { + strcpy(preapproved_string, parsed_string); } - } - else{ - strcpy(preapproved_string, parsed_string); - } } void reportFinalizeError(bool direct) { - reset_app_context(); - if (direct) { - THROW(0x6A80); - } - else { - io_seproxyhal_send_status(0x6A80); - ui_idle(); - } + reset_app_context(); + if (direct) { + THROW(0x6A80); + } else { + io_seproxyhal_send_status(0x6A80); + ui_idle(); + } } void computeFees(char *displayBuffer, uint32_t displayBufferSize) { - uint256_t gasPrice, startGas, uint256; - uint8_t *feeTicker = (uint8_t *)PIC(chainConfig->coinName); - uint8_t tickerOffset = 0; - uint32_t i; + uint256_t gasPrice, startGas, uint256; + uint8_t *feeTicker = (uint8_t *) PIC(chainConfig->coinName); + uint8_t tickerOffset = 0; + uint32_t i; - PRINTF("Max fee\n"); - PRINTF("Gasprice %.*H\n", tmpContent.txContent.gasprice.length, tmpContent.txContent.gasprice.value); - PRINTF("Startgas %.*H\n", tmpContent.txContent.startgas.length, tmpContent.txContent.startgas.value); - convertUint256BE(tmpContent.txContent.gasprice.value, tmpContent.txContent.gasprice.length, &gasPrice); - convertUint256BE(tmpContent.txContent.startgas.value, tmpContent.txContent.startgas.length, &startGas); - mul256(&gasPrice, &startGas, &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; - tickerOffset=0; - memset(displayBuffer, 0, displayBufferSize); - while (feeTicker[tickerOffset]) { - displayBuffer[tickerOffset] = feeTicker[tickerOffset]; - tickerOffset++; - } - while (G_io_apdu_buffer[i]) { - displayBuffer[tickerOffset + i] = G_io_apdu_buffer[i]; - i++; - } - displayBuffer[tickerOffset + i] = '\0'; + PRINTF("Max fee\n"); + PRINTF("Gasprice %.*H\n", + tmpContent.txContent.gasprice.length, + tmpContent.txContent.gasprice.value); + PRINTF("Startgas %.*H\n", + tmpContent.txContent.startgas.length, + tmpContent.txContent.startgas.value); + convertUint256BE(tmpContent.txContent.gasprice.value, + tmpContent.txContent.gasprice.length, + &gasPrice); + convertUint256BE(tmpContent.txContent.startgas.value, + tmpContent.txContent.startgas.length, + &startGas); + mul256(&gasPrice, &startGas, &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; + tickerOffset = 0; + memset(displayBuffer, 0, displayBufferSize); + while (feeTicker[tickerOffset]) { + displayBuffer[tickerOffset] = feeTicker[tickerOffset]; + tickerOffset++; + } + while (G_io_apdu_buffer[i]) { + displayBuffer[tickerOffset + i] = G_io_apdu_buffer[i]; + i++; + } + displayBuffer[tickerOffset + i] = '\0'; } -void finalizeParsing(bool direct) { - char displayBuffer[50]; - uint8_t decimals = WEI_TO_ETHER; - uint8_t *ticker = (uint8_t *)PIC(chainConfig->coinName); - ethPluginFinalize_t pluginFinalize; - tokenDefinition_t *token1 = NULL, *token2 = NULL; - bool genericUI = true; +void finalizeParsing(bool direct) { + char displayBuffer[50]; + uint8_t decimals = WEI_TO_ETHER; + uint8_t *ticker = (uint8_t *) PIC(chainConfig->coinName); + ethPluginFinalize_t pluginFinalize; + tokenDefinition_t *token1 = NULL, *token2 = NULL; + bool genericUI = true; - // Verify the chain - if (chainConfig->chainId != 0) { - uint32_t v = getV(&tmpContent.txContent); - if (chainConfig->chainId != v) { - reset_app_context(); - PRINTF("Invalid chainId %d expected %d\n", v, chainConfig->chainId); - reportFinalizeError(direct); - if (!direct) { - return; - } - } - } - // Store the hash - cx_hash((cx_hash_t *)&global_sha3, CX_LAST, tmpCtx.transactionContext.hash, 0, tmpCtx.transactionContext.hash, 32); - - // Finalize the plugin handling - if (dataContext.tokenContext.pluginAvailable) { - genericUI = false; - eth_plugin_prepare_finalize(&pluginFinalize); - if (!eth_plugin_call(NULL, ETH_PLUGIN_FINALIZE, (void*)&pluginFinalize)) { - PRINTF("Plugin finalize call failed\n"); - reportFinalizeError(direct); - if (!direct) { - return; - } - } - // Lookup tokens if requested - if (pluginFinalize.tokenLookup1 != NULL) { - ethPluginProvideToken_t pluginProvideToken; - token1 = getKnownToken(pluginFinalize.tokenLookup1); - if (pluginFinalize.tokenLookup2 != NULL) { - token2 = getKnownToken(pluginFinalize.tokenLookup2); - } - eth_plugin_prepare_provide_token(&pluginProvideToken, token1, token2); - if (!eth_plugin_call(NULL, ETH_PLUGIN_PROVIDE_TOKEN, (void*)&pluginProvideToken)) { - PRINTF("Plugin provide token call failed\n"); - reportFinalizeError(direct); - if (!direct) { - return; - } - } - pluginFinalize.result = pluginProvideToken.result; - } - if (pluginFinalize.result != ETH_PLUGIN_RESULT_FALLBACK) { - // Handle the right interface - switch(pluginFinalize.uiType) { - case ETH_UI_TYPE_GENERIC: - dataPresent = false; - dataContext.tokenContext.pluginUiMaxItems = pluginFinalize.numScreens; - break; - case ETH_UI_TYPE_AMOUNT_ADDRESS: - genericUI = true; - dataPresent = false; - if ((pluginFinalize.amount == NULL) || (pluginFinalize.address == NULL)) { - PRINTF("Incorrect amount/address set by plugin\n"); + // Verify the chain + if (chainConfig->chainId != 0) { + uint32_t v = getV(&tmpContent.txContent); + if (chainConfig->chainId != v) { + reset_app_context(); + PRINTF("Invalid chainId %d expected %d\n", v, chainConfig->chainId); reportFinalizeError(direct); if (!direct) { - return; - } - } - memmove(tmpContent.txContent.value.value, pluginFinalize.amount, 32); - tmpContent.txContent.value.length = 32; - memmove(tmpContent.txContent.destination, pluginFinalize.address, 20); - tmpContent.txContent.destinationLength = 20; - if (token1 != NULL) { - decimals = token1->decimals; - ticker = token1->ticker; - } - break; - default: - PRINTF("ui type %d not supported\n", pluginFinalize.uiType); - reportFinalizeError(direct); - if (!direct) { + return; + } + } + } + // Store the hash + cx_hash((cx_hash_t *) &global_sha3, + CX_LAST, + tmpCtx.transactionContext.hash, + 0, + tmpCtx.transactionContext.hash, + 32); + + // Finalize the plugin handling + if (dataContext.tokenContext.pluginAvailable) { + genericUI = false; + eth_plugin_prepare_finalize(&pluginFinalize); + if (!eth_plugin_call(NULL, ETH_PLUGIN_FINALIZE, (void *) &pluginFinalize)) { + PRINTF("Plugin finalize call failed\n"); + reportFinalizeError(direct); + if (!direct) { + return; + } + } + // Lookup tokens if requested + if (pluginFinalize.tokenLookup1 != NULL) { + ethPluginProvideToken_t pluginProvideToken; + token1 = getKnownToken(pluginFinalize.tokenLookup1); + if (pluginFinalize.tokenLookup2 != NULL) { + token2 = getKnownToken(pluginFinalize.tokenLookup2); + } + eth_plugin_prepare_provide_token(&pluginProvideToken, token1, token2); + if (!eth_plugin_call(NULL, ETH_PLUGIN_PROVIDE_TOKEN, (void *) &pluginProvideToken)) { + PRINTF("Plugin provide token call failed\n"); + reportFinalizeError(direct); + if (!direct) { + return; + } + } + pluginFinalize.result = pluginProvideToken.result; + } + if (pluginFinalize.result != ETH_PLUGIN_RESULT_FALLBACK) { + // Handle the right interface + switch (pluginFinalize.uiType) { + case ETH_UI_TYPE_GENERIC: + dataPresent = false; + dataContext.tokenContext.pluginUiMaxItems = pluginFinalize.numScreens; + break; + case ETH_UI_TYPE_AMOUNT_ADDRESS: + genericUI = true; + dataPresent = false; + if ((pluginFinalize.amount == NULL) || (pluginFinalize.address == NULL)) { + PRINTF("Incorrect amount/address set by plugin\n"); + reportFinalizeError(direct); + if (!direct) { + return; + } + } + memmove(tmpContent.txContent.value.value, pluginFinalize.amount, 32); + tmpContent.txContent.value.length = 32; + memmove(tmpContent.txContent.destination, pluginFinalize.address, 20); + tmpContent.txContent.destinationLength = 20; + if (token1 != NULL) { + decimals = token1->decimals; + ticker = token1->ticker; + } + break; + default: + PRINTF("ui type %d not supported\n", pluginFinalize.uiType); + reportFinalizeError(direct); + if (!direct) { + return; + } + } + } else { + genericUI = true; + } + } + + if (dataPresent && !N_storage.dataAllowed) { + PRINTF("Data field forbidden\n"); + reportFinalizeError(direct); + if (!direct) { return; - } - } + } } - else { - genericUI = true; + // Prepare destination address to display + if (genericUI) { + if (tmpContent.txContent.destinationLength != 0) { + displayBuffer[0] = '0'; + displayBuffer[1] = 'x'; + getEthAddressStringFromBinary(tmpContent.txContent.destination, + (uint8_t *) displayBuffer + 2, + &global_sha3, + chainConfig); + compareOrCopy(strings.common.fullAddress, displayBuffer, called_from_swap); + } else { + strcpy(strings.common.fullAddress, "Contract"); + } + } + // Prepare amount to display + if (genericUI) { + amountToString(tmpContent.txContent.value.value, + tmpContent.txContent.value.length, + decimals, + (char *) ticker, + displayBuffer, + sizeof(displayBuffer)); + compareOrCopy(strings.common.fullAmount, displayBuffer, called_from_swap); + } + // Compute maximum fee + if (genericUI) { + computeFees(displayBuffer, sizeof(displayBuffer)); + compareOrCopy(strings.common.maxFee, displayBuffer, called_from_swap); } - } - if (dataPresent && !N_storage.dataAllowed) { - PRINTF("Data field forbidden\n"); - reportFinalizeError(direct); - if (!direct) { - return; - } - } - // Prepare destination address to display - if (genericUI) { - if (tmpContent.txContent.destinationLength != 0) { - displayBuffer[0] = '0'; - displayBuffer[1] = 'x'; - getEthAddressStringFromBinary(tmpContent.txContent.destination, (uint8_t*)displayBuffer+2, &global_sha3, chainConfig); - compareOrCopy(strings.common.fullAddress, displayBuffer, called_from_swap); - } - else - { - strcpy(strings.common.fullAddress, "Contract"); - } - } - // Prepare amount to display - if (genericUI) { - amountToString(tmpContent.txContent.value.value, tmpContent.txContent.value.length, decimals, (char*)ticker, displayBuffer, sizeof(displayBuffer)); - compareOrCopy(strings.common.fullAmount, displayBuffer, called_from_swap); - } - // Compute maximum fee - if (genericUI) { - computeFees(displayBuffer, sizeof(displayBuffer)); - compareOrCopy(strings.common.maxFee, displayBuffer, called_from_swap); - } + bool no_consent = false; - bool no_consent = false; - - no_consent = called_from_swap; + no_consent = called_from_swap; #ifdef NO_CONSENT - no_consent = true; -#endif // NO_CONSENT + no_consent = true; +#endif // NO_CONSENT - if(no_consent){ - io_seproxyhal_touch_tx_ok(NULL); - } - else{ - - if (genericUI) { - ux_flow_init(0, - ((dataPresent && !N_storage.contractDetails) ? ux_approval_tx_data_warning_flow : ux_approval_tx_flow), - NULL); + if (no_consent) { + io_seproxyhal_touch_tx_ok(NULL); + } else { + if (genericUI) { + ux_flow_init( + 0, + ((dataPresent && !N_storage.contractDetails) ? ux_approval_tx_data_warning_flow + : ux_approval_tx_flow), + NULL); + } else { + plugin_ui_start(); + } } - else { - plugin_ui_start(); - } - } - } diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c index 17efa4c..23cc80f 100644 --- a/src_features/signTx/ui_common_signTx.c +++ b/src_features/signTx/ui_common_signTx.c @@ -10,34 +10,38 @@ unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { uint32_t tx = 0; uint32_t v = getV(&tmpContent.txContent); io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32(CX_CURVE_256K1, tmpCtx.transactionContext.bip32Path, + 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); + privateKeyData, + NULL); + cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); explicit_bzero(privateKeyData, sizeof(privateKeyData)); unsigned int info = 0; io_seproxyhal_io_heartbeat(); - signatureLength = - cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - tmpCtx.transactionContext.hash, - sizeof(tmpCtx.transactionContext.hash), signature, sizeof(signature), &info); + signatureLength = cx_ecdsa_sign(&privateKey, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + tmpCtx.transactionContext.hash, + sizeof(tmpCtx.transactionContext.hash), + signature, + sizeof(signature), + &info); explicit_bzero(&privateKey, sizeof(privateKey)); // Parity is present in the sequence tag in the legacy API if (tmpContent.txContent.vLength == 0) { - // Legacy API - G_io_apdu_buffer[0] = 27; - } - else { - // New API - // Note that this is wrong for a large v, but the client can always recover - G_io_apdu_buffer[0] = (v * 2) + 35; + // Legacy API + G_io_apdu_buffer[0] = 27; + } else { + // New API + // Note that this is wrong for a large v, but the client can always recover + G_io_apdu_buffer[0] = (v * 2) + 35; } if (info & CX_ECCINFO_PARITY_ODD) { - G_io_apdu_buffer[0]++; + G_io_apdu_buffer[0]++; } if (info & CX_ECCINFO_xGTn) { - G_io_apdu_buffer[0] += 2; + G_io_apdu_buffer[0] += 2; } format_signature_out(signature); tx = 65; @@ -45,13 +49,13 @@ unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { 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); - if(called_from_swap){ + if (called_from_swap) { os_sched_exit(0); } reset_app_context(); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e) { @@ -62,31 +66,31 @@ unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } unsigned int io_seproxyhal_touch_data_ok(const bagl_element_t *e) { parserStatus_e txResult = USTREAM_FINISHED; txResult = continueTx(&txContext); switch (txResult) { - case USTREAM_SUSPENDED: - break; - case USTREAM_FINISHED: - break; - case USTREAM_PROCESSING: - io_seproxyhal_send_status(0x9000); - ui_idle(); - break; - case USTREAM_FAULT: - reset_app_context(); - io_seproxyhal_send_status(0x6A80); - ui_idle(); - break; - default: - PRINTF("Unexpected parser status\n"); - reset_app_context(); - io_seproxyhal_send_status(0x6A80); - ui_idle(); + case USTREAM_SUSPENDED: + break; + case USTREAM_FINISHED: + break; + case USTREAM_PROCESSING: + io_seproxyhal_send_status(0x9000); + ui_idle(); + break; + case USTREAM_FAULT: + reset_app_context(); + io_seproxyhal_send_status(0x6A80); + ui_idle(); + break; + default: + PRINTF("Unexpected parser status\n"); + reset_app_context(); + io_seproxyhal_send_status(0x6A80); + ui_idle(); } if (txResult == USTREAM_FINISHED) { @@ -101,6 +105,5 @@ unsigned int io_seproxyhal_touch_data_cancel(const bagl_element_t *e) { io_seproxyhal_send_status(0x6985); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } - diff --git a/src_features/signTx/ui_flow_signTx.c b/src_features/signTx/ui_flow_signTx.c index 6a65e1f..09c55e2 100644 --- a/src_features/signTx/ui_flow_signTx.c +++ b/src_features/signTx/ui_flow_signTx.c @@ -1,6 +1,7 @@ #include "shared_context.h" #include "ui_callbacks.h" +// clang-format off UX_STEP_NOCB( ux_confirm_selector_flow_1_step, pnn, @@ -33,15 +34,16 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on - UX_FLOW(ux_confirm_selector_flow, - &ux_confirm_selector_flow_1_step, - &ux_confirm_selector_flow_2_step, - &ux_confirm_selector_flow_3_step, - &ux_confirm_selector_flow_4_step -); +UX_FLOW(ux_confirm_selector_flow, + &ux_confirm_selector_flow_1_step, + &ux_confirm_selector_flow_2_step, + &ux_confirm_selector_flow_3_step, + &ux_confirm_selector_flow_4_step); ////////////////////////////////////////////////////////////////////// +// clang-format off UX_STEP_NOCB( ux_confirm_parameter_flow_1_step, pnn, @@ -73,15 +75,16 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on UX_FLOW(ux_confirm_parameter_flow, - &ux_confirm_parameter_flow_1_step, - &ux_confirm_parameter_flow_2_step, - &ux_confirm_parameter_flow_3_step, - &ux_confirm_parameter_flow_4_step -); + &ux_confirm_parameter_flow_1_step, + &ux_confirm_parameter_flow_2_step, + &ux_confirm_parameter_flow_3_step, + &ux_confirm_parameter_flow_4_step); ////////////////////////////////////////////////////////////////////// +// clang-format off UX_STEP_NOCB(ux_approval_tx_1_step, pnn, { @@ -135,23 +138,21 @@ UX_STEP_NOCB(ux_approval_tx_data_warning_step, "Data", "Present", }); - +// clang-format on UX_FLOW(ux_approval_tx_flow, - &ux_approval_tx_1_step, - &ux_approval_tx_2_step, - &ux_approval_tx_3_step, - &ux_approval_tx_4_step, - &ux_approval_tx_5_step, - &ux_approval_tx_6_step -); + &ux_approval_tx_1_step, + &ux_approval_tx_2_step, + &ux_approval_tx_3_step, + &ux_approval_tx_4_step, + &ux_approval_tx_5_step, + &ux_approval_tx_6_step); UX_FLOW(ux_approval_tx_data_warning_flow, - &ux_approval_tx_1_step, - &ux_approval_tx_data_warning_step, - &ux_approval_tx_2_step, - &ux_approval_tx_3_step, - &ux_approval_tx_4_step, - &ux_approval_tx_5_step, - &ux_approval_tx_6_step -); \ No newline at end of file + &ux_approval_tx_1_step, + &ux_approval_tx_data_warning_step, + &ux_approval_tx_2_step, + &ux_approval_tx_3_step, + &ux_approval_tx_4_step, + &ux_approval_tx_5_step, + &ux_approval_tx_6_step); \ No newline at end of file diff --git a/src_features/stark_getPublicKey/cmd_stark_getPublicKey.c b/src_features/stark_getPublicKey/cmd_stark_getPublicKey.c index dc0a35f..54edf09 100644 --- a/src_features/stark_getPublicKey/cmd_stark_getPublicKey.c +++ b/src_features/stark_getPublicKey/cmd_stark_getPublicKey.c @@ -6,55 +6,61 @@ #include "feature_stark_getPublicKey.h" #include "ui_flow.h" -void handleStarkwareGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - UNUSED(dataLength); - uint8_t privateKeyData[32]; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint32_t i; - uint8_t bip32PathLength = *(dataBuffer++); - cx_ecfp_private_key_t privateKey; - reset_app_context(); - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { - THROW(0x6B00); - } - if (p2 != 0) { - THROW(0x6B00); - } - for (i = 0; i < bip32PathLength; i++) { - bip32Path[i] = U4BE(dataBuffer, 0); - dataBuffer += 4; - } - io_seproxyhal_io_heartbeat(); - starkDerivePrivateKey(bip32Path, bip32PathLength, privateKeyData); - cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); - io_seproxyhal_io_heartbeat(); - cx_ecfp_generate_pair(CX_CURVE_Stark256, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); - explicit_bzero(&privateKey, sizeof(privateKey)); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); - io_seproxyhal_io_heartbeat(); +void handleStarkwareGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + UNUSED(dataLength); + uint8_t privateKeyData[32]; + uint32_t bip32Path[MAX_BIP32_PATH]; + uint32_t i; + uint8_t bip32PathLength = *(dataBuffer++); + cx_ecfp_private_key_t privateKey; + reset_app_context(); + if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { + THROW(0x6B00); + } + if (p2 != 0) { + THROW(0x6B00); + } + for (i = 0; i < bip32PathLength; i++) { + bip32Path[i] = U4BE(dataBuffer, 0); + dataBuffer += 4; + } + io_seproxyhal_io_heartbeat(); + starkDerivePrivateKey(bip32Path, bip32PathLength, privateKeyData); + cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); + io_seproxyhal_io_heartbeat(); + cx_ecfp_generate_pair(CX_CURVE_Stark256, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); + explicit_bzero(&privateKey, sizeof(privateKey)); + explicit_bzero(privateKeyData, sizeof(privateKeyData)); + io_seproxyhal_io_heartbeat(); #ifndef NO_CONSENT - if (p1 == P1_NON_CONFIRM) -#endif // NO_CONSENT - { - *tx = set_result_get_stark_publicKey(); - THROW(0x9000); - } + if (p1 == P1_NON_CONFIRM) +#endif // NO_CONSENT + { + *tx = set_result_get_stark_publicKey(); + THROW(0x9000); + } #ifndef NO_CONSENT - else - { - // prepare for a UI based reply - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, tmpCtx.publicKeyContext.publicKey.W + 1); - ux_flow_init(0, ux_display_stark_public_flow, NULL); + else { + // prepare for a UI based reply + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "0x%.*H", + 32, + tmpCtx.publicKeyContext.publicKey.W + 1); + ux_flow_init(0, ux_display_stark_public_flow, NULL); - *flags |= IO_ASYNCH_REPLY; - } -#endif // NO_CONSENT + *flags |= IO_ASYNCH_REPLY; + } +#endif // NO_CONSENT } - #endif diff --git a/src_features/stark_getPublicKey/feature_stark_getPublicKey.h b/src_features/stark_getPublicKey/feature_stark_getPublicKey.h index 805ac3e..bb50747 100644 --- a/src_features/stark_getPublicKey/feature_stark_getPublicKey.h +++ b/src_features/stark_getPublicKey/feature_stark_getPublicKey.h @@ -1,4 +1,3 @@ #include "shared_context.h" uint32_t set_result_get_stark_publicKey(void); - diff --git a/src_features/stark_getPublicKey/logic_stark_getPublicKey.c b/src_features/stark_getPublicKey/logic_stark_getPublicKey.c index 20fb704..8c99cfd 100644 --- a/src_features/stark_getPublicKey/logic_stark_getPublicKey.c +++ b/src_features/stark_getPublicKey/logic_stark_getPublicKey.c @@ -11,5 +11,3 @@ uint32_t set_result_get_stark_publicKey() { } #endif - - diff --git a/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c b/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c index b726d29..db03c53 100644 --- a/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c +++ b/src_features/stark_getPublicKey/ui_common_stark_getPublicKey.c @@ -13,8 +13,7 @@ unsigned int io_seproxyhal_touch_stark_pubkey_ok(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } #endif - diff --git a/src_features/stark_getPublicKey/ui_flow_stark_getPublicKey.c b/src_features/stark_getPublicKey/ui_flow_stark_getPublicKey.c index 6ac04e8..7f7b374 100644 --- a/src_features/stark_getPublicKey/ui_flow_stark_getPublicKey.c +++ b/src_features/stark_getPublicKey/ui_flow_stark_getPublicKey.c @@ -5,6 +5,7 @@ unsigned int io_seproxyhal_touch_stark_pubkey_ok(const bagl_element_t *e); +// clang-format off UX_STEP_NOCB( ux_display_stark_public_flow_1_step, pnn, @@ -36,13 +37,12 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on UX_FLOW(ux_display_stark_public_flow, - &ux_display_stark_public_flow_1_step, - &ux_display_stark_public_flow_2_step, - &ux_display_stark_public_flow_3_step, - &ux_display_stark_public_flow_4_step -); + &ux_display_stark_public_flow_1_step, + &ux_display_stark_public_flow_2_step, + &ux_display_stark_public_flow_3_step, + &ux_display_stark_public_flow_4_step); #endif - diff --git a/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c b/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c index 076c6f6..6433e33 100644 --- a/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c +++ b/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c @@ -4,56 +4,61 @@ #include "apdu_constants.h" #include "ui_flow.h" -void handleStarkwareProvideQuantum(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - size_t i = 0; - uint8_t expectedDataSize = 20 + 32; - uint8_t addressZero = 0; - tokenDefinition_t *currentToken = NULL; - if (appState != APP_STATE_IDLE) { - reset_app_context(); - } - switch(p1) { - case STARK_QUANTUM_LEGACY: - break; - case STARK_QUANTUM_ETH: - case STARK_QUANTUM_ERC20: - case STARK_QUANTUM_ERC721: - case STARK_QUANTUM_MINTABLE_ERC20: - case STARK_QUANTUM_MINTABLE_ERC721: - expectedDataSize += 32; - break; - default: - THROW(0x6B00); - } - if (dataLength != expectedDataSize) { - THROW(0x6700); - } - if (p1 == STARK_QUANTUM_LEGACY) { - addressZero = allzeroes(dataBuffer, 20); - } - if ((p1 != STARK_QUANTUM_ETH) && !addressZero) { - for(i=0; iaddress, dataBuffer, 20) == 0)) { - break; - } +void handleStarkwareProvideQuantum(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + size_t i = 0; + uint8_t expectedDataSize = 20 + 32; + uint8_t addressZero = 0; + tokenDefinition_t *currentToken = NULL; + if (appState != APP_STATE_IDLE) { + reset_app_context(); } - if (i == MAX_TOKEN) { - PRINTF("Associated token not found\n"); - THROW(0x6A80); + switch (p1) { + case STARK_QUANTUM_LEGACY: + break; + case STARK_QUANTUM_ETH: + case STARK_QUANTUM_ERC20: + case STARK_QUANTUM_ERC721: + case STARK_QUANTUM_MINTABLE_ERC20: + case STARK_QUANTUM_MINTABLE_ERC721: + expectedDataSize += 32; + break; + default: + THROW(0x6B00); } - } - else { - i = MAX_TOKEN; - } - memmove(dataContext.tokenContext.quantum, dataBuffer + 20, 32); - if (p1 != STARK_QUANTUM_LEGACY) { - memmove(dataContext.tokenContext.mintingBlob, dataBuffer + 20 + 32, 32); - } - dataContext.tokenContext.quantumIndex = i; - dataContext.tokenContext.quantumType = p1; - quantumSet = true; - THROW(0x9000); + if (dataLength != expectedDataSize) { + THROW(0x6700); + } + if (p1 == STARK_QUANTUM_LEGACY) { + addressZero = allzeroes(dataBuffer, 20); + } + if ((p1 != STARK_QUANTUM_ETH) && !addressZero) { + for (i = 0; i < MAX_TOKEN; i++) { + currentToken = &tmpCtx.transactionContext.tokens[i]; + if (tmpCtx.transactionContext.tokenSet[i] && + (memcmp(currentToken->address, dataBuffer, 20) == 0)) { + break; + } + } + if (i == MAX_TOKEN) { + PRINTF("Associated token not found\n"); + THROW(0x6A80); + } + } else { + i = MAX_TOKEN; + } + memmove(dataContext.tokenContext.quantum, dataBuffer + 20, 32); + if (p1 != STARK_QUANTUM_LEGACY) { + memmove(dataContext.tokenContext.mintingBlob, dataBuffer + 20 + 32, 32); + } + dataContext.tokenContext.quantumIndex = i; + dataContext.tokenContext.quantumType = p1; + quantumSet = true; + THROW(0x9000); } #endif diff --git a/src_features/stark_sign/cmd_stark_sign.c b/src_features/stark_sign/cmd_stark_sign.c index b2c3b3b..78d6b61 100644 --- a/src_features/stark_sign/cmd_stark_sign.c +++ b/src_features/stark_sign/cmd_stark_sign.c @@ -7,208 +7,253 @@ #include "poorstream.h" #include "ui_callbacks.h" -#define U8BE(buf, off) (uint64_t)((((uint64_t)U4BE(buf, off)) << 32) | (((uint64_t)U4BE(buf, off + 4)) & 0xFFFFFFFF)) +#define U8BE(buf, off) \ + (uint64_t)((((uint64_t) U4BE(buf, off)) << 32) | (((uint64_t) U4BE(buf, off + 4)) & 0xFFFFFFFF)) #define TMP_OFFSET 140 -void handleStarkwareSignMessage(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - uint8_t privateKeyData[32]; - uint32_t i; - uint8_t bip32PathLength = *(dataBuffer); - uint8_t offset = 1; - cx_ecfp_private_key_t privateKey; - poorstream_t bitstream; - bool selfTransfer = false; - uint8_t order = 1; - uint8_t protocol = 2; - uint8_t preOffset, postOffset; - uint8_t zeroTest; - // Initial checks - if (appState != APP_STATE_IDLE) { - reset_app_context(); - } - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - switch(p1) { - case P1_STARK_ORDER: - protocol = 1; - break; - case P1_STARK_TRANSFER: - protocol = 1; - order = 0; - break; - case P1_STARK_ORDER_V2: - break; - case P1_STARK_TRANSFER_V2: - case P1_STARK_CONDITIONAL_TRANSFER: - order = 0; - break; - default: - THROW(0x6B00); - } - postOffset = (protocol == 2 ? 1 + 32 : 0); - preOffset = (protocol == 2 ? 1 : 0); - if (order) { - if (dataLength != (20 + 32 + 20 + 32 + 4 + 4 + 8 + 8 + 4 + 4 + 1 + 4 * bip32PathLength + - 2 * postOffset)) { - THROW(0x6700); - } - } - else { - if (dataLength != (20 + 32 + 32 + 4 + 4 + 8 + 4 + 4 + 1 + 4 * bip32PathLength + - postOffset + (p1 == P1_STARK_CONDITIONAL_TRANSFER ? 32 + 20 : 0))) { - THROW(0x6700); - } - } - if (p2 != 0) { - THROW(0x6B00); - } - tmpCtx.transactionContext.pathLength = bip32PathLength; - for (i = 0; i < bip32PathLength; i++) { - tmpCtx.transactionContext.bip32Path[i] = U4BE(dataBuffer, offset); - PRINTF("Storing path %d %d\n", i, tmpCtx.transactionContext.bip32Path[i]); - offset += 4; - } - // Discard the path to use part of dataBuffer as a temporary buffer - memmove(dataBuffer, dataBuffer + offset, dataLength - offset); - dataContext.starkContext.conditional = (p1 == P1_STARK_CONDITIONAL_TRANSFER); - if (dataContext.starkContext.conditional) { - memmove(dataContext.starkContext.fact, dataBuffer + 20 + 32 + postOffset + 32 + 4 + 4 + 8 + 4 + 4, 32); - memmove(dataContext.starkContext.conditionAddress, dataBuffer + 20 + 32 + postOffset + 32 + 4 + 4 + 8 + 4 + 4 + 32, 20); - PRINTF("Fact %.*H\n", 32, dataContext.starkContext.fact); - PRINTF("Address %.*H\n", 20, dataContext.starkContext.conditionAddress); - } - - zeroTest = allzeroes(dataBuffer + preOffset, 20); - if (zeroTest && (protocol == 2) && (dataBuffer[0] != STARK_QUANTUM_ETH)) { - PRINTF("stark - unexpected quantum descriptor type for null first address %d\n", dataBuffer[0]); - THROW(0x6A80); - } - if (!zeroTest && getKnownToken(dataBuffer + preOffset) == NULL) { - PRINTF("stark - cannot process unknown token %.*H", 20, dataBuffer + preOffset); - THROW(0x6A80); - } - if (order) { - zeroTest = allzeroes(dataBuffer + 20 + 32 + postOffset + preOffset, 20); - if (zeroTest && (protocol == 2) && (dataBuffer[1 + 20 + 32 + 32] != STARK_QUANTUM_ETH)) { - PRINTF("stark - unexpected quantum descriptor type for null second address %d\n", dataBuffer[1 + 20 + 32 + 32]); - THROW(0x6A80); +void handleStarkwareSignMessage(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + uint8_t privateKeyData[32]; + uint32_t i; + uint8_t bip32PathLength = *(dataBuffer); + uint8_t offset = 1; + cx_ecfp_private_key_t privateKey; + poorstream_t bitstream; + bool selfTransfer = false; + uint8_t order = 1; + uint8_t protocol = 2; + uint8_t preOffset, postOffset; + uint8_t zeroTest; + // Initial checks + if (appState != APP_STATE_IDLE) { + reset_app_context(); } - if (!zeroTest && getKnownToken(dataBuffer + 20 + 32 + postOffset + preOffset) == NULL) { - PRINTF("stark - cannot process unknown token %.*H", 20, dataBuffer + 20 + 32 + postOffset + preOffset); - THROW(0x6A80); + if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); } - } - // Prepare the Stark parameters - io_seproxyhal_io_heartbeat(); - compute_token_id(&global_sha3, dataBuffer + preOffset, - (protocol == 2 ? dataBuffer[0] : STARK_QUANTUM_LEGACY), - dataBuffer + preOffset + 20, - (protocol == 2 ? dataBuffer + 1 + 20 + 32 : NULL), false, dataContext.starkContext.w1); - if (order) { - io_seproxyhal_io_heartbeat(); - compute_token_id(&global_sha3, dataBuffer + 20 + 32 + postOffset + preOffset, - (protocol == 2 ? dataBuffer[1 + 20 + 32 + 32] : STARK_QUANTUM_LEGACY), - dataBuffer + 20 + 32 + postOffset + preOffset + 20, - (protocol == 2 ? dataBuffer + 1 + 20 + 32 + 32 + 1 + 20 + 32 : NULL), false, dataContext.starkContext.w2); - offset = 20 + 32 + postOffset + 20 + 32 + postOffset; - } - else { - memmove(dataContext.starkContext.w2, dataBuffer + 20 + 32 + postOffset, 32); - offset = 20 + 32 + postOffset + 32; - } - - poorstream_init(&bitstream, dataContext.starkContext.w3); - poorstream_write_bits(&bitstream, 0, 11); // padding - poorstream_write_bits(&bitstream, - (p1 == P1_STARK_CONDITIONAL_TRANSFER ? STARK_CONDITIONAL_TRANSFER_TYPE : - order ? STARK_ORDER_TYPE : STARK_TRANSFER_TYPE), 4); - poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset), 31); - poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset + 4), 31); - poorstream_write_bits(&bitstream, U8BE(dataBuffer, offset + 4 + 4), 63); - if (order) { - poorstream_write_bits(&bitstream, U8BE(dataBuffer, offset + 4 + 4 + 8), 63); - offset += 4 + 4 + 8 + 8; - } - else { - poorstream_write_bits(&bitstream, 0, 63); - offset += 4 + 4 + 8; - } - poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset), 31); - poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset + 4), 22); - - PRINTF("stark w1 %.*H\n", 32, dataContext.starkContext.w1); - PRINTF("stark w2 %.*H\n", 32, dataContext.starkContext.w2); - PRINTF("stark w3 %.*H\n", 32, dataContext.starkContext.w3); - - if (dataContext.starkContext.conditional) { - cx_keccak_init(&global_sha3, 256); - cx_hash((cx_hash_t*)&global_sha3, 0, dataContext.starkContext.conditionAddress, 20, NULL, 0); - cx_hash((cx_hash_t*)&global_sha3, CX_LAST, dataContext.starkContext.fact, 32, dataContext.starkContext.w4, 32); - dataContext.starkContext.w4[0] &= 0x03; - PRINTF("stark w4 %.*H\n", 32, dataContext.starkContext.w4); - } - // Prepare the UI - if (order) { - io_seproxyhal_io_heartbeat(); - // amount to sell - stark_get_amount_string(dataBuffer + preOffset, - dataBuffer + preOffset + 20, - dataBuffer + 20 + 32 + postOffset + 20 + 32 + postOffset + 4 + 4, - (char*)(dataBuffer + TMP_OFFSET), strings.common.fullAmount); - io_seproxyhal_io_heartbeat(); - // amount to buy - stark_get_amount_string(dataBuffer + 20 + 32 + postOffset + preOffset, - dataBuffer + 20 + 32 + postOffset + preOffset + 20, - dataBuffer + 20 + 32 + postOffset + 20 + 32 + postOffset + 4 + 4 + 8, - (char*)(dataBuffer + TMP_OFFSET), strings.common.maxFee); - // src vault ID - snprintf(strings.common.fullAddress, sizeof(strings.common.fullAddress), "%d", - U4BE(dataBuffer, 20 + 32 + postOffset + 20 + 32 + postOffset)); - } - else { - cx_ecfp_public_key_t publicKey; - // Check if the transfer is a self transfer - io_seproxyhal_io_heartbeat(); - starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, bip32PathLength, privateKeyData); - cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); - io_seproxyhal_io_heartbeat(); - cx_ecfp_generate_pair(CX_CURVE_Stark256, &publicKey, &privateKey, 1); - explicit_bzero(&privateKey, sizeof(privateKey)); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); - io_seproxyhal_io_heartbeat(); - selfTransfer = (memcmp(publicKey.W + 1, dataBuffer + 20 + 32 + postOffset, 32) == 0); - PRINTF("self transfer %d\n", selfTransfer); - io_seproxyhal_io_heartbeat(); - // amount to transfer - stark_get_amount_string(dataBuffer + preOffset, - dataBuffer + preOffset + 20, - dataBuffer + 20 + 32 + postOffset + 32 + 4 + 4, (char*)(dataBuffer + TMP_OFFSET), tmpContent.tmp); - // dest vault ID - snprintf(strings.tmp.tmp2, sizeof(strings.tmp.tmp2), "%d", - U4BE(dataBuffer, 20 + 32 + postOffset + 32 + 4)); - if (!selfTransfer) { - memmove(dataContext.starkContext.transferDestination, dataBuffer + 20 + 32 + postOffset, 32); - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataBuffer + 20 + 32 + postOffset); + switch (p1) { + case P1_STARK_ORDER: + protocol = 1; + break; + case P1_STARK_TRANSFER: + protocol = 1; + order = 0; + break; + case P1_STARK_ORDER_V2: + break; + case P1_STARK_TRANSFER_V2: + case P1_STARK_CONDITIONAL_TRANSFER: + order = 0; + break; + default: + THROW(0x6B00); } - } - if (order) { - ux_flow_init(0, ux_stark_limit_order_flow, NULL); - } - else { - if (selfTransfer) { - ux_flow_init(0, (dataContext.starkContext.conditional ? ux_stark_self_transfer_conditional_flow : - ux_stark_self_transfer_flow), NULL); + postOffset = (protocol == 2 ? 1 + 32 : 0); + preOffset = (protocol == 2 ? 1 : 0); + if (order) { + if (dataLength != (20 + 32 + 20 + 32 + 4 + 4 + 8 + 8 + 4 + 4 + 1 + 4 * bip32PathLength + + 2 * postOffset)) { + THROW(0x6700); + } + } else { + if (dataLength != (20 + 32 + 32 + 4 + 4 + 8 + 4 + 4 + 1 + 4 * bip32PathLength + postOffset + + (p1 == P1_STARK_CONDITIONAL_TRANSFER ? 32 + 20 : 0))) { + THROW(0x6700); + } } - else { - ux_flow_init(0, (dataContext.starkContext.conditional ? ux_stark_transfer_conditional_flow : - ux_stark_transfer_flow), NULL); + if (p2 != 0) { + THROW(0x6B00); + } + tmpCtx.transactionContext.pathLength = bip32PathLength; + for (i = 0; i < bip32PathLength; i++) { + tmpCtx.transactionContext.bip32Path[i] = U4BE(dataBuffer, offset); + PRINTF("Storing path %d %d\n", i, tmpCtx.transactionContext.bip32Path[i]); + offset += 4; + } + // Discard the path to use part of dataBuffer as a temporary buffer + memmove(dataBuffer, dataBuffer + offset, dataLength - offset); + dataContext.starkContext.conditional = (p1 == P1_STARK_CONDITIONAL_TRANSFER); + if (dataContext.starkContext.conditional) { + memmove(dataContext.starkContext.fact, + dataBuffer + 20 + 32 + postOffset + 32 + 4 + 4 + 8 + 4 + 4, + 32); + memmove(dataContext.starkContext.conditionAddress, + dataBuffer + 20 + 32 + postOffset + 32 + 4 + 4 + 8 + 4 + 4 + 32, + 20); + PRINTF("Fact %.*H\n", 32, dataContext.starkContext.fact); + PRINTF("Address %.*H\n", 20, dataContext.starkContext.conditionAddress); } - } - *flags |= IO_ASYNCH_REPLY; + zeroTest = allzeroes(dataBuffer + preOffset, 20); + if (zeroTest && (protocol == 2) && (dataBuffer[0] != STARK_QUANTUM_ETH)) { + PRINTF("stark - unexpected quantum descriptor type for null first address %d\n", + dataBuffer[0]); + THROW(0x6A80); + } + if (!zeroTest && getKnownToken(dataBuffer + preOffset) == NULL) { + PRINTF("stark - cannot process unknown token %.*H", 20, dataBuffer + preOffset); + THROW(0x6A80); + } + if (order) { + zeroTest = allzeroes(dataBuffer + 20 + 32 + postOffset + preOffset, 20); + if (zeroTest && (protocol == 2) && (dataBuffer[1 + 20 + 32 + 32] != STARK_QUANTUM_ETH)) { + PRINTF("stark - unexpected quantum descriptor type for null second address %d\n", + dataBuffer[1 + 20 + 32 + 32]); + THROW(0x6A80); + } + if (!zeroTest && getKnownToken(dataBuffer + 20 + 32 + postOffset + preOffset) == NULL) { + PRINTF("stark - cannot process unknown token %.*H", + 20, + dataBuffer + 20 + 32 + postOffset + preOffset); + THROW(0x6A80); + } + } + // Prepare the Stark parameters + io_seproxyhal_io_heartbeat(); + compute_token_id(&global_sha3, + dataBuffer + preOffset, + (protocol == 2 ? dataBuffer[0] : STARK_QUANTUM_LEGACY), + dataBuffer + preOffset + 20, + (protocol == 2 ? dataBuffer + 1 + 20 + 32 : NULL), + false, + dataContext.starkContext.w1); + if (order) { + io_seproxyhal_io_heartbeat(); + compute_token_id(&global_sha3, + dataBuffer + 20 + 32 + postOffset + preOffset, + (protocol == 2 ? dataBuffer[1 + 20 + 32 + 32] : STARK_QUANTUM_LEGACY), + dataBuffer + 20 + 32 + postOffset + preOffset + 20, + (protocol == 2 ? dataBuffer + 1 + 20 + 32 + 32 + 1 + 20 + 32 : NULL), + false, + dataContext.starkContext.w2); + offset = 20 + 32 + postOffset + 20 + 32 + postOffset; + } else { + memmove(dataContext.starkContext.w2, dataBuffer + 20 + 32 + postOffset, 32); + offset = 20 + 32 + postOffset + 32; + } + + poorstream_init(&bitstream, dataContext.starkContext.w3); + poorstream_write_bits(&bitstream, 0, 11); // padding + poorstream_write_bits( + &bitstream, + (p1 == P1_STARK_CONDITIONAL_TRANSFER ? STARK_CONDITIONAL_TRANSFER_TYPE + : order ? STARK_ORDER_TYPE : STARK_TRANSFER_TYPE), + 4); + poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset), 31); + poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset + 4), 31); + poorstream_write_bits(&bitstream, U8BE(dataBuffer, offset + 4 + 4), 63); + if (order) { + poorstream_write_bits(&bitstream, U8BE(dataBuffer, offset + 4 + 4 + 8), 63); + offset += 4 + 4 + 8 + 8; + } else { + poorstream_write_bits(&bitstream, 0, 63); + offset += 4 + 4 + 8; + } + poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset), 31); + poorstream_write_bits(&bitstream, U4BE(dataBuffer, offset + 4), 22); + + PRINTF("stark w1 %.*H\n", 32, dataContext.starkContext.w1); + PRINTF("stark w2 %.*H\n", 32, dataContext.starkContext.w2); + PRINTF("stark w3 %.*H\n", 32, dataContext.starkContext.w3); + + if (dataContext.starkContext.conditional) { + cx_keccak_init(&global_sha3, 256); + cx_hash((cx_hash_t *) &global_sha3, + 0, + dataContext.starkContext.conditionAddress, + 20, + NULL, + 0); + cx_hash((cx_hash_t *) &global_sha3, + CX_LAST, + dataContext.starkContext.fact, + 32, + dataContext.starkContext.w4, + 32); + dataContext.starkContext.w4[0] &= 0x03; + PRINTF("stark w4 %.*H\n", 32, dataContext.starkContext.w4); + } + // Prepare the UI + if (order) { + io_seproxyhal_io_heartbeat(); + // amount to sell + stark_get_amount_string(dataBuffer + preOffset, + dataBuffer + preOffset + 20, + dataBuffer + 20 + 32 + postOffset + 20 + 32 + postOffset + 4 + 4, + (char *) (dataBuffer + TMP_OFFSET), + strings.common.fullAmount); + io_seproxyhal_io_heartbeat(); + // amount to buy + stark_get_amount_string( + dataBuffer + 20 + 32 + postOffset + preOffset, + dataBuffer + 20 + 32 + postOffset + preOffset + 20, + dataBuffer + 20 + 32 + postOffset + 20 + 32 + postOffset + 4 + 4 + 8, + (char *) (dataBuffer + TMP_OFFSET), + strings.common.maxFee); + // src vault ID + snprintf(strings.common.fullAddress, + sizeof(strings.common.fullAddress), + "%d", + U4BE(dataBuffer, 20 + 32 + postOffset + 20 + 32 + postOffset)); + } else { + cx_ecfp_public_key_t publicKey; + // Check if the transfer is a self transfer + io_seproxyhal_io_heartbeat(); + starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, bip32PathLength, privateKeyData); + cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); + io_seproxyhal_io_heartbeat(); + cx_ecfp_generate_pair(CX_CURVE_Stark256, &publicKey, &privateKey, 1); + explicit_bzero(&privateKey, sizeof(privateKey)); + explicit_bzero(privateKeyData, sizeof(privateKeyData)); + io_seproxyhal_io_heartbeat(); + selfTransfer = (memcmp(publicKey.W + 1, dataBuffer + 20 + 32 + postOffset, 32) == 0); + PRINTF("self transfer %d\n", selfTransfer); + io_seproxyhal_io_heartbeat(); + // amount to transfer + stark_get_amount_string(dataBuffer + preOffset, + dataBuffer + preOffset + 20, + dataBuffer + 20 + 32 + postOffset + 32 + 4 + 4, + (char *) (dataBuffer + TMP_OFFSET), + tmpContent.tmp); + // dest vault ID + snprintf(strings.tmp.tmp2, + sizeof(strings.tmp.tmp2), + "%d", + U4BE(dataBuffer, 20 + 32 + postOffset + 32 + 4)); + if (!selfTransfer) { + memmove(dataContext.starkContext.transferDestination, + dataBuffer + 20 + 32 + postOffset, + 32); + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "0x%.*H", + 32, + dataBuffer + 20 + 32 + postOffset); + } + } + if (order) { + ux_flow_init(0, ux_stark_limit_order_flow, NULL); + } else { + if (selfTransfer) { + ux_flow_init( + 0, + (dataContext.starkContext.conditional ? ux_stark_self_transfer_conditional_flow + : ux_stark_self_transfer_flow), + NULL); + } else { + ux_flow_init(0, + (dataContext.starkContext.conditional ? ux_stark_transfer_conditional_flow + : ux_stark_transfer_flow), + NULL); + } + } + + *flags |= IO_ASYNCH_REPLY; } #endif diff --git a/src_features/stark_sign/ui_common_stark_sign.c b/src_features/stark_sign/ui_common_stark_sign.c index 862b97b..9443f72 100644 --- a/src_features/stark_sign/ui_common_stark_sign.c +++ b/src_features/stark_sign/ui_common_stark_sign.c @@ -9,12 +9,17 @@ unsigned int io_seproxyhal_touch_stark_ok(const bagl_element_t *e) { uint8_t signature[72]; uint32_t tx = 0; io_seproxyhal_io_heartbeat(); - starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, tmpCtx.transactionContext.pathLength, privateKeyData); + starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, + tmpCtx.transactionContext.pathLength, + privateKeyData); io_seproxyhal_io_heartbeat(); - stark_sign(signature, privateKeyData, dataContext.starkContext.w1, dataContext.starkContext.w2, - dataContext.starkContext.w3, - (dataContext.starkContext.conditional ? dataContext.starkContext.w4 : NULL)); - G_io_apdu_buffer[0] = 0; + stark_sign(signature, + privateKeyData, + dataContext.starkContext.w1, + dataContext.starkContext.w2, + dataContext.starkContext.w3, + (dataContext.starkContext.conditional ? dataContext.starkContext.w4 : NULL)); + G_io_apdu_buffer[0] = 0; format_signature_out(signature); tx = 65; G_io_apdu_buffer[tx++] = 0x90; @@ -24,7 +29,7 @@ unsigned int io_seproxyhal_touch_stark_ok(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } #endif diff --git a/src_features/stark_sign/ui_flow_stark_sign.c b/src_features/stark_sign/ui_flow_stark_sign.c index 550d31c..c1df89d 100644 --- a/src_features/stark_sign/ui_flow_stark_sign.c +++ b/src_features/stark_sign/ui_flow_stark_sign.c @@ -6,20 +6,28 @@ unsigned int io_seproxyhal_touch_stark_ok(const bagl_element_t *e); void stark_sign_display_master_account() { - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.transferDestination); + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "0x%.*H", + 32, + dataContext.starkContext.transferDestination); } void stark_sign_display_condition_address() { - strings.tmp.tmp[0] = '0'; - strings.tmp.tmp[1] = 'x'; - getEthAddressStringFromBinary(dataContext.starkContext.conditionAddress, (uint8_t*)(strings.tmp.tmp + 2), &global_sha3, chainConfig); - strings.tmp.tmp[42] = '\0'; -} - -void stark_sign_display_condition_fact() { - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.fact); + strings.tmp.tmp[0] = '0'; + strings.tmp.tmp[1] = 'x'; + getEthAddressStringFromBinary(dataContext.starkContext.conditionAddress, + (uint8_t *) (strings.tmp.tmp + 2), + &global_sha3, + chainConfig); + strings.tmp.tmp[42] = '\0'; } +void stark_sign_display_condition_fact() { + snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.fact); +} + +// clang-format off UX_STEP_NOCB(ux_stark_limit_order_1_step, pnn, { @@ -80,19 +88,20 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on UX_FLOW(ux_stark_limit_order_flow, - &ux_stark_limit_order_1_step, - &ux_stark_limit_order_2_step, - &ux_stark_limit_order_3_step, - &ux_stark_limit_order_4_step, - &ux_stark_limit_order_5_step, - &ux_stark_limit_order_6_step, - &ux_stark_limit_order_7_step, - &ux_stark_limit_order_8_step -); + &ux_stark_limit_order_1_step, + &ux_stark_limit_order_2_step, + &ux_stark_limit_order_3_step, + &ux_stark_limit_order_4_step, + &ux_stark_limit_order_5_step, + &ux_stark_limit_order_6_step, + &ux_stark_limit_order_7_step, + &ux_stark_limit_order_8_step); ////////////////////////////////////////////////////////////////////// +// clang-format off UX_STEP_NOCB(ux_stark_transfer_1_step, pnn, { @@ -194,47 +203,44 @@ UX_STEP_NOCB_INIT( .title = "Cond. Fact", .text = strings.tmp.tmp }); +// clang-format on UX_FLOW(ux_stark_transfer_flow, - &ux_stark_transfer_1_step, - &ux_stark_transfer_2_step, - &ux_stark_transfer_3_step, - &ux_stark_transfer_4_step, - &ux_stark_transfer_5_step, - &ux_stark_transfer_6_step, - &ux_stark_transfer_7_step -); + &ux_stark_transfer_1_step, + &ux_stark_transfer_2_step, + &ux_stark_transfer_3_step, + &ux_stark_transfer_4_step, + &ux_stark_transfer_5_step, + &ux_stark_transfer_6_step, + &ux_stark_transfer_7_step); UX_FLOW(ux_stark_self_transfer_flow, - &ux_stark_transfer_1_step, - &ux_stark_self_transfer_2_step, - &ux_stark_transfer_3_step, - &ux_stark_transfer_5_step, - &ux_stark_transfer_6_step, - &ux_stark_transfer_7_step -); + &ux_stark_transfer_1_step, + &ux_stark_self_transfer_2_step, + &ux_stark_transfer_3_step, + &ux_stark_transfer_5_step, + &ux_stark_transfer_6_step, + &ux_stark_transfer_7_step); UX_FLOW(ux_stark_transfer_conditional_flow, - &ux_stark_transfer_1_step, - &ux_stark_conditional_transfer_2_step, - &ux_stark_transfer_3_step, - &ux_stark_conditional_transfer_4_step, - &ux_stark_transfer_5_step, - &ux_stark_conditional_transfer_8_step, - &ux_stark_conditional_transfer_9_step, - &ux_stark_transfer_6_step, - &ux_stark_transfer_7_step -); + &ux_stark_transfer_1_step, + &ux_stark_conditional_transfer_2_step, + &ux_stark_transfer_3_step, + &ux_stark_conditional_transfer_4_step, + &ux_stark_transfer_5_step, + &ux_stark_conditional_transfer_8_step, + &ux_stark_conditional_transfer_9_step, + &ux_stark_transfer_6_step, + &ux_stark_transfer_7_step); UX_FLOW(ux_stark_self_transfer_conditional_flow, - &ux_stark_transfer_1_step, - &ux_stark_self_conditional_transfer_2_step, - &ux_stark_transfer_3_step, - &ux_stark_transfer_5_step, - &ux_stark_conditional_transfer_8_step, - &ux_stark_conditional_transfer_9_step, - &ux_stark_transfer_6_step, - &ux_stark_transfer_7_step -); + &ux_stark_transfer_1_step, + &ux_stark_self_conditional_transfer_2_step, + &ux_stark_transfer_3_step, + &ux_stark_transfer_5_step, + &ux_stark_conditional_transfer_8_step, + &ux_stark_conditional_transfer_9_step, + &ux_stark_transfer_6_step, + &ux_stark_transfer_7_step); #endif diff --git a/src_features/stark_unsafe_sign/cmd_stark_unsafe_sign.c b/src_features/stark_unsafe_sign/cmd_stark_unsafe_sign.c index 89e2b85..17e9625 100644 --- a/src_features/stark_unsafe_sign/cmd_stark_unsafe_sign.c +++ b/src_features/stark_unsafe_sign/cmd_stark_unsafe_sign.c @@ -6,49 +6,53 @@ #include "ui_flow.h" #include "ui_callbacks.h" -void handleStarkwareUnsafeSign(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, unsigned int *flags, unsigned int *tx) { - uint32_t i; - uint8_t privateKeyData[32]; - cx_ecfp_public_key_t publicKey; - cx_ecfp_private_key_t privateKey; - uint8_t bip32PathLength = *(dataBuffer); - uint8_t offset = 1; - // Initial checks - if (appState != APP_STATE_IDLE) { - reset_app_context(); - } - if ((bip32PathLength < 0x01) || - (bip32PathLength > MAX_BIP32_PATH)) { - PRINTF("Invalid path\n"); - THROW(0x6a80); - } - if ((p1 != 0) || (p2 != 0)) { - THROW(0x6B00); - } +void handleStarkwareUnsafeSign(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + unsigned int *flags, + unsigned int *tx) { + uint32_t i; + uint8_t privateKeyData[32]; + cx_ecfp_public_key_t publicKey; + cx_ecfp_private_key_t privateKey; + uint8_t bip32PathLength = *(dataBuffer); + uint8_t offset = 1; + // Initial checks + if (appState != APP_STATE_IDLE) { + reset_app_context(); + } + if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH)) { + PRINTF("Invalid path\n"); + THROW(0x6a80); + } + if ((p1 != 0) || (p2 != 0)) { + THROW(0x6B00); + } - if (dataLength != 32 + 4 * bip32PathLength + 1) { - THROW(0x6700); - } + if (dataLength != 32 + 4 * bip32PathLength + 1) { + THROW(0x6700); + } - tmpCtx.transactionContext.pathLength = bip32PathLength; - for (i = 0; i < bip32PathLength; i++) { - tmpCtx.transactionContext.bip32Path[i] = U4BE(dataBuffer, offset); - PRINTF("Storing path %d %d\n", i, tmpCtx.transactionContext.bip32Path[i]); - offset += 4; - } - memmove(dataContext.starkContext.w2, dataBuffer + offset, 32); - io_seproxyhal_io_heartbeat(); - starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, bip32PathLength, privateKeyData); - cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); - io_seproxyhal_io_heartbeat(); - cx_ecfp_generate_pair(CX_CURVE_Stark256, &publicKey, &privateKey, 1); - explicit_bzero(&privateKey, sizeof(privateKey)); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); - io_seproxyhal_io_heartbeat(); - memmove(dataContext.starkContext.w1, publicKey.W + 1, 32); - ux_flow_init(0, ux_stark_unsafe_sign_flow, NULL); + tmpCtx.transactionContext.pathLength = bip32PathLength; + for (i = 0; i < bip32PathLength; i++) { + tmpCtx.transactionContext.bip32Path[i] = U4BE(dataBuffer, offset); + PRINTF("Storing path %d %d\n", i, tmpCtx.transactionContext.bip32Path[i]); + offset += 4; + } + memmove(dataContext.starkContext.w2, dataBuffer + offset, 32); + io_seproxyhal_io_heartbeat(); + starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, bip32PathLength, privateKeyData); + cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); + io_seproxyhal_io_heartbeat(); + cx_ecfp_generate_pair(CX_CURVE_Stark256, &publicKey, &privateKey, 1); + explicit_bzero(&privateKey, sizeof(privateKey)); + explicit_bzero(privateKeyData, sizeof(privateKeyData)); + io_seproxyhal_io_heartbeat(); + memmove(dataContext.starkContext.w1, publicKey.W + 1, 32); + ux_flow_init(0, ux_stark_unsafe_sign_flow, NULL); - *flags |= IO_ASYNCH_REPLY; + *flags |= IO_ASYNCH_REPLY; } #endif diff --git a/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c b/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c index 0484d6d..6232f92 100644 --- a/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c +++ b/src_features/stark_unsafe_sign/ui_common_stark_unsafe_sign.c @@ -11,11 +11,19 @@ unsigned int io_seproxyhal_touch_stark_unsafe_sign_ok(const bagl_element_t *e) { unsigned int info = 0; uint32_t tx = 0; io_seproxyhal_io_heartbeat(); - starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, tmpCtx.transactionContext.pathLength, privateKeyData); + starkDerivePrivateKey(tmpCtx.transactionContext.bip32Path, + tmpCtx.transactionContext.pathLength, + privateKeyData); io_seproxyhal_io_heartbeat(); cx_ecfp_init_private_key(CX_CURVE_Stark256, privateKeyData, 32, &privateKey); - cx_ecdsa_sign(&privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, - dataContext.starkContext.w2, sizeof(dataContext.starkContext.w2), signature, sizeof(signature), &info); + cx_ecdsa_sign(&privateKey, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + dataContext.starkContext.w2, + sizeof(dataContext.starkContext.w2), + signature, + sizeof(signature), + &info); G_io_apdu_buffer[0] = 0; format_signature_out(signature); tx = 65; @@ -26,7 +34,7 @@ unsigned int io_seproxyhal_touch_stark_unsafe_sign_ok(const bagl_element_t *e) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX ui_idle(); - return 0; // do not redraw the widget + return 0; // do not redraw the widget } #endif diff --git a/src_features/stark_unsafe_sign/ui_flow_stark_unsafe_sign.c b/src_features/stark_unsafe_sign/ui_flow_stark_unsafe_sign.c index 14448ee..6bb8764 100644 --- a/src_features/stark_unsafe_sign/ui_flow_stark_unsafe_sign.c +++ b/src_features/stark_unsafe_sign/ui_flow_stark_unsafe_sign.c @@ -6,13 +6,14 @@ unsigned int io_seproxyhal_touch_stark_unsafe_sign_ok(const bagl_element_t *e); void stark_unsafe_sign_display_account() { - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.w1); + snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.w1); } void stark_unsafe_sign_display_hash() { - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.w2); + snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.w2); } +// clang-format off UX_STEP_NOCB(ux_stark_unsafe_sign_1_step, pnn, { @@ -57,13 +58,13 @@ UX_STEP_CB( &C_icon_crossmark, "Reject", }); +// clang-format on UX_FLOW(ux_stark_unsafe_sign_flow, - &ux_stark_unsafe_sign_1_step, - &ux_stark_unsafe_sign_2_step, - &ux_stark_unsafe_sign_3_step, - &ux_stark_unsafe_sign_4_step, - &ux_stark_unsafe_sign_5_step -); + &ux_stark_unsafe_sign_1_step, + &ux_stark_unsafe_sign_2_step, + &ux_stark_unsafe_sign_3_step, + &ux_stark_unsafe_sign_4_step, + &ux_stark_unsafe_sign_5_step); #endif diff --git a/src_plugins/compound/compound_plugin.c b/src_plugins/compound/compound_plugin.c index f67041c..a214343 100644 --- a/src_plugins/compound/compound_plugin.c +++ b/src_plugins/compound/compound_plugin.c @@ -1,7 +1,7 @@ #include #include "eth_plugin_interface.h" -#include "shared_context.h" // TODO : rewrite as independant code -#include "eth_plugin_internal.h" // TODO : rewrite as independant code +#include "shared_context.h" // TODO : rewrite as independant code +#include "eth_plugin_internal.h" // TODO : rewrite as independant code #include "utils.h" typedef enum { @@ -39,11 +39,9 @@ typedef struct underlying_asset_decimals_t { uint8_t decimals; } underlying_asset_decimals_t; - - -/* Sadly, we don't have the information about the underlying asset's decimals, which can differ from the cToken decimals. -Therefore, we hardcode a binding table. If Compound adds a lot of token in the future, we will have to move to a CAL -based architecture instead, as this one doesn't scale well.*/ +/* Sadly, we don't have the information about the underlying asset's decimals, which can differ from +the cToken decimals. Therefore, we hardcode a binding table. If Compound adds a lot of token in the +future, we will have to move to a CAL based architecture instead, as this one doesn't scale well.*/ #define NUM_COMPOUND_BINDINGS 9 const underlying_asset_decimals_t const UNDERLYING_ASSET_DECIMALS[NUM_COMPOUND_BINDINGS] = { {"cDAI", 18}, @@ -57,10 +55,13 @@ const underlying_asset_decimals_t const UNDERLYING_ASSET_DECIMALS[NUM_COMPOUND_B {"cSAI", 18}, }; -bool get_underlying_asset_decimals(char* compound_ticker, uint8_t* out_decimals){ - for(size_t i = 0; i < NUM_COMPOUND_BINDINGS; i++){ - underlying_asset_decimals_t* binding = (underlying_asset_decimals_t *)PIC(&UNDERLYING_ASSET_DECIMALS[i]); - if (strncmp(binding->c_ticker, compound_ticker, strnlen(binding->c_ticker, MAX_TICKER_LEN)) == 0){ +bool get_underlying_asset_decimals(char *compound_ticker, uint8_t *out_decimals) { + for (size_t i = 0; i < NUM_COMPOUND_BINDINGS; i++) { + underlying_asset_decimals_t *binding = + (underlying_asset_decimals_t *) PIC(&UNDERLYING_ASSET_DECIMALS[i]); + if (strncmp(binding->c_ticker, + compound_ticker, + strnlen(binding->c_ticker, MAX_TICKER_LEN)) == 0) { *out_decimals = binding->decimals; return true; } @@ -69,21 +70,21 @@ bool get_underlying_asset_decimals(char* compound_ticker, uint8_t* out_decimals) } void compound_plugin_call(int message, void *parameters) { - - switch(message) { + switch (message) { case ETH_PLUGIN_INIT_CONTRACT: { - ethPluginInitContract_t *msg = (ethPluginInitContract_t*)parameters; - compound_parameters_t *context = (compound_parameters_t*)msg->pluginContext; + ethPluginInitContract_t *msg = (ethPluginInitContract_t *) parameters; + compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; size_t i; - for (i=0; iselector, SELECTOR_SIZE) == 0) { + for (i = 0; i < NUM_COMPOUND_SELECTORS; i++) { + if (memcmp((uint8_t *) PIC(COMPOUND_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == + 0) { context->selectorIndex = i; break; } } // enforce that ETH amount should be 0, except in ceth.mint case - if (!allzeroes(msg->pluginSharedRO->txContent->value.value, 32)){ - if(context->selectorIndex != CETH_MINT){ + if (!allzeroes(msg->pluginSharedRO->txContent->value.value, 32)) { + if (context->selectorIndex != CETH_MINT) { msg->result = ETH_PLUGIN_RESULT_ERROR; break; } @@ -94,27 +95,35 @@ void compound_plugin_call(int message, void *parameters) { break; } if (msg->dataSize != COMPOUND_EXPECTED_DATA_SIZE[context->selectorIndex]) { - PRINTF("Unexpected data size for command %d expected %d got %d\n", context->selectorIndex, - COMPOUND_EXPECTED_DATA_SIZE[context->selectorIndex], msg->dataSize); + PRINTF("Unexpected data size for command %d expected %d got %d\n", + context->selectorIndex, + COMPOUND_EXPECTED_DATA_SIZE[context->selectorIndex], + msg->dataSize); msg->result = ETH_PLUGIN_RESULT_ERROR; break; } - if(context->selectorIndex == CETH_MINT){ - // ETH amount 0x1234 is stored 0x12340000...000 instead of 0x00....001234, so we strip the following zeroes when copying + if (context->selectorIndex == CETH_MINT) { + // ETH amount 0x1234 is stored 0x12340000...000 instead of 0x00....001234, so we + // strip the following zeroes when copying memset(context->amount, 0, sizeof(context->amount)); - memmove(context->amount + sizeof(context->amount) - msg->pluginSharedRO->txContent->value.length, msg->pluginSharedRO->txContent->value.value, msg->pluginSharedRO->txContent->value.length); + memmove(context->amount + sizeof(context->amount) - + msg->pluginSharedRO->txContent->value.length, + msg->pluginSharedRO->txContent->value.value, + msg->pluginSharedRO->txContent->value.length); } PRINTF("compound plugin inititialized\n"); msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + } break; - case ETH_PLUGIN_PROVIDE_PARAMETER : { - ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t*)parameters; - compound_parameters_t *context = (compound_parameters_t*)msg->pluginContext; - PRINTF("compound plugin provide parameter %d %.*H\n", msg->parameterOffset, 32, msg->parameter); - if (context->selectorIndex != CETH_MINT){ - switch(msg->parameterOffset) { + case ETH_PLUGIN_PROVIDE_PARAMETER: { + ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters; + compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; + PRINTF("compound plugin provide parameter %d %.*H\n", + msg->parameterOffset, + 32, + msg->parameter); + if (context->selectorIndex != CETH_MINT) { + switch (msg->parameterOffset) { case 4: memmove(context->amount, msg->parameter, 32); msg->result = ETH_PLUGIN_RESULT_OK; @@ -124,36 +133,35 @@ void compound_plugin_call(int message, void *parameters) { msg->result = ETH_PLUGIN_RESULT_ERROR; break; } - } - else { + } else { PRINTF("CETH contract expects no parameters\n"); msg->result = ETH_PLUGIN_RESULT_ERROR; } - } - break; + } break; case ETH_PLUGIN_FINALIZE: { - ethPluginFinalize_t *msg = (ethPluginFinalize_t*)parameters; + ethPluginFinalize_t *msg = (ethPluginFinalize_t *) parameters; PRINTF("compound plugin finalize\n"); msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; msg->numScreens = 2; msg->uiType = ETH_UI_TYPE_GENERIC; msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + } break; case ETH_PLUGIN_PROVIDE_TOKEN: { - ethPluginProvideToken_t *msg = (ethPluginProvideToken_t*)parameters; - compound_parameters_t *context = (compound_parameters_t*)msg->pluginContext; + ethPluginProvideToken_t *msg = (ethPluginProvideToken_t *) parameters; + compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; PRINTF("compound plugin provide token: %d\n", (msg->token1 != NULL)); if (msg->token1 != NULL) { - strcpy((char *)context->ticker_1, (char *)msg->token1->ticker); - switch (context->selectorIndex) - { + strcpy((char *) context->ticker_1, (char *) msg->token1->ticker); + switch (context->selectorIndex) { case COMPOUND_REDEEM_UNDERLYING: case COMPOUND_MINT: case CETH_MINT: - msg->result = get_underlying_asset_decimals(context->ticker_1, &context->decimals) ? ETH_PLUGIN_RESULT_OK : ETH_PLUGIN_RESULT_FALLBACK; + msg->result = + get_underlying_asset_decimals(context->ticker_1, &context->decimals) + ? ETH_PLUGIN_RESULT_OK + : ETH_PLUGIN_RESULT_FALLBACK; break; // Only case where we use the compound contract decimals @@ -166,19 +174,16 @@ void compound_plugin_call(int message, void *parameters) { msg->result = ETH_PLUGIN_RESULT_FALLBACK; break; } - } - else { + } else { msg->result = ETH_PLUGIN_RESULT_FALLBACK; } - } - break; + } break; case ETH_PLUGIN_QUERY_CONTRACT_ID: { - ethQueryContractID_t *msg = (ethQueryContractID_t*)parameters; - compound_parameters_t *context = (compound_parameters_t*)msg->pluginContext; + ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; + compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; strcpy(msg->name, "Type"); - switch (context->selectorIndex) - { + switch (context->selectorIndex) { case COMPOUND_REDEEM_UNDERLYING: case COMPOUND_REDEEM: strcpy(msg->version, "Redeem"); @@ -194,37 +199,41 @@ void compound_plugin_call(int message, void *parameters) { } strcat(msg->version, " Assets"); msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + } break; case ETH_PLUGIN_QUERY_CONTRACT_UI: { - ethQueryContractUI_t *msg = (ethQueryContractUI_t*)parameters; - compound_parameters_t *context = (compound_parameters_t*)msg->pluginContext; - switch(msg->screenIndex) { + ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters; + compound_parameters_t *context = (compound_parameters_t *) msg->pluginContext; + switch (msg->screenIndex) { case 0: { strcpy(msg->title, "Amount"); - char * ticker_ptr = (char *)context->ticker_1; + char *ticker_ptr = (char *) context->ticker_1; /* skip "c" in front of cToken unless we use "redeem", as redeem is the only operation dealing with a cToken amount */ - if(context->selectorIndex != COMPOUND_REDEEM){ + if (context->selectorIndex != COMPOUND_REDEEM) { ticker_ptr++; } - amountToString(context->amount, sizeof(context->amount), context->decimals, ticker_ptr, msg->msg, 100); + amountToString(context->amount, + sizeof(context->amount), + context->decimals, + ticker_ptr, + msg->msg, + 100); msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + } break; case 1: strcpy(msg->title, "Contract"); strcpy(msg->msg, "Compound "); - strcat(msg->msg, (char *)context->ticker_1 + 1); // remove the 'c' char at beginning of compound ticker + strcat(msg->msg, + (char *) context->ticker_1 + + 1); // remove the 'c' char at beginning of compound ticker msg->result = ETH_PLUGIN_RESULT_OK; break; default: break; } - } - break; + } break; default: PRINTF("Unhandled message %d\n", message); diff --git a/src_plugins/erc20/erc20_plugin.c b/src_plugins/erc20/erc20_plugin.c index 4723bfa..df3013e 100644 --- a/src_plugins/erc20/erc20_plugin.c +++ b/src_plugins/erc20/erc20_plugin.c @@ -5,221 +5,223 @@ #include "ethUtils.h" #include "utils.h" -typedef enum { - ERC20_TRANSFER = 0, - ERC20_APPROVE -} erc20Selector_t; +typedef enum { ERC20_TRANSFER = 0, ERC20_APPROVE } erc20Selector_t; -typedef enum { - TARGET_ADDRESS = 0, - TARGET_CONTRACT, - TARGET_COMPOUND -} targetType_t; +typedef enum { TARGET_ADDRESS = 0, TARGET_CONTRACT, TARGET_COMPOUND } targetType_t; typedef struct erc20_parameters_t { - uint8_t selectorIndex; - uint8_t destinationAddress[21]; - uint8_t amount[32]; - uint8_t ticker_1[MAX_TICKER_LEN]; - uint8_t ticker_2[MAX_TICKER_LEN]; - uint8_t decimals; - uint8_t target; + uint8_t selectorIndex; + uint8_t destinationAddress[21]; + uint8_t amount[32]; + uint8_t ticker_1[MAX_TICKER_LEN]; + uint8_t ticker_2[MAX_TICKER_LEN]; + uint8_t decimals; + uint8_t target; } erc20_parameters_t; typedef struct ticker_binding_t { - char ticker1[MAX_TICKER_LEN]; - char ticker2[MAX_TICKER_LEN]; + char ticker1[MAX_TICKER_LEN]; + char ticker2[MAX_TICKER_LEN]; } ticker_binding_t; #define NUM_COMPOUND_BINDINGS 9 const ticker_binding_t const COMPOUND_BINDINGS[NUM_COMPOUND_BINDINGS] = { - {"DAI", "CDAI"}, - {"WETH", "CETH"}, - {"USDC", "CUSDC"}, - {"ZRX", "CZRX"}, - {"USDT", "CUSDT"}, - {"WBTC", "CBTC"}, - {"BAT", "CBAT"}, - {"REPv2", "CREP"}, - {"SAI", "CSAI"}, + {"DAI", "CDAI"}, + {"WETH", "CETH"}, + {"USDC", "CUSDC"}, + {"ZRX", "CZRX"}, + {"USDT", "CUSDT"}, + {"WBTC", "CBTC"}, + {"BAT", "CBAT"}, + {"REPv2", "CREP"}, + {"SAI", "CSAI"}, }; -bool check_token_binding(char* ticker1, char* ticker2, const ticker_binding_t* bindings, size_t num_bindings){ - for(size_t i = 0; i < num_bindings; i++){ - ticker_binding_t* binding = (ticker_binding_t *)PIC(&bindings[i]); - if (strncmp(binding->ticker1, ticker1, strnlen(binding->ticker1, MAX_TICKER_LEN)) == 0 && - strncmp(binding->ticker2, ticker2, strnlen(binding->ticker2, MAX_TICKER_LEN)) == 0){ - return true; - } - } - return false; +bool check_token_binding(char *ticker1, + char *ticker2, + const ticker_binding_t *bindings, + size_t num_bindings) { + for (size_t i = 0; i < num_bindings; i++) { + ticker_binding_t *binding = (ticker_binding_t *) PIC(&bindings[i]); + if (strncmp(binding->ticker1, ticker1, strnlen(binding->ticker1, MAX_TICKER_LEN)) == 0 && + strncmp(binding->ticker2, ticker2, strnlen(binding->ticker2, MAX_TICKER_LEN)) == 0) { + return true; + } + } + return false; } bool erc20_plugin_available_check() { #ifdef HAVE_STARKWARE - if (quantumSet) { - switch(dataContext.tokenContext.quantumType) { - case STARK_QUANTUM_LEGACY: - case STARK_QUANTUM_ETH: - case STARK_QUANTUM_ERC20: - case STARK_QUANTUM_MINTABLE_ERC20: - return true; - default: - return false; - } - } + if (quantumSet) { + switch (dataContext.tokenContext.quantumType) { + case STARK_QUANTUM_LEGACY: + case STARK_QUANTUM_ETH: + case STARK_QUANTUM_ERC20: + case STARK_QUANTUM_MINTABLE_ERC20: + return true; + default: + return false; + } + } #endif - return true; + return true; } void erc20_plugin_call(int message, void *parameters) { + switch (message) { + case ETH_PLUGIN_INIT_CONTRACT: { + ethPluginInitContract_t *msg = (ethPluginInitContract_t *) parameters; + erc20_parameters_t *context = (erc20_parameters_t *) msg->pluginContext; + // enforce that ETH amount should be 0 + if (!allzeroes(msg->pluginSharedRO->txContent->value.value, 32)) { + PRINTF("Err: Transaction amount is not 0\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + } else { + size_t i; + for (i = 0; i < NUM_ERC20_SELECTORS; i++) { + if (memcmp((uint8_t *) PIC(ERC20_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == + 0) { + context->selectorIndex = i; + break; + } + } + if (i == NUM_ERC20_SELECTORS) { + PRINTF("Unknown selector %.*H\n", SELECTOR_SIZE, msg->selector); + msg->result = ETH_PLUGIN_RESULT_ERROR; + break; + } + PRINTF("erc20 plugin init\n"); + msg->result = ETH_PLUGIN_RESULT_OK; + } + } break; - switch(message) { - case ETH_PLUGIN_INIT_CONTRACT: { - ethPluginInitContract_t *msg = (ethPluginInitContract_t*)parameters; - erc20_parameters_t *context = (erc20_parameters_t*)msg->pluginContext; - // enforce that ETH amount should be 0 - if (!allzeroes(msg->pluginSharedRO->txContent->value.value, 32)){ - PRINTF("Err: Transaction amount is not 0\n"); - msg->result = ETH_PLUGIN_RESULT_ERROR; - } - else { - size_t i; - for (i=0; iselector, SELECTOR_SIZE) == 0) { - context->selectorIndex = i; - break; - } - } - if (i == NUM_ERC20_SELECTORS) { - PRINTF("Unknown selector %.*H\n", SELECTOR_SIZE, msg->selector); - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - } - PRINTF("erc20 plugin init\n"); - msg->result = ETH_PLUGIN_RESULT_OK; - } - } - break; + case ETH_PLUGIN_PROVIDE_PARAMETER: { + ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters; + erc20_parameters_t *context = (erc20_parameters_t *) msg->pluginContext; + PRINTF("erc20 plugin provide parameter %d %.*H\n", + msg->parameterOffset, + 32, + msg->parameter); + switch (msg->parameterOffset) { + case 4: + memmove(context->destinationAddress, msg->parameter + 12, 20); + msg->result = ETH_PLUGIN_RESULT_OK; + break; + case 4 + 32: + memmove(context->amount, msg->parameter, 32); + msg->result = ETH_PLUGIN_RESULT_OK; + break; + default: + PRINTF("Unhandled parameter offset\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + break; + } + } break; - case ETH_PLUGIN_PROVIDE_PARAMETER : { - ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t*)parameters; - erc20_parameters_t *context = (erc20_parameters_t*)msg->pluginContext; - PRINTF("erc20 plugin provide parameter %d %.*H\n", msg->parameterOffset, 32, msg->parameter); - switch(msg->parameterOffset) { - case 4: - memmove(context->destinationAddress, msg->parameter + 12, 20); - msg->result = ETH_PLUGIN_RESULT_OK; - break; - case 4 + 32: - memmove(context->amount, msg->parameter, 32); - msg->result = ETH_PLUGIN_RESULT_OK; - break; - default: - PRINTF("Unhandled parameter offset\n"); - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - } - } - break; + case ETH_PLUGIN_FINALIZE: { + ethPluginFinalize_t *msg = (ethPluginFinalize_t *) parameters; + erc20_parameters_t *context = (erc20_parameters_t *) msg->pluginContext; + PRINTF("erc20 plugin finalize\n"); + if (context->selectorIndex == ERC20_TRANSFER) { + msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; + msg->amount = context->amount; + msg->address = context->destinationAddress; + msg->uiType = ETH_UI_TYPE_AMOUNT_ADDRESS; + msg->result = ETH_PLUGIN_RESULT_OK; + } else if (context->selectorIndex == ERC20_APPROVE) { + msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; + msg->tokenLookup2 = context->destinationAddress; + msg->numScreens = 2; + msg->uiType = ETH_UI_TYPE_GENERIC; + msg->result = ETH_PLUGIN_RESULT_OK; + } + } break; - case ETH_PLUGIN_FINALIZE: { - ethPluginFinalize_t *msg = (ethPluginFinalize_t*)parameters; - erc20_parameters_t *context = (erc20_parameters_t*)msg->pluginContext; - PRINTF("erc20 plugin finalize\n"); - if (context->selectorIndex == ERC20_TRANSFER){ - msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; - msg->amount = context->amount; - msg->address = context->destinationAddress; - msg->uiType = ETH_UI_TYPE_AMOUNT_ADDRESS; - msg->result = ETH_PLUGIN_RESULT_OK; - } - else if (context->selectorIndex == ERC20_APPROVE){ - msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; - msg->tokenLookup2 = context->destinationAddress; - msg->numScreens = 2; - msg->uiType = ETH_UI_TYPE_GENERIC; - msg->result = ETH_PLUGIN_RESULT_OK; - } - } - break; + case ETH_PLUGIN_PROVIDE_TOKEN: { + ethPluginProvideToken_t *msg = (ethPluginProvideToken_t *) parameters; + erc20_parameters_t *context = (erc20_parameters_t *) msg->pluginContext; + PRINTF("erc20 plugin provide token 1: %d - 2: %d\n", + (msg->token1 != NULL), + (msg->token2 != NULL)); + if (msg->token1 != NULL) { + context->target = TARGET_ADDRESS; + strcpy((char *) context->ticker_1, (char *) msg->token1->ticker); + context->decimals = msg->token1->decimals; + if (context->selectorIndex == ERC20_APPROVE) { + if (msg->token2 != NULL) { + context->target = TARGET_CONTRACT; + strcpy((char *) context->ticker_2, (char *) msg->token2->ticker); + // test if we're doing a Compound allowance + if (check_token_binding((char *) msg->token1->ticker, + (char *) msg->token2->ticker, + COMPOUND_BINDINGS, + NUM_COMPOUND_BINDINGS)) { + context->target = TARGET_COMPOUND; + } + } + } + msg->result = ETH_PLUGIN_RESULT_OK; + } else { + msg->result = ETH_PLUGIN_RESULT_FALLBACK; + } + } break; - case ETH_PLUGIN_PROVIDE_TOKEN: { - ethPluginProvideToken_t *msg = (ethPluginProvideToken_t*)parameters; - erc20_parameters_t *context = (erc20_parameters_t*)msg->pluginContext; - PRINTF("erc20 plugin provide token 1: %d - 2: %d\n", (msg->token1 != NULL), (msg->token2 != NULL)); - if (msg->token1 != NULL) { - context->target = TARGET_ADDRESS; - strcpy((char *)context->ticker_1, (char *)msg->token1->ticker); - context->decimals = msg->token1->decimals; - if (context->selectorIndex == ERC20_APPROVE){ - if(msg->token2 != NULL){ - context->target = TARGET_CONTRACT; - strcpy((char *)context->ticker_2, (char *)msg->token2->ticker); - // test if we're doing a Compound allowance - if (check_token_binding((char *)msg->token1->ticker, (char *)msg->token2->ticker, COMPOUND_BINDINGS, NUM_COMPOUND_BINDINGS)){ - context->target = TARGET_COMPOUND; - } - } - } - msg->result = ETH_PLUGIN_RESULT_OK; - } - else { - msg->result = ETH_PLUGIN_RESULT_FALLBACK; - } - } - break; + case ETH_PLUGIN_QUERY_CONTRACT_ID: { + ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; + strcpy(msg->name, "Type"); + strcpy(msg->version, "Approve"); + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - case ETH_PLUGIN_QUERY_CONTRACT_ID: { - ethQueryContractID_t *msg = (ethQueryContractID_t*)parameters; - strcpy(msg->name, "Type"); - strcpy(msg->version, "Approve"); - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + case ETH_PLUGIN_QUERY_CONTRACT_UI: { + ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters; + erc20_parameters_t *context = (erc20_parameters_t *) msg->pluginContext; + switch (msg->screenIndex) { + case 0: + strcpy(msg->title, "Amount"); + if (ismaxint(context->amount, sizeof(context->amount))) { + strcpy(msg->msg, "Unlimited "); + strcat(msg->msg, (char *) context->ticker_1); + } else { + amountToString(context->amount, + sizeof(context->amount), + context->decimals, + (char *) context->ticker_1, + msg->msg, + 100); + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + case 1: + if (context->target >= TARGET_CONTRACT) { + strcpy(msg->title, "Contract"); + if (context->target == TARGET_COMPOUND) { + strcpy(msg->msg, "Compound "); + strcat(msg->msg, + (char *) context->ticker_2 + + 1); // remove the 'c' char at beginning of compound ticker + } else { + strcpy(msg->msg, (char *) context->ticker_2); + } + } else { + strcpy(msg->title, "Address"); + msg->msg[0] = '0'; + msg->msg[1] = 'x'; + getEthAddressStringFromBinary(context->destinationAddress, + (uint8_t *) msg->msg + 2, + msg->pluginSharedRW->sha3, + chainConfig); + } - case ETH_PLUGIN_QUERY_CONTRACT_UI: { - ethQueryContractUI_t *msg = (ethQueryContractUI_t*)parameters; - erc20_parameters_t *context = (erc20_parameters_t*)msg->pluginContext; - switch(msg->screenIndex) { - case 0: - strcpy(msg->title, "Amount"); - if(ismaxint(context->amount, sizeof(context->amount))){ - strcpy(msg->msg, "Unlimited "); - strcat(msg->msg, (char *)context->ticker_1); - } - else{ - amountToString(context->amount, sizeof(context->amount), context->decimals, (char *)context->ticker_1, msg->msg, 100); - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; - case 1: - if(context->target >= TARGET_CONTRACT){ - strcpy(msg->title, "Contract"); - if (context->target == TARGET_COMPOUND){ - strcpy(msg->msg, "Compound "); - strcat(msg->msg, (char *)context->ticker_2 + 1); // remove the 'c' char at beginning of compound ticker - } - else { - strcpy(msg->msg, (char *)context->ticker_2); - } - } - else{ - strcpy(msg->title, "Address"); - msg->msg[0] = '0'; - msg->msg[1] = 'x'; - getEthAddressStringFromBinary(context->destinationAddress, (uint8_t *)msg->msg + 2, msg->pluginSharedRW->sha3, chainConfig); - } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + default: + break; + } + } break; - msg->result = ETH_PLUGIN_RESULT_OK; - break; - default: - break; - } - } - break; - - default: - PRINTF("Unhandled message %d\n", message); - } + default: + PRINTF("Unhandled message %d\n", message); + } } diff --git a/src_plugins/erc721/erc721_plugin.c b/src_plugins/erc721/erc721_plugin.c index 9293423..5577d67 100644 --- a/src_plugins/erc721/erc721_plugin.c +++ b/src_plugins/erc721/erc721_plugin.c @@ -9,140 +9,139 @@ void starkware_print_stark_key(uint8_t *starkKey, char *destination); void starkware_print_eth_address(uint8_t *address, char *destination); typedef struct erc721_parameters_t { - uint8_t selectorIndex; - uint8_t address[20]; - uint8_t tokenId[32]; - //tokenDefinition_t *tokenSelf; - //tokenDefinition_t *tokenAddress; + uint8_t selectorIndex; + uint8_t address[20]; + uint8_t tokenId[32]; + // tokenDefinition_t *tokenSelf; + // tokenDefinition_t *tokenAddress; } erc721_parameters_t; bool erc721_plugin_available_check() { #ifdef HAVE_STARKWARE - if (quantumSet) { - switch(dataContext.tokenContext.quantumType) { - case STARK_QUANTUM_ERC721: - case STARK_QUANTUM_MINTABLE_ERC721: - return true; - default: - return false; - } - } - return false; + if (quantumSet) { + switch (dataContext.tokenContext.quantumType) { + case STARK_QUANTUM_ERC721: + case STARK_QUANTUM_MINTABLE_ERC721: + return true; + default: + return false; + } + } + return false; #endif } void erc721_plugin_call(int message, void *parameters) { + switch (message) { + case ETH_PLUGIN_INIT_CONTRACT: { + ethPluginInitContract_t *msg = (ethPluginInitContract_t *) parameters; + erc721_parameters_t *context = (erc721_parameters_t *) msg->pluginContext; + // enforce that ETH amount should be 0 + if (!allzeroes(msg->pluginSharedRO->txContent->value.value, 32)) { + PRINTF("Err: Transaction amount is not 0 for erc721 approval\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + } else { + size_t i; + for (i = 0; i < NUM_ERC721_SELECTORS; i++) { + if (memcmp((uint8_t *) PIC(ERC721_SELECTORS[i]), + msg->selector, + SELECTOR_SIZE) == 0) { + context->selectorIndex = i; + break; + } + } + if (i == NUM_ERC721_SELECTORS) { + PRINTF("Unknown erc721 selector %.*H\n", SELECTOR_SIZE, msg->selector); + break; + } + if (msg->dataSize != 4 + 32 + 32) { + PRINTF("Invalid erc721 approval data size %d\n", msg->dataSize); + break; + } + PRINTF("erc721 plugin init\n"); + msg->result = ETH_PLUGIN_RESULT_OK; + } + } break; - switch(message) { - case ETH_PLUGIN_INIT_CONTRACT: { - ethPluginInitContract_t *msg = (ethPluginInitContract_t*)parameters; - erc721_parameters_t *context = (erc721_parameters_t*)msg->pluginContext; - // enforce that ETH amount should be 0 - if (!allzeroes(msg->pluginSharedRO->txContent->value.value, 32)){ - PRINTF("Err: Transaction amount is not 0 for erc721 approval\n"); - msg->result = ETH_PLUGIN_RESULT_ERROR; - } - else { - size_t i; - for (i=0; iselector, SELECTOR_SIZE) == 0) { - context->selectorIndex = i; - break; - } - } - if (i == NUM_ERC721_SELECTORS) { - PRINTF("Unknown erc721 selector %.*H\n", SELECTOR_SIZE, msg->selector); - break; - } - if (msg->dataSize != 4 + 32 + 32) { - PRINTF("Invalid erc721 approval data size %d\n", msg->dataSize); - break; - } - PRINTF("erc721 plugin init\n"); - msg->result = ETH_PLUGIN_RESULT_OK; - } - } - break; + case ETH_PLUGIN_PROVIDE_PARAMETER: { + ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters; + erc721_parameters_t *context = (erc721_parameters_t *) msg->pluginContext; + PRINTF("erc721 plugin provide parameter %d %.*H\n", + msg->parameterOffset, + 32, + msg->parameter); + switch (msg->parameterOffset) { + case 4: + memmove(context->address, msg->parameter + 32 - 20, 20); + msg->result = ETH_PLUGIN_RESULT_OK; + break; + case 4 + 32: + memmove(context->tokenId, msg->parameter, 32); + msg->result = ETH_PLUGIN_RESULT_OK; + break; + default: + PRINTF("Unhandled parameter offset\n"); + break; + } + } break; - case ETH_PLUGIN_PROVIDE_PARAMETER : { - ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t*)parameters; - erc721_parameters_t *context = (erc721_parameters_t*)msg->pluginContext; - PRINTF("erc721 plugin provide parameter %d %.*H\n", msg->parameterOffset, 32, msg->parameter); - switch(msg->parameterOffset) { - case 4: - memmove(context->address, msg->parameter + 32 - 20, 20); - msg->result = ETH_PLUGIN_RESULT_OK; - break; - case 4 + 32: - memmove(context->tokenId, msg->parameter, 32); - msg->result = ETH_PLUGIN_RESULT_OK; - break; - default: - PRINTF("Unhandled parameter offset\n"); - break; - } - } - break; + case ETH_PLUGIN_FINALIZE: { + ethPluginFinalize_t *msg = (ethPluginFinalize_t *) parameters; + erc721_parameters_t *context = (erc721_parameters_t *) msg->pluginContext; + PRINTF("erc721 plugin finalize\n"); + msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; + msg->tokenLookup2 = context->address; + msg->numScreens = 3; + msg->uiType = ETH_UI_TYPE_GENERIC; + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - case ETH_PLUGIN_FINALIZE: { - ethPluginFinalize_t *msg = (ethPluginFinalize_t*)parameters; - erc721_parameters_t *context = (erc721_parameters_t*)msg->pluginContext; - PRINTF("erc721 plugin finalize\n"); - msg->tokenLookup1 = msg->pluginSharedRO->txContent->destination; - msg->tokenLookup2 = context->address; - msg->numScreens = 3; - msg->uiType = ETH_UI_TYPE_GENERIC; - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + case ETH_PLUGIN_PROVIDE_TOKEN: { + ethPluginProvideToken_t *msg = (ethPluginProvideToken_t *) parameters; + erc721_parameters_t *context = (erc721_parameters_t *) msg->pluginContext; + PRINTF("erc721 plugin provide token dest: %d - address: %d\n", + (msg->token1 != NULL), + (msg->token2 != NULL)); + // context->tokenSelf = msg->token1; + // context->tokenAddress = msg->token2; + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - case ETH_PLUGIN_PROVIDE_TOKEN: { - ethPluginProvideToken_t *msg = (ethPluginProvideToken_t*)parameters; - erc721_parameters_t *context = (erc721_parameters_t*)msg->pluginContext; - PRINTF("erc721 plugin provide token dest: %d - address: %d\n", (msg->token1 != NULL), (msg->token2 != NULL)); - //context->tokenSelf = msg->token1; - //context->tokenAddress = msg->token2; - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + case ETH_PLUGIN_QUERY_CONTRACT_ID: { + ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; + strcpy(msg->name, "Allowance"); + strcpy(msg->version, ""); + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - case ETH_PLUGIN_QUERY_CONTRACT_ID: { - ethQueryContractID_t *msg = (ethQueryContractID_t*)parameters; - strcpy(msg->name, "Allowance"); - strcpy(msg->version, ""); - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + case ETH_PLUGIN_QUERY_CONTRACT_UI: { + ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters; + erc721_parameters_t *context = (erc721_parameters_t *) msg->pluginContext; + switch (msg->screenIndex) { + case 0: + strcpy(msg->title, "Contract Name"); + starkware_print_eth_address(tmpContent.txContent.destination, msg->msg); + msg->result = ETH_PLUGIN_RESULT_OK; + break; - case ETH_PLUGIN_QUERY_CONTRACT_UI: { - ethQueryContractUI_t *msg = (ethQueryContractUI_t*)parameters; - erc721_parameters_t *context = (erc721_parameters_t*)msg->pluginContext; - switch(msg->screenIndex) { - case 0: - strcpy(msg->title, "Contract Name"); - starkware_print_eth_address(tmpContent.txContent.destination, msg->msg); - msg->result = ETH_PLUGIN_RESULT_OK; - break; + case 1: + strcpy(msg->title, "NFT Contract"); + starkware_print_eth_address(context->address, msg->msg); + msg->result = ETH_PLUGIN_RESULT_OK; + break; - case 1: - strcpy(msg->title, "NFT Contract"); - starkware_print_eth_address(context->address, msg->msg); - msg->result = ETH_PLUGIN_RESULT_OK; - break; + case 2: + strcpy(msg->title, "TokenID"); + starkware_print_stark_key(context->tokenId, msg->msg); + msg->result = ETH_PLUGIN_RESULT_OK; + break; - case 2: - strcpy(msg->title, "TokenID"); - starkware_print_stark_key(context->tokenId, msg->msg); - msg->result = ETH_PLUGIN_RESULT_OK; - break; + default: + break; + } + } break; - default: - break; - } - } - break; - - default: - PRINTF("Unhandled message %d\n", message); - } + default: + PRINTF("Unhandled message %d\n", message); + } } diff --git a/src_plugins/eth2/eth2_plugin.c b/src_plugins/eth2/eth2_plugin.c index 9346088..e4d57a2 100644 --- a/src_plugins/eth2/eth2_plugin.c +++ b/src_plugins/eth2/eth2_plugin.c @@ -13,155 +13,156 @@ void getEth2PublicKey(uint32_t *bip32Path, uint8_t bip32PathLength, uint8_t *out #define WITHDRAWAL_KEY_PATH_2 3600 #define WITHDRAWAL_KEY_PATH_4 0 -#define ETH2_DEPOSIT_PUBKEY_OFFSET 0x80 +#define ETH2_DEPOSIT_PUBKEY_OFFSET 0x80 #define ETH2_WITHDRAWAL_CREDENTIALS_OFFSET 0xE0 -#define ETH2_SIGNATURE_OFFSET 0x120 -#define ETH2_DEPOSIT_PUBKEY_LENGTH 0x30 +#define ETH2_SIGNATURE_OFFSET 0x120 +#define ETH2_DEPOSIT_PUBKEY_LENGTH 0x30 #define ETH2_WITHDRAWAL_CREDENTIALS_LENGTH 0x20 -#define ETH2_SIGNATURE_LENGTH 0x60 +#define ETH2_SIGNATURE_LENGTH 0x60 typedef struct eth2_deposit_parameters_t { - uint8_t valid; + uint8_t valid; } eth2_deposit_parameters_t; void eth2_plugin_call(int message, void *parameters) { + switch (message) { + case ETH_PLUGIN_INIT_CONTRACT: { + ethPluginInitContract_t *msg = (ethPluginInitContract_t *) parameters; + eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t *) msg->pluginContext; + context->valid = 1; + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - switch(message) { - case ETH_PLUGIN_INIT_CONTRACT: { - ethPluginInitContract_t *msg = (ethPluginInitContract_t*)parameters; - eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t*)msg->pluginContext; - context->valid = 1; - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + case ETH_PLUGIN_PROVIDE_PARAMETER: { + ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters; + eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t *) msg->pluginContext; + uint32_t index; + PRINTF("eth2 plugin provide parameter %d %.*H\n", + msg->parameterOffset, + 32, + msg->parameter); + switch (msg->parameterOffset) { + case 4 + (32 * 0): // pubkey offset + case 4 + (32 * 1): // withdrawal credentials offset + case 4 + (32 * 2): // signature offset + case 4 + (32 * 4): // deposit pubkey length + case 4 + (32 * 7): // withdrawal credentials length + case 4 + (32 * 9): // signature length + { + uint32_t check = 0; + switch (msg->parameterOffset) { + case 4 + (32 * 0): + check = ETH2_DEPOSIT_PUBKEY_OFFSET; + break; + case 4 + (32 * 1): + check = ETH2_WITHDRAWAL_CREDENTIALS_OFFSET; + break; + case 4 + (32 * 2): + check = ETH2_SIGNATURE_OFFSET; + break; + case 4 + (32 * 4): + check = ETH2_DEPOSIT_PUBKEY_LENGTH; + break; + case 4 + (32 * 7): + check = ETH2_WITHDRAWAL_CREDENTIALS_LENGTH; + break; + case 4 + (32 * 9): + check = ETH2_SIGNATURE_LENGTH; + break; + default: + break; + } + index = U4BE(msg->parameter, 32 - 4); + if (index != check) { + PRINTF("eth2 plugin parameter check %d failed, expected %d got %d\n", + msg->parameterOffset, + check, + index); + context->valid = 0; + } + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - case ETH_PLUGIN_PROVIDE_PARAMETER : { - ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t*)parameters; - eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t*)msg->pluginContext; - uint32_t index; - PRINTF("eth2 plugin provide parameter %d %.*H\n", msg->parameterOffset, 32, msg->parameter); - switch(msg->parameterOffset) { - case 4 + (32 * 0): // pubkey offset - case 4 + (32 * 1): // withdrawal credentials offset - case 4 + (32 * 2): // signature offset - case 4 + (32 * 4): // deposit pubkey length - case 4 + (32 * 7): // withdrawal credentials length - case 4 + (32 * 9): // signature length - { - uint32_t check = 0; - switch(msg->parameterOffset) { - case 4 + (32 * 0): - check = ETH2_DEPOSIT_PUBKEY_OFFSET; - break; - case 4 + (32 * 1): - check = ETH2_WITHDRAWAL_CREDENTIALS_OFFSET; - break; - case 4 + (32 * 2): - check = ETH2_SIGNATURE_OFFSET; - break; - case 4 + (32 * 4): - check = ETH2_DEPOSIT_PUBKEY_LENGTH; - break; - case 4 + (32 * 7): - check = ETH2_WITHDRAWAL_CREDENTIALS_LENGTH; - break; - case 4 + (32 * 9): - check = ETH2_SIGNATURE_LENGTH; - break; - default: - break; - } - index = U4BE(msg->parameter, 32 - 4); - if (index != check) { - PRINTF("eth2 plugin parameter check %d failed, expected %d got %d\n", msg->parameterOffset, check, index); - context->valid = 0; - } - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + case 4 + (32 * 3): // deposit data root + case 4 + (32 * 5): // deposit pubkey + case 4 + (32 * 6): + case 4 + (32 * 10): // signature + case 4 + (32 * 11): + case 4 + (32 * 12): + msg->result = ETH_PLUGIN_RESULT_OK; + break; - case 4 + (32 * 3): // deposit data root - case 4 + (32 * 5): // deposit pubkey - case 4 + (32 * 6): - case 4 + (32 * 10): // signature - case 4 + (32 * 11): - case 4 + (32 * 12): - msg->result = ETH_PLUGIN_RESULT_OK; - break; + case 4 + (32 * 8): // withdrawal credentials + { + uint8_t tmp[48]; + uint32_t withdrawalKeyPath[4]; + withdrawalKeyPath[0] = WITHDRAWAL_KEY_PATH_1; + withdrawalKeyPath[1] = WITHDRAWAL_KEY_PATH_2; + withdrawalKeyPath[2] = eth2WithdrawalIndex; + withdrawalKeyPath[3] = WITHDRAWAL_KEY_PATH_4; + getEth2PublicKey(withdrawalKeyPath, 4, tmp); + PRINTF("eth2 plugin computed withdrawal public key %.*H\n", 48, tmp); + cx_hash_sha256(tmp, 48, tmp, 32); + tmp[0] = 0; + if (memcmp(tmp, msg->parameter, 32) != 0) { + PRINTF("eth2 plugin invalid withdrawal credentials\n"); + PRINTF("Got %.*H\n", 32, msg->parameter); + PRINTF("Expected %.*H\n", 32, tmp); + context->valid = 0; + } + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - case 4 + (32 * 8): // withdrawal credentials - { - uint8_t tmp[48]; - uint32_t withdrawalKeyPath[4]; - withdrawalKeyPath[0] = WITHDRAWAL_KEY_PATH_1; - withdrawalKeyPath[1] = WITHDRAWAL_KEY_PATH_2; - withdrawalKeyPath[2] = eth2WithdrawalIndex; - withdrawalKeyPath[3] = WITHDRAWAL_KEY_PATH_4; - getEth2PublicKey(withdrawalKeyPath, 4, tmp); - PRINTF("eth2 plugin computed withdrawal public key %.*H\n", 48, tmp); - cx_hash_sha256(tmp, 48, tmp, 32); - tmp[0] = 0; - if (memcmp(tmp, msg->parameter, 32) != 0) { - PRINTF("eth2 plugin invalid withdrawal credentials\n"); - PRINTF("Got %.*H\n", 32, msg->parameter); - PRINTF("Expected %.*H\n", 32, tmp); - context->valid = 0; - } - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + default: + PRINTF("Unhandled parameter offset\n"); + break; + } + } break; - default: - PRINTF("Unhandled parameter offset\n"); - break; - } - } - break; + case ETH_PLUGIN_FINALIZE: { + ethPluginFinalize_t *msg = (ethPluginFinalize_t *) parameters; + eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t *) msg->pluginContext; + PRINTF("eth2 plugin finalize\n"); + if (context->valid) { + msg->numScreens = 1; + msg->uiType = ETH_UI_TYPE_GENERIC; + msg->result = ETH_PLUGIN_RESULT_OK; + } else { + msg->result = ETH_PLUGIN_RESULT_FALLBACK; + } + } break; - case ETH_PLUGIN_FINALIZE: { - ethPluginFinalize_t *msg = (ethPluginFinalize_t*)parameters; - eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t*)msg->pluginContext; - PRINTF("eth2 plugin finalize\n"); - if (context->valid) { - msg->numScreens = 1; - msg->uiType = ETH_UI_TYPE_GENERIC; - msg->result = ETH_PLUGIN_RESULT_OK; - } - else { - msg->result = ETH_PLUGIN_RESULT_FALLBACK; - } - } - break; + case ETH_PLUGIN_QUERY_CONTRACT_ID: { + ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; + strcpy(msg->name, "ETH2"); + strcpy(msg->version, "Deposit"); + msg->result = ETH_PLUGIN_RESULT_OK; + } break; - case ETH_PLUGIN_QUERY_CONTRACT_ID: { - ethQueryContractID_t *msg = (ethQueryContractID_t*)parameters; - strcpy(msg->name, "ETH2"); - strcpy(msg->version, "Deposit"); - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; + case ETH_PLUGIN_QUERY_CONTRACT_UI: { + ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters; + // eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t*)msg->pluginContext; + switch (msg->screenIndex) { + case 0: { + uint8_t decimals = WEI_TO_ETHER; + uint8_t *ticker = (uint8_t *) PIC(chainConfig->coinName); + strcpy(msg->title, "Amount"); + amountToString(tmpContent.txContent.value.value, + tmpContent.txContent.value.length, + decimals, + (char *) ticker, + msg->msg, + 100); + msg->result = ETH_PLUGIN_RESULT_OK; + } break; + default: + break; + } + } break; - case ETH_PLUGIN_QUERY_CONTRACT_UI: { - ethQueryContractUI_t *msg = (ethQueryContractUI_t*)parameters; - //eth2_deposit_parameters_t *context = (eth2_deposit_parameters_t*)msg->pluginContext; - switch(msg->screenIndex) { - case 0: { - uint8_t decimals = WEI_TO_ETHER; - uint8_t *ticker = (uint8_t *)PIC(chainConfig->coinName); - strcpy(msg->title, "Amount"); - amountToString(tmpContent.txContent.value.value, tmpContent.txContent.value.length, decimals, (char*)ticker, msg->msg, 100); - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; - default: - break; - } - } - break; - - default: - PRINTF("Unhandled message %d\n", message); - } + default: + PRINTF("Unhandled message %d\n", message); + } } #endif diff --git a/src_plugins/starkware/starkware_plugin.c b/src_plugins/starkware/starkware_plugin.c index e248bbe..3e2e051 100644 --- a/src_plugins/starkware/starkware_plugin.c +++ b/src_plugins/starkware/starkware_plugin.c @@ -1,713 +1,722 @@ #include #include "eth_plugin_interface.h" -#include "shared_context.h" // TODO : rewrite as independant code -#include "eth_plugin_internal.h" // TODO : rewrite as independant code +#include "shared_context.h" // TODO : rewrite as independant code +#include "eth_plugin_internal.h" // TODO : rewrite as independant code #ifdef HAVE_STARKWARE typedef enum { - STARKWARE_REGISTER = 0, - STARKWARE_DEPOSIT_TOKEN, - STARKWARE_DEPOSIT_ETH, - STARKWARE_DEPOSIT_CANCEL, - STARKWARE_DEPOSIT_RECLAIM, - STARKWARE_WITHDRAW, - STARKWARE_FULL_WITHDRAW, - STARKWARE_FREEZE, - STARKWARE_ESCAPE, - STARKWARE_VERIFY_ESCAPE, - STARKWARE_WITHDRAW_TO, - STARKWARE_DEPOSIT_NFT, - STARKWARE_DEPOSIT_NFT_RECLAIM, - STARKWARE_WITHDRAW_AND_MINT, - STARKWARE_WITHDRAW_NFT, - STARKWARE_WITHDRAW_NFT_TO + STARKWARE_REGISTER = 0, + STARKWARE_DEPOSIT_TOKEN, + STARKWARE_DEPOSIT_ETH, + STARKWARE_DEPOSIT_CANCEL, + STARKWARE_DEPOSIT_RECLAIM, + STARKWARE_WITHDRAW, + STARKWARE_FULL_WITHDRAW, + STARKWARE_FREEZE, + STARKWARE_ESCAPE, + STARKWARE_VERIFY_ESCAPE, + STARKWARE_WITHDRAW_TO, + STARKWARE_DEPOSIT_NFT, + STARKWARE_DEPOSIT_NFT_RECLAIM, + STARKWARE_WITHDRAW_AND_MINT, + STARKWARE_WITHDRAW_NFT, + STARKWARE_WITHDRAW_NFT_TO } starkwareSelector_t; #ifndef HAVE_TOKENS_EXTRA_LIST -static const uint8_t DEVERSIFI_CONTRACT[] = { - 0x01, - 0x5d,0x22,0x04,0x5d,0xac,0xea,0xb0,0x3b,0x15,0x80,0x31,0xec,0xb7,0xd9,0xd0,0x6f,0xad,0x24,0x60,0x9b -}; +static const uint8_t DEVERSIFI_CONTRACT[] = {0x01, 0x5d, 0x22, 0x04, 0x5d, 0xac, 0xea, + 0xb0, 0x3b, 0x15, 0x80, 0x31, 0xec, 0xb7, + 0xd9, 0xd0, 0x6f, 0xad, 0x24, 0x60, 0x9b}; #else static const uint8_t DEVERSIFI_CONTRACT[] = { - 0x02, - 0xe7,0x3a,0x39,0x4a,0xde,0x4d,0x94,0xa0,0x73,0x50,0x2d,0xa8,0x70,0x3e,0xa2,0x34,0x90,0xdc,0x7b,0x6a, - 0x69,0xC6,0x39,0x2E,0xb0,0x2a,0x28,0x82,0x31,0x41,0x34,0xc9,0x8D,0xDC,0xBF,0x73,0xB7,0xAd,0xBa,0xb1 -}; + 0x02, 0xe7, 0x3a, 0x39, 0x4a, 0xde, 0x4d, 0x94, 0xa0, 0x73, 0x50, 0x2d, 0xa8, 0x70, + 0x3e, 0xa2, 0x34, 0x90, 0xdc, 0x7b, 0x6a, 0x69, 0xC6, 0x39, 0x2E, 0xb0, 0x2a, 0x28, + 0x82, 0x31, 0x41, 0x34, 0xc9, 0x8D, 0xDC, 0xBF, 0x73, 0xB7, 0xAd, 0xBa, 0xb1}; #endif // register : address (20), stark key (32), drop param 3 - // Registration - // Contract Name - // From ETH address - // Master account +// Registration +// Contract Name +// From ETH address +// Master account // deposit token : stark key (32), verify assetType (32), vaultId (4), quantized Amount (32) - // Deposit - // Contract Name - // Master Account - // Token Account - // Amount +// Deposit +// Contract Name +// Master Account +// Token Account +// Amount // deposit : stark key (32), verify assetType (32), vaultId (4) - // Flow similar to deposit -// deposit cancel, deposit reclaim : stark key (32), assetType (reclaim) / assetId (cancel) (32) ignored, vaultId(4) -// full withdrawal, freeze : stark key (32), vaultId (4) - // Cancel Deposit | Reclaim Deposit | Full Withdrawal | Freeze - // Contract Name - // Master Account - // Token Account +// Flow similar to deposit +// deposit cancel, deposit reclaim : stark key (32), assetType (reclaim) / assetId (cancel) (32) +// ignored, vaultId(4) full withdrawal, freeze : stark key (32), vaultId (4) Cancel Deposit | +// Reclaim Deposit | Full Withdrawal | Freeze Contract Name Master Account Token Account // withdrawal : stark key (32), verify assetType (32) - // Withdrawal - // Contract Name - // Master Account - // To Eth Address - // Token Symbol +// Withdrawal +// Contract Name +// Master Account +// To Eth Address +// Token Symbol // withdrawal to : stark key (32), verify assetType (32), address (20) - // Withdrawal To - // Contract Name - // Master Account - // To Eth Address - // Token Symbol +// Withdrawal To +// Contract Name +// Master Account +// To Eth Address +// Token Symbol // escape : stark key (32), vaultId (4), verify assetType (32), quantized Amount (32) - // Escape - // Contract Name - // Amount - // Master Account - // Token Account +// Escape +// Contract Name +// Amount +// Master Account +// Token Account // verify escape : escapeProof (ignore) - // Verify Escape - // Contract Name +// Verify Escape +// Contract Name // deposit NFT : stark key (32), verify assetType (32), vault id (4), token id (32) - // Deposit - // Contract Name - // Master Account - // Token Account - // NFT Contract - // Token ID +// Deposit +// Contract Name +// Master Account +// Token Account +// NFT Contract +// Token ID // deposit NFT reclaim : stark key (32), verify assetType (32), vault id (4), token id (32) - // Reclaim Deposit - // Contract Name - // Master Account - // Token Account - // NFT Contract - // Token ID +// Reclaim Deposit +// Contract Name +// Master Account +// Token Account +// NFT Contract +// Token ID // withdraw and mint : stark key (32), verify assetType (32), mintable blob (ignored variable) - // Withdrawal - // Contract Name - // Master Account - // Asset Contract +// Withdrawal +// Contract Name +// Master Account +// Asset Contract // withdraw NFT : stark key (32), verify assetType (32), token id (32) - // Withdrawal - // Contract Name - // Master Account - // To Eth Address - // NFT Contract - // Token ID +// Withdrawal +// Contract Name +// Master Account +// To Eth Address +// NFT Contract +// Token ID // withdraw NFT To : stark key (32), verify assetType (32), token id (32), address (20) - // Withdrawal To - // Contract Name - // Master Account - // To Eth Address - // NFT Contract - // Token ID +// Withdrawal To +// Contract Name +// Master Account +// To Eth Address +// NFT Contract +// Token ID +static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = {0, + 4 + 32 + 32 + 32 + 32, + 4 + 32 + 32 + 32, + 4 + 32 + 32 + 32, + 4 + 32 + 32 + 32, + 4 + 32 + 32, + 4 + 32 + 32, + 4 + 32 + 32, + 4 + 32 + 32 + 32 + 32, + 0, + 4 + 32 + 32 + 32, + 4 + 32 + 32 + 32 + 32, + 4 + 32 + 32 + 32 + 32, + 0, + 4 + 32 + 32 + 32, + 4 + 32 + 32 + 32 + 32}; -static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = { - 0, - 4 + 32 + 32 + 32 + 32, - 4 + 32 + 32 + 32, - 4 + 32 + 32 + 32, - 4 + 32 + 32 + 32, - 4 + 32 + 32, - 4 + 32 + 32, - 4 + 32 + 32, - 4 + 32 + 32 + 32 + 32, - 0, - 4 + 32 + 32 + 32, - 4 + 32 + 32 + 32 + 32, - 4 + 32 + 32 + 32 + 32, - 0, - 4 + 32 + 32 + 32, - 4 + 32 + 32 + 32 + 32 -}; - -static const uint8_t STARKWARE_NUM_SCREENS[] = { - 4 - 1, - 5 - 1, - 5 - 1, - 4 - 1, - 4 - 1, - 5 - 1, - 4 - 1, - 4 - 1, - 5 - 1, - 2 - 1, - 5 - 1, - 6 - 1, - 6 - 1, - 4 - 1, - 6 - 1, - 6 - 1 -}; +static const uint8_t STARKWARE_NUM_SCREENS[] = {4 - 1, + 5 - 1, + 5 - 1, + 4 - 1, + 4 - 1, + 5 - 1, + 4 - 1, + 4 - 1, + 5 - 1, + 2 - 1, + 5 - 1, + 6 - 1, + 6 - 1, + 4 - 1, + 6 - 1, + 6 - 1}; typedef struct starkware_parameters_t { - - uint8_t vaultId[4]; - uint8_t selectorIndex; - uint8_t starkKey[32]; - uint8_t amount[32]; - uint8_t validToken; + uint8_t vaultId[4]; + uint8_t selectorIndex; + uint8_t starkKey[32]; + uint8_t amount[32]; + uint8_t validToken; } starkware_parameters_t; bool is_deversify_contract(const uint8_t *address) { - uint32_t offset = 0; - uint8_t size = DEVERSIFI_CONTRACT[0]; - uint8_t i; + uint32_t offset = 0; + uint8_t size = DEVERSIFI_CONTRACT[0]; + uint8_t i; - for (i=0; iaddress : NULL), - dataContext.tokenContext.quantumType, - dataContext.tokenContext.quantum, - dataContext.tokenContext.mintingBlob, assetTypeOnly, tmp32); - if (memcmp(tokenId, tmp32, 32) != 0) { - PRINTF("Token ID not matching - computed %.*H\n", 32, tmp32); - PRINTF("Current quantum %.*H\n", 32, dataContext.tokenContext.quantum); - PRINTF("Requested %.*H\n", 32, tokenId); - return false; + if (quantumSet) { + cx_sha3_t sha3; + tokenDefinition_t *currentToken = NULL; + if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) { + currentToken = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex]; + } + cx_keccak_init(&sha3, 256); + compute_token_id(&sha3, + (currentToken != NULL ? currentToken->address : NULL), + dataContext.tokenContext.quantumType, + dataContext.tokenContext.quantum, + dataContext.tokenContext.mintingBlob, + assetTypeOnly, + tmp32); + if (memcmp(tokenId, tmp32, 32) != 0) { + PRINTF("Token ID not matching - computed %.*H\n", 32, tmp32); + PRINTF("Current quantum %.*H\n", 32, dataContext.tokenContext.quantum); + PRINTF("Requested %.*H\n", 32, tokenId); + return false; + } + } else { + PRINTF("Quantum not set\n"); + return false; } - } - else { - PRINTF("Quantum not set\n"); - return false; - } - return true; + return true; } bool starkware_verify_nft_token_id(uint8_t *tokenId) { - if (!quantumSet) { - PRINTF("Quantum not set\n"); - return false; - } - switch(dataContext.tokenContext.quantumType) { - case STARK_QUANTUM_ERC721: - case STARK_QUANTUM_MINTABLE_ERC721: - break; - default: - PRINTF("Unexpected quantum type for NFT token id check %d\n", dataContext.tokenContext.quantumType); - return false; - } - if (memcmp(dataContext.tokenContext.quantum, tokenId, 32) != 0) { - PRINTF("Token ID not matching - expected %.*H\n", 32, dataContext.tokenContext.quantum); - PRINTF("Current token ID %.*H\n", 32, tokenId); - return false; - } - return true; + if (!quantumSet) { + PRINTF("Quantum not set\n"); + return false; + } + switch (dataContext.tokenContext.quantumType) { + case STARK_QUANTUM_ERC721: + case STARK_QUANTUM_MINTABLE_ERC721: + break; + default: + PRINTF("Unexpected quantum type for NFT token id check %d\n", + dataContext.tokenContext.quantumType); + return false; + } + if (memcmp(dataContext.tokenContext.quantum, tokenId, 32) != 0) { + PRINTF("Token ID not matching - expected %.*H\n", 32, dataContext.tokenContext.quantum); + PRINTF("Current token ID %.*H\n", 32, tokenId); + return false; + } + return true; } void starkware_print_vault_id(uint32_t vaultId, char *destination) { - snprintf(destination, 10, "%d", vaultId); + snprintf(destination, 10, "%d", vaultId); } void starkware_print_stark_key(uint8_t *starkKey, char *destination) { - snprintf(destination, 70, "0x%.*H", 32, starkKey); + snprintf(destination, 70, "0x%.*H", 32, starkKey); } // TODO : rewrite as independant code void starkware_print_eth_address(uint8_t *address, char *destination) { - destination[0] = '0'; - destination[1] = 'x'; - getEthAddressStringFromBinary(address, destination + 2, &global_sha3, chainConfig); - destination[42] = '\0'; + destination[0] = '0'; + destination[1] = 'x'; + getEthAddressStringFromBinary(address, destination + 2, &global_sha3, chainConfig); + destination[42] = '\0'; } // TODO : rewrite as independant code void starkware_print_amount(uint8_t *amountData, char *destination, bool forEscape) { - uint256_t amount, amountPre, quantum; - uint8_t decimals; - char *ticker = (char*)PIC(chainConfig->coinName); + uint256_t amount, amountPre, quantum; + uint8_t decimals; + char *ticker = (char *) PIC(chainConfig->coinName); - if ((amountData == NULL) || (forEscape && (dataContext.tokenContext.quantumIndex == MAX_TOKEN))) { - decimals = WEI_TO_ETHER; - if (!forEscape) { - convertUint256BE(tmpContent.txContent.value.value, tmpContent.txContent.value.length, &amount); + if ((amountData == NULL) || + (forEscape && (dataContext.tokenContext.quantumIndex == MAX_TOKEN))) { + decimals = WEI_TO_ETHER; + if (!forEscape) { + convertUint256BE(tmpContent.txContent.value.value, + tmpContent.txContent.value.length, + &amount); + } else { + readu256BE(amountData, &amountPre); + } + } else { + tokenDefinition_t *token = + &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex]; + decimals = token->decimals; + ticker = (char *) token->ticker; + readu256BE(amountData, &amountPre); } - else { - readu256BE(amountData, &amountPre); + if (amountData != NULL) { + readu256BE(dataContext.tokenContext.quantum, &quantum); + mul256(&amountPre, &quantum, &amount); } - } - else { - tokenDefinition_t *token = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex]; - decimals = token->decimals; - ticker = (char*)token->ticker; - readu256BE(amountData, &amountPre); - } - if (amountData != NULL) { - readu256BE(dataContext.tokenContext.quantum, &quantum); - mul256(&amountPre, &quantum, &amount); - } - tostring256(&amount, 10, (char*)(G_io_apdu_buffer + 100), 100); - strcpy(destination, ticker); - adjustDecimals((char*)(G_io_apdu_buffer + 100), strlen((char*)(G_io_apdu_buffer + 100)), destination + strlen(ticker), 50 - strlen(ticker), decimals); + tostring256(&amount, 10, (char *) (G_io_apdu_buffer + 100), 100); + strcpy(destination, ticker); + adjustDecimals((char *) (G_io_apdu_buffer + 100), + strlen((char *) (G_io_apdu_buffer + 100)), + destination + strlen(ticker), + 50 - strlen(ticker), + decimals); } // TODO : rewrite as independant code void starkware_print_ticker(char *destination) { - char *ticker = (char*)PIC(chainConfig->coinName); + char *ticker = (char *) PIC(chainConfig->coinName); - if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) { - tokenDefinition_t *token = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex]; - ticker = (char*)token->ticker; - } - strcpy(destination, ticker); + if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) { + tokenDefinition_t *token = + &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex]; + ticker = (char *) token->ticker; + } + strcpy(destination, ticker); } // TODO : rewrite as independant code void starkware_print_asset_contract(char *destination) { - // token has been validated to be present previously - if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) { - tokenDefinition_t *token = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex]; - starkware_print_eth_address(token->address, destination); - } - else { - strcpy(destination, "UNKNOWN"); - } + // token has been validated to be present previously + if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) { + tokenDefinition_t *token = + &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex]; + starkware_print_eth_address(token->address, destination); + } else { + strcpy(destination, "UNKNOWN"); + } } // TODO : rewrite as independant code void starkware_get_source_address(char *destination) { - uint8_t privateKeyData[32]; - cx_ecfp_private_key_t privateKey; - cx_ecfp_public_key_t publicKey; - os_perso_derive_node_bip32(CX_CURVE_256K1, tmpCtx.transactionContext.bip32Path, + uint8_t privateKeyData[32]; + cx_ecfp_private_key_t privateKey; + cx_ecfp_public_key_t publicKey; + 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); - io_seproxyhal_io_heartbeat(); - cx_ecfp_generate_pair(CX_CURVE_256K1, &publicKey, &privateKey, 1); - explicit_bzero(&privateKey, sizeof(privateKey)); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); - io_seproxyhal_io_heartbeat(); - destination[0] = '0'; - destination[1] = 'x'; - getEthAddressStringFromKey(&publicKey, destination + 2, &global_sha3, chainConfig); - destination[42] = '\0'; + privateKeyData, + NULL); + cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); + io_seproxyhal_io_heartbeat(); + cx_ecfp_generate_pair(CX_CURVE_256K1, &publicKey, &privateKey, 1); + explicit_bzero(&privateKey, sizeof(privateKey)); + explicit_bzero(privateKeyData, sizeof(privateKeyData)); + io_seproxyhal_io_heartbeat(); + destination[0] = '0'; + destination[1] = 'x'; + getEthAddressStringFromKey(&publicKey, destination + 2, &global_sha3, chainConfig); + destination[42] = '\0'; } void starkware_plugin_call(int message, void *parameters) { - - switch(message) { - case ETH_PLUGIN_INIT_CONTRACT: { - uint8_t i; - ethPluginInitContract_t *msg = (ethPluginInitContract_t*)parameters; - starkware_parameters_t *context = (starkware_parameters_t*)msg->pluginContext; - PRINTF("starkware plugin init\n"); - for (i=0; iselector, SELECTOR_SIZE) == 0) { - context->selectorIndex = i; - break; - } - } - if (i == NUM_STARKWARE_SELECTORS) { - PRINTF("Unknown selector %.*H\n", SELECTOR_SIZE, msg->selector); - break; - } - if (STARKWARE_EXPECTED_DATA_SIZE[context->selectorIndex] != 0) { - if (msg->dataSize != STARKWARE_EXPECTED_DATA_SIZE[context->selectorIndex]) { - PRINTF("Unexpected data size for command %d expected %d got %d\n", context->selectorIndex, - STARKWARE_EXPECTED_DATA_SIZE[context->selectorIndex], msg->dataSize); - break; - } - } - context->validToken = true; - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; - - case ETH_PLUGIN_PROVIDE_PARAMETER : { - ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t*)parameters; - starkware_parameters_t *context = (starkware_parameters_t*)msg->pluginContext; - PRINTF("starkware plugin provide parameter %d %.*H\n", msg->parameterOffset, 32, msg->parameter); - // Ignore for verify escape - if (context->selectorIndex == STARKWARE_VERIFY_ESCAPE) { - msg->result = ETH_PLUGIN_RESULT_OK; - break; - } - switch(msg->parameterOffset) { - - case 4: - switch(context->selectorIndex) { - case STARKWARE_REGISTER: - memmove(context->amount, msg->parameter + 32 - 20, 20); - break; - - case STARKWARE_DEPOSIT_TOKEN: - case STARKWARE_DEPOSIT_ETH: - case STARKWARE_DEPOSIT_CANCEL: - case STARKWARE_DEPOSIT_RECLAIM: - case STARKWARE_WITHDRAW: - case STARKWARE_FULL_WITHDRAW: - case STARKWARE_FREEZE: - case STARKWARE_ESCAPE: - case STARKWARE_WITHDRAW_TO: - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - case STARKWARE_WITHDRAW_AND_MINT: - case STARKWARE_WITHDRAW_NFT: - case STARKWARE_WITHDRAW_NFT_TO: - memmove(context->starkKey, msg->parameter, 32); - break; - - default: - break; - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - case 4 + 32: - switch(context->selectorIndex) { - case STARKWARE_REGISTER: - memmove(context->starkKey, msg->parameter, 32); - break; - - case STARKWARE_ESCAPE: - memmove(context->vaultId, msg->parameter + 32 - 4, 4); - break; - - case STARKWARE_DEPOSIT_CANCEL: - case STARKWARE_DEPOSIT_RECLAIM: - break; - - case STARKWARE_FULL_WITHDRAW: - case STARKWARE_FREEZE: - memmove(context->vaultId, msg->parameter + 32 - 4, 4); - break; - - case STARKWARE_DEPOSIT_ETH: - case STARKWARE_DEPOSIT_TOKEN: - case STARKWARE_WITHDRAW: - case STARKWARE_WITHDRAW_TO: - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - case STARKWARE_WITHDRAW_AND_MINT: - case STARKWARE_WITHDRAW_NFT: - case STARKWARE_WITHDRAW_NFT_TO: - context->validToken = starkware_verify_asset_id(context->amount, msg->parameter, true); - break; - - default: - break; - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - case 4 + 32 + 32: - switch(context->selectorIndex) { - - case STARKWARE_ESCAPE: - context->validToken = starkware_verify_asset_id(context->amount, msg->parameter, true); - break; - - case STARKWARE_DEPOSIT_CANCEL: - case STARKWARE_DEPOSIT_RECLAIM: - case STARKWARE_DEPOSIT_ETH: - case STARKWARE_DEPOSIT_TOKEN: - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - memmove(context->vaultId, msg->parameter + 32 - 4, 4); - break; - - case STARKWARE_WITHDRAW_TO: - memmove(context->amount, msg->parameter + 32 - 20, 20); - break; - - case STARKWARE_WITHDRAW_NFT: - case STARKWARE_WITHDRAW_NFT_TO: - context->validToken = starkware_verify_nft_token_id(msg->parameter); - break; - - default: - break; - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - case 4 + 32 + 32 + 32: - switch(context->selectorIndex) { - - case STARKWARE_ESCAPE: - case STARKWARE_DEPOSIT_TOKEN: - memmove(context->amount, msg->parameter, 32); - break; - - case STARKWARE_WITHDRAW_NFT_TO: - memmove(context->amount, msg->parameter + 32 - 20, 20); - break; - - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - context->validToken = starkware_verify_nft_token_id(msg->parameter); - break; - - default: - break; - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - default: - switch(context->selectorIndex) { - case STARKWARE_REGISTER: - case STARKWARE_VERIFY_ESCAPE: - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - default: - PRINTF("Unhandled parameter offset\n"); - break; - } - } - } - break; - - case ETH_PLUGIN_FINALIZE: { - ethPluginFinalize_t *msg = (ethPluginFinalize_t*)parameters; - starkware_parameters_t *context = (starkware_parameters_t*)msg->pluginContext; - PRINTF("starkware plugin finalize\n"); - if (!context->validToken) { - msg->result = ETH_PLUGIN_RESULT_FALLBACK; - } - else { - msg->uiType = ETH_UI_TYPE_GENERIC; - msg->numScreens = STARKWARE_NUM_SCREENS[context->selectorIndex]; - msg->result = ETH_PLUGIN_RESULT_OK; - } - } - break; - - case ETH_PLUGIN_QUERY_CONTRACT_ID: { - ethQueryContractID_t *msg = (ethQueryContractID_t*)parameters; - starkware_parameters_t *context = (starkware_parameters_t*)msg->pluginContext; - PRINTF("starkware query contract id\n"); - switch(context->selectorIndex) { - case STARKWARE_REGISTER: - strcpy(msg->name, "Register"); - break; - case STARKWARE_DEPOSIT_TOKEN: - case STARKWARE_DEPOSIT_ETH: - case STARKWARE_DEPOSIT_NFT: - strcpy(msg->name, "Deposit"); - break; - case STARKWARE_DEPOSIT_CANCEL: - strcpy(msg->name, "Cancel Deposit"); - break; - case STARKWARE_DEPOSIT_RECLAIM: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - strcpy(msg->name, "Reclaim Deposit"); - break; - case STARKWARE_WITHDRAW: - case STARKWARE_WITHDRAW_NFT: - case STARKWARE_WITHDRAW_AND_MINT: - strcpy(msg->name, "Withdrawal"); - break; - case STARKWARE_FULL_WITHDRAW: - strcpy(msg->name, "Full Withdrawal"); - break; - case STARKWARE_FREEZE: - strcpy(msg->name, "Freeze"); - break; - case STARKWARE_ESCAPE: - strcpy(msg->name, "Escape"); - break; - case STARKWARE_VERIFY_ESCAPE: - strcpy(msg->name, "Verify Escape"); - break; - case STARKWARE_WITHDRAW_TO: - case STARKWARE_WITHDRAW_NFT_TO: - strcpy(msg->name, "Withdrawal To"); - break; - - default: - break; - } - strcpy(msg->version, is_deversify_contract(tmpContent.txContent.destination) ? "DeversiFi" : "Starkware"); - msg->result = ETH_PLUGIN_RESULT_OK; - } - break; - - case ETH_PLUGIN_QUERY_CONTRACT_UI: { - ethQueryContractUI_t *msg = (ethQueryContractUI_t*)parameters; - starkware_parameters_t *context = (starkware_parameters_t*)msg->pluginContext; - switch(msg->screenIndex) { - case 0: - strcpy(msg->title, "Contract Name"); - if (is_deversify_contract(tmpContent.txContent.destination)) { - strcpy(msg->msg, "DeversiFi"); + switch (message) { + case ETH_PLUGIN_INIT_CONTRACT: { + uint8_t i; + ethPluginInitContract_t *msg = (ethPluginInitContract_t *) parameters; + starkware_parameters_t *context = (starkware_parameters_t *) msg->pluginContext; + PRINTF("starkware plugin init\n"); + for (i = 0; i < NUM_STARKWARE_SELECTORS; i++) { + if (memcmp(PIC(STARKWARE_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == 0) { + context->selectorIndex = i; + break; + } } - else { - starkware_print_eth_address(tmpContent.txContent.destination, msg->msg); - } + if (i == NUM_STARKWARE_SELECTORS) { + PRINTF("Unknown selector %.*H\n", SELECTOR_SIZE, msg->selector); + break; + } + if (STARKWARE_EXPECTED_DATA_SIZE[context->selectorIndex] != 0) { + if (msg->dataSize != STARKWARE_EXPECTED_DATA_SIZE[context->selectorIndex]) { + PRINTF("Unexpected data size for command %d expected %d got %d\n", + context->selectorIndex, + STARKWARE_EXPECTED_DATA_SIZE[context->selectorIndex], + msg->dataSize); + break; + } + } + context->validToken = true; msg->result = ETH_PLUGIN_RESULT_OK; - break; - case 1: - switch(context->selectorIndex) { - case STARKWARE_REGISTER: - strcpy(msg->title, "From ETH Address"); - starkware_print_eth_address(context->amount, msg->msg); - break; - case STARKWARE_ESCAPE: - strcpy(msg->title, "Amount"); - starkware_print_amount(context->amount, msg->msg, true); - break; - case STARKWARE_DEPOSIT_TOKEN: - case STARKWARE_DEPOSIT_ETH: - case STARKWARE_DEPOSIT_CANCEL: - case STARKWARE_DEPOSIT_RECLAIM: - case STARKWARE_WITHDRAW: - case STARKWARE_FULL_WITHDRAW: - case STARKWARE_FREEZE: - case STARKWARE_VERIFY_ESCAPE: - case STARKWARE_WITHDRAW_TO: - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - case STARKWARE_WITHDRAW_AND_MINT: - case STARKWARE_WITHDRAW_NFT: - case STARKWARE_WITHDRAW_NFT_TO: - strcpy(msg->title, "Master Account"); - starkware_print_stark_key(context->starkKey, msg->msg); - break; - default: - PRINTF("Unexpected screen %d for %d\n", msg->screenIndex, context->selectorIndex); - break; - } + } break; + + case ETH_PLUGIN_PROVIDE_PARAMETER: { + ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters; + starkware_parameters_t *context = (starkware_parameters_t *) msg->pluginContext; + PRINTF("starkware plugin provide parameter %d %.*H\n", + msg->parameterOffset, + 32, + msg->parameter); + // Ignore for verify escape + if (context->selectorIndex == STARKWARE_VERIFY_ESCAPE) { + msg->result = ETH_PLUGIN_RESULT_OK; + break; + } + switch (msg->parameterOffset) { + case 4: + switch (context->selectorIndex) { + case STARKWARE_REGISTER: + memmove(context->amount, msg->parameter + 32 - 20, 20); + break; + + case STARKWARE_DEPOSIT_TOKEN: + case STARKWARE_DEPOSIT_ETH: + case STARKWARE_DEPOSIT_CANCEL: + case STARKWARE_DEPOSIT_RECLAIM: + case STARKWARE_WITHDRAW: + case STARKWARE_FULL_WITHDRAW: + case STARKWARE_FREEZE: + case STARKWARE_ESCAPE: + case STARKWARE_WITHDRAW_TO: + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + case STARKWARE_WITHDRAW_AND_MINT: + case STARKWARE_WITHDRAW_NFT: + case STARKWARE_WITHDRAW_NFT_TO: + memmove(context->starkKey, msg->parameter, 32); + break; + + default: + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + case 4 + 32: + switch (context->selectorIndex) { + case STARKWARE_REGISTER: + memmove(context->starkKey, msg->parameter, 32); + break; + + case STARKWARE_ESCAPE: + memmove(context->vaultId, msg->parameter + 32 - 4, 4); + break; + + case STARKWARE_DEPOSIT_CANCEL: + case STARKWARE_DEPOSIT_RECLAIM: + break; + + case STARKWARE_FULL_WITHDRAW: + case STARKWARE_FREEZE: + memmove(context->vaultId, msg->parameter + 32 - 4, 4); + break; + + case STARKWARE_DEPOSIT_ETH: + case STARKWARE_DEPOSIT_TOKEN: + case STARKWARE_WITHDRAW: + case STARKWARE_WITHDRAW_TO: + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + case STARKWARE_WITHDRAW_AND_MINT: + case STARKWARE_WITHDRAW_NFT: + case STARKWARE_WITHDRAW_NFT_TO: + context->validToken = + starkware_verify_asset_id(context->amount, msg->parameter, true); + break; + + default: + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + case 4 + 32 + 32: + switch (context->selectorIndex) { + case STARKWARE_ESCAPE: + context->validToken = + starkware_verify_asset_id(context->amount, msg->parameter, true); + break; + + case STARKWARE_DEPOSIT_CANCEL: + case STARKWARE_DEPOSIT_RECLAIM: + case STARKWARE_DEPOSIT_ETH: + case STARKWARE_DEPOSIT_TOKEN: + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + memmove(context->vaultId, msg->parameter + 32 - 4, 4); + break; + + case STARKWARE_WITHDRAW_TO: + memmove(context->amount, msg->parameter + 32 - 20, 20); + break; + + case STARKWARE_WITHDRAW_NFT: + case STARKWARE_WITHDRAW_NFT_TO: + context->validToken = starkware_verify_nft_token_id(msg->parameter); + break; + + default: + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + case 4 + 32 + 32 + 32: + switch (context->selectorIndex) { + case STARKWARE_ESCAPE: + case STARKWARE_DEPOSIT_TOKEN: + memmove(context->amount, msg->parameter, 32); + break; + + case STARKWARE_WITHDRAW_NFT_TO: + memmove(context->amount, msg->parameter + 32 - 20, 20); + break; + + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + context->validToken = starkware_verify_nft_token_id(msg->parameter); + break; + + default: + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + default: + switch (context->selectorIndex) { + case STARKWARE_REGISTER: + case STARKWARE_VERIFY_ESCAPE: + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + default: + PRINTF("Unhandled parameter offset\n"); + break; + } + } + } break; + + case ETH_PLUGIN_FINALIZE: { + ethPluginFinalize_t *msg = (ethPluginFinalize_t *) parameters; + starkware_parameters_t *context = (starkware_parameters_t *) msg->pluginContext; + PRINTF("starkware plugin finalize\n"); + if (!context->validToken) { + msg->result = ETH_PLUGIN_RESULT_FALLBACK; + } else { + msg->uiType = ETH_UI_TYPE_GENERIC; + msg->numScreens = STARKWARE_NUM_SCREENS[context->selectorIndex]; + msg->result = ETH_PLUGIN_RESULT_OK; + } + } break; + + case ETH_PLUGIN_QUERY_CONTRACT_ID: { + ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; + starkware_parameters_t *context = (starkware_parameters_t *) msg->pluginContext; + PRINTF("starkware query contract id\n"); + switch (context->selectorIndex) { + case STARKWARE_REGISTER: + strcpy(msg->name, "Register"); + break; + case STARKWARE_DEPOSIT_TOKEN: + case STARKWARE_DEPOSIT_ETH: + case STARKWARE_DEPOSIT_NFT: + strcpy(msg->name, "Deposit"); + break; + case STARKWARE_DEPOSIT_CANCEL: + strcpy(msg->name, "Cancel Deposit"); + break; + case STARKWARE_DEPOSIT_RECLAIM: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + strcpy(msg->name, "Reclaim Deposit"); + break; + case STARKWARE_WITHDRAW: + case STARKWARE_WITHDRAW_NFT: + case STARKWARE_WITHDRAW_AND_MINT: + strcpy(msg->name, "Withdrawal"); + break; + case STARKWARE_FULL_WITHDRAW: + strcpy(msg->name, "Full Withdrawal"); + break; + case STARKWARE_FREEZE: + strcpy(msg->name, "Freeze"); + break; + case STARKWARE_ESCAPE: + strcpy(msg->name, "Escape"); + break; + case STARKWARE_VERIFY_ESCAPE: + strcpy(msg->name, "Verify Escape"); + break; + case STARKWARE_WITHDRAW_TO: + case STARKWARE_WITHDRAW_NFT_TO: + strcpy(msg->name, "Withdrawal To"); + break; + + default: + break; + } + strcpy(msg->version, + is_deversify_contract(tmpContent.txContent.destination) ? "DeversiFi" + : "Starkware"); msg->result = ETH_PLUGIN_RESULT_OK; - break; - case 2: - switch(context->selectorIndex) { - case STARKWARE_REGISTER: - case STARKWARE_ESCAPE: - strcpy(msg->title, "Master Account"); - starkware_print_stark_key(context->starkKey, msg->msg); - break; + } break; - case STARKWARE_DEPOSIT_TOKEN: - case STARKWARE_DEPOSIT_ETH: - case STARKWARE_DEPOSIT_CANCEL: - case STARKWARE_DEPOSIT_RECLAIM: - case STARKWARE_FULL_WITHDRAW: - case STARKWARE_FREEZE: - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - strcpy(msg->title, "Token Account"); - starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg); - break; - case STARKWARE_WITHDRAW: - case STARKWARE_WITHDRAW_NFT: - strcpy(msg->title, "To ETH Address"); - starkware_get_source_address(msg->msg); - break; - case STARKWARE_WITHDRAW_TO: - case STARKWARE_WITHDRAW_NFT_TO: - strcpy(msg->title, "To ETH Address"); - starkware_print_eth_address(context->amount, msg->msg); - break; - case STARKWARE_WITHDRAW_AND_MINT: - strcpy(msg->title, "Asset Contract"); - starkware_print_asset_contract(msg->msg); - break; + case ETH_PLUGIN_QUERY_CONTRACT_UI: { + ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters; + starkware_parameters_t *context = (starkware_parameters_t *) msg->pluginContext; + switch (msg->screenIndex) { + case 0: + strcpy(msg->title, "Contract Name"); + if (is_deversify_contract(tmpContent.txContent.destination)) { + strcpy(msg->msg, "DeversiFi"); + } else { + starkware_print_eth_address(tmpContent.txContent.destination, msg->msg); + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + case 1: + switch (context->selectorIndex) { + case STARKWARE_REGISTER: + strcpy(msg->title, "From ETH Address"); + starkware_print_eth_address(context->amount, msg->msg); + break; + case STARKWARE_ESCAPE: + strcpy(msg->title, "Amount"); + starkware_print_amount(context->amount, msg->msg, true); + break; + case STARKWARE_DEPOSIT_TOKEN: + case STARKWARE_DEPOSIT_ETH: + case STARKWARE_DEPOSIT_CANCEL: + case STARKWARE_DEPOSIT_RECLAIM: + case STARKWARE_WITHDRAW: + case STARKWARE_FULL_WITHDRAW: + case STARKWARE_FREEZE: + case STARKWARE_VERIFY_ESCAPE: + case STARKWARE_WITHDRAW_TO: + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + case STARKWARE_WITHDRAW_AND_MINT: + case STARKWARE_WITHDRAW_NFT: + case STARKWARE_WITHDRAW_NFT_TO: + strcpy(msg->title, "Master Account"); + starkware_print_stark_key(context->starkKey, msg->msg); + break; + default: + PRINTF("Unexpected screen %d for %d\n", + msg->screenIndex, + context->selectorIndex); + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; + case 2: + switch (context->selectorIndex) { + case STARKWARE_REGISTER: + case STARKWARE_ESCAPE: + strcpy(msg->title, "Master Account"); + starkware_print_stark_key(context->starkKey, msg->msg); + break; - default: - PRINTF("Unexpected screen %d for %d\n", msg->screenIndex, context->selectorIndex); - break; - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; + case STARKWARE_DEPOSIT_TOKEN: + case STARKWARE_DEPOSIT_ETH: + case STARKWARE_DEPOSIT_CANCEL: + case STARKWARE_DEPOSIT_RECLAIM: + case STARKWARE_FULL_WITHDRAW: + case STARKWARE_FREEZE: + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + strcpy(msg->title, "Token Account"); + starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg); + break; + case STARKWARE_WITHDRAW: + case STARKWARE_WITHDRAW_NFT: + strcpy(msg->title, "To ETH Address"); + starkware_get_source_address(msg->msg); + break; + case STARKWARE_WITHDRAW_TO: + case STARKWARE_WITHDRAW_NFT_TO: + strcpy(msg->title, "To ETH Address"); + starkware_print_eth_address(context->amount, msg->msg); + break; + case STARKWARE_WITHDRAW_AND_MINT: + strcpy(msg->title, "Asset Contract"); + starkware_print_asset_contract(msg->msg); + break; - case 3: - switch(context->selectorIndex) { - case STARKWARE_ESCAPE: - strcpy(msg->title, "Token Account"); - starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg); - break; - case STARKWARE_DEPOSIT_TOKEN: - case STARKWARE_DEPOSIT_ETH: - strcpy(msg->title, "Amount"); - starkware_print_amount( - (context->selectorIndex == STARKWARE_DEPOSIT_ETH ? NULL : context->amount), - msg->msg, false); - break; - case STARKWARE_WITHDRAW: - case STARKWARE_WITHDRAW_TO: - strcpy(msg->title, "Token Symbol"); - starkware_print_ticker(msg->msg); - break; + default: + PRINTF("Unexpected screen %d for %d\n", + msg->screenIndex, + context->selectorIndex); + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; - case STARKWARE_WITHDRAW_NFT: - case STARKWARE_WITHDRAW_NFT_TO: - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - strcpy(msg->title, "NFT Contract"); - starkware_print_asset_contract(msg->msg); - break; + case 3: + switch (context->selectorIndex) { + case STARKWARE_ESCAPE: + strcpy(msg->title, "Token Account"); + starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg); + break; + case STARKWARE_DEPOSIT_TOKEN: + case STARKWARE_DEPOSIT_ETH: + strcpy(msg->title, "Amount"); + starkware_print_amount( + (context->selectorIndex == STARKWARE_DEPOSIT_ETH ? NULL + : context->amount), + msg->msg, + false); + break; + case STARKWARE_WITHDRAW: + case STARKWARE_WITHDRAW_TO: + strcpy(msg->title, "Token Symbol"); + starkware_print_ticker(msg->msg); + break; - default: - PRINTF("Unexpected screen %d for %d\n", msg->screenIndex, context->selectorIndex); - break; - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; + case STARKWARE_WITHDRAW_NFT: + case STARKWARE_WITHDRAW_NFT_TO: + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + strcpy(msg->title, "NFT Contract"); + starkware_print_asset_contract(msg->msg); + break; - case 4: - switch(context->selectorIndex) { + default: + PRINTF("Unexpected screen %d for %d\n", + msg->screenIndex, + context->selectorIndex); + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; - case STARKWARE_WITHDRAW_NFT: - case STARKWARE_WITHDRAW_NFT_TO: - case STARKWARE_DEPOSIT_NFT: - case STARKWARE_DEPOSIT_NFT_RECLAIM: - strcpy(msg->title, "TokenID"); - starkware_print_stark_key(dataContext.tokenContext.quantum, msg->msg); - break; + case 4: + switch (context->selectorIndex) { + case STARKWARE_WITHDRAW_NFT: + case STARKWARE_WITHDRAW_NFT_TO: + case STARKWARE_DEPOSIT_NFT: + case STARKWARE_DEPOSIT_NFT_RECLAIM: + strcpy(msg->title, "TokenID"); + starkware_print_stark_key(dataContext.tokenContext.quantum, msg->msg); + break; - default: - PRINTF("Unexpected screen %d for %d\n", msg->screenIndex, context->selectorIndex); - break; - } - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - default: - PRINTF("Unexpected screen %d for %d\n", msg->screenIndex, context->selectorIndex); - break; - } - } - break; + default: + PRINTF("Unexpected screen %d for %d\n", + msg->screenIndex, + context->selectorIndex); + break; + } + msg->result = ETH_PLUGIN_RESULT_OK; + break; - default: - PRINTF("Unhandled message %d\n", message); - } + default: + PRINTF("Unexpected screen %d for %d\n", + msg->screenIndex, + context->selectorIndex); + break; + } + } break; + + default: + PRINTF("Unhandled message %d\n", message); + } } #endif From 8e57f1d699f641c4082f3b00432b6876fdd5556a Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Tue, 1 Dec 2020 16:44:51 +0100 Subject: [PATCH 3/3] Add a minimal github action pipeline --- .github/workflows/ci-workflow.yml | 36 +++++++++++++++++++++++++++++ .github/workflows/lint-workflow.yml | 19 +++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 .github/workflows/ci-workflow.yml create mode 100644 .github/workflows/lint-workflow.yml diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml new file mode 100644 index 0000000..aa826d1 --- /dev/null +++ b/.github/workflows/ci-workflow.yml @@ -0,0 +1,36 @@ +name: Compilation & tests + +on: [push, pull_request] + +jobs: + job_build_debug: + name: Build debug + runs-on: ubuntu-latest + + container: + image: docker://ledgerhq/ledger-app-builder:1.6.1-2 + + steps: + - name: Clone + uses: actions/checkout@v2 + + - name: Build an altcoin + run: | + make DEBUG=1 CHAIN=ethereum_classic + + - name: Upload altcoin binary + uses: actions/upload-artifact@v2 + with: + name: ethereum-classic-app-debug + path: bin + + - name: Build Ethereum + run: | + make clean + make DEBUG=1 + + - name: Upload app binary + uses: actions/upload-artifact@v2 + with: + name: ethereum-app-debug + path: bin diff --git a/.github/workflows/lint-workflow.yml b/.github/workflows/lint-workflow.yml new file mode 100644 index 0000000..6d07bc9 --- /dev/null +++ b/.github/workflows/lint-workflow.yml @@ -0,0 +1,19 @@ +name: Code style check + +on: [push, pull_request] + +jobs: + job_lint: + name: Lint + runs-on: ubuntu-latest + + steps: + - name: Clone + uses: actions/checkout@v2 + + - name: Lint + uses: DoozyX/clang-format-lint-action@v0.11 + with: + source: "./" + extensions: "h,c" + clangFormatVersion: 10