diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 5c2c5b3..9c19c99 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 1138673..4dbca94 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 dd80d27..89e3920 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 0180681..3aeeb14 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 be33471..89033b4 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 1df3372..b3c01fc 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 ea366c1..3d9433e 160000 --- a/ethereum-plugin-sdk +++ b/ethereum-plugin-sdk @@ -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 0000000..302030b 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 0000000..1361a68 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 0000000..0fd35ec Binary files /dev/null and b/icons/songbird.png differ diff --git a/src/chainConfig.h b/src/chainConfig.h index a845018..83d7157 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 725469c..d20e927 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 2698e21..94d7b7e 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 7686205..48b6b94 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 48a91d7..3820fd6 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 e3e9c6f..8631c35 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 63667e8..ce7a92d 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 3573cd3..f57cbb0 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 e3e04c6..5048119 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 f10ac19..6ee5d45 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 01b9f37..e73cc95 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 3ad545e..eb9ddf6 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 67712a7..de51b1c 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 f1181b8..eee88c6 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 e8c4f7a..529cc4f 100644 --- a/src_common/network.h +++ b/src_common/network.h @@ -1,16 +1,15 @@ #include #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 3d9118b..ef521c4 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 4e4fdbe..09c0f8c 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 47960af..cec6536 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 360f883..36a0bd9 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 aee22f5..b508ee5 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 6f1b247..4ef5ddc 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 156ca07..7903402 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 584ac5c..9d04d74 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 7a43eaf..29ea299 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 c2ae91e..872ea0d 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); diff --git a/tests/build_local_test_elfs.sh b/tests/build_local_test_elfs.sh new file mode 100755 index 0000000..38777eb --- /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 8ec2b86..e835233 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 fbceb38..af09403 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: ['/setupTests.js'], + + // Stop immediatly when a test fail + bail: true, }; diff --git a/tests/package.json b/tests/package.json index d600722..ffc9815 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 0000000..cbd0230 --- /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 7f2b8c8..a2cb8f9 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 d8d9e03..4f601ca 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 9d200d0..6207f9e 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 19c6d6c..a15d822 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 8794afe..4a982c5 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 bec2de7..c9f6ee0 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 0000000..3158ea6 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 0000000..f979f71 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 0000000..93c90c5 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 0000000..402c20d 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 0000000..4cd3e38 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 0000000..d5afc7a 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 0000000..11ae75e 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 0000000..e042010 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 0000000..8b996b5 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 0000000..bf970a9 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 0000000..3242d61 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 0000000..297527f 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 0000000..2994983 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 0000000..a2cb8f9 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 0000000..4228ae1 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 0000000..a5592a6 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 0000000..14404ae 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 0000000..a67fa25 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 0000000..0ee720a 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 0000000..f91355b 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 0000000..14a7b7b 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 0000000..4a982c5 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 7f2b8c8..a2cb8f9 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 0c893f3..91fef4d 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 1523569..5486e4a 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 8af206f..dd2bbf9 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 559c155..294140a 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 8794afe..4a982c5 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 7f2b8c8..a2cb8f9 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 fe5d609..db02d0d 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 3da7c25..be296ea 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 bc32080..de628de 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 8794afe..4a982c5 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 7f2b8c8..a2cb8f9 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 ce3e586..4228ae1 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 c4f9260..a5592a6 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 f5a4c53..a67fa25 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 eb4b7b8..e3682de 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 8794afe..4a982c5 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 7f2b8c8..a2cb8f9 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 ce3e586..4228ae1 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 9911bf3..92b6eb5 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 ac5d9db..a4514d7 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 b021901..d354b8c 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 8794afe..4a982c5 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 7f2b8c8..a2cb8f9 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 ce3e586..4228ae1 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 e83449a..6b7d579 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 2a101ca..4a61a9d 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 8794afe..4a982c5 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 aab52d9..0000000 --- a/tests/snapshots/tmp/nanos/.gitignore +++ /dev/null @@ -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 aab52d9..0000000 --- a/tests/snapshots/tmp/nanox/.gitignore +++ /dev/null @@ -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 579d252..ec5e01e 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 0000000..e62da55 --- /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 b024692..2aa054d 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 d102d3c..4ad9427 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 2fdcd2b..dff7566 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 7deb7c7..1ba03de 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 028f6cb..8339b69 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 39da31c..0407144 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 12a8900..f40fad1 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== +"@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.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/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.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== +"@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.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/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.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== +"@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.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" + "@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.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== +"@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.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/rlp" "^5.3.0" + "@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.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== +"@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.3.0" + "@ethersproject/bytes" "^5.4.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== +"@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.3.0" - "@ethersproject/properties" "^5.3.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/properties" "^5.4.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== +"@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.3.0" - "@ethersproject/logger" "^5.3.0" + "@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== +"@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.3.0" + "@ethersproject/logger" "^5.4.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== +"@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.3.0" + "@ethersproject/bignumber" "^5.4.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== +"@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.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/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.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== +"@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.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/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.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== +"@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.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/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.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== +"@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.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/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/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.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== +"@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.3.0" + "@ethersproject/logger" "^5.4.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== +"@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.3.0" - "@ethersproject/sha2" "^5.3.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/sha2" "^5.4.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== +"@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.3.0" + "@ethersproject/logger" "^5.4.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== +"@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.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/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== +"@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.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" - "@ethersproject/strings" "^5.3.0" + "@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.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== +"@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.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.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== +"@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.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/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.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== +"@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.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.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== +"@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.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/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.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== +"@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.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" + "@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.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== +"@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.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" + "@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.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== +"@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/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@^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== +"@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" "^5.53.0" - "@ledgerhq/errors" "^5.50.0" - "@ledgerhq/hw-transport" "^5.51.1" - "@ledgerhq/logs" "^5.50.0" + "@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== +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.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" + "@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"