From a2d9a8068adcc43237e8d0f21a6acb6fc376f1fd Mon Sep 17 00:00:00 2001 From: pscott <30843220+pscott@users.noreply.github.com> Date: Fri, 2 Jul 2021 18:46:23 +0200 Subject: [PATCH] Add network display (#152) * Add network name display instead of chainID * Add display of correct ticker along with network * Add FTM * Clang-format * Add comment in python script * Rename SIZE_MAX to MAX_SIZE * Change %u to %d in printf * Remove needless PIC * Update comment about get_chain_id() * Update example script to follow EIP155 * Remove unused PIC calls * Add whitespace between ticker and amount when using EIP155 * Remove decimal config per network, set back 18 everywhere * Adapt u32_from_BE to swith cases * Remove chainid from signTx.py * Switch to switch in stead of if in get_chain_id * Revert "Remove chainid from signTx.py" This reverts commit 454e09f280ec3e3ec1c7d7cc0027247ef4390088. * Change Ethereum chainid to 1 * Rename chainid_step to network_step * Adapt finalizeParsing to new chainid for Ethereum * Update snapshots * clang-format * Fix network display logic for clones * Fix tests * Add clone tests Co-authored-by: TamtamHero <10632523+TamtamHero@users.noreply.github.com> --- .github/workflows/ci-workflow.yml | 15 +- Makefile | 2 +- examples/ethBase.py | 3 + examples/signTx.py | 11 + src/shared_context.h | 7 +- src/stark_crypto.c | 2 +- src/utils.c | 30 +-- src_common/network.c | 70 +++++++ src_common/network.h | 19 ++ src_features/signTx/feature_signTx.h | 2 + src_features/signTx/logic_signTx.c | 48 ++--- src_features/signTx/ui_flow_signTx.c | 23 +- src_plugins/eth2/eth2_plugin.c | 4 +- src_plugins/starkware/starkware_plugin.c | 4 +- tests/snapshots/send/nanos/network.png | Bin 0 -> 477 bytes tests/snapshots/send/nanox/network.png | Bin 0 -> 585 bytes tests/snapshots/send_bsc/nanos/amount_1.png | Bin 474 -> 499 bytes tests/snapshots/send_bsc/nanos/chainid.png | Bin 382 -> 0 bytes tests/snapshots/send_bsc/nanos/fees.png | Bin 545 -> 569 bytes tests/snapshots/send_bsc/nanos/network.png | Bin 0 -> 449 bytes tests/snapshots/send_bsc/nanox/amount.png | Bin 860 -> 884 bytes tests/snapshots/send_bsc/nanox/chainid.png | Bin 473 -> 0 bytes tests/snapshots/send_bsc/nanox/fees.png | Bin 669 -> 692 bytes tests/snapshots/send_bsc/nanox/network.png | Bin 0 -> 555 bytes tests/snapshots/send_etc/nanos/accept.png | Bin 0 -> 582 bytes tests/snapshots/send_etc/nanos/address_1.png | Bin 0 -> 809 bytes tests/snapshots/send_etc/nanos/address_2.png | Bin 0 -> 837 bytes tests/snapshots/send_etc/nanos/address_3.png | Bin 0 -> 567 bytes tests/snapshots/send_etc/nanos/amount_1.png | Bin 0 -> 475 bytes tests/snapshots/send_etc/nanos/amount_2.png | Bin 0 -> 759 bytes tests/snapshots/send_etc/nanos/amount_3.png | Bin 0 -> 479 bytes tests/snapshots/send_etc/nanos/fees.png | Bin 0 -> 557 bytes tests/snapshots/send_etc/nanos/review.png | Bin 0 -> 541 bytes tests/snapshots/send_etc/nanox/accept.png | Bin 0 -> 667 bytes tests/snapshots/send_etc/nanox/address.png | Bin 0 -> 1292 bytes tests/snapshots/send_etc/nanox/amount.png | Bin 0 -> 869 bytes tests/snapshots/send_etc/nanox/fees.png | Bin 0 -> 688 bytes tests/snapshots/send_etc/nanox/review.png | Bin 0 -> 633 bytes tests/src/generic.js | 14 +- tests/src/send.test.js | 169 ++++++++++++++- tests/src/send_bsc.test.js | 8 +- tests/src/send_etc.test.js | 208 +++++++++++++++++++ 42 files changed, 559 insertions(+), 80 deletions(-) create mode 100644 src_common/network.c create mode 100644 src_common/network.h create mode 100644 tests/snapshots/send/nanos/network.png create mode 100644 tests/snapshots/send/nanox/network.png delete mode 100644 tests/snapshots/send_bsc/nanos/chainid.png create mode 100644 tests/snapshots/send_bsc/nanos/network.png delete mode 100644 tests/snapshots/send_bsc/nanox/chainid.png create mode 100644 tests/snapshots/send_bsc/nanox/network.png create mode 100644 tests/snapshots/send_etc/nanos/accept.png create mode 100644 tests/snapshots/send_etc/nanos/address_1.png create mode 100644 tests/snapshots/send_etc/nanos/address_2.png create mode 100644 tests/snapshots/send_etc/nanos/address_3.png create mode 100644 tests/snapshots/send_etc/nanos/amount_1.png create mode 100644 tests/snapshots/send_etc/nanos/amount_2.png create mode 100644 tests/snapshots/send_etc/nanos/amount_3.png create mode 100644 tests/snapshots/send_etc/nanos/fees.png create mode 100644 tests/snapshots/send_etc/nanos/review.png create mode 100644 tests/snapshots/send_etc/nanox/accept.png create mode 100644 tests/snapshots/send_etc/nanox/address.png create mode 100644 tests/snapshots/send_etc/nanox/amount.png create mode 100644 tests/snapshots/send_etc/nanox/fees.png create mode 100644 tests/snapshots/send_etc/nanox/review.png create mode 100644 tests/src/send_etc.test.js diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 61618ce..9ae8086 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -25,23 +25,25 @@ jobs: - name: Build an altcoin run: | make DEBUG=1 ALLOW_DATA=1 CHAIN=ethereum_classic + mv bin/app.elf ethereum_classic_nanos.elf - name: Upload altcoin binary uses: actions/upload-artifact@v2 with: name: ethereum_classic_nanos - path: bin + path: ./ethereum_classic_nanos.elf - name: Build Ethereum run: | make clean make DEBUG=1 ALLOW_DATA=1 + mv bin/app.elf ethereum_nanos.elf - name: Upload app binary uses: actions/upload-artifact@v2 with: name: ethereum_nanos - path: bin + path: ./ethereum_nanos.elf job_build_debug_nano_x: name: Build debug Nano X @@ -60,23 +62,25 @@ jobs: run: | make clean make BOLOS_SDK=$NANOX_SDK DEBUG=1 ALLOW_DATA=1 CHAIN=ethereum_classic + mv bin/app.elf ethereum_classic_nanox.elf - name: Upload altcoin binary uses: actions/upload-artifact@v2 with: name: ethereum_classic_nanox - path: bin + path: ./ethereum_classic_nanox.elf - name: Build Ethereum Nano X run: | make clean make BOLOS_SDK=$NANOX_SDK DEBUG=1 ALLOW_DATA=1 + mv bin/app.elf ethereum_nanox.elf - name: Upload app binary uses: actions/upload-artifact@v2 with: name: ethereum_nanox - path: bin + path: ./ethereum_nanox.elf jobs-e2e-tests: needs: [job_build_debug_nano_s, job_build_debug_nano_x] @@ -104,6 +108,9 @@ jobs: uses: actions/download-artifact@v2 with: path: tests/elfs + - name: Gather elfs + run: | + cp `find . -name "*.elf"` ./tests/elfs - name: Run zemu tests run: | cd tests && yarn test diff --git a/Makefile b/Makefile index bfd27bf..6edd453 100755 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ endif ifeq ($(CHAIN),ethereum) # Lock the application on its standard path for 1.5. Please complain if non compliant APP_LOAD_PARAMS += --path "44'/60'" -DEFINES += CHAINID_UPCASE=\"ETHEREUM\" CHAINID_COINNAME=\"ETH\" CHAIN_KIND=CHAIN_KIND_ETHEREUM CHAIN_ID=0 +DEFINES += CHAINID_UPCASE=\"ETHEREUM\" CHAINID_COINNAME=\"ETH\" CHAIN_KIND=CHAIN_KIND_ETHEREUM CHAIN_ID=1 # Starkware integration APP_LOAD_PARAMS += --path "2645'/579218131'" DEFINES += HAVE_STARKWARE diff --git a/examples/ethBase.py b/examples/ethBase.py index b66b116..4fc1998 100755 --- a/examples/ethBase.py +++ b/examples/ethBase.py @@ -59,6 +59,9 @@ class UnsignedTransaction(Serializable): ('to', address), ('value', big_endian_int), ('data', binary), + ('chainid', big_endian_int), + ('dummy1', big_endian_int), + ('dummy2', big_endian_int), ] def unsigned_tx_from_tx(tx): diff --git a/examples/signTx.py b/examples/signTx.py index 9f0c4a0..f1d0337 100755 --- a/examples/signTx.py +++ b/examples/signTx.py @@ -59,6 +59,7 @@ parser.add_argument('--amount', help="Amount to send in ether", required=True) parser.add_argument('--to', help="Destination address", type=str, required=True) parser.add_argument('--path', help="BIP 32 path to sign with") parser.add_argument('--data', help="Data to add, hex encoded") +parser.add_argument('--chainid', help="Chain ID (1 for Ethereum mainnet, 137 for Polygon, etc)", type=int) parser.add_argument('--descriptor', help="Optional descriptor") args = parser.parse_args() @@ -71,6 +72,10 @@ if args.data == None: else: args.data = decode_hex(args.data[2:]) +# default to Ethereum mainnet +if args.chainid == None: + args.chainid = 1 + amount = Decimal(args.amount) * 10**18 tx = UnsignedTransaction( @@ -80,10 +85,16 @@ tx = UnsignedTransaction( to=decode_hex(args.to[2:]), value=int(amount), data=args.data, + chainid=args.chainid, + dummy1=0, + dummy2=0 ) encodedTx = encode(tx, UnsignedTransaction) +# To test an EIP-2930 transaction, uncomment this line +#encodedTx = bytearray.fromhex("01f8e60380018402625a0094cccccccccccccccccccccccccccccccccccccccc830186a0a4693c61390000000000000000000000000000000000000000000000000000000000000002f85bf859940000000000000000000000000000000000000102f842a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000060a780a09b8adcd2a4abd34b42d56fcd90b949f74ca9696dfe2b427bc39aa280bbf1924ca029af4a471bb2953b4e7933ea95880648552a9345424a1ac760189655ceb1832a") + dongle = getDongle(True) if args.descriptor != None: diff --git a/src/shared_context.h b/src/shared_context.h index f36c131..ea5e2b4 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -162,13 +162,14 @@ typedef enum { #endif } contract_call_t; +#define NETWORK_NAME_MAX_SIZE 12 + 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 chainID[8]; // 10M different chainID ought to be enough for people to find a unique - // chainID for their token / chain. + char nonce[8]; // 10M tx per account ought to be enough for everybody + char network_name[NETWORK_NAME_MAX_SIZE]; } txStringProperties_t; #define SHARED_CTX_FIELD_1_SIZE 100 diff --git a/src/stark_crypto.c b/src/stark_crypto.c index 9217567..cb7ee65 100644 --- a/src/stark_crypto.c +++ b/src/stark_crypto.c @@ -60,7 +60,7 @@ void stark_get_amount_string(uint8_t *contractAddress, char *target100) { uint256_t amountPre, quantum, amount; uint8_t decimals; - char *ticker = (char *) PIC(chainConfig->coinName); + char *ticker = chainConfig->coinName; PRINTF("stark_get_amount_string %.*H\n", 20, contractAddress); diff --git a/src/utils.c b/src/utils.c index 401de81..e662209 100644 --- a/src/utils.c +++ b/src/utils.c @@ -57,20 +57,24 @@ int local_strchr(char *string, char ch) { // Almost like U4BE except that it takes `size` as a parameter. // The `strict` parameter defines whether we should throw in case of a length > 4. uint32_t u32_from_BE(uint8_t *in, uint8_t size, bool strict) { - uint32_t res = 0; - if (size == 1) { - res = in[0]; - } else if (size == 2) { - res = (in[0] << 8) | in[1]; - } else if (size == 3) { - res = (in[0] << 16) | (in[1] << 8) | in[2]; - } else if (size == 4) { - res = (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3]; - } else if (strict && size != 0) { - PRINTF("Unexpected format\n"); - THROW(EXCEPTION); + 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]; + case 4: + return (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3]; + default: + if (strict) { + PRINTF("Unexpected format\n"); + THROW(EXCEPTION); + } + return (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3]; } - return res; } bool uint256_to_decimal(const uint8_t *value, size_t value_len, char *out, size_t out_len) { diff --git a/src_common/network.c b/src_common/network.c new file mode 100644 index 0000000..096f56d --- /dev/null +++ b/src_common/network.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include "network.h" +#include "os.h" +#include "shared_context.h" +#include "utils.h" + +// Mappping of chain ids to networks. +const network_info_t NETWORK_MAPPING[] = { + {.chain_id = 1, .name = "Ethereum", .ticker = "ETH "}, + {.chain_id = 3, .name = "Ropsten", .ticker = "ETH "}, + {.chain_id = 4, .name = "Rinkeby", .ticker = "ETH "}, + {.chain_id = 5, .name = "Goerli", .ticker = "ETH "}, + {.chain_id = 10, .name = "Optimism", .ticker = "ETH "}, + {.chain_id = 42, .name = "Kovan", .ticker = "ETH "}, + {.chain_id = 56, .name = "BSC", .ticker = "BNB "}, + {.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 "}}; + +uint32_t get_chain_id(void) { + uint32_t chain_id = 0; + + switch (txContext.txType) { + case LEGACY: + chain_id = u32_from_BE(txContext.content->v, txContext.content->vLength, true); + break; + case EIP2930: + chain_id = u32_from_BE(tmpContent.txContent.chainID.value, + tmpContent.txContent.chainID.length, + true); + 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(); + 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]); + } + } + return NULL; +} + +char *get_network_name(void) { + network_info_t *network = get_network(); + if (network == NULL) { + return NULL; + } else { + return (char *) PIC(network->name); + } +} + +char *get_network_ticker(void) { + network_info_t *network = get_network(); + if (network == NULL) { + return chainConfig->coinName; + } else { + return (char *) PIC(network->ticker); + } +} diff --git a/src_common/network.h b/src_common/network.h new file mode 100644 index 0000000..e8c4f7a --- /dev/null +++ b/src_common/network.h @@ -0,0 +1,19 @@ +#include +#include "tokens.h" + +#define NETWORK_STRING_MAX_SIZE 12 + +typedef struct network_info_s { + const char name[NETWORK_STRING_MAX_SIZE]; + const char ticker[MAX_TICKER_LEN]; + uint32_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); +// 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. +char *get_network_name(void); +// Returns a pointer to the network ticker, or chainConfig->coinName if there is none. +char *get_network_ticker(void); \ No newline at end of file diff --git a/src_features/signTx/feature_signTx.h b/src_features/signTx/feature_signTx.h index a25a650..fdcab3e 100644 --- a/src_features/signTx/feature_signTx.h +++ b/src_features/signTx/feature_signTx.h @@ -2,3 +2,5 @@ customStatus_e customProcessor(txContext_t *context); void finalizeParsing(bool direct); + +void ux_approve_tx(bool dataPresent); \ No newline at end of file diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index 259ee78..14a889c 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -6,6 +6,7 @@ #include "stark_utils.h" #endif #include "eth_plugin_handler.h" +#include "network.h" #define ERR_SILENT_MODE_CHECK_FAILED 0x6001 @@ -195,7 +196,7 @@ void reportFinalizeError(bool direct) { void computeFees(char *displayBuffer, uint32_t displayBufferSize) { uint256_t gasPrice, startGas, uint256; - uint8_t *feeTicker = (uint8_t *) PIC(chainConfig->coinName); + char *feeTicker = get_network_ticker(); uint8_t tickerOffset = 0; uint32_t i; @@ -240,25 +241,14 @@ void computeFees(char *displayBuffer, uint32_t displayBufferSize) { void finalizeParsing(bool direct) { char displayBuffer[50]; uint8_t decimals = WEI_TO_ETHER; - uint8_t *ticker = (uint8_t *) PIC(chainConfig->coinName); + char *ticker = get_network_ticker(); ethPluginFinalize_t pluginFinalize; tokenDefinition_t *token1 = NULL, *token2 = NULL; bool genericUI = true; // Verify the chain - if (chainConfig->chainId != 0) { - uint32_t id = 0; - - if (txContext.txType == LEGACY) { - id = u32_from_BE(txContext.content->v, txContext.content->vLength, true); - } else if (txContext.txType == EIP2930) { - id = u32_from_BE(txContext.content->chainID.value, - txContext.content->chainID.length, - false); - } else { - PRINTF("TxType `%u` not supported while checking for chainID\n", txContext.txType); - return; - } + if (chainConfig->chainId != ETHEREUM_MAINNET_CHAINID) { + uint32_t id = get_chain_id(); if (chainConfig->chainId != id) { PRINTF("Invalid chainID %u expected %u\n", id, chainConfig->chainId); @@ -342,7 +332,7 @@ void finalizeParsing(bool direct) { tmpContent.txContent.destinationLength = 20; if (token1 != NULL) { decimals = token1->decimals; - ticker = token1->ticker; + ticker = (char *) token1->ticker; } break; default: @@ -404,26 +394,22 @@ void finalizeParsing(bool direct) { // Prepare chainID field if (genericUI) { - if (txContext.txType == LEGACY) { - uint32_t id = u32_from_BE(txContext.content->v, txContext.content->vLength, true); - PRINTF("Chain ID: %u\n", id); - uint8_t res = - snprintf(strings.common.chainID, sizeof(strings.common.chainID), "%d", id); - if (res >= sizeof(strings.common.chainID)) { + 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); } - } else if (txContext.txType == EIP2930) { - uint256_t chainID; - convertUint256BE(tmpContent.txContent.chainID.value, - tmpContent.txContent.chainID.length, - &chainID); - tostring256(&chainID, 10, displayBuffer, sizeof(displayBuffer)); - strncpy(strings.common.chainID, displayBuffer, sizeof(strings.common.chainID)); } else { - PRINTF("Txtype `%u` not supported while generating chainID\n", txContext.txType); - return; + // Network name found, simply copy it. + strncpy(strings.common.network_name, name, sizeof(strings.common.network_name)); } } diff --git a/src_features/signTx/ui_flow_signTx.c b/src_features/signTx/ui_flow_signTx.c index 31de33d..6a8aaf4 100644 --- a/src_features/signTx/ui_flow_signTx.c +++ b/src_features/signTx/ui_flow_signTx.c @@ -2,6 +2,8 @@ #include "ui_callbacks.h" #include "chainConfig.h" #include "utils.h" +#include "feature_signTx.h" +#include "network.h" // clang-format off UX_STEP_NOCB( @@ -116,11 +118,11 @@ UX_STEP_NOCB( .text = strings.common.maxFee, }); UX_STEP_NOCB( - ux_approval_chainid_step, + ux_approval_network_step, bnnn_paging, { - .title = "Chain ID", - .text = strings.common.chainID, + .title = "Network", + .text = strings.common.network_name, }); UX_STEP_CB( ux_approval_accept_step, @@ -171,18 +173,9 @@ void ux_approve_tx(bool dataPresent) { ux_approval_tx_flow_[step++] = &ux_approval_nonce_step; } - uint32_t id; - if (txContext.txType == LEGACY) { - id = u32_from_BE(txContext.content->v, txContext.content->vLength, true); - } else if (txContext.txType == EIP2930) { - id = - u32_from_BE(txContext.content->chainID.value, txContext.content->chainID.length, false); - } else { - PRINTF("TxType `%u` not supported while preparing to approve tx\n", txContext.txType); - THROW(0x6501); - } - if (id != ETHEREUM_MAINNET_CHAINID) { - ux_approval_tx_flow_[step++] = &ux_approval_chainid_step; + uint32_t chain_id = get_chain_id(); + if (chainConfig->chainId == ETHEREUM_MAINNET_CHAINID && chain_id != chainConfig->chainId) { + ux_approval_tx_flow_[step++] = &ux_approval_network_step; } ux_approval_tx_flow_[step++] = &ux_approval_fees_step; ux_approval_tx_flow_[step++] = &ux_approval_accept_step; diff --git a/src_plugins/eth2/eth2_plugin.c b/src_plugins/eth2/eth2_plugin.c index 6687902..6c18826 100644 --- a/src_plugins/eth2/eth2_plugin.c +++ b/src_plugins/eth2/eth2_plugin.c @@ -217,12 +217,12 @@ void eth2_plugin_call(int message, void *parameters) { switch (msg->screenIndex) { case 0: { // Amount screen uint8_t decimals = WEI_TO_ETHER; - uint8_t *ticker = (uint8_t *) PIC(chainConfig->coinName); + char *ticker = chainConfig->coinName; strcpy(msg->title, "Amount"); amountToString(tmpContent.txContent.value.value, tmpContent.txContent.value.length, decimals, - (char *) ticker, + ticker, msg->msg, 100); msg->result = ETH_PLUGIN_RESULT_OK; diff --git a/src_plugins/starkware/starkware_plugin.c b/src_plugins/starkware/starkware_plugin.c index cb4d584..6f0ffe5 100644 --- a/src_plugins/starkware/starkware_plugin.c +++ b/src_plugins/starkware/starkware_plugin.c @@ -294,7 +294,7 @@ void starkware_print_eth_address(uint8_t *address, char *destination) { void starkware_print_amount(uint8_t *amountData, char *destination, bool forEscape) { uint256_t amount, amountPre, quantum; uint8_t decimals; - char *ticker = (char *) PIC(chainConfig->coinName); + char *ticker = chainConfig->coinName; if ((amountData == NULL) || (forEscape && (dataContext.tokenContext.quantumIndex == MAX_TOKEN))) { @@ -328,7 +328,7 @@ void starkware_print_amount(uint8_t *amountData, char *destination, bool forEsca // TODO : rewrite as independant code void starkware_print_ticker(char *destination) { - char *ticker = (char *) PIC(chainConfig->coinName); + char *ticker = chainConfig->coinName; if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) { tokenDefinition_t *token = diff --git a/tests/snapshots/send/nanos/network.png b/tests/snapshots/send/nanos/network.png new file mode 100644 index 0000000000000000000000000000000000000000..9dde424c77d6b22671a7910a57de8c0ae4dd218e GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfcChba4!+V0?Qpu|#stlbY~zz0`!Aiw<5j`LnIs%Fi3=aLOJyubyuKlOL1WuwAarKtHJM{_!Qt@i zHtkA-$!sZQyw;LZ6D&;>oSBWl#BR0}KHd{DDfdhiidCDnCoOy!%xm(enD<1?+2)%k z{)hur0mWAX#rscOXgK57#+LH0i-$M-(}Pnf85Sol6aWo-ld{jHt*!Y?56hHr-V-{) znGVmcJ_uztI-Qb|QDItft>KK3rliz7UON+o%|3o@ZT!vrMkYFwvmKrtelU}V_w*8} z36*LK_GCFcna5+%T<%Tn}+vc9hVLN@^RKa*P zyK$Dqi9bPy{hlphoH^5WM(>%04}F=9)Qy0CdY4k5&U>Q9^YFUHw%Efta(7&rjpEgc zFEyOWkvp^Op+fPcf(bWGWm4X`IYj1VZ@6gTe~DWM4fyc^E< literal 0 HcmV?d00001 diff --git a/tests/snapshots/send/nanox/network.png b/tests/snapshots/send/nanox/network.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4b7b8ce403bd5379db4c96f3ad2a45675a1462 GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}EWU|Qy)6x?atzZ2ps4)Da=h3-cr_{CV?{>2X-rSe|p?gKm(oeBk;-XW# zPc8Y>dFp@QOs%?I2bov+h>8L&TDj?rffnx#c617?QkiE71%+FVWe?Juh3|MgL$mY&xCB0Ys{$fVCMb$()h|w3wPJ=A&;%u|kbl!o#kQWhyywRPr>EwtcC5Gq4xa8) z!J#W^N*UD6MYV2!4q0)BH%}{MTYAvS9nyaS7jCkh?R7NuL%Y|}Z#kk`(+~Cn89t&~ mdrw6)DW)6JHWA(7I?mU1uk zA&=CAg%3@n>XtIj%r{loJlT;=QtDjN(=$?hU^Q)yY4sTnX+U(nKw)$C4bwL%bt<1v zhMn^Riy4?G7@H`3);4lxHac;k0c7$&kHdax6BaVgERU$z&X!VUWD?`VY{U+fE)dgB zzhJQU_$kQ~JiM3xr$3!5HNg_3GJf*H#0i!eKa_c`XF39%Rd=P~jN@Uj$$Ctu>Nm5c zERzS?vOdG%nf>*KGn-q}c~AI=D?1-HW_$|N{_>F2gvy8tpc{8tNJ`0x$)#k>&|Aki zv%Pgah_#Aw=6aSXKrJ;}+Qf}^v!(D!O}J^gXTr}6-V-*_Kl{$80-eLod*Y8rTE>qG zqx+FNv?Zn9w^f7iq# zCHk-0dd=>7B<~4STWZ430A?d=$&?8TAL@jiTk{a2Mk1xHo-L(~Ev1Z?-Dr1P>|wuW!AABs zPu)Dp!+YY56i@<)_PGEJW0RDcP`R9OW`5?4lRQR1+qk&bUu!ty*Vg6@vc}H+;CzaHgct$izm+=EMbq*cfIbpw~|V zSs~0u`J5U+Ek8d>@d3T@9_Z`|mOv-DXFEK*dCEOS&-t0`%vffl?FyeKw!XX;wr*YG zgrAezc1P^AnrW|Ae8I9Hl>72pU7zjSib{E#&y=Vv@Y%lA;O?zMCD~AMAV+`WishwK SSbhF60D-5gpUXO@geCwH&cXcv diff --git a/tests/snapshots/send_bsc/nanos/chainid.png b/tests/snapshots/send_bsc/nanos/chainid.png deleted file mode 100644 index acfe3d3d4145536db8b7957bb87c3fca04bcca55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfh7$x;TbZFupzLn0LoPfaTyC z#@GM(-#O1z*wd_<$|$5Fe_|fT$MCXA5mkX@Z?>HF6Y`d4I;6*WD^UI~?L4E%YIJ`R)69I&#xsgX*^SCK6{>6U8SQs^c09!|NTFCW;KC^i)XVu(NDbv~~DjvQ1AQr@$q}h^wf$n;zf`Q@6;OXk;vd$@?2>>gZm`eZv diff --git a/tests/snapshots/send_bsc/nanos/fees.png b/tests/snapshots/send_bsc/nanos/fees.png index 2c12e0ae5461c7044763f35bf38efe39249e85f9..6a16a429052c635d7602bcd7b47f8cc6236b866f 100644 GIT binary patch delta 545 zcmZ3;vXf@U;fqAz*7+elsZ~66){at^bL4?0cr`t7;98ZvqVwS^4QIM|>WxnPG3Gs?u=!F0j}d>$ zgi3btZ%Yy<^YAvGSuPcp($?n7J6j4Qdan~CrZ#io!_z5dCvzrMDj1t6e10X?w}4SH zCF6&nk;$H2+|`#q_@4yYz++_MW8{2T6u=9DdAoLSBNU21~m+a4a??_znT z3dOfHC8hFo>uWL`o^2^MGO3C9q2PQt^SRW7pBoCi+uAPs0o8ar?7ZG^W_wlz$TFZ4 z&s_N6kQRJc;qyv}XCpHuQo^LzW=;iivmz$`4C6gsma(PF%=1lieto*(l#NEvsT$>*a;Id#og-{O&(KWNi9J-^gT*$)Aa!Kmytb^ooKp zFeFa+7@6=G)vJKGrangJl@`q5%YImr!M)r$+Cui$p_ft@#QfU7aX*}QX8*RH+HVX% N;OXk;vd$@?2>_rX?aaV4qU(EQs{b>jdR)?imr;qe)SSMZJBfDh3M&(92)kqhZQzoHaPJopO-(S@7ei036GIAZ}S;Hh{t_^Uab#dHu|n-qx?BHMeYO-?}Px# diff --git a/tests/snapshots/send_bsc/nanos/network.png b/tests/snapshots/send_bsc/nanos/network.png new file mode 100644 index 0000000000000000000000000000000000000000..ef98ec61ac8c8a33ae16d5b213249dcf3b67b083 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfev_x;TbZFupx_yX&?CgUi9o z&ATcm|GOSZGrM;sF7`E_6!A=PLC&p3V3t9}CEn8^EK^oz zI6PazI5Yoh!x>TDb;}<1o9fKxUFX);7N51Cu`TxSx<)oBKOp4eHMvl5$$^eREv*;5* z)l+%ad9}6eS8`@HvIgq=scvKvbFx``^1_D-&W9bJUDz=Br>>ESOv*bChf1J}ij;Xz z?2+1&<&d^hQc^08cb=)j<~vh(c+a!NOHGK(^J{C7 z#fdp43dWn+%hiD%NK*&->`aD%^~{;P)5>`_R}_>3eNv<1%*@L^bGJ~yv`pSngQu&X%Q~loCID&?wSNEr literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_bsc/nanox/amount.png b/tests/snapshots/send_bsc/nanox/amount.png index c4f9260f4a6952260df015ed4567fe236a14f251..9911bf3683e093c34149dc41e3f760f10bc5346c 100644 GIT binary patch delta 621 zcmcb^_JwVN3ZwNz)lc;+y4iHEjLgKFWiZ3$?T@kY~WQ9%8Os$Z(izl~jnS69*$eLHjthGYs#U6EE5fT%+ zXA;*`clLtki=0xcZAG=h)x|}%Zf6Ir++p=|DNra^OZ4(deJ#=3*{kaVX8P%cXl=V5 zvaqO>p?q8F-5*U|j!(n#LW1JoG)Mq|g2WLlr8d=mB`82VpIV3bXw?^i!gOwqxAo0wWt(*0rbOQY zMwm1=L`kYDdtyPlqo`KDR!CSOQ2JOBFx+|h9-M2^0)}!(Skb1x;jO2#{LFytl4M0- z@P-~;vZ;%C$7bEv5ThpNW~$%5b;@ts(z_LfqLWX# zhpc&YtULIp&eYXi;ia2&-=;+0I%%yH=j!Tu^pw`UVuo@(t&nZkgBKQ+76mTcv{!9v z*XqgfAfaVJhI9Wc3fj1L8`spAPn?z}Rr`u+g|io=M_=pJUm+1vw>+snV5XKD&|t@> z+}NkKD#B0$O1RWm>$sjGGbRrc zh+OCj9#O64Qy~kDLRN(Q@jJShYigIfR=-wA8`o5zMuZyYR*({d{0 zqj|`Rm{1;3puHgrKLysC*BMM*%{BFX*uqbjR|3@lRnIScJUIju6i%rDD> zR8gR8p3btQfSV5(-s!Ax0*10vs;c_!`p^|?o~0~yN_90C3o-;c#7AqjMT7P2O%S83 hZ%!+N#{9M|{}~b*Ug$zmvv4FO#r-Y6iomC diff --git a/tests/snapshots/send_bsc/nanox/chainid.png b/tests/snapshots/send_bsc/nanox/chainid.png deleted file mode 100644 index 53424d95c498fbb4b6789eaa3972f6cca125ec87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}EWU|?L}>Eakt!T9zdW7eGj0oH^6 zn)5Dwx4&fFt#pv<2%9vIT8e4#){2|_*}87}+4cny?SD61OZu|0Vea95@7Elzi^w*t z(#ZS9ym%_>o1Sf57o!ZLZvRm5+!1W4`f$l7VNZ*de_Vw8w3e&v3I53KK1^h zPqRb(JUyCD{m*;sIH@2IsMPQ2q?XC2G&!|AcdW39{HUPyJ|qOF=7*n9$gUd|J5+ks zi}FuvncQ{iM>NO+0WD9DL#|J)LDc>UE#0ToBMzL)SS_(ubn(`tEnz*^x-Q;wQwF+X zr^>@cmyWs_YrUVe;8Gw^Yla%9_*8EpJ+0UrlSM_Ihvot;oht&;wXI>Uxo1G-ER~p$ zcasW&Di^7&*b{x=oUc&GvCk@wPuK16Y&un;HdW=0sJ>@_zopr00AG+ ArT_o{ diff --git a/tests/snapshots/send_bsc/nanox/fees.png b/tests/snapshots/send_bsc/nanox/fees.png index 71a1ef94c1b086e595dd68c3e93e9cb9d81f76c7..ac5d9dba1699161270cdac51110d1b0f425ccd9b 100644 GIT binary patch literal 692 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}EWU|_2Dba4!+V0?S9F<04~f#IO7 z)7+f@s=2yd9Df+a51+Gkl$+#wPUcThy+vPhuI}-_jqQ&g{wt7Sziq|$;N0QAb*WaL4`p-*8!QqN2i_&DO~!gi!I;5)irh1j1arUpQd(o1s`3q$SBlDbaEF+ zdeNsp1bP5slG9VKrA|Q40CoE>Dq2-B4dkxw;FUN2^+?ZO5%BY});{N@k5)Y@ z57ANsDOwU_xN;7NJ=yE%l26uJU}r7)v^;c0O$kG}o>s`V@4*X;On0mZxOoq#q|ba4!+V0?S9u~*uhf#IO7 z)7+f@s=2yd96uUPKejL9QNPqZ$MVO+e+4q^x1;)gGxHxm{P&>+-?mbj19RJd|2_Ay zpx&adIhVJ&`#1CLAif9Zwyin1Z3_@d>#usWq-d4J%0HT-@+swU&dqUQb1N?=^IFoeD8rS>yIpTU2y;m#1s$su@~pqCnMN zu1`bnRxpdk2d-Q(BjjJ_sg;jH3PTH5{qQ=vGX7!(^F&7$*01#)TXZP@_f1~DQM@a86oR{ z+~A{APZ{5-Fap}WjBD!s(1k{!D{4YOq>rdpaO)`;Q#2gR^?Z7h?Y8{FPqKF_Hg!!t zwSGkfJJ8+fJ3gjp{hxL!^l16wqE!{spy4@xMZiycpd0_GOa)pBG-+jskCr-!y(GwR z<)0p4IDmuux>kstRfDy-sMhV@D+6{)#e}TLdGEROQPv0N)>Gf^0RyF3K16HV_ppUU uQZXw+a^3@d^orqK&S|L}Z)qB!-`qv*mUrfyjH?DFI|ffzKbLh*2~7ZXW-3Eakt!T9#z#m*-d3=9`H zz3|ccKS4_@p8Hxtn)J74`Nu9*v)9kbKVGPlS6#8_8)!lP)lpu`M5tyqFVDq?yL-n z(RvrMtjjZX)eIojeQK%G(xjlBt7nANZ92#d)SwmIddk(+HFedGRY^fJwbZ7re6;S- zE3~F}Sx;SF z^|1iVSPyi9D9^V2E7m+ZdN?#DUTyxaDN02Q!{ zYWW8M9j2}&Dk?tp{yL|ptC=l!t_-+2Z@JUcyn^6`n`|e09liUYpKI#dn;}|y&GsQ$ x+tODD?BvM4RtRSIvkw{qJ) z-k{BNYMKd;QTzYAL~p5OZSof#4llR(=qVMJ($*$Ab77)uTE-4V=fhVFPUOsN*u=_P zev*f``Ha_Lh0T`?P5_w@bmoG=iJGR?wG$oFmOfn9wp(f$o7BG*4~6I6nAJ9Y(#_4S zx*0Q4Cd`zYu+#gQ-puxsHA;+6txb81;;$K;SOc`)`Eb{n3mcS-P1XR-G*4O9=9zYy zWlA>hi9IogRX%T%Vw>52vEj_tR;Wnvk2E8bnCKl>8qOS+%J|{VJNeAR_7fKhJRN>6 zWt_R(#K%Y*B*bf?@cHzid?OPZ*R-q|Qfe~~OJ_JdGiQ7n#BAiBxx@R}2R5LKwiNib zwJkq!XF{bkuSv~rHmSN0W~1w3?WueMPz z$jMOtJF#s}Y?8nbo644w2lP(7Qu7&Lh$$GG`0$>%lOd6E?`G%PjEacEho#sgfuXFQ zeWOb_8W?6gy!z_Ez}=wqxl_z;<{4*T7^Tcp+APW)4b*$#gTTy%593WQI2=|m1}X&# zr~*UES~!4j_tt_NTU!sW)0HX9eYhc;yFK9u$bQ|Tj}*;XgammwB9|D81-LZ`XFR^n$fF;SI`v$~Bw#9iRXBdhZ99sk z8`td4mwb9bhHPRif?hDQUYA`V<=)BC+XvR2WdHhQH%(=F&8$W! zMzihGN~OCp&ZyB>K|(3A9qk4;oWdE&K?p9d1`WGy=_LX@LX2!min2l=M2slbD{MUb5t%PAS0uT7^VLjsV|_GCBElca4UkexH1riZL?{w_s8D zhPh}VMWu?qg17w-P`Ca1BSD&uhCu^u-mehg4xN2^R41JPWs5RGq$;lUv|0~4VA#RtV2sDi0w4xX;L}5VF-pN5>w{FKA#Ksj z(n4Y$PT<%Aoev$v98_+>(id8Y3Br!Sz#gK4J6t=cyPQhMiQAOXUrtXmk-?m1hO!Wp) dMc)c+e?_|s$wq~xc@nMwFF&VHJ)V8j@(=l|VF&;K literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanos/address_2.png b/tests/snapshots/send_etc/nanos/address_2.png new file mode 100644 index 0000000000000000000000000000000000000000..93c90c542343a4423166f143ee5f43f335c73b96 GIT binary patch literal 837 zcmXAo4M-DV7{_;A%@R)~MB5oQ6F(yHVLVt$ZA=)^QU zBa$mqOLSqW0}B(ikSSa-LTA~M^?~9*LQSM{U?0zWaUbu!FYohz{?G4uuQ5L_n+PNW zB@zjt%~2P?XoE+-Qws0-{S~ni2_B?XXBJwqm5I{@W!f;+L`=i;zdOFE7GI3q(@a%%ggCfQn@u^+iip^<%vKAXE_sg2^OTwK8cYgpA)QlwvHdYYcoX z2bgK!RAU5Mt$@`d>q?fj?;F7Qi1_QVD(7qn&>7r*=L5+dHSVGAOCb#lr3w}pAa_-p zlo_~48)j3Oa(4=Ih)@|!9sq;O08x*=RR=>ZP7Ur#7=~;jQXTRs>{ZCq#E)j6REz_9 zh=eA{H+q2|PIY6bIx&VnoGuofiBqpCec?p6Uhv)k^ddd4^G&t%9 zY-k2o(470o9Kb|1c*OH30!6??u5JhP6bM<+K|&{NI5fW_YOc}VaBX4v;R9>6F}@>e b9;QD-q}la_C0C<6;P;SdHF@d*Woi9CJYZeG literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanos/address_3.png b/tests/snapshots/send_etc/nanos/address_3.png new file mode 100644 index 0000000000000000000000000000000000000000..402c20d84b73864383ebc9f5a2cc87b175f5db3a GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfjh}ba4!+V0?Qpu$}+Z;wl?0GvNM-UO}LpM zky5uhal%ZHQK4dSYZ+%cwzcJ7bU5q>gz}StoRy3-c_mXaD%7>#FL-$Sd3dKc15MFpd>Y7XB)^&w=$kU2LncsOmxlb>jgobGRa}{EieYSf!=|k6FpyANtNyN}T_TK6 zIix21go%h5A10d_fp3{c}O%$9DCz{lFGaK!{(s0I&O)@3JqD$KS+6HCk z!wSYGJVwsUAT+y8cBb#)Wr@n4C!JB>U04DUTgW&Qi1H^&N=b;i+2>V@LsOIW5G0YVdAg)ygk9pM%G3^ExATOYpi+e zmn141pSaL)#+&!V8;Hg4l@{1!IiytqE!n?_ac2EG#+mNi{ZbQV`nk2Wxig)LWj4Cp zX{u1Xz2JJonUW$SlRLV1PF^sW8^df=&K(b8g)ke%b7}y!{H)-$2KqwX$oX*Jnd8|G z&n7k$g#n!j^t9h$w`W{p%hHX)3m?CcVw;)y{@BfvKI?UTrf)N_&EC-^oqpZm#Gh$A wyg)~#t1j@FzSSW1)}fM2?#oNTYGQBk3zn>j|CK9X0*o{UPgg&ebxsLQ0A4`7wEzGB literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanos/amount_2.png b/tests/snapshots/send_etc/nanos/amount_2.png new file mode 100644 index 0000000000000000000000000000000000000000..11ae75e8391d69f363be24e20c136f0ee32b13d0 GIT binary patch literal 759 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfi@&ba4!+V0?Qp&`&v1#O2^* z)#v}j=g8l@cDdkcYoY6pnS>%$F{b` zI|@>Gt&L20W?nQ%abpIlU7F~gmKh->HuL_gLl;l>u%%3EyV!6h!{M18P*ySp$N;L7 zzqH{5k0j70KI!{w8E3k-waKq!oC#Fd$75t7bF@`C)bY?cP=5SXJ5Ka6+Wjt_GC6%9`D!IrY`NDl40?;i1&oe%^$OQc$deoVw}03 zQ{y~P)v7kvXQ8~^XMn+A4Ww2}O}GiP)$MTKnG6sG-b{T(V_>|+T?K~mnM)fkf6z1XW;Sw81BOR1&|&@D?$YFcvsLlQ$7&?QRF zAYZnfnGM9i5S+g#@x&fi2TR*Ey_cPDTi9+vP`{bucKb|_So<*tn4lRvUHx3vIVCg! E0D4U}bN~PV literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanos/amount_3.png b/tests/snapshots/send_etc/nanos/amount_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0420108494b969f9c050ba46e44f5c255fa1f1b GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfcCjba4!+V0?Qpu2D;LWW?VAh6@j^#SRf&uFm zFwXq%#B9{w=J;$fTS|sRN*i0sz0}8CQWF+FG?Loq!X}xLVUg+ZOre>_$Ry@yvv#({ z#D$3yB&FD9E@T8D=fj<67CyXCFk$Cv_HcD$6NTao2`Qlbgr7n{X`pTgkimXZd`A1P z6ifi~WzFubWt`c}!~0(r$Oo#noaorrwz{H#mG^YD%?_rS3lo2q%k2qfHc~e-QTUu{ zWWr;l&bxo2L{A6 zpc$$Q&a7aZ=`S^5=FwwDTiG{fTAa{P0E+>AleTGN&Gm*eIc8!R4ry-uX+WpU0lIOs tK)|%jT%F+C5zDr1^vO-0c?+mDU$Ss>;+dSqdccTd@O1TaS?83{1OS_=#2f$s literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanos/fees.png b/tests/snapshots/send_etc/nanos/fees.png new file mode 100644 index 0000000000000000000000000000000000000000..85a89604d99dbfa3cb09541671cda9ecc3f74e56 GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfe}cba4!+V0?QpuM9RO-ZL%{L?=Ji~`^?Qd7L(dK&s=B#q5RAnCvv3BjGPaH`o<&}mr|JNld8JoNTx?au5-;~GbewIXv8ZXevi4$&`fW}LV) zm52AlpJ_b2>@)W(0ade0N=>L#7k{_%p*K+Izf)VA1-(C=WRZ-BymEd z+ycg#=gr>vKI=O3DZ$93W?LaYQ1QY>pxO%?Y&v*&<#TnOD>)zbXF6qTB9pT3N&!&M z3dWi9&EBnj=ymuLi`0al9u7OFx80vqnaz8`W+_{Wop8XrwTVif&jYR3;ytm)i1F!7 zQ=gO!i4>qCfqpe|KCDm-Wb*LtR{=T`$TJ28kKEHk+7p0Y?mPqLwy~wK0ofM}OcabW z9iDmf0+pZOF#@XZFL)Sha%TzS%!Lnq%!RyR`IX+l PXlL+r^>bP0l+XkKp5EPW literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanox/accept.png b/tests/snapshots/send_etc/nanox/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2b8c89bd1a94620c388b2ac5599a5860918179 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}EWU|>q}ba4!+V0?R!F;Cf*f#Kl2 zz`9HS>x1^Ee)QO$Vfbu^0!v}qD!w`k`M$>q(WeXTJ`~u@;XhuuVeMlEKe= zblsz=UEx}KqN4T7AKeXEai{i!%hS0be`bg5)1I2%Y#ve=7`PK?+@eoir_xu}u(KC@ zO4CxCy1UCWb=8jGnOg6FCRYU^5c7u@_QxF*4>iefJ62pYe>kS>sng- zHXYoyg@4};pf2xLucNL{gFco6P0<5+2g=uDi=Wfg1@u|?!cS|Gf_{o>X-)6)bOl-% zvcd-FmwN}<<71Adht`B0T>=c@AEBb}pEc_PRnFAEv02=qn^cWuW6bfX(Mx8*RNi5Q7S*c4N9CR-H3X_(?fzps@T6PxSxy?d|U z_xbg`x0ve6z0|{$$z`>vm__J(e_?lE0G zAi0bGdZ+lnxBEWNGVl2`{%6UJXQyvpE4Wzn-e|aC?{wb8^_8OsR~Bx4QP|*isOuQt^m>}Nu7q+}3pf1Hn)V>OQKgpB zh<;sTrr2Cmi|ndPr%%kiDa;FspIMGSgx8c~oEeb?2VdjRIbXm66AXWR688v7s$VGQ zIg32k9m?@~Hjc>fF{3znxIq;*l&O)kR!%NCYwSns9?!DZ6L>7=`-P_`{Y*WSg{pk) zm|_M1F@MyG6Hrpr@@Gv&)n`6zF8(02BsC51Yx?1p7xE_TmyI`sa=nz!7r7v8XNS<^ zBBzF}TmnEcfrt%oC~kUya2Z0oMTJy!qYfJ2l!}#;b7MAMW&(X0VT=YeELmkYjqE`e zK`}d#YD1d{lM9av3fVhEhLot-qBcHiBtkW@LA3p-xCm7uHoa={ZZ<$@#AfsyCr!uF z5Bmit9~;EAG+LAg@%Fp63yOCEV$6*-R0lZB=`H$R6;N8TVlxfvjhx&G#2eJZXz`NaB*3)}Kzawuog$Rv*?LaC+eD)~z-shW{cTDt zkNTNFjT*6HIe`&Q>lHDIWI#ONQp3g}5qwIc9dHFTSJbBWQ{wysFCX_vEn5LNKd+Y( zmlh-J)XHzL`0I><-Fa7JJbdZ`CBArEVw<;yU>6vA>;1{jGBpe$kj#vO2#|>c9M~r_ z$qC|&Tr!sN+zV>U-*}b5^fowsq*(_xAVOLOX2%r`MnLVNFi(k+O>aZEhYZrTtU;3C zWboL=GcfqBRlgs!3L6C=`na&FFiLx^8Zo@SKsPX(!4L-$6$O~b0i4X_B4VtclZ^eK zq*@0-Sv?18Er6E%tVM^>kn;5P&P`P1Q%wm(3dM*iB{F0FcRPCS*4V_Zc zqN@M`GKfY!(sUj4@pOJR&b$ly02(@fTid1F9BX+h-GC{QA<57F{)8wvqkcBP|33!U b{Kq5wVK(&fFDI_STh8QkR98&ep6~t} z9p8du7?!TCD5KE39X$WxwOWmn1Q^Mwy*mO!mcJVrF+IjxmOtOudDnGGR zRj2)I%<0dl**?7KoPVmgyQ4n;`H%F*?xK~V=hl077qO+lMEFZi<5FYyVqNXikoY5g zp4#;OrO#`xKb|{3qji$y;&QU2rI65zO*&oN(h#_gvy9ShqI$s&Rxpu5CcK0qYPZRg z37ylS451lXX|53Rdr{yLWAl&`R4;^1F_b~+RLQT zTIV&%mB<1I#DN5_iVmV$=9m?0@|hi$%96J?PLJouj@HhFd=IhC@ykAB#A9>zBk9nve9 z2K1s!?)qKRDbeD9OhWI>i9GQ z5T*J!uX0Cvq(PkJRAvPIhaox2>Xvapzg7^qgK&^bzG1y2UM-1UC zvdG%7rGKn4%&5(>S%w&Ow0g}t)GCgo8O?d@s5i)7lehGD(LvR3h#{1+U?4kXN$5UH z<)g8ijMChZ>c2mL%e~n?OH#*;-?De%Eb*?UVr?CQHzIFo&;OSBZRejU#eK172QM$? Qqu&Qpmut&LRCO1A0sr2d*Z=?k literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanox/fees.png b/tests/snapshots/send_etc/nanox/fees.png new file mode 100644 index 0000000000000000000000000000000000000000..2a101cac282c517fb351101ed602b99cb4df331b GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}EWU|=fuba4!+V0?S9F<04~f#IO7 z)7+f@s=2yd9Df+a5B`%ls6Ng0oXnr1dW*j1T;1b;8`~d0{8u2ue%p%g!MVeK>z-Ha zu$MW0a9i8KqkkK7HQ5W&qpu}I-vXju@zBB`%g{L?|E6@MYrTJW?3=lk_Rf#YAuB>^ zmOS!GU1hN{WKPJwRgb)$h7>L}3XNI0XVF3FfWW|+T541KSJW(9^eDt|tDnm{r-UW|1^__O literal 0 HcmV?d00001 diff --git a/tests/snapshots/send_etc/nanox/review.png b/tests/snapshots/send_etc/nanox/review.png new file mode 100644 index 0000000000000000000000000000000000000000..8794afe436a71131138e8f80fe7d0d4eca0eb076 GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}EWU|@3aba4!+V0?S7Zd@yx<8LGD|NL^HOwMbIhRMr6+gQ$n z$QbOfoPT3l5rg{eO>DO>VIn!5Rge5qUD*pZP3XEG70O~b+m^~6IH{zir*(hjjumT?HZ15`uN79ppw7MWhwRj;G6zmJ zX}t>p31G2LNNZm)gL*#D!l%o%LhK@2Pu*plvu7pO)Rj)DzqfKt&HQjsOG`^nG(I#& z>m8U?E?O@7-eGByRLu%5(W#zGlU4=%T;=4N8nkjp$cm5{t&n?;t*5>`I2-DtRW52D z`Y}^0h?Z-ue|C^NaAm;G;F&;qYmldcfNZU0TvK;*O?@A-!benV@~M!8 zpS { +test("Transfer Ether on Ethereum app nanos", async () => { jest.setTimeout(TIMEOUT); const sim = new Zemu(NANOS_ELF_PATH); @@ -106,7 +106,103 @@ test("Transfer nanos", async () => { } }); -test("Transfer nanox", async () => { +test("Transfer on network 5234 on Ethereum nanos", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOS_ELF_PATH); + + try { + await sim.start(sim_options_nanos); + + let transport = await sim.getTransport(); + + let buffer = Buffer.from("058000002C8000003C800000010000000000000000EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818808214728080", "hex"); + + // Send transaction + let tx = transport.send(0xe0, 0x04, 0x00, 0x00, buffer); + let filename; + + 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); + const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(review).toEqual(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); + const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_1).toEqual(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); + const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_2).toEqual(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); + const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_3).toEqual(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); + const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_1).toEqual(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); + const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_2).toEqual(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); + const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_3).toEqual(expected_address_3); + + // Network + filename = "network.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOS + filename); + const network = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename); + const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(network).toEqual(expected_network); + + // Max Fees + filename = "fees.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOS + filename); + const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename); + const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(fees).toEqual(expected_fees); + + // Accept + filename = "accept.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOS + filename); + const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename); + const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(accept).toEqual(expected_accept); + + await sim.clickBoth(); + + await expect(tx).resolves.toEqual( + Buffer.from("08f3449bbc245669e26dd076986e11aa3117e2405ffe2ddc7a7e220f81326fbd91150515605c78119367be311345e9ff40c4e4ddb9ec0fd81f37035c3828f4c8b29000", 'hex') + ); + } finally { + await sim.close(); + } +}); + +test("Transfer Ether on Ethereum nanox", async () => { jest.setTimeout(TIMEOUT); const sim = new Zemu(NANOX_ELF_PATH); @@ -164,4 +260,73 @@ test("Transfer nanox", async () => { } finally { await sim.close(); } +}); + + +test("Transfer on network 5234 on Ethereum nanox", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOX_ELF_PATH); + + try { + await sim.start(sim_options_nanox); + + let transport = await sim.getTransport(); + + let buffer = Buffer.from("058000002C8000003C800000010000000000000000EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818808214728080", "hex"); + + // Send transaction + let tx = transport.send(0xe0, 0x04, 0x00, 0x00, buffer); + let filename; + + 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); + const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(review).toEqual(expected_review); + + // Amount + filename = "amount.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(amount).toEqual(expected_amount); + + // Address + filename = "address.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(address).toEqual(expected_address); + + // Network + filename = "network.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const network = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(network).toEqual(expected_network); + + // Max Fees + filename = "fees.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(fees).toEqual(expected_fees); + + // Accept + filename = "accept.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(accept).toEqual(expected_accept); + + await sim.clickBoth(); + + await expect(tx).resolves.toEqual( + Buffer.from("08f3449bbc245669e26dd076986e11aa3117e2405ffe2ddc7a7e220f81326fbd91150515605c78119367be311345e9ff40c4e4ddb9ec0fd81f37035c3828f4c8b29000", 'hex') + ); + } finally { + await sim.close(); + } }); \ No newline at end of file diff --git a/tests/src/send_bsc.test.js b/tests/src/send_bsc.test.js index dda50a3..028f6cb 100644 --- a/tests/src/send_bsc.test.js +++ b/tests/src/send_bsc.test.js @@ -83,8 +83,8 @@ test("Transfer bsc nanos", async () => { const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); expect(address_3).toEqual(expected_address_3); - // Chain ID - filename = "chainid.png"; + // Network name + filename = "network.png"; await sim.clickRight(SNAPSHOT_PATH_NANOS + filename); const chainid = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename); const expected_chainid = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); @@ -151,8 +151,8 @@ test("Transfer bsc nanox", async () => { const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); expect(address).toEqual(expected_address); - // Chain ID - filename = "chainid.png"; + // Network name + filename = "network.png"; await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); const chainid = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); const expected_chainid = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); diff --git a/tests/src/send_etc.test.js b/tests/src/send_etc.test.js new file mode 100644 index 0000000..39da31c --- /dev/null +++ b/tests/src/send_etc.test.js @@ -0,0 +1,208 @@ +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_ETH_LIB, NANOX_ETH_LIB, NANOS_CLONE_ELF_PATH, NANOX_CLONE_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT} = 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); + + try { + await sim.start(sim_options_nanos); + + let transport = await sim.getTransport(); + + let buffer = Buffer.from("058000002C8000003C800000010000000000000000EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818803D8080", "hex"); + + // Send transaction + let tx = transport.send(0xe0, 0x04, 0x00, 0x00, buffer); + let filename; + + 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); + const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(review).toEqual(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); + const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_1).toEqual(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); + const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_2).toEqual(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); + const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_3).toEqual(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); + const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_1).toEqual(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); + const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_2).toEqual(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); + const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_3).toEqual(expected_address_3); + + // Max Fees + filename = "fees.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOS + filename); + const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename); + const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(fees).toEqual(expected_fees); + + // Accept + filename = "accept.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOS + filename); + const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOS + filename); + const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(accept).toEqual(expected_accept); + + await sim.clickBoth(); + await expect(tx).resolves.toEqual( + Buffer.from("9e52b80e10cb82f3dc8345005e3da3f9cae1fb3f2b9a5df05b7cedba786c685fed381875af27d121beaa9efd8a7450975f9d45a26ba5aa331b7a8b26bcce95e6d09000", 'hex') + ); + } finally { + await sim.close(); + } +}); + +test("Transfer on network 5234 on Ethereum clone nanos", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOS_CLONE_ELF_PATH, NANOS_ETH_LIB); + + try { + await sim.start(sim_options_nanos); + + let transport = await sim.getTransport(); + + let buffer = Buffer.from("058000002C8000003C800000010000000000000000EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818808214728080", "hex"); + + // Send transaction + let tx = transport.send(0xe0, 0x04, 0x00, 0x00, buffer); + + await expect(tx).rejects.toEqual(new TransportStatusError(0x6a80)); + + } finally { + await sim.close(); + } +}); + +test("Transfer on Ethereum clone nanox", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOX_CLONE_ELF_PATH, NANOX_ETH_LIB); + + try { + await sim.start(sim_options_nanox); + + let transport = await sim.getTransport(); + let buffer = Buffer.from("058000002C8000003C800000010000000000000000EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818803D8080", "hex"); + + // Send transaction + let tx = transport.send(0xe0, 0x04, 0x00, 0x00, buffer); + let filename; + + 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); + const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(review).toEqual(expected_review); + + // Amount + filename = "amount.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const amount = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(amount).toEqual(expected_amount); + + // Address + filename = "address.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const address = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(address).toEqual(expected_address); + + // Max Fees + filename = "fees.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const fees = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(fees).toEqual(expected_fees); + + // Accept + filename = "accept.png"; + await sim.clickRight(SNAPSHOT_PATH_NANOX + filename); + const accept = Zemu.LoadPng2RGB(SNAPSHOT_PATH_NANOX + filename); + const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(accept).toEqual(expected_accept); + + await sim.clickBoth(); + + await expect(tx).resolves.toEqual( + Buffer.from("9e52b80e10cb82f3dc8345005e3da3f9cae1fb3f2b9a5df05b7cedba786c685fed381875af27d121beaa9efd8a7450975f9d45a26ba5aa331b7a8b26bcce95e6d09000", 'hex') + ); + } finally { + await sim.close(); + } +}); + + +test("Transfer on network 5234 on Ethereum clone nanox", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOX_CLONE_ELF_PATH, NANOX_ETH_LIB); + + try { + await sim.start(sim_options_nanox); + + let transport = await sim.getTransport(); + + let buffer = Buffer.from("058000002C8000003C800000010000000000000000EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818808214728080", "hex"); + + // Send transaction + let tx = transport.send(0xe0, 0x04, 0x00, 0x00, buffer); + + await expect(tx).rejects.toEqual(new TransportStatusError(0x6a80)); + } finally { + await sim.close(); + } +}); \ No newline at end of file