diff --git a/.github/actions/commit-changes/action.yml b/.github/actions/commit-changes/action.yml index 147feb6..0099ad6 100644 --- a/.github/actions/commit-changes/action.yml +++ b/.github/actions/commit-changes/action.yml @@ -21,10 +21,14 @@ inputs: description: 'The directory in which the action will be performed' required: true default: '.' - branch: - description: 'Checkout (or create) on a specific branch before commit/push' - required: true - default: 'master' + src_branch: + description: 'Checkout (or create) a specific branch before commit/push. Defaults to current branch' + required: false + default: '' + dst_branch: + description: 'Push the created commit on a specific branch. Defaults to current branch' + required: false + default: '' secret: description: 'A token allowing to push the commit on the repository' required: true @@ -43,38 +47,73 @@ runs: git config --global user.name ${{ inputs.name }} ORIGIN="$(pwd)" cd ${{ inputs.directory }} - git switch ${{ inputs.branch }} 2>/dev/null || git switch -c ${{ inputs.branch }} + + CURRENT_BRANCH=${GITHUB_REF#refs/heads/}; + # calculating source branch + if [ -n "${{ inputs.src_branch }}" ]; \ + then \ + git switch ${{ inputs.src_branch }} 2>/dev/null || git switch -c ${{ inputs.src_branch }}; \ + SRC_BRANCH=${{ inputs.src_branch }}; \ + else \ + SRC_BRANCH=`git branch --show-current`; \ + if [ -z "$SRC_BRANCH" ]; \ + then \ + SRC_BRANCH=$CURRENT_BRANCH; \ + fi \ + fi + + # calculating destination branch + if [ -n "${{ inputs.dst_branch }}" ]; \ + then \ + DST_BRANCH=${{ inputs.dst_branch }}; \ + else \ + DST_BRANCH=`git branch --show-current`; \ + if [ -z "$DST_BRANCH" ]; \ + then \ + DST_BRANCH=$CURRENT_BRANCH; \ + fi \ + fi + echo "-----------------------------------------------------------" echo "Initial repo status" git status + # checking changes, commit if needed CHANGES="$(git status --porcelain ${{ inputs.files }})" - if [ -z "${CHANGES}" ]; \ + if [ -n "${CHANGES}" ]; \ then \ + echo -e "Changes:\n${CHANGES}"; \ + git add ${{ inputs.files }}; \ echo "-----------------------------------------------------------"; \ - echo "No changes, stopping now"; \ - echo "COMMIT=NO" > $GITHUB_ENV; \ - cd "${ORIGIN}"; \ - exit 0; \ + echo "Repo status before commit"; \ + git status; \ + git commit -am "${{ inputs.message }}"; \ fi - echo -e "Changes:\n${CHANGES}" - git add ${{ inputs.files }} - echo "-----------------------------------------------------------" - echo "Repo status before commit" - git status - git commit -am "${{ inputs.message }}" - echo "COMMIT=YES" > $GITHUB_ENV + + # compute if a push is needed + if [ -n "${CHANGES}" -o "$SRC_BRANCH" != "$DST_BRANCH" ]; \ + then \ + PUSH="YES"; \ + else \ + PUSH="NO"; \ + fi + git log -n 2 cd "${ORIGIN}" - shell: bash - - run: echo "${{ env.COMMIT }}" + echo " -- Env SRC_BRANCH: $SRC_BRANCH"; + echo " -- Env DST_BRANCH: $DST_BRANCH"; + echo " -- Env PUSH: $PUSH" + # exporting these variables for next steps + echo "##[set-output name=src_branch;]$(echo $SRC_BRANCH)"; + echo "##[set-output name=dst_branch;]$(echo $DST_BRANCH)"; + echo "##[set-output name=push;]$(echo $PUSH)"; shell: bash - name: Push commit - if: ${{ env.COMMIT == 'YES' }} + if: steps.commit.outputs.push == 'YES' uses: ad-m/github-push-action@master with: github_token: ${{ inputs.secret }} - branch: ${{ inputs.branch }} + branch: ${{ steps.commit.outputs.src_branch }}:${{ steps.commit.outputs.dst_branch }} directory: ${{ inputs.directory }} repository: ${{ inputs.repository }} diff --git a/.github/workflows/sdk-generation.yml b/.github/workflows/sdk-generation.yml index bb11552..4593b41 100644 --- a/.github/workflows/sdk-generation.yml +++ b/.github/workflows/sdk-generation.yml @@ -37,7 +37,7 @@ jobs: with: name: 'ldg-github-ci' directory: ethereum-plugin-sdk - branch: ${{ steps.extract_branch.outputs.branch }} + dst_branch: ${{ steps.extract_branch.outputs.branch }} message: "[update] Branch ${{ steps.extract_branch.outputs.branch }} | Commit ${GITHUB_SHA}" secret: ${{ secrets.CI_BOT_TOKEN }} repository: LedgerHQ/ethereum-plugin-sdk @@ -47,7 +47,6 @@ jobs: with: name: 'ldg-github-ci' files: ethereum-plugin-sdk - branch: ${{ steps.extract_branch.outputs.branch }} message: "[update][SDK] Branch ${{ steps.extract_branch.outputs.branch }} | Commit ${GITHUB_SHA}" secret: ${{ secrets.CI_BOT_TOKEN }} repository: LedgerHQ/app-ethereum diff --git a/CHANGELOG.md b/CHANGELOG.md index d01c246..935cc00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,17 +5,34 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [1.9.19](https://github.com/ledgerhq/app-ethereum/compare/1.9.18...1.9.19) - 2022-06-15 + +### Added + +- (clone) OKXChain +- (clone) Cube +- (clone) Astar EVM +- (clone) Shiden EVM + +### Changed + +- EIP-191 signatures now show (up to 99 characters on LNS and 255 on LNX & LNS) the actual data contained in the message (clear-signing) + +### Fixed + +- Bug with huge swap amounts + ## [1.9.18](https://github.com/ledgerhq/app-ethereum/compare/1.9.17...1.9.18) - 2022-04-25 ### Added - Easier way of adding a chain into the Makefile - EIP 1024 support -- Conflux chain -- Moonbeam chain -- KardiaChain -- BitTorrent Chain -- Wethio chain +- (clone) Conflux chain +- (clone) Moonbeam chain +- (clone) KardiaChain +- (clone) BitTorrent Chain +- (clone) Wethio chain ### Changed diff --git a/Makefile b/Makefile index 91a750f..f9af42a 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'" APPVERSION_M=1 APPVERSION_N=9 -APPVERSION_P=18 +APPVERSION_P=19 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION) @@ -79,7 +79,7 @@ all: default ############ DEFINES += OS_IO_SEPROXYHAL -DEFINES += HAVE_BAGL HAVE_SPRINTF +DEFINES += HAVE_BAGL HAVE_SPRINTF HAVE_SNPRINTF_FORMAT_U DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) diff --git a/icons/nanos_app_astar.gif b/icons/nanos_app_astar.gif new file mode 100644 index 0000000..d656968 Binary files /dev/null and b/icons/nanos_app_astar.gif differ diff --git a/icons/nanos_app_cube.gif b/icons/nanos_app_cube.gif new file mode 100644 index 0000000..1e1d755 Binary files /dev/null and b/icons/nanos_app_cube.gif differ diff --git a/icons/nanos_app_okc.gif b/icons/nanos_app_okc.gif new file mode 100644 index 0000000..ef6b29c Binary files /dev/null and b/icons/nanos_app_okc.gif differ diff --git a/icons/nanos_app_shiden.gif b/icons/nanos_app_shiden.gif new file mode 100644 index 0000000..c3b91d4 Binary files /dev/null and b/icons/nanos_app_shiden.gif differ diff --git a/icons/nanox_app_astar.gif b/icons/nanox_app_astar.gif new file mode 100644 index 0000000..827e926 Binary files /dev/null and b/icons/nanox_app_astar.gif differ diff --git a/icons/nanox_app_cube.gif b/icons/nanox_app_cube.gif new file mode 100644 index 0000000..912c760 Binary files /dev/null and b/icons/nanox_app_cube.gif differ diff --git a/icons/nanox_app_okc.gif b/icons/nanox_app_okc.gif new file mode 100644 index 0000000..5f729da Binary files /dev/null and b/icons/nanox_app_okc.gif differ diff --git a/icons/nanox_app_shiden.gif b/icons/nanox_app_shiden.gif new file mode 100644 index 0000000..7494ccb Binary files /dev/null and b/icons/nanox_app_shiden.gif differ diff --git a/makefile_conf/chain/astar.mk b/makefile_conf/chain/astar.mk new file mode 100644 index 0000000..0f8bbe9 --- /dev/null +++ b/makefile_conf/chain/astar.mk @@ -0,0 +1,3 @@ +APP_LOAD_PARAMS += --path "44'/810'" --path "44'/60'" +DEFINES += CHAINID_UPCASE=\"ASTAR\" CHAINID_COINNAME=\"ASTR\" CHAIN_KIND=CHAIN_KIND_ASTAR CHAIN_ID=592 +APPNAME = "Astar EVM" diff --git a/makefile_conf/chain/cube.mk b/makefile_conf/chain/cube.mk new file mode 100644 index 0000000..6eff774 --- /dev/null +++ b/makefile_conf/chain/cube.mk @@ -0,0 +1,3 @@ +APP_LOAD_PARAMS += --path "44'/60'" +DEFINES += CHAINID_UPCASE=\"CUBE\" CHAINID_COINNAME=\"CUBE\" CHAIN_KIND=CHAIN_KIND_CUBE CHAIN_ID=1818 +APPNAME = "Cube" \ No newline at end of file diff --git a/makefile_conf/chain/okc.mk b/makefile_conf/chain/okc.mk new file mode 100644 index 0000000..d520276 --- /dev/null +++ b/makefile_conf/chain/okc.mk @@ -0,0 +1,3 @@ +APP_LOAD_PARAMS += --path "44'/60'" +DEFINES += CHAINID_UPCASE=\"OKC\" CHAINID_COINNAME=\"OKT\" CHAIN_KIND=CHAIN_KIND_OKC CHAIN_ID=66 +APPNAME = "OKXChain" \ No newline at end of file diff --git a/makefile_conf/chain/shiden.mk b/makefile_conf/chain/shiden.mk new file mode 100644 index 0000000..1a561f1 --- /dev/null +++ b/makefile_conf/chain/shiden.mk @@ -0,0 +1,3 @@ +APP_LOAD_PARAMS += --path "44'/809'" --path "44'/60'" +DEFINES += CHAINID_UPCASE=\"SHIDEN\" CHAINID_COINNAME=\"SDN\" CHAIN_KIND=CHAIN_KIND_SHIDEN CHAIN_ID=336 +APPNAME = "Shiden EVM" diff --git a/src/chainConfig.h b/src/chainConfig.h index 91aabe0..155e335 100644 --- a/src/chainConfig.h +++ b/src/chainConfig.h @@ -63,7 +63,11 @@ typedef enum chain_kind_e { CHAIN_KIND_MOONBEAM, CHAIN_KIND_BTTC, CHAIN_KIND_KARDIACHAIN, - CHAIN_KIND_WETHIO + CHAIN_KIND_WETHIO, + CHAIN_KIND_OKC, + CHAIN_KIND_CUBE, + CHAIN_KIND_SHIDEN, + CHAIN_KIND_ASTAR } chain_kind_t; typedef struct chain_config_s { diff --git a/src/handle_check_address.c b/src/handle_check_address.c index 274582a..7950f7e 100644 --- a/src/handle_check_address.c +++ b/src/handle_check_address.c @@ -16,7 +16,7 @@ int handle_check_address(check_address_parameters_t* params, chain_config_t* cha } uint8_t i; - uint8_t* bip32_path_ptr = params->address_parameters; + const uint8_t* bip32_path_ptr = params->address_parameters; uint8_t bip32PathLength = *(bip32_path_ptr++); cx_sha3_t local_sha3; diff --git a/src/main.c b/src/main.c index 0cd2025..8b029fa 100644 --- a/src/main.c +++ b/src/main.c @@ -284,6 +284,18 @@ extraInfo_t *getKnownToken(uint8_t *contractAddress) { case CHAIN_KIND_WETHIO: numTokens = NUM_TOKENS_WETHIO; break; + case CHAIN_KIND_OKC: + numTokens = NUM_TOKENS_OKC; + break; + case CHAIN_KIND_CUBE: + numTokens = NUM_TOKENS_CUBE; + break; + case CHAIN_KIND_SHIDEN: + numTokens = NUM_TOKENS_SHIDEN; + break; + case CHAIN_KIND_ASTAR: + numTokens = NUM_TOKENS_ASTAR; + break; } for (i = 0; i < numTokens; i++) { switch (chainConfig->kind) { @@ -410,6 +422,18 @@ extraInfo_t *getKnownToken(uint8_t *contractAddress) { case CHAIN_KIND_WETHIO: currentToken = (tokenDefinition_t *) PIC(&TOKENS_WETHIO[i]); break; + case CHAIN_KIND_OKC: + currentToken = (tokenDefinition_t *) PIC(&TOKENS_OKC[i]); + break; + case CHAIN_KIND_CUBE: + currentToken = (tokenDefinition_t *) PIC(&TOKENS_CUBE[i]); + break; + case CHAIN_KIND_SHIDEN: + currentToken = (tokenDefinition_t *) PIC(&TOKENS_SHIDEN[i]); + break; + case CHAIN_KIND_ASTAR: + currentToken = (tokenDefinition_t *) PIC(&TOKENS_ASTAR[i]); + break; } if (memcmp(currentToken->address, tmpContent.txContent.destination, ADDRESS_LENGTH) == 0) { return currentToken; diff --git a/src/shared_context.h b/src/shared_context.h index 12b21f5..ef418fe 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -170,7 +170,11 @@ typedef struct txStringProperties_t { char network_name[NETWORK_STRING_MAX_SIZE]; } txStringProperties_t; +#ifdef TARGET_NANOS #define SHARED_CTX_FIELD_1_SIZE 100 +#else +#define SHARED_CTX_FIELD_1_SIZE 256 +#endif #define SHARED_CTX_FIELD_2_SIZE 40 typedef struct strDataTmp_t { diff --git a/src/swap_lib_calls.h b/src/swap_lib_calls.h index 937d610..9bdb115 100644 --- a/src/swap_lib_calls.h +++ b/src/swap_lib_calls.h @@ -11,17 +11,19 @@ #define GET_PRINTABLE_AMOUNT 4 +#define MAX_PRINTABLE_AMOUNT_SIZE 50 + // structure that should be send to specific coin application to get address typedef struct check_address_parameters_s { // IN - unsigned char* coin_configuration; - unsigned char coin_configuration_length; + const unsigned char* const coin_configuration; + const unsigned char coin_configuration_length; // serialized path, segwit, version prefix, hash used, dictionary etc. // 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; + const unsigned char* const address_parameters; + const unsigned char address_parameters_length; + const char* const address_to_check; + const char* const extra_id_to_check; // OUT int result; } check_address_parameters_t; @@ -29,25 +31,25 @@ typedef struct check_address_parameters_s { // structure that should be send to specific coin application to get printable amount typedef struct get_printable_amount_parameters_s { // IN - unsigned char* coin_configuration; - unsigned char coin_configuration_length; - unsigned char* amount; - unsigned char amount_length; - bool is_fee; + const unsigned char* const coin_configuration; + const unsigned char coin_configuration_length; + const unsigned char* const amount; + const unsigned char amount_length; + const bool is_fee; // OUT - char printable_amount[30]; + char printable_amount[MAX_PRINTABLE_AMOUNT_SIZE]; // int result; } get_printable_amount_parameters_t; typedef struct create_transaction_parameters_s { - unsigned char* coin_configuration; - unsigned char coin_configuration_length; - unsigned char* amount; - unsigned char amount_length; - unsigned char* fee_amount; - unsigned char fee_amount_length; - char* destination_address; - char* destination_address_extra_id; + const unsigned char* const coin_configuration; + const unsigned char coin_configuration_length; + const unsigned char* const amount; + const unsigned char amount_length; + const unsigned char* const fee_amount; + const unsigned char fee_amount_length; + const char* const destination_address; + const char* const destination_address_extra_id; } create_transaction_parameters_t; #endif // _SWAP_LIB_CALLS_H_ diff --git a/src/tokens.c b/src/tokens.c index 0347ec4..b26771c 100644 --- a/src/tokens.c +++ b/src/tokens.c @@ -204,4 +204,12 @@ const tokenDefinition_t const TOKENS_KARDIACHAIN[NUM_TOKENS_KARDIACHAIN] = {}; const tokenDefinition_t const TOKENS_WETHIO[NUM_TOKENS_WETHIO] = {}; +const tokenDefinition_t const TOKENS_OKC[NUM_TOKENS_OKC] = {}; + +const tokenDefinition_t const TOKENS_CUBE[NUM_TOKENS_CUBE] = {}; + +const tokenDefinition_t const TOKENS_ASTAR[NUM_TOKENS_ASTAR] = {}; + +const tokenDefinition_t const TOKENS_SHIDEN[NUM_TOKENS_SHIDEN] = {}; + #endif diff --git a/src/tokens.h b/src/tokens.h index eb4a14e..318edad 100644 --- a/src/tokens.h +++ b/src/tokens.h @@ -106,6 +106,10 @@ static const uint8_t LEDGER_SIGNATURE_PUBLIC_KEY[] = { #define NUM_TOKENS_BTTC 0 #define NUM_TOKENS_KARDIACHAIN 0 #define NUM_TOKENS_WETHIO 0 +#define NUM_TOKENS_OKC 0 +#define NUM_TOKENS_CUBE 0 +#define NUM_TOKENS_ASTAR 0 +#define NUM_TOKENS_SHIDEN 0 extern tokenDefinition_t const TOKENS_AKROMA[NUM_TOKENS_AKROMA]; extern tokenDefinition_t const TOKENS_ELLAISM[NUM_TOKENS_ELLAISM]; @@ -148,6 +152,9 @@ extern tokenDefinition_t const TOKENS_MOONBEAM[NUM_TOKENS_MOONBEAM]; extern tokenDefinition_t const TOKENS_BTTC[NUM_TOKENS_BTTC]; extern tokenDefinition_t const TOKENS_KARDIACHAIN[NUM_TOKENS_KARDIACHAIN]; extern tokenDefinition_t const TOKENS_WETHIO[NUM_TOKENS_WETHIO]; +extern tokenDefinition_t const TOKENS_CUBE[NUM_TOKENS_CUBE]; +extern tokenDefinition_t const TOKENS_ASTAR[NUM_TOKENS_ASTAR]; +extern tokenDefinition_t const TOKENS_SHIDEN[NUM_TOKENS_SHIDEN]; #endif /* HAVE_TOKENS_LIST */ diff --git a/src/utils.c b/src/utils.c index fdda1c0..e6d60e1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -138,7 +138,7 @@ void amountToString(const uint8_t *amount, 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(const uint8_t *config, uint8_t config_len, char *ticker, uint8_t *decimals) { uint8_t ticker_len, offset = 0; if (config_len == 0) { return false; diff --git a/src/utils.h b/src/utils.h index 988ce08..5afabd4 100644 --- a/src/utils.h +++ b/src/utils.h @@ -39,6 +39,6 @@ void amountToString(const uint8_t* amount, char* out_buffer, size_t out_buffer_size); -bool parse_swap_config(uint8_t* config, uint8_t config_len, char* ticker, uint8_t* decimals); +bool parse_swap_config(const uint8_t* config, uint8_t config_len, char* ticker, uint8_t* decimals); #endif // _UTILS_H_ diff --git a/src_common/network.c b/src_common/network.c index 392b7d5..2d090b9 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -24,7 +24,10 @@ const network_info_t NETWORK_MAPPING[] = { {.chain_id = 43114, .name = "Avalanche", .ticker = "AVAX "}, {.chain_id = 44787, .name = "Celo Alfajores", .ticker = "aCELO "}, {.chain_id = 62320, .name = "Celo Baklava", .ticker = "bCELO "}, - {.chain_id = 11297108109, .name = "Palm Network", .ticker = "PALM "}}; + {.chain_id = 11297108109, .name = "Palm Network", .ticker = "PALM "}, + {.chain_id = 1818, .name = "Cube", .ticker = "CUBE "}, + {.chain_id = 336, .name = "Shiden", .ticker = "SDN "}, + {.chain_id = 592, .name = "Astar", .ticker = "ASTR "}}; uint64_t get_chain_id(void) { uint64_t chain_id = 0; diff --git a/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c b/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c index b396d33..9bd5802 100644 --- a/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c +++ b/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c @@ -1,5 +1,6 @@ #include "shared_context.h" #include "apdu_constants.h" +#include "ethUtils.h" #include "ui_flow.h" #include "feature_performPrivacyOperation.h" diff --git a/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c b/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c index 6cc7182..ac045f2 100644 --- a/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c +++ b/src_features/performPrivacyOperation/ui_common_performPrivacyOperation.c @@ -1,6 +1,7 @@ #include "shared_context.h" #include "feature_getPublicKey.h" #include "ui_callbacks.h" +#include "feature_performPrivacyOperation.h" unsigned int io_seproxyhal_touch_privacy_ok(__attribute__((unused)) const bagl_element_t *e) { uint32_t tx = set_result_perform_privacy_operation(); diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 2c5ec6f..7ea12db 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -1,3 +1,4 @@ +#include #include "shared_context.h" #include "apdu_constants.h" #include "utils.h" @@ -7,6 +8,109 @@ static const char SIGN_MAGIC[] = "\x19" "Ethereum Signed Message:\n"; +/** + * Check if a given character is a "special" displayable ASCII character + * + * @param[in] c character we're checking + * @return wether the character is special or not + */ +static inline bool is_char_special(char c) { + return ((c >= '\b') && (c <= '\r')); +} + +/** + * Check if a given data is made of ASCII characters + * + * @param[in] data the input data + * @param[in] the length of the input data + * @return wether the data is fully ASCII or not + */ +static bool is_data_ascii(const uint8_t *const data, size_t length) { + for (uint8_t idx = 0; idx < length; ++idx) { + if (!is_char_special(data[idx]) && ((data[idx] < 0x20) || (data[idx] > 0x7e))) { + return false; + } + } + return true; +} + +/** + * Initialize value string that will be displayed in the UX STEP + * + * @param[in] if the value is ASCII + */ +static void init_value_str(bool is_ascii) { + if (is_ascii) { + strings.tmp.tmp[0] = '\0'; // init string as empty + } else { + strcpy(strings.tmp.tmp, "0x"); // will display the hex bytes instead + } +} + +/** + * @return Whether the currently stored data is initialized as ASCII or not + */ +static bool is_value_str_ascii() { + return (memcmp(strings.tmp.tmp, "0x", 2) != 0); +} + +/** + * Update the global UI string variable by formatting & appending the new data to it + * + * @param[in] data the input data + * @param[in] length the data length + * @param[in] is_ascii wether the data is ASCII or not + */ +static void feed_value_str(const uint8_t *const data, size_t length, bool is_ascii) { + uint16_t value_strlen = strlen(strings.tmp.tmp); + + if ((value_strlen + 1) < sizeof(strings.tmp.tmp)) { + if (is_ascii) { + uint8_t src_idx = 0; + uint16_t dst_idx = value_strlen; + bool prev_is_special = false; + + while ((src_idx < length) && (dst_idx < sizeof(strings.tmp.tmp))) { + if (prev_is_special) { + if (!is_char_special(data[src_idx])) { + prev_is_special = false; + } + } else { + if (is_char_special(data[src_idx])) { + prev_is_special = true; + strings.tmp.tmp[dst_idx] = ' '; + dst_idx += 1; + } + } + if (!is_char_special(data[src_idx])) { + strings.tmp.tmp[dst_idx] = data[src_idx]; + dst_idx += 1; + } + src_idx += 1; + } + + if (dst_idx < sizeof(strings.tmp.tmp)) { + strings.tmp.tmp[dst_idx] = '\0'; + } else { + const char marker[] = "..."; + + memcpy(strings.tmp.tmp + sizeof(strings.tmp.tmp) - sizeof(marker), + marker, + sizeof(marker)); + } + } else { + // truncate to strings.tmp.tmp 's size + length = MIN(length, (sizeof(strings.tmp.tmp) - value_strlen) / 2); + for (size_t i = 0; i < length; i++) { + snprintf(strings.tmp.tmp + value_strlen + 2 * i, + sizeof(strings.tmp.tmp) - value_strlen - 2 * i, + "%02X", + data[i]); + } + } + } +} + void handleSignPersonalMessage(uint8_t p1, uint8_t p2, uint8_t *workBuffer, @@ -16,10 +120,7 @@ void handleSignPersonalMessage(uint8_t p1, UNUSED(tx); uint8_t hashMessage[INT256_LENGTH]; if (p1 == P1_FIRST) { - char tmp[11]; - uint32_t index; - uint32_t base = 10; - uint8_t pos = 0; + char tmp[11] = {0}; uint32_t i; if (dataLength < 1) { PRINTF("Invalid data\n"); @@ -29,6 +130,7 @@ void handleSignPersonalMessage(uint8_t p1, reset_app_context(); } appState = APP_STATE_SIGNING_MESSAGE; + tmpCtx.messageSigningContext.pathLength = workBuffer[0]; if ((tmpCtx.messageSigningContext.pathLength < 0x01) || (tmpCtx.messageSigningContext.pathLength > MAX_BIP32_PATH)) { @@ -38,21 +140,21 @@ void handleSignPersonalMessage(uint8_t p1, workBuffer++; dataLength--; for (i = 0; i < tmpCtx.messageSigningContext.pathLength; i++) { - if (dataLength < 4) { + if (dataLength < sizeof(uint32_t)) { PRINTF("Invalid data\n"); THROW(0x6a80); } tmpCtx.messageSigningContext.bip32Path[i] = U4BE(workBuffer, 0); - workBuffer += 4; - dataLength -= 4; + workBuffer += sizeof(uint32_t); + dataLength -= sizeof(uint32_t); } - if (dataLength < 4) { + if (dataLength < sizeof(uint32_t)) { PRINTF("Invalid data\n"); THROW(0x6a80); } tmpCtx.messageSigningContext.remainingLength = U4BE(workBuffer, 0); - workBuffer += 4; - dataLength -= 4; + workBuffer += sizeof(uint32_t); + dataLength -= sizeof(uint32_t); // Initialize message header + length cx_keccak_init(&global_sha3, 256); cx_hash((cx_hash_t *) &global_sha3, @@ -61,16 +163,12 @@ void handleSignPersonalMessage(uint8_t p1, 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); - } - tmp[pos] = '\0'; - cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) tmp, pos, NULL, 0); + snprintf(tmp, sizeof(tmp), "%u", tmpCtx.messageSigningContext.remainingLength); + cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) tmp, strlen(tmp), NULL, 0); cx_sha256_init(&tmpContent.sha2); + + init_value_str(is_data_ascii(workBuffer, dataLength)); + } else if (p1 != P1_MORE) { THROW(0x6B00); } @@ -84,9 +182,13 @@ void handleSignPersonalMessage(uint8_t p1, 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; + + feed_value_str(workBuffer, dataLength, is_value_str_ascii()); + if (tmpCtx.messageSigningContext.remainingLength == 0) { cx_hash((cx_hash_t *) &global_sha3, CX_LAST, @@ -95,11 +197,6 @@ void handleSignPersonalMessage(uint8_t p1, 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); diff --git a/src_features/signMessage/ui_flow_signMessage.c b/src_features/signMessage/ui_flow_signMessage.c index 6672977..ee8e39e 100644 --- a/src_features/signMessage/ui_flow_signMessage.c +++ b/src_features/signMessage/ui_flow_signMessage.c @@ -14,7 +14,7 @@ UX_STEP_NOCB( ux_sign_flow_2_step, bnnn_paging, { - .title = "Message hash", + .title = "Message", .text = strings.tmp.tmp, }); UX_STEP_CB( diff --git a/tests/jest.js b/tests/jest.js deleted file mode 100644 index 521ecbe..0000000 --- a/tests/jest.js +++ /dev/null @@ -1,22 +0,0 @@ -export default jest; -export const { expect, test } = global; - -export const sim_options_s = { - model: "nanos", - logging: true, - start_delay: 2000, - X11: true, - custom: "", -}; - -export const sim_options_x = { - model: "nanox", - logging: true, - start_delay: 2000, - X11: true, - custom: "", -}; - -export const Resolve = require("path").resolve; -export const NANOS_ELF_PATH = Resolve("elfs/ethereum_nanos.elf"); -export const NANOX_ELF_PATH = Resolve("elfs/ethereum_nanox.elf"); \ No newline at end of file diff --git a/tests/package.json b/tests/package.json index 7b08f38..ff934a8 100644 --- a/tests/package.json +++ b/tests/package.json @@ -15,7 +15,7 @@ "@ledgerhq/hw-app-eth": "^6.5.0", "@ledgerhq/hw-transport-http": "^4.74.2", "@ledgerhq/logs": "^5.50.0", - "@zondax/zemu": "^0.22.1", + "@zondax/zemu": "^0.27.4", "bignumber.js": "^9.0.0", "bip32-path": "^0.4.2", "core-js": "^3.7.0", diff --git a/tests/snapshots/nanos_eip191_metamask/00000.png b/tests/snapshots/nanos_eip191_metamask/00000.png new file mode 100644 index 0000000..ab16f62 Binary files /dev/null and b/tests/snapshots/nanos_eip191_metamask/00000.png differ diff --git a/tests/snapshots/nanos_eip191_metamask/00001.png b/tests/snapshots/nanos_eip191_metamask/00001.png new file mode 100644 index 0000000..b90315c Binary files /dev/null and b/tests/snapshots/nanos_eip191_metamask/00001.png differ diff --git a/tests/snapshots/nanos_eip191_metamask/00002.png b/tests/snapshots/nanos_eip191_metamask/00002.png new file mode 100644 index 0000000..3d90dfd Binary files /dev/null and b/tests/snapshots/nanos_eip191_metamask/00002.png differ diff --git a/tests/snapshots/nanos_eip191_metamask/00003.png b/tests/snapshots/nanos_eip191_metamask/00003.png new file mode 100644 index 0000000..f5c2d67 Binary files /dev/null and b/tests/snapshots/nanos_eip191_metamask/00003.png differ diff --git a/tests/snapshots/nanos_eip191_metamask/00004.png b/tests/snapshots/nanos_eip191_metamask/00004.png new file mode 100644 index 0000000..d55782f Binary files /dev/null and b/tests/snapshots/nanos_eip191_metamask/00004.png differ diff --git a/tests/snapshots/nanos_eip191_metamask/00005.png b/tests/snapshots/nanos_eip191_metamask/00005.png new file mode 100644 index 0000000..f5c2d67 Binary files /dev/null and b/tests/snapshots/nanos_eip191_metamask/00005.png differ diff --git a/tests/snapshots/nanos_eip191_metamask/00006.png b/tests/snapshots/nanos_eip191_metamask/00006.png new file mode 100644 index 0000000..ce795f3 Binary files /dev/null and b/tests/snapshots/nanos_eip191_metamask/00006.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00000.png b/tests/snapshots/nanos_eip191_nonascii/00000.png new file mode 100644 index 0000000..ab16f62 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00000.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00001.png b/tests/snapshots/nanos_eip191_nonascii/00001.png new file mode 100644 index 0000000..ad00cb8 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00001.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00002.png b/tests/snapshots/nanos_eip191_nonascii/00002.png new file mode 100644 index 0000000..b435297 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00002.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00003.png b/tests/snapshots/nanos_eip191_nonascii/00003.png new file mode 100644 index 0000000..fcd68b2 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00003.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00004.png b/tests/snapshots/nanos_eip191_nonascii/00004.png new file mode 100644 index 0000000..251c562 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00004.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00005.png b/tests/snapshots/nanos_eip191_nonascii/00005.png new file mode 100644 index 0000000..f5c2d67 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00005.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00006.png b/tests/snapshots/nanos_eip191_nonascii/00006.png new file mode 100644 index 0000000..d55782f Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00006.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00007.png b/tests/snapshots/nanos_eip191_nonascii/00007.png new file mode 100644 index 0000000..f5c2d67 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00007.png differ diff --git a/tests/snapshots/nanos_eip191_nonascii/00008.png b/tests/snapshots/nanos_eip191_nonascii/00008.png new file mode 100644 index 0000000..ce795f3 Binary files /dev/null and b/tests/snapshots/nanos_eip191_nonascii/00008.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00000.png b/tests/snapshots/nanos_eip191_opensea/00000.png new file mode 100644 index 0000000..ab16f62 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00000.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00001.png b/tests/snapshots/nanos_eip191_opensea/00001.png new file mode 100644 index 0000000..bdbb3a0 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00001.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00002.png b/tests/snapshots/nanos_eip191_opensea/00002.png new file mode 100644 index 0000000..0676953 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00002.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00003.png b/tests/snapshots/nanos_eip191_opensea/00003.png new file mode 100644 index 0000000..582648d Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00003.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00004.png b/tests/snapshots/nanos_eip191_opensea/00004.png new file mode 100644 index 0000000..53e1317 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00004.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00005.png b/tests/snapshots/nanos_eip191_opensea/00005.png new file mode 100644 index 0000000..228f924 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00005.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00006.png b/tests/snapshots/nanos_eip191_opensea/00006.png new file mode 100644 index 0000000..f5c2d67 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00006.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00007.png b/tests/snapshots/nanos_eip191_opensea/00007.png new file mode 100644 index 0000000..d55782f Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00007.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00008.png b/tests/snapshots/nanos_eip191_opensea/00008.png new file mode 100644 index 0000000..f5c2d67 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00008.png differ diff --git a/tests/snapshots/nanos_eip191_opensea/00009.png b/tests/snapshots/nanos_eip191_opensea/00009.png new file mode 100644 index 0000000..ce795f3 Binary files /dev/null and b/tests/snapshots/nanos_eip191_opensea/00009.png differ diff --git a/tests/snapshots/nanox_eip191_metamask/00000.png b/tests/snapshots/nanox_eip191_metamask/00000.png new file mode 100644 index 0000000..1b27154 Binary files /dev/null and b/tests/snapshots/nanox_eip191_metamask/00000.png differ diff --git a/tests/snapshots/nanox_eip191_metamask/00001.png b/tests/snapshots/nanox_eip191_metamask/00001.png new file mode 100644 index 0000000..58f0606 Binary files /dev/null and b/tests/snapshots/nanox_eip191_metamask/00001.png differ diff --git a/tests/snapshots/nanox_eip191_metamask/00002.png b/tests/snapshots/nanox_eip191_metamask/00002.png new file mode 100644 index 0000000..c9da92b Binary files /dev/null and b/tests/snapshots/nanox_eip191_metamask/00002.png differ diff --git a/tests/snapshots/nanox_eip191_metamask/00003.png b/tests/snapshots/nanox_eip191_metamask/00003.png new file mode 100644 index 0000000..121cfd5 Binary files /dev/null and b/tests/snapshots/nanox_eip191_metamask/00003.png differ diff --git a/tests/snapshots/nanox_eip191_metamask/00004.png b/tests/snapshots/nanox_eip191_metamask/00004.png new file mode 100644 index 0000000..c9da92b Binary files /dev/null and b/tests/snapshots/nanox_eip191_metamask/00004.png differ diff --git a/tests/snapshots/nanox_eip191_metamask/00005.png b/tests/snapshots/nanox_eip191_metamask/00005.png new file mode 100644 index 0000000..a58590b Binary files /dev/null and b/tests/snapshots/nanox_eip191_metamask/00005.png differ diff --git a/tests/snapshots/nanox_eip191_nonascii/00000.png b/tests/snapshots/nanox_eip191_nonascii/00000.png new file mode 100644 index 0000000..1b27154 Binary files /dev/null and b/tests/snapshots/nanox_eip191_nonascii/00000.png differ diff --git a/tests/snapshots/nanox_eip191_nonascii/00001.png b/tests/snapshots/nanox_eip191_nonascii/00001.png new file mode 100644 index 0000000..93eda35 Binary files /dev/null and b/tests/snapshots/nanox_eip191_nonascii/00001.png differ diff --git a/tests/snapshots/nanox_eip191_nonascii/00002.png b/tests/snapshots/nanox_eip191_nonascii/00002.png new file mode 100644 index 0000000..873634e Binary files /dev/null and b/tests/snapshots/nanox_eip191_nonascii/00002.png differ diff --git a/tests/snapshots/nanox_eip191_nonascii/00003.png b/tests/snapshots/nanox_eip191_nonascii/00003.png new file mode 100644 index 0000000..c9da92b Binary files /dev/null and b/tests/snapshots/nanox_eip191_nonascii/00003.png differ diff --git a/tests/snapshots/nanox_eip191_nonascii/00004.png b/tests/snapshots/nanox_eip191_nonascii/00004.png new file mode 100644 index 0000000..121cfd5 Binary files /dev/null and b/tests/snapshots/nanox_eip191_nonascii/00004.png differ diff --git a/tests/snapshots/nanox_eip191_nonascii/00005.png b/tests/snapshots/nanox_eip191_nonascii/00005.png new file mode 100644 index 0000000..c9da92b Binary files /dev/null and b/tests/snapshots/nanox_eip191_nonascii/00005.png differ diff --git a/tests/snapshots/nanox_eip191_nonascii/00006.png b/tests/snapshots/nanox_eip191_nonascii/00006.png new file mode 100644 index 0000000..a58590b Binary files /dev/null and b/tests/snapshots/nanox_eip191_nonascii/00006.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00000.png b/tests/snapshots/nanox_eip191_opensea/00000.png new file mode 100644 index 0000000..1b27154 Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00000.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00001.png b/tests/snapshots/nanox_eip191_opensea/00001.png new file mode 100644 index 0000000..802fad5 Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00001.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00002.png b/tests/snapshots/nanox_eip191_opensea/00002.png new file mode 100644 index 0000000..a3ba739 Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00002.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00003.png b/tests/snapshots/nanox_eip191_opensea/00003.png new file mode 100644 index 0000000..4601bca Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00003.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00004.png b/tests/snapshots/nanox_eip191_opensea/00004.png new file mode 100644 index 0000000..eab9f1d Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00004.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00005.png b/tests/snapshots/nanox_eip191_opensea/00005.png new file mode 100644 index 0000000..0b4bdbd Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00005.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00006.png b/tests/snapshots/nanox_eip191_opensea/00006.png new file mode 100644 index 0000000..c9da92b Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00006.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00007.png b/tests/snapshots/nanox_eip191_opensea/00007.png new file mode 100644 index 0000000..121cfd5 Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00007.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00008.png b/tests/snapshots/nanox_eip191_opensea/00008.png new file mode 100644 index 0000000..c9da92b Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00008.png differ diff --git a/tests/snapshots/nanox_eip191_opensea/00009.png b/tests/snapshots/nanox_eip191_opensea/00009.png new file mode 100644 index 0000000..a58590b Binary files /dev/null and b/tests/snapshots/nanox_eip191_opensea/00009.png differ diff --git a/tests/src/contract_data_warning.test.js b/tests/src/contract_data_warning.test.js index 7047968..c3b06e2 100644 --- a/tests/src/contract_data_warning.test.js +++ b/tests/src/contract_data_warning.test.js @@ -1,6 +1,5 @@ import 'core-js/stable'; import 'regenerator-runtime/runtime'; -import { expect } from "../jest"; import { TransportStatusError } from "@ledgerhq/errors"; import { waitForAppScreen, zemu, nano_models } from './test.fixture'; import Zemu from '@zondax/zemu'; diff --git a/tests/src/eip191.test.js b/tests/src/eip191.test.js new file mode 100644 index 0000000..2223256 --- /dev/null +++ b/tests/src/eip191.test.js @@ -0,0 +1,65 @@ +import "core-js/stable"; +import "regenerator-runtime/runtime"; +import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture'; + +const testgroup = "EIP-191"; + +nano_models.forEach(function(model) { + test("[Nano " + model.letter + "] "+ testgroup +" Metamask test", zemu(model, async (sim, eth) => { + + const tx = eth.signPersonalMessage( + "44'/60'/0'/0/0", + Buffer.from("Example `personal_sign` message").toString("hex") + ); + + await waitForAppScreen(sim); + + const rclicks = (model.letter == 'S') ? 4 : 3; + await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_metamask', [rclicks, -1, 0]); + + await expect(tx).resolves.toEqual({ + "v": 28, + "r": "916099cf0d9c21911c85f0770a47a9696a8189e78c259cf099749748c507baae", + "s": "0d72234bc0ac2e94c5f7a5f4f9cd8610a52be4ea55515a85b9703f1bb158415c" + }); + })); + + + test("[Nano " + model.letter + "] "+ testgroup +" non-ASCII test", zemu(model, async (sim, eth) => { + + const tx = eth.signPersonalMessage( + "44'/60'/0'/0/0", + "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658" + ); + + await waitForAppScreen(sim); + + const rclicks = (model.letter == 'S') ? 6 : 4; + await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_nonascii', [rclicks, -1, 0]); + + await expect(tx).resolves.toEqual({ + "v": 28, + "r": "64bdbdb6959425445d00ff2536a7018d2dce904e1f7475938fe4221c3c72500c", + "s": "7c9208e99b6b9266a73aae17b73472d06499746edec34fd47a9dab42f06f2e42" + }); + })); + + + test("[Nano " + model.letter + "] "+ testgroup +" OpenSea test", zemu(model, async (sim, eth) => { + + const tx = eth.signPersonalMessage( + "44'/60'/0'/0/0", + Buffer.from("Welcome to OpenSea!\n\nClick to sign in and accept the OpenSea Terms of Service: https://opensea.io/tos\n\nThis request will not trigger a blockchain transaction or cost any gas fees.\n\nYour authentication status will reset after 24 hours.\n\nWallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121").toString("hex") + ); + + await waitForAppScreen(sim); + + await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [7, -1, 0]); + + await expect(tx).resolves.toEqual({ + "v": 28, + "r": "61a68c986f087730d2f6ecf89d6d1e48ab963ac461102bb02664bc05c3db75bb", + "s": "5714729ef441e097673a7b29a681e97f6963d875eeed2081f26b0b6686cd2bd2" + }); + })); +}); diff --git a/tests/yarn.lock b/tests/yarn.lock index 238895c..2ed8afa 100644 --- a/tests/yarn.lock +++ b/tests/yarn.lock @@ -1637,11 +1637,12 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@grpc/grpc-js@^1.3.4": - version "1.3.7" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.7.tgz#58b687aff93b743aafde237fd2ee9a3259d7f2d8" - integrity sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA== +"@grpc/grpc-js@^1.5.5": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz#4c4fa998ff719fe859ac19fe977fdef097bb99aa" + integrity sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw== dependencies: + "@grpc/proto-loader" "^0.6.4" "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.6.4": @@ -1655,6 +1656,17 @@ protobufjs "^6.10.0" yargs "^16.1.1" +"@grpc/proto-loader@^0.6.9": + version "0.6.12" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz#459b619b8b9b67794bf0d1cb819653a38c63e164" + integrity sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^6.10.0" + yargs "^16.2.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1945,6 +1957,16 @@ "@ledgerhq/logs" "^4.72.0" rxjs "^6.5.3" +"@ledgerhq/devices@^6.27.1": + version "6.27.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.27.1.tgz#3b13ab1d1ba8201e9e74a08f390560483978c962" + integrity sha512-jX++oy89jtv7Dp2X6gwt3MMkoajel80JFWcdc0HCouwDsV1mVJ3SQdwl/bQU0zd8HI6KebvUP95QTwbQLLK/RQ== + dependencies: + "@ledgerhq/errors" "^6.10.0" + "@ledgerhq/logs" "^6.10.0" + rxjs "6" + semver "^7.3.5" + "@ledgerhq/devices@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.3.0.tgz#7ee59614198882311d1805912e368451527d05b2" @@ -1960,6 +1982,11 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.78.0.tgz#23daf3af54d03b1bda3e616002b555da1bdb705a" integrity sha512-FX6zHZeiNtegBvXabK6M5dJ+8OV8kQGGaGtuXDeK/Ss5EmG4Ltxc6Lnhe8hiHpm9pCHtktOsnUVL7IFBdHhYUg== +"@ledgerhq/errors@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.10.0.tgz#dda9127b65f653fbb2f74a55e8f0e550d69de6e4" + integrity sha512-fQFnl2VIXh9Yd41lGjReCeK+Q2hwxQJvLZfqHnKqWapTz68NHOv5QcI0OHuZVNEbv0xhgdLhi5b65kgYeQSUVg== + "@ledgerhq/errors@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.2.0.tgz#7dc2b3bf6bdedccdaa1b97dccacfa912c4fc22f8" @@ -1989,16 +2016,16 @@ axios "^0.19.0" ws "6" -"@ledgerhq/hw-transport-http@^6.1.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-6.3.0.tgz#e409ba846b3fda9366f1ad68f545b799336ab08b" - integrity sha512-KIYRlobKsjxBa7wNIDB+8Vo+OcKRmUy/nImyFZLTnKE0nLNgwRaK+P7D/Qw3VXBMpwHkdCtsTeBho+0fapkHxA== +"@ledgerhq/hw-transport-http@^6.24.1": + version "6.27.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-6.27.1.tgz#25c6cf02c4b464fae416d163f9ab4fda7b6198ff" + integrity sha512-494Zk5jvHcasa5xjZW7l5g+QqJqLlZpuV/RvlIWnKHdVdrBWYvG/1VukQfJQPgbK3WHtt/9WhrnJoLI+xv2PrA== dependencies: - "@ledgerhq/errors" "^6.2.0" - "@ledgerhq/hw-transport" "^6.3.0" - "@ledgerhq/logs" "^6.2.0" - axios "^0.21.1" - ws "7" + "@ledgerhq/errors" "^6.10.0" + "@ledgerhq/hw-transport" "^6.27.1" + "@ledgerhq/logs" "^6.10.0" + axios "^0.26.1" + ws "8.5.0" "@ledgerhq/hw-transport@^4.78.0": version "4.78.0" @@ -2009,7 +2036,16 @@ "@ledgerhq/errors" "^4.78.0" events "^3.0.0" -"@ledgerhq/hw-transport@^6.1.0", "@ledgerhq/hw-transport@^6.3.0": +"@ledgerhq/hw-transport@^6.24.1", "@ledgerhq/hw-transport@^6.27.1": + version "6.27.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.27.1.tgz#88072278f69c279cb6569352acd4ae2fec33ace3" + integrity sha512-hnE4/Fq1YzQI4PA1W0H8tCkI99R3UWDb3pJeZd6/Xs4Qw/q1uiQO+vNLC6KIPPhK0IajUfuI/P2jk0qWcMsuAQ== + dependencies: + "@ledgerhq/devices" "^6.27.1" + "@ledgerhq/errors" "^6.10.0" + events "^3.3.0" + +"@ledgerhq/hw-transport@^6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.3.0.tgz#4fc966b1a68c991c0a6b5384841f99c4f8304ce9" integrity sha512-kdnVrgmxrFtKaRdkoaQBEa02RXgLzEBiooYbxA65BGSJig3PGWDS9LrqNpzLTZM1RQlivd9NLBmfwU2ze4chWA== @@ -2028,6 +2064,11 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== +"@ledgerhq/logs@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.0.tgz#c012c1ecc1a0e53d50e6af381618dca5268461c1" + integrity sha512-lLseUPEhSFUXYTKj6q7s2O3s2vW2ebgA11vMAlKodXGf5AFw4zUoEbTz9CoFOC9jS6xY4Qr8BmRnxP/odT4Uuw== + "@ledgerhq/logs@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.2.0.tgz#9fb2d6f1811316697f7b3cc14607f6c608912419" @@ -2238,22 +2279,21 @@ dependencies: "@types/yargs-parser" "*" -"@zondax/zemu@^0.22.1": - version "0.22.1" - resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.22.1.tgz#378ea193ccc4836ee5407b01028e9030f70a696e" - integrity sha512-WxX65myug9tyQuoXENO4XujDpTY+guQpc+mzN8rggmIwNqleNDe/HmBc5aeTqNyORBCSJkYpUVv3O9q2xcqzrg== +"@zondax/zemu@^0.27.4": + version "0.27.4" + resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.27.4.tgz#4e306ba76f5c718d901c7948516668e944a6aa1e" + integrity sha512-bbYAW9JJUx+hVBdwkTonu+0q9WkeFQpcGMRUrzS/Gfc6rvhAQ+X9KrGhwGrnxmBuzajt0oXZ50QvoEJHBR9PDA== dependencies: - "@grpc/grpc-js" "^1.3.4" - "@grpc/proto-loader" "^0.6.4" - "@ledgerhq/hw-transport" "^6.1.0" - "@ledgerhq/hw-transport-http" "^6.1.0" - axios "^0.22.0" + "@grpc/grpc-js" "^1.5.5" + "@grpc/proto-loader" "^0.6.9" + "@ledgerhq/hw-transport" "^6.24.1" + "@ledgerhq/hw-transport-http" "^6.24.1" + axios "^0.26.0" axios-retry "^3.2.0" - dockerode "^3.3.0" + dockerode "^3.3.1" elfy "^1.0.0" fs-extra "^10.0.0" get-port "^5.1.1" - json-rpc2 "^2.0.0" path "^0.12.7" pngjs "^6.0.0" randomstring "^1.2.1" @@ -2486,12 +2526,12 @@ axios@^0.21.1: dependencies: follow-redirects "^1.10.0" -axios@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.22.0.tgz#bf702c41fb50fbca4539589d839a077117b79b25" - integrity sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w== +axios@^0.26.0, axios@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== dependencies: - follow-redirects "^1.14.4" + follow-redirects "^1.14.8" babel-jest@^24.9.0: version "24.9.0" @@ -2658,11 +2698,6 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -better-curry@1.x.x: - version "1.6.0" - resolved "https://registry.yarnpkg.com/better-curry/-/better-curry-1.6.0.tgz#38f716b24c8cee07a262abc41c22c314e20e3869" - integrity sha1-OPcWskyM7geiYqvEHCLDFOIOOGk= - bignumber.js@^9.0.0, bignumber.js@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" @@ -3274,10 +3309,10 @@ docker-modem@^3.0.0: split-ca "^1.0.1" ssh2 "^0.8.7" -dockerode@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-3.3.0.tgz#bedaf48ef9fa9124275a54a9881a92374c51008e" - integrity sha512-St08lfOjpYCOXEM8XA0VLu3B3hRjtddODphNW5GFoA0AS3JHgoPQKOz0Qmdzg3P+hUPxhb02g1o1Cu1G+U3lRg== +dockerode@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-3.3.1.tgz#74f66e239e092e7910e2beae6322d35c44b08cdc" + integrity sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ== dependencies: docker-modem "^3.0.0" tar-fs "~2.0.1" @@ -3416,13 +3451,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5class@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/es5class/-/es5class-2.3.1.tgz#42c5c18a9016bcb0db28a4d340ebb831f55d1b66" - integrity sha1-QsXBipAWvLDbKKTTQOu4MfVdG2Y= - dependencies: - better-curry "1.x.x" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -3723,13 +3751,6 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -3800,10 +3821,10 @@ follow-redirects@^1.10.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== -follow-redirects@^1.14.4: - version "1.14.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" - integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== +follow-redirects@^1.14.8: + version "1.15.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== for-each@^0.3.3: version "0.3.3" @@ -4120,11 +4141,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-parser-js@>=0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" - integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -5324,18 +5340,6 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-rpc2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/json-rpc2/-/json-rpc2-2.0.0.tgz#7935199f23cf3665fe6b19b03a85d4a3ea3d94b8" - integrity sha512-0jfrGSH0ZDxrpaaHUkigg/oA6MQqsZDpKSpUzeokhP2jyy6h+cH4G+MPoAa4SVdw9sTzc+YK2hzhUgdShMzKow== - dependencies: - debug "^4.1.1" - es5class "^2.3.1" - faye-websocket "^0.11.3" - jsonparse "^1.3.1" - lodash "^4.17.15" - object-assign "^4.1.1" - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -5367,11 +5371,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -5474,7 +5473,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: +lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5747,11 +5746,6 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -6384,7 +6378,7 @@ rxjs@6, rxjs@^6.5.3: dependencies: tslib "^1.9.0" -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7234,20 +7228,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -7380,16 +7360,16 @@ ws@6: dependencies: async-limiter "~1.0.0" -ws@7: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== - ws@7.4.6, ws@^7.4.5: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" @@ -7481,7 +7461,7 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.1.1: +yargs@^16.1.1, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==