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

Issue:
Parallel tests

Add Celo mainnet and long-running testnets

Parallel tests



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml
index 5c2c5b31a..9c19c9918 100644
--- a/.github/workflows/ci-workflow.yml
+++ b/.github/workflows/ci-workflow.yml
@@ -124,13 +124,17 @@ jobs:
       - name: Build/Install build js deps
         run: |
           cd tests && yarn install
+      - name: Create tmp folder for artifacts
+        run: |
+          mkdir tests/elfs
       - name: Download app binaries
         uses: actions/download-artifact@v2
         with:
           path: tests/elfs
       - name: Gather elfs
         run: |
-          cp `find . -name "*.elf"` ./tests/elfs
+          cd tests/elfs
+          cp `find . -name "*.elf"` .
       - name: Run zemu tests
         run: |
           cd tests && yarn test
diff --git a/.gitignore b/.gitignore
index 11386732e..4dbca94bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@ obj/
 tests/node_modules
 tests/lib
 tests/yarn-error.log
-
+tests/elfs/*
+tests/snapshots/tmp/*
 
 .vscode
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dd80d27cc..89e39203b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,21 @@ 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.3](https://github.com/ledgerhq/app-ethereum/compare/1.9.2...1.9.3) - 2021-9-03
+
+### Added
+
+- Added better display for bigger chainIDs.
+- Added support for Songbird.
+- Added support for Celo.
+
+### Changed
+
+- Small refactor of `getEthDisplayableAddress` helper
+- Improve Zemu tests to get parallelization
+- Increased plugin interface to version 2
+- Remove support for Theta and Flare
+
 ## [1.9.2](https://github.com/ledgerhq/app-ethereum/compare/1.9.0...1.9.2) - 2021-8-11
 
 ### Added
diff --git a/Makefile b/Makefile
index 018068106..3aeeb14b3 100755
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,7 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'"
 
 APPVERSION_M=1
 APPVERSION_N=9
-APPVERSION_P=2
+APPVERSION_P=3
 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)
 APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION)
 
@@ -203,17 +203,17 @@ else ifeq ($(CHAIN),flare_coston)
 APP_LOAD_PARAMS += --path "44'/554'" --path "44'/60'"
 DEFINES += CHAINID_UPCASE=\"FLARE\" CHAINID_COINNAME=\"FLR\" CHAIN_KIND=CHAIN_KIND_FLARE CHAIN_ID=16
 APPNAME = "Flare Coston"
-else ifeq ($(CHAIN),theta)
-APP_LOAD_PARAMS += --path "44'/500'"
-DEFINES += CHAINID_UPCASE=\"THETA\" CHAINID_COINNAME=\"THETA\" CHAIN_KIND=CHAIN_KIND_THETA CHAIN_ID=500
-APPNAME = "Theta"
 else ifeq ($(CHAIN),bsc)
 APP_LOAD_PARAMS += --path "44'/60'"
 DEFINES += CHAINID_UPCASE=\"BSC\" CHAINID_COINNAME=\"BNB\" CHAIN_KIND=CHAIN_KIND_BSC CHAIN_ID=56
 APPNAME = "Binance Smart Chain"
+else ifeq ($(CHAIN),songbird)
+APP_LOAD_PARAMS += --path "44'/554'" --path "44'/60'"
+DEFINES += CHAINID_UPCASE=\"SONGBIRD\" CHAINID_COINNAME=\"SGB\" CHAIN_KIND=CHAIN_KIND_SONGBIRD CHAIN_ID=19
+APPNAME = "Songbird"
 else
 ifeq ($(filter clean,$(MAKECMDGOALS)),)
-$(error Unsupported CHAIN - use ethereum, ropsten, ethereum_classic, expanse, poa, artis_sigma1, artis_tau1, rsk, rsk_testnet, ubiq, wanchain, kusd, musicoin, pirl, akroma, atheios, callisto, ethersocial, ellaism, ether1, ethergem, gochain, mix, reosc, hpb, tomochain, tobalaba, dexon, volta, ewc, webchain, thundercore, flare, flare_coston, theta)
+$(error Unsupported CHAIN - use ethereum, ropsten, ethereum_classic, expanse, poa, artis_sigma1, artis_tau1, rsk, rsk_testnet, ubiq, wanchain, kusd, musicoin, pirl, akroma, atheios, callisto, ethersocial, ellaism, ether1, ethergem, gochain, mix, reosc, hpb, tomochain, tobalaba, dexon, volta, ewc, webchain, thundercore, bsc, songbird)
 endif
 endif
 
@@ -384,4 +384,4 @@ include $(BOLOS_SDK)/Makefile.rules
 dep/%.d: %.c Makefile
 
 listvariants:
-	@echo VARIANTS CHAIN ethereum ropsten ethereum_classic expanse poa rsk rsk_testnet ubiq wanchain pirl akroma atheios callisto ethersocial ether1 gochain musicoin ethergem mix ellaism reosc hpb tomochain dexon volta ewc thundercore flare flare_coston theta bsc
+	@echo VARIANTS CHAIN ethereum ropsten ethereum_classic expanse poa rsk rsk_testnet ubiq wanchain pirl akroma atheios callisto ethersocial ether1 gochain musicoin ethergem mix ellaism reosc hpb tomochain dexon volta ewc thundercore bsc songbird
diff --git a/README.md b/README.md
index be334712d..89033b46e 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,15 @@ Testing is done via the open-source framework [zemu](https://github.com/Zondax/z
 ## Running tests
 
 First [install yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable).
+Open `tests/build_local_test_elfs.sh` and add your BOLOS SDKs path to `NANOS_SDK` and `NANOX_SDK`.
+This helper script will build the applications required by the test suite and move them at the right place.
+```
+cd test
+./build_local_test_elfs.sh
+```
 Then you can install the project by simply running:
 ```
+cd ..
 make test
 ```
 This will run `make install_tests` and `make run_tests`
diff --git a/doc/ethapp.asc b/doc/ethapp.asc
index 1df3372ae..b3c01fcaf 100644
--- a/doc/ethapp.asc
+++ b/doc/ethapp.asc
@@ -520,7 +520,7 @@ The following standard Status Words are returned for all APDUs - some specific S
 |===============================================================================================
 | *SW*     | *Description*
 |   6501   | TransactionType not supported
-|   6502   | Output buffer too small for snprintf input
+|   6502   | Output buffer too small for chainId conversion
 |   6503   | Plugin error
 |   6504   | Failed to convert from int256
 |   6700   | Incorrect length
diff --git a/ethereum-plugin-sdk b/ethereum-plugin-sdk
index ea366c130..3d9433e3a 160000
--- a/ethereum-plugin-sdk
+++ b/ethereum-plugin-sdk
@@ -1,1 +1,1 @@
-Subproject commit ea366c1302f5e6947eeb7e7f30147ea431fa5e72
+Subproject commit 3d9433e3a0e4c034938f767fe8be928d554536de
diff --git a/icons/nanos_app_songbird.gif b/icons/nanos_app_songbird.gif
new file mode 100644
index 000000000..302030bcf
Binary files /dev/null and b/icons/nanos_app_songbird.gif differ
diff --git a/icons/nanox_app_songbird.gif b/icons/nanox_app_songbird.gif
new file mode 100644
index 000000000..1361a6886
Binary files /dev/null and b/icons/nanox_app_songbird.gif differ
diff --git a/icons/songbird.png b/icons/songbird.png
new file mode 100644
index 000000000..0fd35ec03
Binary files /dev/null and b/icons/songbird.png differ
diff --git a/src/chainConfig.h b/src/chainConfig.h
index a8450182b..83d71579b 100644
--- a/src/chainConfig.h
+++ b/src/chainConfig.h
@@ -54,13 +54,13 @@ typedef enum chain_kind_e {
     CHAIN_KIND_WEBCHAIN,
     CHAIN_KIND_THUNDERCORE,
     CHAIN_KIND_FLARE,
-    CHAIN_KIND_THETA,
-    CHAIN_KIND_BSC
+    CHAIN_KIND_BSC,
+    CHAIN_KIND_SONGBIRD
 } chain_kind_t;
 
 typedef struct chain_config_s {
     char coinName[10];  // ticker
-    uint32_t chainId;
+    uint64_t chainId;
     chain_kind_t kind;
 } chain_config_t;
 
diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c
index 725469c86..d20e927a5 100644
--- a/src/eth_plugin_handler.c
+++ b/src/eth_plugin_handler.c
@@ -153,7 +153,7 @@ eth_plugin_result_t eth_plugin_call(int method, void *parameter) {
         case ETH_PLUGIN_INIT_CONTRACT:
             PRINTF("-- PLUGIN INIT CONTRACT --\n");
             ((ethPluginInitContract_t *) parameter)->interfaceVersion =
-                ETH_PLUGIN_INTERFACE_VERSION_1;
+                ETH_PLUGIN_INTERFACE_VERSION_LATEST;
             ((ethPluginInitContract_t *) parameter)->result = ETH_PLUGIN_RESULT_UNAVAILABLE;
             ((ethPluginInitContract_t *) parameter)->pluginSharedRW = &pluginRW;
             ((ethPluginInitContract_t *) parameter)->pluginSharedRO = &pluginRO;
diff --git a/src/eth_plugin_interface.h b/src/eth_plugin_interface.h
index 2698e2167..94d7b7ef6 100644
--- a/src/eth_plugin_interface.h
+++ b/src/eth_plugin_interface.h
@@ -12,6 +12,7 @@
 // Interface version. To be updated everytime we introduce breaking changes to the plugin interface.
 typedef enum {
     ETH_PLUGIN_INTERFACE_VERSION_1 = 1,  // Version 1
+    ETH_PLUGIN_INTERFACE_VERSION_LATEST = 2,
 } eth_plugin_interface_version_t;
 
 typedef enum {
diff --git a/src/handle_check_address.c b/src/handle_check_address.c
index 768620528..48b6b9409 100644
--- a/src/handle_check_address.c
+++ b/src/handle_check_address.c
@@ -61,7 +61,7 @@ int handle_check_address(check_address_parameters_t* params, chain_config_t* cha
     getEthAddressStringFromKey(&locals_union2.publicKey,
                                locals_union1.address,
                                &local_sha3,
-                               chain_config);
+                               chain_config->chainId);
     ZERO(locals_union2);
 
     uint8_t offset_0x = 0;
diff --git a/src/main.c b/src/main.c
index 48a91d7a9..3820fd651 100644
--- a/src/main.c
+++ b/src/main.c
@@ -250,12 +250,12 @@ tokenDefinition_t *getKnownToken(uint8_t *contractAddress) {
         case CHAIN_KIND_FLARE:
             numTokens = NUM_TOKENS_FLARE;
             break;
-        case CHAIN_KIND_THETA:
-            numTokens = NUM_TOKENS_THETA;
-            break;
         case CHAIN_KIND_BSC:
             numTokens = NUM_TOKENS_BSC;
             break;
+        case CHAIN_KIND_SONGBIRD:
+            numTokens = NUM_TOKENS_SONGBIRD;
+            break;
     }
     for (i = 0; i < numTokens; i++) {
         switch (chainConfig->kind) {
@@ -352,12 +352,12 @@ tokenDefinition_t *getKnownToken(uint8_t *contractAddress) {
             case CHAIN_KIND_FLARE:
                 currentToken = (tokenDefinition_t *) PIC(&TOKENS_FLARE[i]);
                 break;
-            case CHAIN_KIND_THETA:
-                currentToken = (tokenDefinition_t *) PIC(&TOKENS_THETA[i]);
-                break;
             case CHAIN_KIND_BSC:
                 currentToken = (tokenDefinition_t *) PIC(&TOKENS_BSC[i]);
                 break;
+            case CHAIN_KIND_SONGBIRD:
+                currentToken = (tokenDefinition_t *) PIC(&TOKENS_SONGBIRD[i]);
+                break;
         }
         if (memcmp(currentToken->address, tmpContent.txContent.destination, ADDRESS_LENGTH) == 0) {
             return currentToken;
@@ -876,22 +876,22 @@ __attribute__((section(".boot"))) int main(int arg0) {
             PRINTF("Hello from Eth-clone\n");
             check_api_level(CX_COMPAT_APILEVEL);
             // delegate to Ethereum app/lib
-            libcall_params[0] = "Ethereum";
+            libcall_params[0] = (unsigned int) "Ethereum";
             libcall_params[1] = 0x100;
             libcall_params[2] = RUN_APPLICATION;
-            libcall_params[3] = &local_chainConfig;
+            libcall_params[3] = (unsigned int) &local_chainConfig;
             libcall_params[4] = 0;
             if (arg0) {
                 // call as a library
                 libcall_params[2] = ((unsigned int *) arg0)[1];
                 libcall_params[4] = ((unsigned int *) arg0)[3];  // library arguments
-                os_lib_call(&libcall_params);
+                os_lib_call((unsigned int *) &libcall_params);
                 ((unsigned int *) arg0)[0] = libcall_params[1];
                 os_lib_end();
             } else {
                 // launch coin application
                 libcall_params[1] = 0x100;  // use the Init call, as we won't exit
-                os_lib_call(&libcall_params);
+                os_lib_call((unsigned int *) &libcall_params);
             }
         }
         FINALLY {
diff --git a/src/shared_context.h b/src/shared_context.h
index e3e9c6f8b..8631c35d6 100644
--- a/src/shared_context.h
+++ b/src/shared_context.h
@@ -162,14 +162,14 @@ typedef enum {
 #endif
 } contract_call_t;
 
-#define NETWORK_NAME_MAX_SIZE 12
+#define NETWORK_STRING_MAX_SIZE 16
 
 typedef struct txStringProperties_t {
     char fullAddress[43];
     char fullAmount[50];
     char maxFee[50];
     char nonce[8];  // 10M tx per account ought to be enough for everybody
-    char network_name[NETWORK_NAME_MAX_SIZE];
+    char network_name[NETWORK_STRING_MAX_SIZE];
 } txStringProperties_t;
 
 #define SHARED_CTX_FIELD_1_SIZE 100
diff --git a/src/tokens.c b/src/tokens.c
index 63667e8f5..ce7a92d84 100644
--- a/src/tokens.c
+++ b/src/tokens.c
@@ -3853,10 +3853,6 @@ const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = {
       0x91, 0x9a, 0xbc, 0x23, 0x5c, 0xa4, 0xfd, 0x7f, 0x72, 0xc1},
      "TGT ",
      1},
-    {{0x38, 0x83, 0xf5, 0xe1, 0x81, 0xfc, 0xca, 0xf8, 0x41, 0x0f,
-      0xa6, 0x1e, 0x12, 0xb5, 0x9b, 0xad, 0x96, 0x3f, 0xb6, 0x45},
-     "THETA ",
-     18},
     {{0x1c, 0xb3, 0x20, 0x9d, 0x45, 0xb2, 0xa6, 0x0b, 0x7f, 0xbc,
       0xa1, 0xcc, 0xdb, 0xf8, 0x7f, 0x67, 0x42, 0x37, 0xa4, 0xaa},
      "THR ",
@@ -4564,8 +4560,8 @@ const tokenDefinition_t const TOKENS_THUNDERCORE[NUM_TOKENS_THUNDERCORE] = {};
 
 const tokenDefinition_t const TOKENS_FLARE[NUM_TOKENS_FLARE] = {};
 
-const tokenDefinition_t const TOKENS_THETA[NUM_TOKENS_THETA] = {};
-
 const tokenDefinition_t const TOKENS_BSC[NUM_TOKENS_BSC] = {};
 
+const tokenDefinition_t const TOKENS_SONGBIRD[NUM_TOKENS_SONGBIRD] = {};
+
 #endif
diff --git a/src/tokens.h b/src/tokens.h
index 3573cd396..f57cbb0ac 100644
--- a/src/tokens.h
+++ b/src/tokens.h
@@ -95,8 +95,8 @@ static const uint8_t LEDGER_SIGNATURE_PUBLIC_KEY[] = {
 #define NUM_TOKENS_WEBCHAIN         0
 #define NUM_TOKENS_THUNDERCORE      0
 #define NUM_TOKENS_FLARE            0
-#define NUM_TOKENS_THETA            0
 #define NUM_TOKENS_BSC              0
+#define NUM_TOKENS_SONGBIRD         0
 
 extern tokenDefinition_t const TOKENS_AKROMA[NUM_TOKENS_AKROMA];
 extern tokenDefinition_t const TOKENS_ELLAISM[NUM_TOKENS_ELLAISM];
@@ -129,8 +129,8 @@ extern tokenDefinition_t const TOKENS_ARTIS_TAU1[NUM_TOKENS_ARTIS_TAU1];
 extern tokenDefinition_t const TOKENS_WEBCHAIN[NUM_TOKENS_WEBCHAIN];
 extern tokenDefinition_t const TOKENS_THUNDERCORE[NUM_TOKENS_THUNDERCORE];
 extern tokenDefinition_t const TOKENS_FLARE[NUM_TOKENS_FLARE];
-extern tokenDefinition_t const TOKENS_THETA[NUM_TOKENS_THETA];
 extern tokenDefinition_t const TOKENS_BSC[NUM_TOKENS_BSC];
+extern tokenDefinition_t const TOKENS_SONGBIRD[NUM_TOKENS_SONGBIRD];
 
 #endif /* HAVE_TOKENS_LIST */
 
diff --git a/src/utils.c b/src/utils.c
index e3e04c609..50481194e 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -54,19 +54,17 @@ int local_strchr(char *string, char ch) {
     return -1;
 }
 
-uint32_t u32_from_BE(uint8_t *in, uint8_t size) {
-    switch (size) {
-        case 0:
-            return 0;
-        case 1:
-            return in[0];
-        case 2:
-            return (in[0] << 8) | in[1];
-        case 3:
-            return (in[0] << 16) | (in[1] << 8) | in[2];
-        default:
-            return (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3];
+uint64_t u64_from_BE(uint8_t *in, uint8_t size) {
+    uint8_t i = 0;
+    uint64_t res = 0;
+
+    while (i < size && i < sizeof(res)) {
+        res <<= 8;
+        res |= in[i];
+        i++;
     }
+
+    return res;
 }
 
 bool uint256_to_decimal(const uint8_t *value, size_t value_len, char *out, size_t out_len) {
diff --git a/src/utils.h b/src/utils.h
index f10ac1933..6ee5d459b 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -28,7 +28,7 @@ void convertUint256BE(uint8_t* data, uint32_t length, uint256_t* target);
 
 int local_strchr(char* string, char ch);
 
-uint32_t u32_from_BE(uint8_t* in, uint8_t size);
+uint64_t u64_from_BE(uint8_t* in, uint8_t size);
 
 bool uint256_to_decimal(const uint8_t* value, size_t value_len, char* out, size_t out_len);
 
diff --git a/src_common/ethUstream.h b/src_common/ethUstream.h
index 01b9f3702..e73cc958c 100644
--- a/src_common/ethUstream.h
+++ b/src_common/ethUstream.h
@@ -126,7 +126,7 @@ typedef struct txContent_t {
     txInt256_t chainID;
     uint8_t destination[ADDRESS_LENGTH];
     uint8_t destinationLength;
-    uint8_t v[4];
+    uint8_t v[8];
     uint8_t vLength;
     bool dataPresent;
 } txContent_t;
diff --git a/src_common/ethUtils.c b/src_common/ethUtils.c
index 3ad545e7c..eb9ddf604 100644
--- a/src_common/ethUtils.c
+++ b/src_common/ethUtils.c
@@ -126,17 +126,45 @@ void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3
 void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey,
                                 char *out,
                                 cx_sha3_t *sha3Context,
-                                chain_config_t *chain_config) {
+                                uint64_t chainId) {
     uint8_t hashAddress[INT256_LENGTH];
     cx_keccak_init(sha3Context, 256);
     cx_hash((cx_hash_t *) sha3Context, CX_LAST, publicKey->W + 1, 64, hashAddress, 32);
-    getEthAddressStringFromBinary(hashAddress + 12, out, sha3Context, chain_config);
+    getEthAddressStringFromBinary(hashAddress + 12, out, sha3Context, chainId);
+}
+
+void u64_to_string(uint64_t src, char *dst, uint8_t dst_size) {
+    // Copy the numbers in ASCII format.
+    uint8_t i = 0;
+    do {
+        // Checking `i + 1` to make sure we have enough space for '\0'.
+        if (i + 1 >= dst_size) {
+            THROW(0x6502);
+        }
+        dst[i] = src % 10 + '0';
+        src /= 10;
+        i++;
+    } while (src);
+
+    // Null terminate string
+    dst[i] = '\0';
+
+    // Revert the string
+    i--;
+    uint8_t j = 0;
+    while (j < i) {
+        char tmp = dst[i];
+        dst[i] = dst[j];
+        dst[j] = tmp;
+        i--;
+        j++;
+    }
 }
 
 void getEthAddressStringFromBinary(uint8_t *address,
                                    char *out,
                                    cx_sha3_t *sha3Context,
-                                   chain_config_t *chain_config) {
+                                   uint64_t chainId) {
     // save some precious stack space
     union locals_union {
         uint8_t hashChecksum[INT256_LENGTH];
@@ -146,18 +174,17 @@ void getEthAddressStringFromBinary(uint8_t *address,
     uint8_t i;
     bool eip1191 = false;
     uint32_t offset = 0;
-    switch (chain_config->chainId) {
+    switch (chainId) {
         case 30:
         case 31:
             eip1191 = true;
             break;
     }
     if (eip1191) {
-        snprintf((char *) locals_union.tmp,
-                 sizeof(locals_union.tmp),
-                 "%d0x",
-                 chain_config->chainId);
-        offset = strlen((char *) locals_union.tmp);
+        u64_to_string(chainId, (char *) locals_union.tmp, sizeof(locals_union.tmp));
+        offset = strnlen((char *) locals_union.tmp, sizeof(locals_union.tmp));
+        strlcat((char *) locals_union.tmp + offset, "0x", sizeof(locals_union.tmp) - offset);
+        offset = strnlen((char *) locals_union.tmp, sizeof(locals_union.tmp));
     }
     for (i = 0; i < 20; i++) {
         uint8_t digit = address[i];
@@ -192,6 +219,24 @@ void getEthAddressStringFromBinary(uint8_t *address,
     out[40] = '\0';
 }
 
+/* Fills the `out` buffer with the lowercase string representation of the pubkey passed in as binary
+format by `in`. (eg: uint8_t*:0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB ->
+char*:"0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB\0" )
+`sha3` context doesn't have have to be initialized prior to call.*/
+void getEthDisplayableAddress(uint8_t *in,
+                              char *out,
+                              size_t out_len,
+                              cx_sha3_t *sha3,
+                              uint64_t chainId) {
+    if (out_len < 43) {
+        strlcpy(out, "ERROR", out_len);
+        return;
+    }
+    out[0] = '0';
+    out[1] = 'x';
+    getEthAddressStringFromBinary(in, out + 2, sha3, chainId);
+}
+
 bool adjustDecimals(char *src,
                     uint32_t srcLength,
                     char *target,
diff --git a/src_common/ethUtils.h b/src_common/ethUtils.h
index 67712a71b..de51b1c9d 100644
--- a/src_common/ethUtils.h
+++ b/src_common/ethUtils.h
@@ -42,12 +42,20 @@ void getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3
 void getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey,
                                 char *out,
                                 cx_sha3_t *sha3Context,
-                                chain_config_t *chain_config);
+                                uint64_t chainId);
+
+void u64_to_string(uint64_t src, char *dst, uint8_t dst_size);
 
 void getEthAddressStringFromBinary(uint8_t *address,
                                    char *out,
                                    cx_sha3_t *sha3Context,
-                                   chain_config_t *chain_config);
+                                   uint64_t chainId);
+
+void getEthDisplayableAddress(uint8_t *in,
+                              char *out,
+                              size_t out_len,
+                              cx_sha3_t *sha3,
+                              uint64_t chainId);
 
 bool adjustDecimals(char *src,
                     uint32_t srcLength,
diff --git a/src_common/network.c b/src_common/network.c
index f1181b8c7..eee88c69b 100644
--- a/src_common/network.c
+++ b/src_common/network.c
@@ -19,30 +19,33 @@ const network_info_t NETWORK_MAPPING[] = {
     {.chain_id = 100, .name = "xDai", .ticker = "xDAI "},
     {.chain_id = 137, .name = "Polygon", .ticker = "MATIC "},
     {.chain_id = 250, .name = "Fantom", .ticker = "FTM "},
-    {.chain_id = 43114, .name = "Avalanche", .ticker = "AVAX "}};
+    {.chain_id = 42220, .name = "Celo", .ticker = "CELO "},
+    {.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 "}};
 
-uint32_t get_chain_id(void) {
-    uint32_t chain_id = 0;
+uint64_t get_chain_id(void) {
+    uint64_t chain_id = 0;
 
     switch (txContext.txType) {
         case LEGACY:
-            chain_id = u32_from_BE(txContext.content->v, txContext.content->vLength);
+            chain_id = u64_from_BE(txContext.content->v, txContext.content->vLength);
             break;
         case EIP2930:
         case EIP1559:
-            chain_id = u32_from_BE(tmpContent.txContent.chainID.value,
+            chain_id = u64_from_BE(tmpContent.txContent.chainID.value,
                                    tmpContent.txContent.chainID.length);
             break;
         default:
             PRINTF("Txtype `%d` not supported while generating chainID\n", txContext.txType);
             break;
     }
-    PRINTF("ChainID: %d\n", chain_id);
     return chain_id;
 }
 
 network_info_t *get_network(void) {
-    uint32_t chain_id = get_chain_id();
+    uint64_t chain_id = get_chain_id();
     for (uint8_t i = 0; i < sizeof(NETWORK_MAPPING) / sizeof(*NETWORK_MAPPING); i++) {
         if (NETWORK_MAPPING[i].chain_id == chain_id) {
             return (network_info_t *) PIC(&NETWORK_MAPPING[i]);
diff --git a/src_common/network.h b/src_common/network.h
index e8c4f7a81..529cc4f01 100644
--- a/src_common/network.h
+++ b/src_common/network.h
@@ -1,16 +1,15 @@
 #include <stdint.h>
 #include "tokens.h"
-
-#define NETWORK_STRING_MAX_SIZE 12
+#include "shared_context.h"
 
 typedef struct network_info_s {
     const char name[NETWORK_STRING_MAX_SIZE];
     const char ticker[MAX_TICKER_LEN];
-    uint32_t chain_id;
+    uint64_t chain_id;
 } network_info_t;
 
 // Returns the current chain id. Defaults to 0 if txType was not found.
-uint32_t get_chain_id(void);
+uint64_t get_chain_id(void);
 // Returns a pointer to the network struct, or NULL if there is none.
 network_info_t *get_network(void);
 // Returns a pointer to the network name, or NULL if there is none.
diff --git a/src_features/getPublicKey/cmd_getPublicKey.c b/src_features/getPublicKey/cmd_getPublicKey.c
index 3d9118b2b..ef521c49c 100644
--- a/src_features/getPublicKey/cmd_getPublicKey.c
+++ b/src_features/getPublicKey/cmd_getPublicKey.c
@@ -50,7 +50,7 @@ void handleGetPublicKey(uint8_t p1,
     getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey,
                                tmpCtx.publicKeyContext.address,
                                &global_sha3,
-                               chainConfig);
+                               chainConfig->chainId);
 #ifndef NO_CONSENT
     if (p1 == P1_NON_CONFIRM)
 #endif  // NO_CONSENT
diff --git a/src_features/signTx/cmd_signTx.c b/src_features/signTx/cmd_signTx.c
index 4e4fdbea5..09c0f8c68 100644
--- a/src_features/signTx/cmd_signTx.c
+++ b/src_features/signTx/cmd_signTx.c
@@ -59,7 +59,7 @@ void handleSign(uint8_t p1,
         } else {
             txContext.txType = LEGACY;
         }
-        PRINTF("TxType: %d\n", txContext.txType);
+        PRINTF("TxType: %x\n", txContext.txType);
     } else if (p1 != P1_MORE) {
         THROW(0x6B00);
     }
diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c
index 47960afcb..cec653697 100644
--- a/src_features/signTx/logic_signTx.c
+++ b/src_features/signTx/logic_signTx.c
@@ -8,6 +8,7 @@
 #endif
 #include "eth_plugin_handler.h"
 #include "network.h"
+#include "ethUtils.h"
 
 #define ERR_SILENT_MODE_CHECK_FAILED 0x6001
 
@@ -261,16 +262,8 @@ void prepareNetworkDisplay() {
     char *name = get_network_name();
     if (name == NULL) {
         // No network name found so simply copy the chain ID as the network name.
-        uint32_t chain_id = get_chain_id();
-        uint8_t res = snprintf(strings.common.network_name,
-                               sizeof(strings.common.network_name),
-                               "%d",
-                               chain_id);
-        if (res >= sizeof(strings.common.network_name)) {
-            // If the return value is higher or equal to the size passed in as parameter, then
-            // the output was truncated. Return the appropriate error code.
-            THROW(0x6502);
-        }
+        uint64_t chain_id = get_chain_id();
+        u64_to_string(chain_id, strings.common.network_name, sizeof(strings.common.network_name));
     } else {
         // Network name found, simply copy it.
         strlcpy(strings.common.network_name, name, sizeof(strings.common.network_name));
@@ -308,7 +301,7 @@ void finalizeParsing(bool direct) {
     // Verify the chain
     if (chainConfig->chainId != ETHEREUM_MAINNET_CHAINID) {
         // TODO: Could we remove above check?
-        uint32_t id = get_chain_id();
+        uint64_t id = get_chain_id();
 
         if (chainConfig->chainId != id) {
             PRINTF("Invalid chainID %u expected %u\n", id, chainConfig->chainId);
@@ -422,12 +415,11 @@ void finalizeParsing(bool direct) {
     // Prepare destination address to display
     if (genericUI) {
         if (tmpContent.txContent.destinationLength != 0) {
-            displayBuffer[0] = '0';
-            displayBuffer[1] = 'x';
-            getEthAddressStringFromBinary(tmpContent.txContent.destination,
-                                          displayBuffer + 2,
-                                          &global_sha3,
-                                          chainConfig);
+            getEthDisplayableAddress(tmpContent.txContent.destination,
+                                     displayBuffer,
+                                     sizeof(displayBuffer),
+                                     &global_sha3,
+                                     chainConfig->chainId);
             compareOrCopy(strings.common.fullAddress,
                           sizeof(strings.common.fullAddress),
                           displayBuffer,
@@ -459,9 +451,11 @@ void finalizeParsing(bool direct) {
 
     // Compute maximum fee
     prepareFeeDisplay();
+    PRINTF("Fees displayed: %s\n", strings.common.maxFee);
 
     // Prepare chainID field
     prepareNetworkDisplay();
+    PRINTF("Network: %s\n", strings.common.network_name);
 
     bool no_consent;
 
diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c
index 360f88364..36a0bd9c1 100644
--- a/src_features/signTx/ui_common_signTx.c
+++ b/src_features/signTx/ui_common_signTx.c
@@ -7,7 +7,6 @@ unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_elemen
     uint8_t signature[100];
     cx_ecfp_private_key_t privateKey;
     uint32_t tx = 0;
-    uint32_t v = u32_from_BE(tmpContent.txContent.v, tmpContent.txContent.vLength);
     io_seproxyhal_io_heartbeat();
     os_perso_derive_node_bip32(CX_CURVE_256K1,
                                tmpCtx.transactionContext.bip32Path,
@@ -40,7 +39,12 @@ unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_elemen
             G_io_apdu_buffer[0] = 27;
         } else {
             // New API
-            // Note that this is wrong for a large v, but the client can always recover
+            // Note that this is wrong for a large v, but ledgerjs will recover.
+
+            // Taking only the 4 highest bytes to not introduce breaking changes. In the future,
+            // this should be updated.
+            uint32_t v = (uint32_t) u64_from_BE(tmpContent.txContent.v,
+                                                MIN(4, tmpContent.txContent.vLength));
             G_io_apdu_buffer[0] = (v * 2) + 35;
         }
         if (info & CX_ECCINFO_PARITY_ODD) {
diff --git a/src_features/signTx/ui_flow_signTx.c b/src_features/signTx/ui_flow_signTx.c
index aee22f55e..b508ee5f9 100644
--- a/src_features/signTx/ui_flow_signTx.c
+++ b/src_features/signTx/ui_flow_signTx.c
@@ -222,9 +222,8 @@ void ux_approve_tx(bool fromPlugin) {
         ux_approval_tx_flow[step++] = &ux_approval_nonce_step;
     }
 
-    uint32_t chain_id = get_chain_id();
+    uint64_t chain_id = get_chain_id();
     if (chainConfig->chainId == ETHEREUM_MAINNET_CHAINID && chain_id != chainConfig->chainId) {
-        // TODO: do we need the `&&` above?
         ux_approval_tx_flow[step++] = &ux_approval_network_step;
     }
 
diff --git a/src_features/stark_sign/ui_flow_stark_sign.c b/src_features/stark_sign/ui_flow_stark_sign.c
index 6f1b24758..4ef5ddcf8 100644
--- a/src_features/stark_sign/ui_flow_stark_sign.c
+++ b/src_features/stark_sign/ui_flow_stark_sign.c
@@ -13,16 +13,6 @@ void stark_sign_display_master_account() {
              dataContext.starkContext.transferDestination);
 }
 
-void stark_sign_display_condition_address() {
-    strings.tmp.tmp[0] = '0';
-    strings.tmp.tmp[1] = 'x';
-    getEthAddressStringFromBinary(dataContext.starkContext.conditionAddress,
-                                  strings.tmp.tmp + 2,
-                                  &global_sha3,
-                                  chainConfig);
-    strings.tmp.tmp[42] = '\0';
-}
-
 void stark_sign_display_condition_fact() {
     snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", 32, dataContext.starkContext.fact);
 }
@@ -189,7 +179,11 @@ UX_STEP_NOCB_INIT(
 UX_STEP_NOCB_INIT(
     ux_stark_conditional_transfer_8_step,
     bnnn_paging,
-    stark_sign_display_condition_address(),
+    getEthDisplayableAddress(dataContext.starkContext.conditionAddress,
+                                  strings.tmp.tmp,
+                                  sizeof(strings.tmp.tmp),
+                                  &global_sha3,
+                                  chainConfig->chainId),
     {
       .title = "Cond. Address",
       .text = strings.tmp.tmp
diff --git a/src_plugins/erc20/erc20_plugin.c b/src_plugins/erc20/erc20_plugin.c
index 156ca0749..7903402a0 100644
--- a/src_plugins/erc20/erc20_plugin.c
+++ b/src_plugins/erc20/erc20_plugin.c
@@ -212,12 +212,11 @@ void erc20_plugin_call(int message, void *parameters) {
                         strlcpy(msg->msg, context->contract_name, msg->msgLength);
                     } else {
                         strlcpy(msg->title, "Address", msg->titleLength);
-                        msg->msg[0] = '0';
-                        msg->msg[1] = 'x';
-                        getEthAddressStringFromBinary(context->destinationAddress,
-                                                      msg->msg + 2,
-                                                      msg->pluginSharedRW->sha3,
-                                                      chainConfig);
+                        getEthDisplayableAddress(context->destinationAddress,
+                                                 msg->msg,
+                                                 msg->msgLength,
+                                                 msg->pluginSharedRW->sha3,
+                                                 chainConfig->chainId);
                     }
 
                     msg->result = ETH_PLUGIN_RESULT_OK;
diff --git a/src_plugins/erc721/erc721_plugin.c b/src_plugins/erc721/erc721_plugin.c
index 584ac5c32..9d04d744b 100644
--- a/src_plugins/erc721/erc721_plugin.c
+++ b/src_plugins/erc721/erc721_plugin.c
@@ -5,9 +5,6 @@
 #include "ethUtils.h"
 #include "utils.h"
 
-void starkware_print_stark_key(uint8_t *starkKey, char *destination);
-void starkware_print_eth_address(uint8_t *address, char *destination);
-
 typedef struct erc721_parameters_t {
     uint8_t selectorIndex;
     uint8_t address[ADDRESS_LENGTH];
@@ -119,19 +116,27 @@ void erc721_plugin_call(int message, void *parameters) {
             switch (msg->screenIndex) {
                 case 0:
                     strlcpy(msg->title, "Contract Name", msg->titleLength);
-                    starkware_print_eth_address(tmpContent.txContent.destination, msg->msg);
+                    getEthDisplayableAddress(tmpContent.txContent.destination,
+                                             msg->msg,
+                                             msg->msgLength,
+                                             &global_sha3,
+                                             chainConfig->chainId);
                     msg->result = ETH_PLUGIN_RESULT_OK;
                     break;
 
                 case 1:
                     strlcpy(msg->title, "NFT Contract", msg->titleLength);
-                    starkware_print_eth_address(context->address, msg->msg);
+                    getEthDisplayableAddress(context->address,
+                                             msg->msg,
+                                             msg->msgLength,
+                                             &global_sha3,
+                                             chainConfig->chainId);
                     msg->result = ETH_PLUGIN_RESULT_OK;
                     break;
 
                 case 2:
                     strlcpy(msg->title, "TokenID", msg->titleLength);
-                    starkware_print_stark_key(context->tokenId, msg->msg);
+                    snprintf(msg->msg, 70, "0x%.*H", 32, context->tokenId);
                     msg->result = ETH_PLUGIN_RESULT_OK;
                     break;
 
diff --git a/src_plugins/eth2/eth2_plugin.c b/src_plugins/eth2/eth2_plugin.c
index 7a43eafb8..29ea29947 100644
--- a/src_plugins/eth2/eth2_plugin.c
+++ b/src_plugins/eth2/eth2_plugin.c
@@ -32,19 +32,6 @@ typedef struct eth2_deposit_parameters_t {
     char deposit_address[ETH2_DEPOSIT_PUBKEY_LENGTH];
 } eth2_deposit_parameters_t;
 
-// Fills the `out` buffer with the lowercase string representation of the pubkey passed in as binary
-// format by `in`. Does not check the size, so expects `out` to be big enough to hold the string
-// representation. Returns the length of string (counting the null terminating character).
-static int getEthDisplayableAddress(char *out, uint8_t *in, cx_sha3_t *sha3) {
-    out[0] = '0';
-    out[1] = 'x';
-    getEthAddressStringFromBinary(in, out + 2, sha3, chainConfig);
-
-    uint8_t destinationLen = strlen(out) + 1;  // Adding one to account for \0.
-
-    return destinationLen;
-}
-
 void eth2_plugin_call(int message, void *parameters) {
     switch (message) {
         case ETH_PLUGIN_INIT_CONTRACT: {
@@ -130,9 +117,11 @@ void eth2_plugin_call(int message, void *parameters) {
 
                     // Use a temporary buffer to store the string representation.
                     char tmp[ETH2_DEPOSIT_PUBKEY_LENGTH];
-                    getEthDisplayableAddress(tmp,
-                                             (uint8_t *) context->deposit_address,
-                                             msg->pluginSharedRW->sha3);
+                    getEthDisplayableAddress((uint8_t *) context->deposit_address,
+                                             tmp,
+                                             sizeof(tmp),
+                                             msg->pluginSharedRW->sha3,
+                                             chainConfig->chainId);
 
                     // Copy back the string to the global variable.
                     strlcpy(context->deposit_address, tmp, ETH2_DEPOSIT_PUBKEY_LENGTH);
diff --git a/src_plugins/starkware/starkware_plugin.c b/src_plugins/starkware/starkware_plugin.c
index c2ae91e6f..872ea0da8 100644
--- a/src_plugins/starkware/starkware_plugin.c
+++ b/src_plugins/starkware/starkware_plugin.c
@@ -279,18 +279,6 @@ void starkware_print_stark_key(uint8_t *starkKey, char *destination) {
     snprintf(destination, 70, "0x%.*H", 32, starkKey);
 }
 
-// TODO : rewrite as independant code
-void starkware_print_eth_address(uint8_t *address, char *destination, size_t destinationLength) {
-    if (destinationLength < 43) {
-        strlcpy(destination, "ERROR", destinationLength);
-        return;
-    }
-    destination[0] = '0';
-    destination[1] = 'x';
-    getEthAddressStringFromBinary(address, destination + 2, &global_sha3, chainConfig);
-    destination[42] = '\0';
-}
-
 // TODO : rewrite as independant code
 void starkware_print_amount(uint8_t *amountData,
                             char *destination,
@@ -348,7 +336,11 @@ void starkware_print_asset_contract(char *destination, size_t destinationLength)
     if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) {
         tokenDefinition_t *token =
             &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex];
-        starkware_print_eth_address(token->address, destination, destinationLength);
+        getEthDisplayableAddress(token->address,
+                                 destination,
+                                 destinationLength,
+                                 &global_sha3,
+                                 chainConfig->chainId);
     } else {
         strlcpy(destination, "UNKNOWN", destinationLength);
     }
@@ -372,7 +364,7 @@ void starkware_get_source_address(char *destination) {
     io_seproxyhal_io_heartbeat();
     destination[0] = '0';
     destination[1] = 'x';
-    getEthAddressStringFromKey(&publicKey, destination + 2, &global_sha3, chainConfig);
+    getEthAddressStringFromKey(&publicKey, destination + 2, &global_sha3, chainConfig->chainId);
     destination[42] = '\0';
 }
 
@@ -708,9 +700,11 @@ void starkware_plugin_call(int message, void *parameters) {
                     if (is_deversify_contract(tmpContent.txContent.destination)) {
                         strlcpy(msg->msg, "DeversiFi", msg->msgLength);
                     } else {
-                        starkware_print_eth_address(tmpContent.txContent.destination,
-                                                    msg->msg,
-                                                    msg->msgLength);
+                        getEthDisplayableAddress(tmpContent.txContent.destination,
+                                                 msg->msg,
+                                                 msg->msgLength,
+                                                 &global_sha3,
+                                                 chainConfig->chainId);
                     }
                     msg->result = ETH_PLUGIN_RESULT_OK;
                     break;
@@ -720,7 +714,11 @@ void starkware_plugin_call(int message, void *parameters) {
                         case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
                         case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
                             strlcpy(msg->title, "From ETH Address", msg->titleLength);
-                            starkware_print_eth_address(context->amount, msg->msg, msg->msgLength);
+                            getEthDisplayableAddress(context->amount,
+                                                     msg->msg,
+                                                     msg->msgLength,
+                                                     &global_sha3,
+                                                     chainConfig->chainId);
                             break;
                         case STARKWARE_ESCAPE:
                             strlcpy(msg->title, "Amount", msg->titleLength);
@@ -784,7 +782,11 @@ void starkware_plugin_call(int message, void *parameters) {
                         case STARKWARE_WITHDRAW_TO:
                         case STARKWARE_WITHDRAW_NFT_TO:
                             strlcpy(msg->title, "To ETH Address", msg->titleLength);
-                            starkware_print_eth_address(context->amount, msg->msg, msg->msgLength);
+                            getEthDisplayableAddress(context->amount,
+                                                     msg->msg,
+                                                     msg->msgLength,
+                                                     &global_sha3,
+                                                     chainConfig->chainId);
                             break;
                         case STARKWARE_WITHDRAW_AND_MINT:
                             strlcpy(msg->title, "Asset Contract", msg->titleLength);


Test patch:
diff --git a/tests/build_local_test_elfs.sh b/tests/build_local_test_elfs.sh
new file mode 100755
index 000000000..38777eb0d
--- /dev/null
+++ b/tests/build_local_test_elfs.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+# FILL THESE WITH YOUR OWN SDKs PATHS
+NANOS_SDK=$TWO
+NANOX_SDK=$X
+
+# list of apps required by tests that we want to build here
+appnames=("ethereum" "ethereum_classic")
+
+# create elfs folder if it doesn't exist
+mkdir -p elfs
+
+# move to repo's root to build apps
+cd ..
+
+echo "*Building elfs for Nano S..."
+for app in "${appnames[@]}"
+do
+   echo "**Building $app for Nano S..."
+   make clean BOLOS_SDK=$NANOS_SDK
+   make -j DEBUG=1 ALLOW_DATA=1 BOLOS_SDK=$NANOS_SDK CHAIN=$app
+   cp bin/app.elf "tests/elfs/${app}_nanos.elf"
+done
+
+echo "*Building elfs for Nano X..."
+for app in "${appnames[@]}"
+do
+   echo "**Building $app for Nano X..."
+   make clean BOLOS_SDK=$NANOX_SDK
+   make -j DEBUG=1 ALLOW_DATA=1 BOLOS_SDK=$NANOX_SDK CHAIN=$app
+   cp bin/app.elf "tests/elfs/${app}_nanox.elf"
+done
+
+echo "done"
diff --git a/tests/globalsetup.js b/tests/globalsetup.js
index 8ec2b8690..e83523342 100644
--- a/tests/globalsetup.js
+++ b/tests/globalsetup.js
@@ -1,4 +1,5 @@
 import Zemu from "@zondax/zemu";
+import fsExtra from "fs-extra";
 
 const catchExit = async () => {
   process.on("SIGINT", () => {
@@ -12,4 +13,5 @@ module.exports = async () => {
   await catchExit();
   await Zemu.checkAndPullImage();
   await Zemu.stopAllEmuContainers();
+  fsExtra.emptyDirSync("snapshots/tmp")
 };
\ No newline at end of file
diff --git a/tests/jest.config.js b/tests/jest.config.js
index fbceb3865..af09403d6 100644
--- a/tests/jest.config.js
+++ b/tests/jest.config.js
@@ -30,4 +30,10 @@ module.exports = {
     "**/?(*.)+(spec|test).[tj]s?(x)",
     "**/?(*.)+(ispec|test).[tj]s?(x)",
   ],
+
+  // Path of the file where tests can be """decorated"""
+  setupFilesAfterEnv: ['<rootDir>/setupTests.js'],
+
+  // Stop immediatly when a test fail
+  bail: true,
 };
diff --git a/tests/package.json b/tests/package.json
index d600722a4..ffc981508 100644
--- a/tests/package.json
+++ b/tests/package.json
@@ -12,14 +12,15 @@
   "license": "ISC",
   "dependencies": {
     "@babel/plugin-proposal-class-properties": "^7.12.1",
-    "@ledgerhq/hw-app-eth": "^5.52.1",
+    "@ledgerhq/hw-app-eth": "^6.5.0",
     "@ledgerhq/hw-transport-http": "^4.74.2",
     "@ledgerhq/logs": "^5.50.0",
-    "@zondax/zemu": "0.13.0",
+    "@zondax/zemu": "0.16.5",
     "bignumber.js": "^9.0.0",
     "bip32-path": "^0.4.2",
     "core-js": "^3.7.0",
     "ethereum-tx-decoder": "^3.0.0",
+    "fs-extra": "^10.0.0",
     "google-protobuf": "^3.11.0",
     "jest-serial-runner": "^1.1.0",
     "js-sha256": "^0.9.0",
diff --git a/tests/setupTests.js b/tests/setupTests.js
new file mode 100644
index 000000000..cbd02302e
--- /dev/null
+++ b/tests/setupTests.js
@@ -0,0 +1,19 @@
+import expect from 'expect'
+
+expect.extend({
+    toMatchSnapshot(received, original) {
+
+      if(received.data.equals(original.data)){
+        return {
+          message: () => `snapshots are equal`,
+          pass: true
+        }
+      } else {
+        console.log("snapshots are not equal")
+        return {
+          message: () => `snapshots are not equal`,
+          pass: false
+        }
+      }
+    },
+  });
\ No newline at end of file
diff --git a/tests/snapshots/approve/nanox/accept.png b/tests/snapshots/approve/nanox/accept.png
index 7f2b8c89b..a2cb8f9dc 100644
Binary files a/tests/snapshots/approve/nanox/accept.png and b/tests/snapshots/approve/nanox/accept.png differ
diff --git a/tests/snapshots/approve/nanox/address.png b/tests/snapshots/approve/nanox/address.png
index d8d9e03f3..4f601ca7d 100644
Binary files a/tests/snapshots/approve/nanox/address.png and b/tests/snapshots/approve/nanox/address.png differ
diff --git a/tests/snapshots/approve/nanox/amount.png b/tests/snapshots/approve/nanox/amount.png
index 9d200d00c..6207f9e20 100644
Binary files a/tests/snapshots/approve/nanox/amount.png and b/tests/snapshots/approve/nanox/amount.png differ
diff --git a/tests/snapshots/approve/nanox/fees.png b/tests/snapshots/approve/nanox/fees.png
index 19c6d6ca7..a15d8224b 100644
Binary files a/tests/snapshots/approve/nanox/fees.png and b/tests/snapshots/approve/nanox/fees.png differ
diff --git a/tests/snapshots/approve/nanox/review.png b/tests/snapshots/approve/nanox/review.png
index 8794afe43..4a982c5f3 100644
Binary files a/tests/snapshots/approve/nanox/review.png and b/tests/snapshots/approve/nanox/review.png differ
diff --git a/tests/snapshots/approve/nanox/type.png b/tests/snapshots/approve/nanox/type.png
index bec2de76f..c9f6ee048 100644
Binary files a/tests/snapshots/approve/nanox/type.png and b/tests/snapshots/approve/nanox/type.png differ
diff --git a/tests/snapshots/chainid/nanos/accept.png b/tests/snapshots/chainid/nanos/accept.png
new file mode 100644
index 000000000..3158ea690
Binary files /dev/null and b/tests/snapshots/chainid/nanos/accept.png differ
diff --git a/tests/snapshots/chainid/nanos/address_1.png b/tests/snapshots/chainid/nanos/address_1.png
new file mode 100644
index 000000000..f979f7160
Binary files /dev/null and b/tests/snapshots/chainid/nanos/address_1.png differ
diff --git a/tests/snapshots/chainid/nanos/address_2.png b/tests/snapshots/chainid/nanos/address_2.png
new file mode 100644
index 000000000..93c90c542
Binary files /dev/null and b/tests/snapshots/chainid/nanos/address_2.png differ
diff --git a/tests/snapshots/chainid/nanos/address_3.png b/tests/snapshots/chainid/nanos/address_3.png
new file mode 100644
index 000000000..402c20d84
Binary files /dev/null and b/tests/snapshots/chainid/nanos/address_3.png differ
diff --git a/tests/snapshots/chainid/nanos/amount_1.png b/tests/snapshots/chainid/nanos/amount_1.png
new file mode 100644
index 000000000..4cd3e38ba
Binary files /dev/null and b/tests/snapshots/chainid/nanos/amount_1.png differ
diff --git a/tests/snapshots/chainid/nanos/amount_1_palm.png b/tests/snapshots/chainid/nanos/amount_1_palm.png
new file mode 100644
index 000000000..d5afc7ad6
Binary files /dev/null and b/tests/snapshots/chainid/nanos/amount_1_palm.png differ
diff --git a/tests/snapshots/chainid/nanos/amount_2.png b/tests/snapshots/chainid/nanos/amount_2.png
new file mode 100644
index 000000000..11ae75e83
Binary files /dev/null and b/tests/snapshots/chainid/nanos/amount_2.png differ
diff --git a/tests/snapshots/chainid/nanos/amount_3.png b/tests/snapshots/chainid/nanos/amount_3.png
new file mode 100644
index 000000000..e04201084
Binary files /dev/null and b/tests/snapshots/chainid/nanos/amount_3.png differ
diff --git a/tests/snapshots/chainid/nanos/fees.png b/tests/snapshots/chainid/nanos/fees.png
new file mode 100644
index 000000000..8b996b58a
Binary files /dev/null and b/tests/snapshots/chainid/nanos/fees.png differ
diff --git a/tests/snapshots/chainid/nanos/fees_palm.png b/tests/snapshots/chainid/nanos/fees_palm.png
new file mode 100644
index 000000000..bf970a95d
Binary files /dev/null and b/tests/snapshots/chainid/nanos/fees_palm.png differ
diff --git a/tests/snapshots/chainid/nanos/network.png b/tests/snapshots/chainid/nanos/network.png
new file mode 100644
index 000000000..3242d6109
Binary files /dev/null and b/tests/snapshots/chainid/nanos/network.png differ
diff --git a/tests/snapshots/chainid/nanos/palm.png b/tests/snapshots/chainid/nanos/palm.png
new file mode 100644
index 000000000..297527f5e
Binary files /dev/null and b/tests/snapshots/chainid/nanos/palm.png differ
diff --git a/tests/snapshots/chainid/nanos/review.png b/tests/snapshots/chainid/nanos/review.png
new file mode 100644
index 000000000..2994983f8
Binary files /dev/null and b/tests/snapshots/chainid/nanos/review.png differ
diff --git a/tests/snapshots/chainid/nanox/accept.png b/tests/snapshots/chainid/nanox/accept.png
new file mode 100644
index 000000000..a2cb8f9dc
Binary files /dev/null and b/tests/snapshots/chainid/nanox/accept.png differ
diff --git a/tests/snapshots/chainid/nanox/address.png b/tests/snapshots/chainid/nanox/address.png
new file mode 100644
index 000000000..4228ae193
Binary files /dev/null and b/tests/snapshots/chainid/nanox/address.png differ
diff --git a/tests/snapshots/chainid/nanox/amount.png b/tests/snapshots/chainid/nanox/amount.png
new file mode 100644
index 000000000..a5592a6c4
Binary files /dev/null and b/tests/snapshots/chainid/nanox/amount.png differ
diff --git a/tests/snapshots/chainid/nanox/amount_palm.png b/tests/snapshots/chainid/nanox/amount_palm.png
new file mode 100644
index 000000000..14404aefa
Binary files /dev/null and b/tests/snapshots/chainid/nanox/amount_palm.png differ
diff --git a/tests/snapshots/chainid/nanox/fees.png b/tests/snapshots/chainid/nanox/fees.png
new file mode 100644
index 000000000..a67fa259f
Binary files /dev/null and b/tests/snapshots/chainid/nanox/fees.png differ
diff --git a/tests/snapshots/chainid/nanox/fees_palm.png b/tests/snapshots/chainid/nanox/fees_palm.png
new file mode 100644
index 000000000..0ee720ae1
Binary files /dev/null and b/tests/snapshots/chainid/nanox/fees_palm.png differ
diff --git a/tests/snapshots/chainid/nanox/network.png b/tests/snapshots/chainid/nanox/network.png
new file mode 100644
index 000000000..f91355bb2
Binary files /dev/null and b/tests/snapshots/chainid/nanox/network.png differ
diff --git a/tests/snapshots/chainid/nanox/palm.png b/tests/snapshots/chainid/nanox/palm.png
new file mode 100644
index 000000000..14a7b7b70
Binary files /dev/null and b/tests/snapshots/chainid/nanox/palm.png differ
diff --git a/tests/snapshots/chainid/nanox/review.png b/tests/snapshots/chainid/nanox/review.png
new file mode 100644
index 000000000..4a982c5f3
Binary files /dev/null and b/tests/snapshots/chainid/nanox/review.png differ
diff --git a/tests/snapshots/deposit/nanox/accept.png b/tests/snapshots/deposit/nanox/accept.png
index 7f2b8c89b..a2cb8f9dc 100644
Binary files a/tests/snapshots/deposit/nanox/accept.png and b/tests/snapshots/deposit/nanox/accept.png differ
diff --git a/tests/snapshots/deposit/nanox/address.png b/tests/snapshots/deposit/nanox/address.png
index 0c893f3d8..91fef4dcc 100644
Binary files a/tests/snapshots/deposit/nanox/address.png and b/tests/snapshots/deposit/nanox/address.png differ
diff --git a/tests/snapshots/deposit/nanox/amount.png b/tests/snapshots/deposit/nanox/amount.png
index 1523569e4..5486e4a2a 100644
Binary files a/tests/snapshots/deposit/nanox/amount.png and b/tests/snapshots/deposit/nanox/amount.png differ
diff --git a/tests/snapshots/deposit/nanox/data_present.png b/tests/snapshots/deposit/nanox/data_present.png
index 8af206fb8..dd2bbf9a1 100644
Binary files a/tests/snapshots/deposit/nanox/data_present.png and b/tests/snapshots/deposit/nanox/data_present.png differ
diff --git a/tests/snapshots/deposit/nanox/fees.png b/tests/snapshots/deposit/nanox/fees.png
index 559c1559d..294140a07 100644
Binary files a/tests/snapshots/deposit/nanox/fees.png and b/tests/snapshots/deposit/nanox/fees.png differ
diff --git a/tests/snapshots/deposit/nanox/review.png b/tests/snapshots/deposit/nanox/review.png
index 8794afe43..4a982c5f3 100644
Binary files a/tests/snapshots/deposit/nanox/review.png and b/tests/snapshots/deposit/nanox/review.png differ
diff --git a/tests/snapshots/eip1559/nanox/accept.png b/tests/snapshots/eip1559/nanox/accept.png
index 7f2b8c89b..a2cb8f9dc 100644
Binary files a/tests/snapshots/eip1559/nanox/accept.png and b/tests/snapshots/eip1559/nanox/accept.png differ
diff --git a/tests/snapshots/eip1559/nanox/address.png b/tests/snapshots/eip1559/nanox/address.png
index fe5d6099d..db02d0d16 100644
Binary files a/tests/snapshots/eip1559/nanox/address.png and b/tests/snapshots/eip1559/nanox/address.png differ
diff --git a/tests/snapshots/eip1559/nanox/amount.png b/tests/snapshots/eip1559/nanox/amount.png
index 3da7c25fa..be296ea60 100644
Binary files a/tests/snapshots/eip1559/nanox/amount.png and b/tests/snapshots/eip1559/nanox/amount.png differ
diff --git a/tests/snapshots/eip1559/nanox/fees.png b/tests/snapshots/eip1559/nanox/fees.png
index bc320802f..de628de9b 100644
Binary files a/tests/snapshots/eip1559/nanox/fees.png and b/tests/snapshots/eip1559/nanox/fees.png differ
diff --git a/tests/snapshots/eip1559/nanox/review.png b/tests/snapshots/eip1559/nanox/review.png
index 8794afe43..4a982c5f3 100644
Binary files a/tests/snapshots/eip1559/nanox/review.png and b/tests/snapshots/eip1559/nanox/review.png differ
diff --git a/tests/snapshots/send/nanox/accept.png b/tests/snapshots/send/nanox/accept.png
index 7f2b8c89b..a2cb8f9dc 100644
Binary files a/tests/snapshots/send/nanox/accept.png and b/tests/snapshots/send/nanox/accept.png differ
diff --git a/tests/snapshots/send/nanox/address.png b/tests/snapshots/send/nanox/address.png
index ce3e586e4..4228ae193 100644
Binary files a/tests/snapshots/send/nanox/address.png and b/tests/snapshots/send/nanox/address.png differ
diff --git a/tests/snapshots/send/nanox/amount.png b/tests/snapshots/send/nanox/amount.png
index c4f9260f4..a5592a6c4 100644
Binary files a/tests/snapshots/send/nanox/amount.png and b/tests/snapshots/send/nanox/amount.png differ
diff --git a/tests/snapshots/send/nanox/fees.png b/tests/snapshots/send/nanox/fees.png
index f5a4c535f..a67fa259f 100644
Binary files a/tests/snapshots/send/nanox/fees.png and b/tests/snapshots/send/nanox/fees.png differ
diff --git a/tests/snapshots/send/nanox/network.png b/tests/snapshots/send/nanox/network.png
index eb4b7b8ce..e3682dea0 100644
Binary files a/tests/snapshots/send/nanox/network.png and b/tests/snapshots/send/nanox/network.png differ
diff --git a/tests/snapshots/send/nanox/review.png b/tests/snapshots/send/nanox/review.png
index 8794afe43..4a982c5f3 100644
Binary files a/tests/snapshots/send/nanox/review.png and b/tests/snapshots/send/nanox/review.png differ
diff --git a/tests/snapshots/send_bsc/nanox/accept.png b/tests/snapshots/send_bsc/nanox/accept.png
index 7f2b8c89b..a2cb8f9dc 100644
Binary files a/tests/snapshots/send_bsc/nanox/accept.png and b/tests/snapshots/send_bsc/nanox/accept.png differ
diff --git a/tests/snapshots/send_bsc/nanox/address.png b/tests/snapshots/send_bsc/nanox/address.png
index ce3e586e4..4228ae193 100644
Binary files a/tests/snapshots/send_bsc/nanox/address.png and b/tests/snapshots/send_bsc/nanox/address.png differ
diff --git a/tests/snapshots/send_bsc/nanox/amount.png b/tests/snapshots/send_bsc/nanox/amount.png
index 9911bf368..92b6eb541 100644
Binary files a/tests/snapshots/send_bsc/nanox/amount.png and b/tests/snapshots/send_bsc/nanox/amount.png differ
diff --git a/tests/snapshots/send_bsc/nanox/fees.png b/tests/snapshots/send_bsc/nanox/fees.png
index ac5d9dba1..a4514d7bb 100644
Binary files a/tests/snapshots/send_bsc/nanox/fees.png and b/tests/snapshots/send_bsc/nanox/fees.png differ
diff --git a/tests/snapshots/send_bsc/nanox/network.png b/tests/snapshots/send_bsc/nanox/network.png
index b021901e7..d354b8c0f 100644
Binary files a/tests/snapshots/send_bsc/nanox/network.png and b/tests/snapshots/send_bsc/nanox/network.png differ
diff --git a/tests/snapshots/send_bsc/nanox/review.png b/tests/snapshots/send_bsc/nanox/review.png
index 8794afe43..4a982c5f3 100644
Binary files a/tests/snapshots/send_bsc/nanox/review.png and b/tests/snapshots/send_bsc/nanox/review.png differ
diff --git a/tests/snapshots/send_etc/nanox/accept.png b/tests/snapshots/send_etc/nanox/accept.png
index 7f2b8c89b..a2cb8f9dc 100644
Binary files a/tests/snapshots/send_etc/nanox/accept.png and b/tests/snapshots/send_etc/nanox/accept.png differ
diff --git a/tests/snapshots/send_etc/nanox/address.png b/tests/snapshots/send_etc/nanox/address.png
index ce3e586e4..4228ae193 100644
Binary files a/tests/snapshots/send_etc/nanox/address.png and b/tests/snapshots/send_etc/nanox/address.png differ
diff --git a/tests/snapshots/send_etc/nanox/amount.png b/tests/snapshots/send_etc/nanox/amount.png
index e83449a77..6b7d579c9 100644
Binary files a/tests/snapshots/send_etc/nanox/amount.png and b/tests/snapshots/send_etc/nanox/amount.png differ
diff --git a/tests/snapshots/send_etc/nanox/fees.png b/tests/snapshots/send_etc/nanox/fees.png
index 2a101cac2..4a61a9d63 100644
Binary files a/tests/snapshots/send_etc/nanox/fees.png and b/tests/snapshots/send_etc/nanox/fees.png differ
diff --git a/tests/snapshots/send_etc/nanox/review.png b/tests/snapshots/send_etc/nanox/review.png
index 8794afe43..4a982c5f3 100644
Binary files a/tests/snapshots/send_etc/nanox/review.png and b/tests/snapshots/send_etc/nanox/review.png differ
diff --git a/tests/snapshots/tmp/nanos/.gitignore b/tests/snapshots/tmp/nanos/.gitignore
deleted file mode 100644
index aab52d906..000000000
--- a/tests/snapshots/tmp/nanos/.gitignore
+++ /dev/null
@@ -1,1 +0,0 @@
-*.png
\ No newline at end of file
diff --git a/tests/snapshots/tmp/nanox/.gitignore b/tests/snapshots/tmp/nanox/.gitignore
deleted file mode 100644
index aab52d906..000000000
--- a/tests/snapshots/tmp/nanox/.gitignore
+++ /dev/null
@@ -1,1 +0,0 @@
-*.png
\ No newline at end of file
diff --git a/tests/src/approve.test.js b/tests/src/approve.test.js
index 579d2528b..ec5e01e8d 100644
--- a/tests/src/approve.test.js
+++ b/tests/src/approve.test.js
@@ -6,22 +6,19 @@ import Zemu from "@zondax/zemu";
 import { TransportStatusError } from "@ledgerhq/errors";
 import { expect } from "../jest";
 
-const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT} = require("generic.js");
+const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js");
 
 const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/approve/";
-const SNAPSHOT_PATH_PREFIX = "snapshots/tmp/";
 
 const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/";
 const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/";
 
-const SNAPSHOT_PATH_NANOS = SNAPSHOT_PATH_PREFIX + "nanos/";
-const SNAPSHOT_PATH_NANOX = SNAPSHOT_PATH_PREFIX + "nanox/";
-
-
 test("Approve DAI tokens nanos", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOS_ELF_PATH);
 
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
+
   try {
     await sim.start(sim_options_nanos);
 
@@ -40,59 +37,59 @@ test("Approve DAI tokens nanos", async () => {
 
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOS + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Type
     filename = "type.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const type = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const type = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_type = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(type).toEqual(expected_type);
+    expect(type).toMatchSnapshot(expected_type);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address 1/3
     filename = "address_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_1).toEqual(expected_address_1);
+    expect(address_1).toMatchSnapshot(expected_address_1);
 
     // Address 2/3
     filename = "address_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_2).toEqual(expected_address_2);
+    expect(address_2).toMatchSnapshot(expected_address_2);
 
     // Address 3/3
     filename = "address_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_3).toEqual(expected_address_3);
+    expect(address_3).toMatchSnapshot(expected_address_3);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
@@ -108,6 +105,8 @@ test("Approve DAI token nanox", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOX_ELF_PATH);
 
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
+
   try {
     await sim.start(sim_options_nanox);
 
@@ -125,45 +124,45 @@ test("Approve DAI token nanox", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOX + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Type
     filename = "type.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const type = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const type = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_type = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(type).toEqual(expected_type);
+    expect(type).toMatchSnapshot(expected_type);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address
     filename = "address.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(address).toEqual(expected_address);
+    expect(address).toMatchSnapshot(expected_address);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
diff --git a/tests/src/chainid.test.js b/tests/src/chainid.test.js
new file mode 100644
index 000000000..e62da55a3
--- /dev/null
+++ b/tests/src/chainid.test.js
@@ -0,0 +1,370 @@
+import "core-js/stable";
+import "regenerator-runtime/runtime";
+import Eth from "@ledgerhq/hw-app-eth";
+import { byContractAddress } from "@ledgerhq/hw-app-eth/erc20";
+import Zemu from "@zondax/zemu";
+import { TransportStatusError } from "@ledgerhq/errors";
+import { expect } from "../jest";
+
+const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js");
+
+const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/chainid/";
+
+const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/";
+const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/";
+
+test("Transfer on network 112233445566 on Ethereum nanos", async () => {
+  jest.setTimeout(TIMEOUT);
+  const sim = new Zemu(NANOS_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
+
+  try {
+    await sim.start(sim_options_nanos);
+
+    let transport = await sim.getTransport();
+    let eth = new Eth(transport);
+
+    // Send transaction
+    let tx = eth.signTransaction(
+	    "44'/60'/0'/0/0",
+      "f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf6181880851a21a278be8080"
+    )
+    let filename;
+
+    await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
+    // Review tx
+    filename = "review.png";
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(review).toMatchSnapshot(expected_review);
+
+    // Amount 1/3
+    filename = "amount_1.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(amount_1).toMatchSnapshot(expected_amount_1);
+
+    // Amount 2/3
+    filename = "amount_2.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(amount_2).toMatchSnapshot(expected_amount_2);
+
+    // Amount 3/3
+    filename = "amount_3.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(amount_3).toMatchSnapshot(expected_amount_3);
+
+    // Address 1/3
+    filename = "address_1.png";
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(address_1).toMatchSnapshot(expected_address_1);
+
+    // Address 2/3
+    filename = "address_2.png";
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(address_2).toMatchSnapshot(expected_address_2);
+
+    // Address 3/3
+    filename = "address_3.png";
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(address_3).toMatchSnapshot(expected_address_3);
+
+    // Network
+    filename = "network.png";
+    await sim.clickRight(tmpPath + filename);
+    const network = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(network).toMatchSnapshot(expected_network);
+
+    // Max Fees
+    filename = "fees.png";
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(fees).toMatchSnapshot(expected_fees);
+
+    // Accept
+    filename = "accept.png";
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(accept).toMatchSnapshot(expected_accept);
+
+    await sim.clickBoth();
+
+    await expect(tx).resolves.toEqual(
+      {
+        "r": "31fca443b3cad62f3ce18e287f3cf4892ac2669379cc21b5cf198561f0511d1e",
+        "s": "3cf21485cd8b86e1acddbcc641e16a3efad18aaeb5ae96a650f1a8b291078494",
+        "v": "344344f1a0",
+      }
+    );
+  } finally {
+    await sim.close();
+  }
+});
+
+test("Transfer on palm network on Ethereum nanos", async () => {
+  jest.setTimeout(TIMEOUT);
+  const sim = new Zemu(NANOS_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
+
+  try {
+    await sim.start(sim_options_nanos);
+
+    let transport = await sim.getTransport();
+    let eth = new Eth(transport);
+
+    // Send transaction
+    let tx = eth.signTransaction(
+	    "44'/60'/0'/0/0",
+      "f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf61818808502a15c308d8080"
+    );
+    let filename;
+
+    await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
+    // Review tx
+    filename = "review.png";
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(review).toMatchSnapshot(expected_review);
+
+    // Amount 1/3
+    filename = "amount_1_palm.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(amount_1).toMatchSnapshot(expected_amount_1);
+
+    // Amount 2/3
+    filename = "amount_2.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(amount_2).toMatchSnapshot(expected_amount_2);
+
+    // Amount 3/3
+    filename = "amount_3.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(amount_3).toMatchSnapshot(expected_amount_3);
+
+    // Address 1/3
+    filename = "address_1.png";
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(address_1).toMatchSnapshot(expected_address_1);
+
+    // Address 2/3
+    filename = "address_2.png";
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(address_2).toMatchSnapshot(expected_address_2);
+
+    // Address 3/3
+    filename = "address_3.png";
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(address_3).toMatchSnapshot(expected_address_3);
+
+    // Network
+    filename = "palm.png";
+    await sim.clickRight(tmpPath + filename);
+    const network = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(network).toMatchSnapshot(expected_network);
+
+    // Max Fees
+    filename = "fees_palm.png";
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(fees).toMatchSnapshot(expected_fees);
+
+    // Accept
+    filename = "accept.png";
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
+    expect(accept).toMatchSnapshot(expected_accept);
+
+    await sim.clickBoth();
+
+    await expect(tx).resolves.toEqual(
+      {
+        "r": "f9b5d903c47c34027156e869bda5aa002233d6cca583ad53d125612fc0795f3b",
+        "s": "00da038129414e5ae6f7c1529c6067e82484e3694c84c16d575e77162f631c27",
+        "v": "0542b8613d", 
+      }
+    );
+  } finally {
+    await sim.close();
+  }
+});
+
+test("Transfer on network 112233445566 on Ethereum nanox", async () => {
+  jest.setTimeout(TIMEOUT);
+  const sim = new Zemu(NANOX_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
+
+  try {
+    await sim.start(sim_options_nanox);
+
+    let transport = await sim.getTransport();
+    let eth = new Eth(transport);
+
+    // Send transaction
+    let tx = eth.signTransaction(
+	    "44'/60'/0'/0/0",
+	    "f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf6181880851a21a278be8080"
+    )
+    let filename;
+
+    await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
+    // Review tx
+    filename = "review.png";
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(review).toMatchSnapshot(expected_review);
+
+    // Amount
+    filename = "amount.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(amount).toMatchSnapshot(expected_amount);
+
+    // Address
+    filename = "address.png";
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(address).toMatchSnapshot(expected_address);
+
+    // Network
+    filename = "network.png";
+    await sim.clickRight(tmpPath + filename);
+    const network = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(network).toMatchSnapshot(expected_network);
+
+    // Max Fees
+    filename = "fees.png";
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(fees).toMatchSnapshot(expected_fees);
+
+    // Accept
+    filename = "accept.png";
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(accept).toMatchSnapshot(expected_accept);
+
+    await sim.clickBoth();
+
+    await expect(tx).resolves.toEqual(
+      {
+      "r": "31fca443b3cad62f3ce18e287f3cf4892ac2669379cc21b5cf198561f0511d1e",
+      "s": "3cf21485cd8b86e1acddbcc641e16a3efad18aaeb5ae96a650f1a8b291078494",
+      "v": "344344f1a0",
+      }
+    );
+  } finally {
+    await sim.close();
+  }
+});
+
+test("Transfer on palm network on Ethereum nanox", async () => {
+  jest.setTimeout(TIMEOUT);
+  const sim = new Zemu(NANOX_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
+
+  try {
+    await sim.start(sim_options_nanox);
+
+    let transport = await sim.getTransport();
+    let eth = new Eth(transport);
+
+    // Send transaction
+    let tx = eth.signTransaction(
+	    "44'/60'/0'/0/0",
+      "f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf61818808502a15c308d8080"
+    );
+    let filename;
+
+    await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
+    // Review tx
+    filename = "review.png";
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(review).toMatchSnapshot(expected_review);
+
+    // Amount
+    filename = "amount_palm.png";
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(amount).toMatchSnapshot(expected_amount);
+
+    // Address
+    filename = "address.png";
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(address).toMatchSnapshot(expected_address);
+
+    // Network
+    filename = "palm.png";
+    await sim.clickRight(tmpPath + filename);
+    const network = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(network).toMatchSnapshot(expected_network);
+
+    // Max Fees
+    filename = "fees_palm.png";
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(fees).toMatchSnapshot(expected_fees);
+
+    // Accept
+    filename = "accept.png";
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
+    const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
+    expect(accept).toMatchSnapshot(expected_accept);
+
+    await sim.clickBoth();
+
+    await expect(tx).resolves.toEqual(
+      {
+        "r": "f9b5d903c47c34027156e869bda5aa002233d6cca583ad53d125612fc0795f3b",
+        "s": "00da038129414e5ae6f7c1529c6067e82484e3694c84c16d575e77162f631c27",
+        "v": "0542b8613d",
+      }
+    );
+  } finally {
+    await sim.close();
+  }
+});
\ No newline at end of file
diff --git a/tests/src/deposit.test.js b/tests/src/deposit.test.js
index b0246923c..2aa054d42 100644
--- a/tests/src/deposit.test.js
+++ b/tests/src/deposit.test.js
@@ -6,22 +6,18 @@ import Zemu from "@zondax/zemu";
 import { TransportStatusError } from "@ledgerhq/errors";
 import { expect } from "../jest";
 
-const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT} = require("generic.js");
+const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js");
 
 // Adapt this prefix.
 const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/deposit/";
-const SNAPSHOT_PATH_PREFIX = "snapshots/tmp/";
 
 const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/";
 const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/";
 
-const SNAPSHOT_PATH_NANOS = SNAPSHOT_PATH_PREFIX + "nanos/";
-const SNAPSHOT_PATH_NANOX = SNAPSHOT_PATH_PREFIX + "nanox/";
-
-
 test("Deposit ETH nanos", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOS_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanos);
@@ -39,59 +35,59 @@ test("Deposit ETH nanos", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOS + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Data present
     filename = "data_present.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const data_present = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const data_present = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_data_present = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(data_present).toEqual(expected_data_present);
+    expect(data_present).toMatchSnapshot(expected_data_present);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address 1/3
     filename = "address_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_1).toEqual(expected_address_1);
+    expect(address_1).toMatchSnapshot(expected_address_1);
 
     // Address 2/3
     filename = "address_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_2).toEqual(expected_address_2);
+    expect(address_2).toMatchSnapshot(expected_address_2);
 
     // Address 3/3
     filename = "address_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_3).toEqual(expected_address_3);
+    expect(address_3).toMatchSnapshot(expected_address_3);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
@@ -106,6 +102,7 @@ test("Deposit ETH nanos", async () => {
 test("Deposit ETH nanox", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOX_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanox);
@@ -123,45 +120,45 @@ test("Deposit ETH nanox", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOX + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Data present
     filename = "data_present.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const data_present = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const data_present = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_data_present = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(data_present).toEqual(expected_data_present);
+    expect(data_present).toMatchSnapshot(expected_data_present);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address
     filename = "address.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(address).toEqual(expected_address);
+    expect(address).toMatchSnapshot(expected_address);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
diff --git a/tests/src/eip1559.test.js b/tests/src/eip1559.test.js
index d102d3c26..4ad942763 100644
--- a/tests/src/eip1559.test.js
+++ b/tests/src/eip1559.test.js
@@ -6,20 +6,17 @@ import Zemu from "@zondax/zemu";
 import { TransportStatusError } from "@ledgerhq/errors";
 import { expect } from "../jest";
 
-const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT} = require("generic.js");
+const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js");
 
 const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/eip1559/";
-const SNAPSHOT_PATH_PREFIX = "snapshots/eip1559/";
 
 const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/";
 const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/";
 
-const SNAPSHOT_PATH_NANOS = SNAPSHOT_PATH_PREFIX + "nanos/";
-const SNAPSHOT_PATH_NANOX = SNAPSHOT_PATH_PREFIX + "nanox/";
-
 test("Transfer nanos eip1559", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOS_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanos);
@@ -36,52 +33,52 @@ test("Transfer nanos eip1559", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOS + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address 1/3
     filename = "address_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_1).toEqual(expected_address_1);
+    expect(address_1).toMatchSnapshot(expected_address_1);
 
     // Address 2/3
     filename = "address_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_2).toEqual(expected_address_2);
+    expect(address_2).toMatchSnapshot(expected_address_2);
 
     // Address 3/3
     filename = "address_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_3).toEqual(expected_address_3);
+    expect(address_3).toMatchSnapshot(expected_address_3);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
@@ -95,6 +92,7 @@ test("Transfer nanos eip1559", async () => {
 test("Transfer nanox", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOX_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanox);
@@ -111,38 +109,38 @@ test("Transfer nanox", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOX + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address
     filename = "address.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(address).toEqual(expected_address);
+    expect(address).toMatchSnapshot(expected_address);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
diff --git a/tests/src/generic.js b/tests/src/generic.js
index 2fdcd2bb8..dff75668b 100644
--- a/tests/src/generic.js
+++ b/tests/src/generic.js
@@ -1,3 +1,5 @@
+import fs from "fs";
+
 const sim_options_nanos = {
   model: "nanos",
   logging: true,
@@ -26,6 +28,17 @@ const NANOX_CLONE_ELF_PATH = Resolve("elfs/ethereum_classic_nanox.elf");
 
 const TIMEOUT = 1000000;
 
+const getTmpPath = (testName) => {
+  let date = new Date();
+  let tmpPath = `snapshots/tmp/${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}@${testName}/`;
+  fs.mkdir(tmpPath, { recursive:true }, (err) => {
+    if(err) {
+      console.log("couldn't create tmp folder at path: " + tmpPath)
+    }
+  });
+  return tmpPath;
+}
+
 module.exports = {
     NANOS_ELF_PATH,
     NANOX_ELF_PATH,
@@ -36,4 +49,5 @@ module.exports = {
     sim_options_nanos,
     sim_options_nanox,
     TIMEOUT,
+    getTmpPath,
 }
\ No newline at end of file
diff --git a/tests/src/send.test.js b/tests/src/send.test.js
index 7deb7c7eb..1ba03dead 100644
--- a/tests/src/send.test.js
+++ b/tests/src/send.test.js
@@ -6,20 +6,17 @@ import Zemu from "@zondax/zemu";
 import { TransportStatusError } from "@ledgerhq/errors";
 import { expect } from "../jest";
 
-const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT} = require("generic.js");
+const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js");
 
 const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/send/";
-const SNAPSHOT_PATH_PREFIX = "snapshots/tmp/";
 
 const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/";
 const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/";
 
-const SNAPSHOT_PATH_NANOS = SNAPSHOT_PATH_PREFIX + "nanos/";
-const SNAPSHOT_PATH_NANOX = SNAPSHOT_PATH_PREFIX + "nanox/";
-
 test("Transfer Ether on Ethereum app nanos", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOS_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanos);
@@ -35,66 +32,66 @@ test("Transfer Ether on Ethereum app nanos", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOS + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount 1/3
     filename = "amount_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_1).toEqual(expected_amount_1);
+    expect(amount_1).toMatchSnapshot(expected_amount_1);
 
     // Amount 2/3
     filename = "amount_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_2).toEqual(expected_amount_2);
+    expect(amount_2).toMatchSnapshot(expected_amount_2);
 
     // Amount 3/3
     filename = "amount_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_3).toEqual(expected_amount_3);
+    expect(amount_3).toMatchSnapshot(expected_amount_3);
 
     // Address 1/3
     filename = "address_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_1).toEqual(expected_address_1);
+    expect(address_1).toMatchSnapshot(expected_address_1);
 
     // Address 2/3
     filename = "address_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_2).toEqual(expected_address_2);
+    expect(address_2).toMatchSnapshot(expected_address_2);
 
     // Address 3/3
     filename = "address_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_3).toEqual(expected_address_3);
+    expect(address_3).toMatchSnapshot(expected_address_3);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
@@ -109,6 +106,7 @@ test("Transfer Ether on Ethereum app nanos", async () => {
 test("Transfer on network 5234 on Ethereum nanos", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOS_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanos);
@@ -124,73 +122,73 @@ test("Transfer on network 5234 on Ethereum nanos", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOS + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount 1/3
     filename = "amount_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_1).toEqual(expected_amount_1);
+    expect(amount_1).toMatchSnapshot(expected_amount_1);
 
     // Amount 2/3
     filename = "amount_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_2).toEqual(expected_amount_2);
+    expect(amount_2).toMatchSnapshot(expected_amount_2);
 
     // Amount 3/3
     filename = "amount_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_3).toEqual(expected_amount_3);
+    expect(amount_3).toMatchSnapshot(expected_amount_3);
 
     // Address 1/3
     filename = "address_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_1).toEqual(expected_address_1);
+    expect(address_1).toMatchSnapshot(expected_address_1);
 
     // Address 2/3
     filename = "address_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_2).toEqual(expected_address_2);
+    expect(address_2).toMatchSnapshot(expected_address_2);
 
     // Address 3/3
     filename = "address_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_3).toEqual(expected_address_3);
+    expect(address_3).toMatchSnapshot(expected_address_3);
 
     // Network
     filename = "network.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const network = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const network = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(network).toEqual(expected_network);
+    expect(network).toMatchSnapshot(expected_network);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
@@ -205,6 +203,7 @@ test("Transfer on network 5234 on Ethereum nanos", async () => {
 test("Transfer Ether on Ethereum nanox", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOX_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanox);
@@ -219,38 +218,38 @@ test("Transfer Ether on Ethereum nanox", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOX + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address
     filename = "address.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(address).toEqual(expected_address);
+    expect(address).toMatchSnapshot(expected_address);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
@@ -266,6 +265,7 @@ test("Transfer Ether on Ethereum nanox", async () => {
 test("Transfer on network 5234 on Ethereum nanox", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOX_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanox);
@@ -281,45 +281,45 @@ test("Transfer on network 5234 on Ethereum nanox", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOX + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address
     filename = "address.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(address).toEqual(expected_address);
+    expect(address).toMatchSnapshot(expected_address);
 
     // Network
     filename = "network.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const network = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const network = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(network).toEqual(expected_network);
+    expect(network).toMatchSnapshot(expected_network);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
diff --git a/tests/src/send_bsc.test.js b/tests/src/send_bsc.test.js
index 028f6cbbc..8339b69bf 100644
--- a/tests/src/send_bsc.test.js
+++ b/tests/src/send_bsc.test.js
@@ -6,21 +6,18 @@ import Zemu from "@zondax/zemu";
 import { TransportStatusError } from "@ledgerhq/errors";
 import { expect } from "../jest";
 
-const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT} = require("generic.js");
+const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js");
 
 const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/send_bsc/";
-const SNAPSHOT_PATH_PREFIX = "snapshots/tmp/";
 
 const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/";
 const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/";
 
-const SNAPSHOT_PATH_NANOS = SNAPSHOT_PATH_PREFIX + "nanos/";
-const SNAPSHOT_PATH_NANOX = SNAPSHOT_PATH_PREFIX + "nanox/";
-
 
 test("Transfer bsc nanos", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOS_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanos);
@@ -36,73 +33,73 @@ test("Transfer bsc nanos", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOS + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount 1/3
     filename = "amount_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_1).toEqual(expected_amount_1);
+    expect(amount_1).toMatchSnapshot(expected_amount_1);
 
     // Amount 2/3
     filename = "amount_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_2).toEqual(expected_amount_2);
+    expect(amount_2).toMatchSnapshot(expected_amount_2);
 
     // Amount 3/3
     filename = "amount_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_3).toEqual(expected_amount_3);
+    expect(amount_3).toMatchSnapshot(expected_amount_3);
 
     // Address 1/3
     filename = "address_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_1).toEqual(expected_address_1);
+    expect(address_1).toMatchSnapshot(expected_address_1);
 
     // Address 2/3
     filename = "address_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_2).toEqual(expected_address_2);
+    expect(address_2).toMatchSnapshot(expected_address_2);
 
     // Address 3/3
     filename = "address_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_3).toEqual(expected_address_3);
+    expect(address_3).toMatchSnapshot(expected_address_3);
 
     // Network name
     filename = "network.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const chainid = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const chainid = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_chainid = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(chainid).toEqual(expected_chainid);
+    expect(chainid).toMatchSnapshot(expected_chainid);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
@@ -118,6 +115,7 @@ test("Transfer bsc nanos", async () => {
 test("Transfer bsc nanox", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOX_ELF_PATH);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanox);
@@ -132,45 +130,45 @@ test("Transfer bsc nanox", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOX + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address
     filename = "address.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(address).toEqual(expected_address);
+    expect(address).toMatchSnapshot(expected_address);
 
     // Network name
     filename = "network.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const chainid = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const chainid = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_chainid = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(chainid).toEqual(expected_chainid);
+    expect(chainid).toMatchSnapshot(expected_chainid);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
diff --git a/tests/src/send_etc.test.js b/tests/src/send_etc.test.js
index 39da31cfe..040714479 100644
--- a/tests/src/send_etc.test.js
+++ b/tests/src/send_etc.test.js
@@ -6,20 +6,18 @@ import Zemu from "@zondax/zemu";
 import { TransportStatusError } from "@ledgerhq/errors";
 import { expect } from "../jest";
 
-const {NANOS_ETH_LIB, NANOX_ETH_LIB, NANOS_CLONE_ELF_PATH, NANOX_CLONE_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT} = require("generic.js");
+const {NANOS_ETH_LIB, NANOX_ETH_LIB, NANOS_CLONE_ELF_PATH, NANOX_CLONE_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js");
 
 const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/send_etc/";
-const SNAPSHOT_PATH_PREFIX = "snapshots/tmp/";
 
 const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/";
 const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/";
 
-const SNAPSHOT_PATH_NANOS = SNAPSHOT_PATH_PREFIX + "nanos/";
-const SNAPSHOT_PATH_NANOX = SNAPSHOT_PATH_PREFIX + "nanox/";
 
 test("Transfer on Ethereum clone app nanos", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOS_CLONE_ELF_PATH, NANOS_ETH_LIB);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanos);
@@ -35,66 +33,66 @@ test("Transfer on Ethereum clone app nanos", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOS + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount 1/3
     filename = "amount_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_1).toEqual(expected_amount_1);
+    expect(amount_1).toMatchSnapshot(expected_amount_1);
 
     // Amount 2/3
     filename = "amount_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_2).toEqual(expected_amount_2);
+    expect(amount_2).toMatchSnapshot(expected_amount_2);
 
     // Amount 3/3
     filename = "amount_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const amount_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(amount_3).toEqual(expected_amount_3);
+    expect(amount_3).toMatchSnapshot(expected_amount_3);
 
     // Address 1/3
     filename = "address_1.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_1 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_1 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_1).toEqual(expected_address_1);
+    expect(address_1).toMatchSnapshot(expected_address_1);
 
     // Address 2/3
     filename = "address_2.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_2 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_2 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_2).toEqual(expected_address_2);
+    expect(address_2).toMatchSnapshot(expected_address_2);
 
     // Address 3/3
     filename = "address_3.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const address_3 = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address_3 = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(address_3).toEqual(expected_address_3);
+    expect(address_3).toMatchSnapshot(expected_address_3);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOS + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
     await expect(tx).resolves.toEqual(
@@ -129,6 +127,7 @@ test("Transfer on network 5234 on Ethereum clone nanos", async () => {
 test("Transfer on Ethereum clone nanox", async () => {
   jest.setTimeout(TIMEOUT);
   const sim = new Zemu(NANOX_CLONE_ELF_PATH, NANOX_ETH_LIB);
+  let tmpPath = getTmpPath(expect.getState().currentTestName);
 
   try {
     await sim.start(sim_options_nanox);
@@ -143,38 +142,38 @@ test("Transfer on Ethereum clone nanox", async () => {
     await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot());
     // Review tx
     filename = "review.png";
-    await sim.snapshot(SNAPSHOT_PATH_NANOX + filename);
-    const review = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.snapshot(tmpPath + filename);
+    const review = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(review).toEqual(expected_review);
+    expect(review).toMatchSnapshot(expected_review);
 
     // Amount
     filename = "amount.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const amount = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(amount).toEqual(expected_amount);
+    expect(amount).toMatchSnapshot(expected_amount);
 
     // Address
     filename = "address.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const address = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(address).toEqual(expected_address);
+    expect(address).toMatchSnapshot(expected_address);
 
     // Max Fees
     filename = "fees.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const fees = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(fees).toEqual(expected_fees);
+    expect(fees).toMatchSnapshot(expected_fees);
 
     // Accept
     filename = "accept.png";
-    await sim.clickRight(SNAPSHOT_PATH_NANOX + filename);
-    const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename);
+    await sim.clickRight(tmpPath + filename);
+    const accept = Zemu.LoadPng2RGB(tmpPath + filename);
     const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename);
-    expect(accept).toEqual(expected_accept);
+    expect(accept).toMatchSnapshot(expected_accept);
 
     await sim.clickBoth();
 
diff --git a/tests/yarn.lock b/tests/yarn.lock
index 12a8900ea..f40fad18e 100644
--- a/tests/yarn.lock
+++ b/tests/yarn.lock
@@ -951,356 +951,356 @@
     exec-sh "^0.3.2"
     minimist "^1.2.0"
 
-"@ethersproject/abi@5.3.1", "@ethersproject/abi@^5.3.0":
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.3.1.tgz#69a1a496729d3a83521675a57cbe21f3cc27241c"
-  integrity sha512-F98FWTJG7nWWAQ4DcV6R0cSlrj67MWK3ylahuFbzkumem5cLWg1p7fZ3vIdRoS1c7TEf55Lvyx0w7ICR47IImw==
-  dependencies:
-    "@ethersproject/address" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/constants" "^5.3.0"
-    "@ethersproject/hash" "^5.3.0"
-    "@ethersproject/keccak256" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-
-"@ethersproject/abstract-provider@5.3.0", "@ethersproject/abstract-provider@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz#f4c0ae4a4cef9f204d7781de805fd44b72756c81"
-  integrity sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==
-  dependencies:
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/networks" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/transactions" "^5.3.0"
-    "@ethersproject/web" "^5.3.0"
-
-"@ethersproject/abstract-signer@5.3.0", "@ethersproject/abstract-signer@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz#05172b653e15b535ed5854ef5f6a72f4b441052d"
-  integrity sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==
-  dependencies:
-    "@ethersproject/abstract-provider" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-
-"@ethersproject/address@5.3.0", "@ethersproject/address@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.3.0.tgz#e53b69eacebf332e8175de814c5e6507d6932518"
-  integrity sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==
-  dependencies:
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/keccak256" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/rlp" "^5.3.0"
-
-"@ethersproject/base64@5.3.0", "@ethersproject/base64@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.3.0.tgz#b831fb35418b42ad24d943c557259062b8640824"
-  integrity sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw==
-  dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-
-"@ethersproject/basex@5.3.0", "@ethersproject/basex@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.3.0.tgz#02dea3ab8559ae625c6d548bc11773432255c916"
-  integrity sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ==
-  dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-
-"@ethersproject/bignumber@5.3.0", "@ethersproject/bignumber@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.3.0.tgz#74ab2ec9c3bda4e344920565720a6ee9c794e9db"
-  integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==
-  dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
+"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242"
+  integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==
+  dependencies:
+    "@ethersproject/address" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/constants" "^5.4.0"
+    "@ethersproject/hash" "^5.4.0"
+    "@ethersproject/keccak256" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0":
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e"
+  integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ==
+  dependencies:
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/networks" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/transactions" "^5.4.0"
+    "@ethersproject/web" "^5.4.0"
+
+"@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0":
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81"
+  integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA==
+  dependencies:
+    "@ethersproject/abstract-provider" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3"
+  integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==
+  dependencies:
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/keccak256" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/rlp" "^5.4.0"
+
+"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a"
+  integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==
+  dependencies:
+    "@ethersproject/bytes" "^5.4.0"
+
+"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6"
+  integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==
+  dependencies:
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+
+"@ethersproject/bignumber@5.4.1", "@ethersproject/bignumber@^5.4.0":
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.1.tgz#64399d3b9ae80aa83d483e550ba57ea062c1042d"
+  integrity sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg==
+  dependencies:
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
     bn.js "^4.11.9"
 
-"@ethersproject/bytes@5.3.0", "@ethersproject/bytes@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.3.0.tgz#473e0da7f831d535b2002be05e6f4ca3729a1bc9"
-  integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==
-  dependencies:
-    "@ethersproject/logger" "^5.3.0"
-
-"@ethersproject/constants@5.3.0", "@ethersproject/constants@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.3.0.tgz#a5d6d86c0eec2c64c3024479609493b9afb3fc77"
-  integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==
-  dependencies:
-    "@ethersproject/bignumber" "^5.3.0"
-
-"@ethersproject/contracts@5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.3.0.tgz#ad699a3abaae30bfb6422cf31813a663b2d4099c"
-  integrity sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg==
-  dependencies:
-    "@ethersproject/abi" "^5.3.0"
-    "@ethersproject/abstract-provider" "^5.3.0"
-    "@ethersproject/abstract-signer" "^5.3.0"
-    "@ethersproject/address" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/constants" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/transactions" "^5.3.0"
-
-"@ethersproject/hash@5.3.0", "@ethersproject/hash@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.3.0.tgz#f65e3bf3db3282df4da676db6cfa049535dd3643"
-  integrity sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==
-  dependencies:
-    "@ethersproject/abstract-signer" "^5.3.0"
-    "@ethersproject/address" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/keccak256" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-
-"@ethersproject/hdnode@5.3.0", "@ethersproject/hdnode@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.3.0.tgz#26fed65ffd5c25463fddff13f5fb4e5617553c94"
-  integrity sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g==
-  dependencies:
-    "@ethersproject/abstract-signer" "^5.3.0"
-    "@ethersproject/basex" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/pbkdf2" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/sha2" "^5.3.0"
-    "@ethersproject/signing-key" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-    "@ethersproject/transactions" "^5.3.0"
-    "@ethersproject/wordlists" "^5.3.0"
-
-"@ethersproject/json-wallets@5.3.0", "@ethersproject/json-wallets@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz#7b1a5ff500c12aa8597ae82c8939837b0449376e"
-  integrity sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw==
-  dependencies:
-    "@ethersproject/abstract-signer" "^5.3.0"
-    "@ethersproject/address" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/hdnode" "^5.3.0"
-    "@ethersproject/keccak256" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/pbkdf2" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/random" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-    "@ethersproject/transactions" "^5.3.0"
+"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e"
+  integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==
+  dependencies:
+    "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a"
+  integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==
+  dependencies:
+    "@ethersproject/bignumber" "^5.4.0"
+
+"@ethersproject/contracts@5.4.1":
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470"
+  integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w==
+  dependencies:
+    "@ethersproject/abi" "^5.4.0"
+    "@ethersproject/abstract-provider" "^5.4.0"
+    "@ethersproject/abstract-signer" "^5.4.0"
+    "@ethersproject/address" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/constants" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/transactions" "^5.4.0"
+
+"@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0"
+  integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==
+  dependencies:
+    "@ethersproject/abstract-signer" "^5.4.0"
+    "@ethersproject/address" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/keccak256" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac"
+  integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==
+  dependencies:
+    "@ethersproject/abstract-signer" "^5.4.0"
+    "@ethersproject/basex" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/pbkdf2" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/sha2" "^5.4.0"
+    "@ethersproject/signing-key" "^5.4.0"
+    "@ethersproject/strings" "^5.4.0"
+    "@ethersproject/transactions" "^5.4.0"
+    "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95"
+  integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==
+  dependencies:
+    "@ethersproject/abstract-signer" "^5.4.0"
+    "@ethersproject/address" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/hdnode" "^5.4.0"
+    "@ethersproject/keccak256" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/pbkdf2" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/random" "^5.4.0"
+    "@ethersproject/strings" "^5.4.0"
+    "@ethersproject/transactions" "^5.4.0"
     aes-js "3.0.0"
     scrypt-js "3.0.1"
 
-"@ethersproject/keccak256@5.3.0", "@ethersproject/keccak256@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.3.0.tgz#fb5cd36bdfd6fa02e2ea84964078a9fc6bd731be"
-  integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==
+"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318"
+  integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==
   dependencies:
-    "@ethersproject/bytes" "^5.3.0"
+    "@ethersproject/bytes" "^5.4.0"
     js-sha3 "0.5.7"
 
-"@ethersproject/logger@5.3.0", "@ethersproject/logger@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.3.0.tgz#7a69fa1d4ca0d4b7138da1627eb152f763d84dd0"
-  integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA==
-
-"@ethersproject/networks@5.3.1", "@ethersproject/networks@^5.3.0":
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.3.1.tgz#78fe08324cee289ce239acf8c746121934b2ef61"
-  integrity sha512-6uQKHkYChlsfeiZhQ8IHIqGE/sQsf25o9ZxAYpMxi15dLPzz3IxOEF5KiSD32aHwsjXVBKBSlo+teAXLlYJybw==
-  dependencies:
-    "@ethersproject/logger" "^5.3.0"
-
-"@ethersproject/pbkdf2@5.3.0", "@ethersproject/pbkdf2@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz#8adbb41489c3c9f319cc44bc7d3e6095fd468dc8"
-  integrity sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA==
-  dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/sha2" "^5.3.0"
-
-"@ethersproject/properties@5.3.0", "@ethersproject/properties@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.3.0.tgz#feef4c4babeb7c10a6b3449575016f4ad2c092b2"
-  integrity sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==
-  dependencies:
-    "@ethersproject/logger" "^5.3.0"
-
-"@ethersproject/providers@5.3.1":
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.3.1.tgz#a12c6370e8cbc0968c9744641b8ef90b0dd5ec2b"
-  integrity sha512-HC63vENTrur6/JKEhcQbA8PRDj1FAesdpX98IW+xAAo3EAkf70ou5fMIA3KCGzJDLNTeYA4C2Bonz849tVLekg==
-  dependencies:
-    "@ethersproject/abstract-provider" "^5.3.0"
-    "@ethersproject/abstract-signer" "^5.3.0"
-    "@ethersproject/address" "^5.3.0"
-    "@ethersproject/basex" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/constants" "^5.3.0"
-    "@ethersproject/hash" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/networks" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/random" "^5.3.0"
-    "@ethersproject/rlp" "^5.3.0"
-    "@ethersproject/sha2" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-    "@ethersproject/transactions" "^5.3.0"
-    "@ethersproject/web" "^5.3.0"
+"@ethersproject/logger@5.4.0", "@ethersproject/logger@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9"
+  integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==
+
+"@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0":
+  version "5.4.2"
+  resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35"
+  integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw==
+  dependencies:
+    "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c"
+  integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==
+  dependencies:
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/sha2" "^5.4.0"
+
+"@ethersproject/properties@5.4.0", "@ethersproject/properties@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7"
+  integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==
+  dependencies:
+    "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/providers@5.4.4":
+  version "5.4.4"
+  resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.4.tgz#6729120317942fc0ab0ecdb35e944ec6bbedb795"
+  integrity sha512-mQevyXj2X2D3l8p/JGDYFZbODhZjW6On15DnCK4Xc9y6b+P0vqorQC/j46omWSm4cyo7BQ/rgfhXNYmvAfyZoQ==
+  dependencies:
+    "@ethersproject/abstract-provider" "^5.4.0"
+    "@ethersproject/abstract-signer" "^5.4.0"
+    "@ethersproject/address" "^5.4.0"
+    "@ethersproject/basex" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/constants" "^5.4.0"
+    "@ethersproject/hash" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/networks" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/random" "^5.4.0"
+    "@ethersproject/rlp" "^5.4.0"
+    "@ethersproject/sha2" "^5.4.0"
+    "@ethersproject/strings" "^5.4.0"
+    "@ethersproject/transactions" "^5.4.0"
+    "@ethersproject/web" "^5.4.0"
     bech32 "1.1.4"
     ws "7.4.6"
 
-"@ethersproject/random@5.3.0", "@ethersproject/random@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.3.0.tgz#7c46bf36e50cb0d0550bc8c666af8e1d4496dc1a"
-  integrity sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw==
+"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16"
+  integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==
   dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
 
-"@ethersproject/rlp@5.3.0", "@ethersproject/rlp@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.3.0.tgz#7cb93a7b5dfa69163894153c9d4b0d936f333188"
-  integrity sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==
+"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931"
+  integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==
   dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
 
-"@ethersproject/sha2@5.3.0", "@ethersproject/sha2@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.3.0.tgz#209f9a1649f7d2452dcd5e5b94af43b7f3f42366"
-  integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg==
+"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371"
+  integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==
   dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
     hash.js "1.1.7"
 
-"@ethersproject/signing-key@5.3.0", "@ethersproject/signing-key@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.3.0.tgz#a96c88f8173e1abedfa35de32d3e5db7c48e5259"
-  integrity sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==
+"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec"
+  integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==
   dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
     bn.js "^4.11.9"
     elliptic "6.5.4"
     hash.js "1.1.7"
 
-"@ethersproject/solidity@5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.3.0.tgz#2a0b00b4aaaef99a080ddea13acab1fa35cd4a93"
-  integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ==
-  dependencies:
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/keccak256" "^5.3.0"
-    "@ethersproject/sha2" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-
-"@ethersproject/strings@5.3.0", "@ethersproject/strings@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.3.0.tgz#a6b640aab56a18e0909f657da798eef890968ff0"
-  integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==
-  dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/constants" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-
-"@ethersproject/transactions@5.3.0", "@ethersproject/transactions@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.3.0.tgz#49b86f2bafa4d0bdf8e596578fc795ee47c50458"
-  integrity sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==
-  dependencies:
-    "@ethersproject/address" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/constants" "^5.3.0"
-    "@ethersproject/keccak256" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/rlp" "^5.3.0"
-    "@ethersproject/signing-key" "^5.3.0"
-
-"@ethersproject/units@5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.3.0.tgz#c4d1493532ad3d4ddf6e2bc4f8c94a2db933a8f5"
-  integrity sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg==
-  dependencies:
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/constants" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-
-"@ethersproject/wallet@5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.3.0.tgz#91946b470bd279e39ade58866f21f92749d062af"
-  integrity sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg==
-  dependencies:
-    "@ethersproject/abstract-provider" "^5.3.0"
-    "@ethersproject/abstract-signer" "^5.3.0"
-    "@ethersproject/address" "^5.3.0"
-    "@ethersproject/bignumber" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/hash" "^5.3.0"
-    "@ethersproject/hdnode" "^5.3.0"
-    "@ethersproject/json-wallets" "^5.3.0"
-    "@ethersproject/keccak256" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/random" "^5.3.0"
-    "@ethersproject/signing-key" "^5.3.0"
-    "@ethersproject/transactions" "^5.3.0"
-    "@ethersproject/wordlists" "^5.3.0"
-
-"@ethersproject/web@5.3.0", "@ethersproject/web@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.3.0.tgz#7959c403f6476c61515008d8f92da51c553a8ee1"
-  integrity sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ==
-  dependencies:
-    "@ethersproject/base64" "^5.3.0"
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-
-"@ethersproject/wordlists@5.3.0", "@ethersproject/wordlists@^5.3.0":
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.3.0.tgz#45a0205f5178c1de33d316cb2ab7ed5eac3c06c5"
-  integrity sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ==
-  dependencies:
-    "@ethersproject/bytes" "^5.3.0"
-    "@ethersproject/hash" "^5.3.0"
-    "@ethersproject/logger" "^5.3.0"
-    "@ethersproject/properties" "^5.3.0"
-    "@ethersproject/strings" "^5.3.0"
-
-"@grpc/grpc-js@^1.3.1":
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.2.tgz#eae97e6daf5abd49a7818aadeca0744dfb1ebca1"
-  integrity sha512-UXepkOKCATJrhHGsxt+CGfpZy9zUn1q9mop5kfcXq1fBkTePxVNPOdnISlCbJFlCtld+pSLGyZCzr9/zVprFKA==
+"@ethersproject/solidity@5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec"
+  integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==
+  dependencies:
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/keccak256" "^5.4.0"
+    "@ethersproject/sha2" "^5.4.0"
+    "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a"
+  integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==
+  dependencies:
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/constants" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0"
+  integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==
+  dependencies:
+    "@ethersproject/address" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/constants" "^5.4.0"
+    "@ethersproject/keccak256" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/rlp" "^5.4.0"
+    "@ethersproject/signing-key" "^5.4.0"
+
+"@ethersproject/units@5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe"
+  integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==
+  dependencies:
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/constants" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+
+"@ethersproject/wallet@5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353"
+  integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==
+  dependencies:
+    "@ethersproject/abstract-provider" "^5.4.0"
+    "@ethersproject/abstract-signer" "^5.4.0"
+    "@ethersproject/address" "^5.4.0"
+    "@ethersproject/bignumber" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/hash" "^5.4.0"
+    "@ethersproject/hdnode" "^5.4.0"
+    "@ethersproject/json-wallets" "^5.4.0"
+    "@ethersproject/keccak256" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/random" "^5.4.0"
+    "@ethersproject/signing-key" "^5.4.0"
+    "@ethersproject/transactions" "^5.4.0"
+    "@ethersproject/wordlists" "^5.4.0"
+
+"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f"
+  integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==
+  dependencies:
+    "@ethersproject/base64" "^5.4.0"
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/strings" "^5.4.0"
+
+"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0":
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7"
+  integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==
+  dependencies:
+    "@ethersproject/bytes" "^5.4.0"
+    "@ethersproject/hash" "^5.4.0"
+    "@ethersproject/logger" "^5.4.0"
+    "@ethersproject/properties" "^5.4.0"
+    "@ethersproject/strings" "^5.4.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==
   dependencies:
     "@types/node" ">=12.12.47"
 
-"@grpc/proto-loader@^0.6.2":
-  version "0.6.2"
-  resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.2.tgz#412575f3ff5ef0a9b79d4ea12c08cba5601041cb"
-  integrity sha512-q2Qle60Ht2OQBCp9S5hv1JbI4uBBq6/mqSevFNK3ZEgRDBCAkWqZPUhD/K9gXOHrHKluliHiVq2L9sw1mVyAIg==
+"@grpc/proto-loader@^0.6.4":
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.4.tgz#5438c0d771e92274e77e631babdc14456441cbdc"
+  integrity sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ==
   dependencies:
     "@types/long" "^4.0.1"
     lodash.camelcase "^4.3.0"
@@ -1582,10 +1582,10 @@
     "@types/yargs" "^15.0.0"
     chalk "^4.0.0"
 
-"@ledgerhq/cryptoassets@^5.53.0":
-  version "5.53.0"
-  resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz#11dcc93211960c6fd6620392e4dd91896aaabe58"
-  integrity sha512-M3ibc3LRuHid5UtL7FI3IC6nMEppvly98QHFoSa7lJU0HDzQxY6zHec/SPM4uuJUC8sXoGVAiRJDkgny54damw==
+"@ledgerhq/cryptoassets@^6.5.0":
+  version "6.5.0"
+  resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-6.5.0.tgz#17250c928baa86603739ffcea19fc8de9f7fb860"
+  integrity sha512-HBmcfb9WTlcsqlzlHfd7nZr49on7ftpWmKXvxZu9DinLS7EZ5ZjgSvmxrx39YCS5yONILBJoA/BSpg1RcCbSjQ==
   dependencies:
     invariant "2"
 
@@ -1598,13 +1598,13 @@
     "@ledgerhq/logs" "^4.72.0"
     rxjs "^6.5.3"
 
-"@ledgerhq/devices@^5.51.1":
-  version "5.51.1"
-  resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.51.1.tgz#d741a4a5d8f17c2f9d282fd27147e6fe1999edb7"
-  integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==
+"@ledgerhq/devices@^6.3.0":
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.3.0.tgz#7ee59614198882311d1805912e368451527d05b2"
+  integrity sha512-DmVxqMAf3FhkpKjkbBCFVJ5DmesfplujeCLzFwO/zF5VGuwY7xxPqeSxlpusXJkqhEq+DbFzIDRWJYDf7rtXqg==
   dependencies:
-    "@ledgerhq/errors" "^5.50.0"
-    "@ledgerhq/logs" "^5.50.0"
+    "@ledgerhq/errors" "^6.2.0"
+    "@ledgerhq/logs" "^6.2.0"
     rxjs "6"
     semver "^7.3.5"
 
@@ -1613,22 +1613,23 @@
   resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.78.0.tgz#23daf3af54d03b1bda3e616002b555da1bdb705a"
   integrity sha512-FX6zHZeiNtegBvXabK6M5dJ+8OV8kQGGaGtuXDeK/Ss5EmG4Ltxc6Lnhe8hiHpm9pCHtktOsnUVL7IFBdHhYUg==
 
-"@ledgerhq/errors@^5.50.0":
-  version "5.50.0"
-  resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9"
-  integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==
-
-"@ledgerhq/hw-app-eth@^5.52.1":
-  version "5.53.0"
-  resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.53.0.tgz#5df2d7427db9f387099d0cc437e9730101d7c404"
-  integrity sha512-LKi/lDA9tW0GdoYP1ng0VY/PXNYjSrwZ1cj0R0MQ9z+knmFlPcVkGK2MEqE8W8cXrC0tjsUXITMcngvpk5yfKA==
-  dependencies:
-    "@ledgerhq/cryptoassets" "^5.53.0"
-    "@ledgerhq/errors" "^5.50.0"
-    "@ledgerhq/hw-transport" "^5.51.1"
-    "@ledgerhq/logs" "^5.50.0"
+"@ledgerhq/errors@^6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.2.0.tgz#7dc2b3bf6bdedccdaa1b97dccacfa912c4fc22f8"
+  integrity sha512-eO03x8HJmG60WtlrMuahigW/rwywFdcGzCnihta/MjkM8BD9A660cKVkyIuheCcpaB7UV/r+QsRl9abHbjjaag==
+
+"@ledgerhq/hw-app-eth@^6.5.0":
+  version "6.5.0"
+  resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-6.5.0.tgz#7541d2455660532272d9c61b2e4e33add06255d9"
+  integrity sha512-2M43aXxVX3xPwmluG/7zXRljSWSMdifi19V2JR5ezjBhpNg+fgrg6cYOkl7nhyrelsCCaRhWmn3+KCNrkFYLOQ==
+  dependencies:
+    "@ledgerhq/cryptoassets" "^6.5.0"
+    "@ledgerhq/errors" "^6.2.0"
+    "@ledgerhq/hw-transport" "^6.3.0"
+    "@ledgerhq/logs" "^6.2.0"
+    axios "^0.21.1"
     bignumber.js "^9.0.1"
-    ethers "^5.2.0"
+    ethers "^5.4.4"
 
 "@ledgerhq/hw-transport-http@^4.74.2":
   version "4.78.0"
@@ -1641,16 +1642,16 @@
     axios "^0.19.0"
     ws "6"
 
-"@ledgerhq/hw-transport-http@^5.51.1":
-  version "5.51.1"
-  resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-5.51.1.tgz#720b4a054401c82884f9d64bcb093988fd397498"
-  integrity sha512-hsWxRX+dICyCHUxdUWqKnFwSPL0G9v/R6TVEJpnQ07IiBfIajbF59IRPCn9/Fw4XHII6IO+xtPT+jFkwwSdHLQ==
+"@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==
   dependencies:
-    "@ledgerhq/errors" "^5.50.0"
-    "@ledgerhq/hw-transport" "^5.51.1"
-    "@ledgerhq/logs" "^5.50.0"
+    "@ledgerhq/errors" "^6.2.0"
+    "@ledgerhq/hw-transport" "^6.3.0"
+    "@ledgerhq/logs" "^6.2.0"
     axios "^0.21.1"
-    ws "6"
+    ws "7"
 
 "@ledgerhq/hw-transport@^4.78.0":
   version "4.78.0"
@@ -1661,13 +1662,13 @@
     "@ledgerhq/errors" "^4.78.0"
     events "^3.0.0"
 
-"@ledgerhq/hw-transport@^5.51.1":
-  version "5.51.1"
-  resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz#8dd14a8e58cbee4df0c29eaeef983a79f5f22578"
-  integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==
+"@ledgerhq/hw-transport@^6.1.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==
   dependencies:
-    "@ledgerhq/devices" "^5.51.1"
-    "@ledgerhq/errors" "^5.50.0"
+    "@ledgerhq/devices" "^6.3.0"
+    "@ledgerhq/errors" "^6.2.0"
     events "^3.3.0"
 
 "@ledgerhq/logs@^4.72.0":
@@ -1680,6 +1681,11 @@
   resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186"
   integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==
 
+"@ledgerhq/logs@^6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.2.0.tgz#9fb2d6f1811316697f7b3cc14607f6c608912419"
+  integrity sha512-SLyFyD7ElMhgKWPYedFGCT/ilcbGPgL5hXXYHxOM79Fs5fWi0zaUpt5oGqGMsOAAFaMa9/rbun0pokzPhEFz8A==
+
 "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents":
   version "2.1.8-no-fsevents"
   resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b"
@@ -1885,18 +1891,19 @@
   dependencies:
     "@types/yargs-parser" "*"
 
-"@zondax/zemu@0.13.0":
-  version "0.13.0"
-  resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.13.0.tgz#e58b255a5c09adb23316ec97f97204b4a9e21ab9"
-  integrity sha512-TsJOdtzngyIX3NAIkozJlHyfPN81dMDg1XjFrUAjO7ABoY/RC4kfY5d2NbaFQ8TbTBqd2eFrY/iwwJ6qdhqFng==
+"@zondax/zemu@0.16.5":
+  version "0.16.5"
+  resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.16.5.tgz#45acddf593de4a9d70861c8671441d6f54c5a461"
+  integrity sha512-y5hMSE9DVVVsJuTbK8EjMxbZ49eItezSksb+JmbW9mkEwj5tIpT/50kF/2Lcu969yLbxBpwVyBUcT9gp0UoLuw==
   dependencies:
-    "@grpc/grpc-js" "^1.3.1"
-    "@grpc/proto-loader" "^0.6.2"
-    "@ledgerhq/hw-transport" "^5.51.1"
-    "@ledgerhq/hw-transport-http" "^5.51.1"
+    "@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"
     dockerode "^3.3.0"
     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"
@@ -3133,41 +3140,41 @@ ethers@^4.0.37:
     uuid "2.0.1"
     xmlhttprequest "1.8.0"
 
-ethers@^5.2.0:
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.3.1.tgz#1f018f0aeb651576cd84fd987a45f0b99646d761"
-  integrity sha512-xCKmC0gsZ9gks89ZfK3B1y6LlPdvX5fxDtu9SytnpdDJR1M7pmJI+4H0AxQPMgUYr7GtQdmECLR0gWdJQ+lZYw==
-  dependencies:
-    "@ethersproject/abi" "5.3.1"
-    "@ethersproject/abstract-provider" "5.3.0"
-    "@ethersproject/abstract-signer" "5.3.0"
-    "@ethersproject/address" "5.3.0"
-    "@ethersproject/base64" "5.3.0"
-    "@ethersproject/basex" "5.3.0"
-    "@ethersproject/bignumber" "5.3.0"
-    "@ethersproject/bytes" "5.3.0"
-    "@ethersproject/constants" "5.3.0"
-    "@ethersproject/contracts" "5.3.0"
-    "@ethersproject/hash" "5.3.0"
-    "@ethersproject/hdnode" "5.3.0"
-    "@ethersproject/json-wallets" "5.3.0"
-    "@ethersproject/keccak256" "5.3.0"
-    "@ethersproject/logger" "5.3.0"
-    "@ethersproject/networks" "5.3.1"
-    "@ethersproject/pbkdf2" "5.3.0"
-    "@ethersproject/properties" "5.3.0"
-    "@ethersproject/providers" "5.3.1"
-    "@ethersproject/random" "5.3.0"
-    "@ethersproject/rlp" "5.3.0"
-    "@ethersproject/sha2" "5.3.0"
-    "@ethersproject/signing-key" "5.3.0"
-    "@ethersproject/solidity" "5.3.0"
-    "@ethersproject/strings" "5.3.0"
-    "@ethersproject/transactions" "5.3.0"
-    "@ethersproject/units" "5.3.0"
-    "@ethersproject/wallet" "5.3.0"
-    "@ethersproject/web" "5.3.0"
-    "@ethersproject/wordlists" "5.3.0"
+ethers@^5.4.4:
+  version "5.4.5"
+  resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.5.tgz#cec133b9f5b514dc55e2561ee7aa7218c33affd7"
+  integrity sha512-PPZ6flOAj230sXEWf/r/It6ZZ5c7EOVWx+PU87Glkbg79OtT7pLE1WgL4MRdwx6iF7HzSOvUUI+8cAmcdzo12w==
+  dependencies:
+    "@ethersproject/abi" "5.4.0"
+    "@ethersproject/abstract-provider" "5.4.1"
+    "@ethersproject/abstract-signer" "5.4.1"
+    "@ethersproject/address" "5.4.0"
+    "@ethersproject/base64" "5.4.0"
+    "@ethersproject/basex" "5.4.0"
+    "@ethersproject/bignumber" "5.4.1"
+    "@ethersproject/bytes" "5.4.0"
+    "@ethersproject/constants" "5.4.0"
+    "@ethersproject/contracts" "5.4.1"
+    "@ethersproject/hash" "5.4.0"
+    "@ethersproject/hdnode" "5.4.0"
+    "@ethersproject/json-wallets" "5.4.0"
+    "@ethersproject/keccak256" "5.4.0"
+    "@ethersproject/logger" "5.4.0"
+    "@ethersproject/networks" "5.4.2"
+    "@ethersproject/pbkdf2" "5.4.0"
+    "@ethersproject/properties" "5.4.0"
+    "@ethersproject/providers" "5.4.4"
+    "@ethersproject/random" "5.4.0"
+    "@ethersproject/rlp" "5.4.0"
+    "@ethersproject/sha2" "5.4.0"
+    "@ethersproject/signing-key" "5.4.0"
+    "@ethersproject/solidity" "5.4.0"
+    "@ethersproject/strings" "5.4.0"
+    "@ethersproject/transactions" "5.4.0"
+    "@ethersproject/units" "5.4.0"
+    "@ethersproject/wallet" "5.4.0"
+    "@ethersproject/web" "5.4.0"
+    "@ethersproject/wordlists" "5.4.0"
 
 events@^3.0.0, events@^3.3.0:
   version "3.3.0"
@@ -3501,6 +3508,11 @@ get-package-type@^0.1.0:
   resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
   integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
 
+get-port@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193"
+  integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==
+
 get-stream@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@@ -6953,6 +6965,11 @@ 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"