Repository: LedgerHQ/app-ethereum (language: python)

Issue:
Update changelog for 1.9.19
## Description

Update changelog file to reflect the changes made in the 1.9.19 version.

## Changes include

- [ ] Bugfix (non-breaking change that solves an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (change that is not backwards-compatible and/or changes current functionality)
- [ ] Tests
- [x] Documentation
- [ ] Other (for changes that might not fit in any category)


Discussion / hints:

Fix patch:
diff --git a/.github/actions/commit-changes/action.yml b/.github/actions/commit-changes/action.yml
index 147feb699..0099ad681 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 bb1155213..4593b41f5 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 d01c246fc..935cc0066 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 91a750fce..f9af42aed 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 000000000..d656968c0
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 000000000..1e1d755ab
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 000000000..ef6b29c4d
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 000000000..c3b91d475
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 000000000..827e926ac
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 000000000..912c760e5
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 000000000..5f729da9b
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 000000000..7494ccb08
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 000000000..0f8bbe934
--- /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 000000000..6eff7742f
--- /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 000000000..d520276d4
--- /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 000000000..1a561f1eb
--- /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 91aabe0e5..155e3355e 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 274582ac4..7950f7ea9 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 0cd20254c..8b029fa85 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 12b21f55b..ef418fede 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 937d610f9..9bdb11522 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 0347ec475..b26771ccf 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 eb4a14e6b..318edad6a 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 fdda1c0b2..e6d60e1af 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 988ce084d..5afabd409 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 392b7d5df..2d090b90c 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 b396d3320..9bd58020e 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 6cc71829c..ac045f208 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 2c5ec6f0f..7ea12db54 100644
--- a/src_features/signMessage/cmd_signMessage.c
+++ b/src_features/signMessage/cmd_signMessage.c
@@ -1,3 +1,4 @@
+#include <stdbool.h>
 #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 66729773f..ee8e39eb8 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(


Test patch:
diff --git a/tests/jest.js b/tests/jest.js
deleted file mode 100644
index 521ecbe62..000000000
--- 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 7b08f383b..ff934a8b4 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 000000000..ab16f62bf
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 000000000..b90315cd3
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 000000000..3d90dfd93
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 000000000..f5c2d6774
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 000000000..d55782f42
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 000000000..f5c2d6774
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 000000000..ce795f34e
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 000000000..ab16f62bf
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 000000000..ad00cb8ed
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 000000000..b435297ce
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 000000000..fcd68b2ff
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 000000000..251c562bb
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 000000000..f5c2d6774
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 000000000..d55782f42
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 000000000..f5c2d6774
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 000000000..ce795f34e
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 000000000..ab16f62bf
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 000000000..bdbb3a0f2
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 000000000..067695318
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 000000000..582648da5
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 000000000..53e131782
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 000000000..228f924e9
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 000000000..f5c2d6774
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 000000000..d55782f42
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 000000000..f5c2d6774
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 000000000..ce795f34e
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 000000000..1b271542d
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 000000000..58f060626
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 000000000..c9da92b60
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 000000000..121cfd59e
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 000000000..c9da92b60
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 000000000..a58590b98
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 000000000..1b271542d
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 000000000..93eda3538
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 000000000..873634efa
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 000000000..c9da92b60
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 000000000..121cfd59e
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 000000000..c9da92b60
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 000000000..a58590b98
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 000000000..1b271542d
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 000000000..802fad56d
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 000000000..a3ba73961
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 000000000..4601bcaf8
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 000000000..eab9f1d48
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 000000000..0b4bdbd98
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 000000000..c9da92b60
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 000000000..121cfd59e
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 000000000..c9da92b60
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 000000000..a58590b98
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 7047968e1..c3b06e2ed 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 000000000..2223256b0
--- /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 238895c2e..2ed8afaeb 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==