diff --git a/CHANGELOG.md b/CHANGELOG.md index 998ed50..f9e6b82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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.6](https://github.com/ledgerhq/app-ethereum/compare/1.9.5...1.9.6) - 2021-9-29 + +### Fixed + +- Fixed a bug where fees displayed were wrong on Starkware transactions + ## [1.9.5](https://github.com/ledgerhq/app-ethereum/compare/1.9.4...1.9.5) - 2021-9-27 ### Changed diff --git a/Makefile b/Makefile index 06a0e6a..25f8b61 100755 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'" APPVERSION_M=1 APPVERSION_N=9 -APPVERSION_P=5 +APPVERSION_P=6 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION) diff --git a/src/shared_context.h b/src/shared_context.h index 8631c35..09aa7d4 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -166,7 +166,7 @@ typedef enum { typedef struct txStringProperties_t { char fullAddress[43]; - char fullAmount[50]; + char fullAmount[67]; char maxFee[50]; char nonce[8]; // 10M tx per account ought to be enough for everybody char network_name[NETWORK_STRING_MAX_SIZE]; diff --git a/src_plugins/starkware/starkware_plugin.c b/src_plugins/starkware/starkware_plugin.c index 872ea0d..31abfb5 100644 --- a/src_plugins/starkware/starkware_plugin.c +++ b/src_plugins/starkware/starkware_plugin.c @@ -167,6 +167,9 @@ typedef struct starkware_parameters_t { } starkware_parameters_t; +#define STARK_KEY_LENGTH (2 + length * 2 + 1) +#define VAULT_ID_LENGTH 10 + bool is_deversify_contract(const uint8_t *address) { uint32_t offset = 0; uint8_t i; @@ -271,12 +274,21 @@ bool starkware_verify_nft_token_id(uint8_t *tokenId) { return true; } -void starkware_print_vault_id(uint32_t vaultId, char *destination) { - snprintf(destination, 10, "%d", vaultId); +void starkware_print_vault_id(uint32_t vaultId, char *destination, size_t max_length) { + if (VAULT_ID_LENGTH > max_length) { + os_sched_exit(EXCEPTION_OVERFLOW); + } + snprintf(destination, max_length, "%d", vaultId); } -void starkware_print_stark_key(uint8_t *starkKey, char *destination) { - snprintf(destination, 70, "0x%.*H", 32, starkKey); +void starkware_print_stark_key(uint8_t *starkKey, + size_t length, + char *destination, + size_t max_length) { + if (STARK_KEY_LENGTH > max_length) { + os_sched_exit(EXCEPTION_OVERFLOW); + } + snprintf(destination, max_length, "0x%.*H", length, starkKey); } // TODO : rewrite as independant code @@ -741,7 +753,10 @@ void starkware_plugin_call(int message, void *parameters) { case STARKWARE_WITHDRAW_NFT: case STARKWARE_WITHDRAW_NFT_TO: strlcpy(msg->title, "Master Account", msg->titleLength); - starkware_print_stark_key(context->starkKey, msg->msg); + starkware_print_stark_key(context->starkKey, + sizeof(context->starkKey), + msg->msg, + msg->msgLength); break; default: PRINTF("Unexpected screen %d for %d\n", @@ -758,7 +773,10 @@ void starkware_plugin_call(int message, void *parameters) { case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN: case STARKWARE_REGISTER_AND_DEPOSIT_ETH: strlcpy(msg->title, "Master Account", msg->titleLength); - starkware_print_stark_key(context->starkKey, msg->msg); + starkware_print_stark_key(context->starkKey, + sizeof(context->starkKey), + msg->msg, + msg->msgLength); break; case STARKWARE_DEPOSIT_TOKEN: @@ -772,7 +790,9 @@ void starkware_plugin_call(int message, void *parameters) { case STARKWARE_DEPOSIT_NFT: case STARKWARE_DEPOSIT_NFT_RECLAIM: strlcpy(msg->title, "Token Account", msg->titleLength); - starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg); + starkware_print_vault_id(U4BE(context->vaultId, 0), + msg->msg, + msg->msgLength); break; case STARKWARE_WITHDRAW: case STARKWARE_WITHDRAW_NFT: @@ -806,7 +826,9 @@ void starkware_plugin_call(int message, void *parameters) { switch (context->selectorIndex) { case STARKWARE_ESCAPE: strlcpy(msg->title, "Token Account", msg->titleLength); - starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg); + starkware_print_vault_id(U4BE(context->vaultId, 0), + msg->msg, + msg->msgLength); break; case STARKWARE_DEPOSIT_TOKEN: case STARKWARE_DEPOSIT_ETH: @@ -839,7 +861,9 @@ void starkware_plugin_call(int message, void *parameters) { case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN: case STARKWARE_REGISTER_AND_DEPOSIT_ETH: strlcpy(msg->title, "Token Account", msg->titleLength); - starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg); + starkware_print_vault_id(U4BE(context->vaultId, 0), + msg->msg, + msg->msgLength); break; default: @@ -858,7 +882,10 @@ void starkware_plugin_call(int message, void *parameters) { case STARKWARE_DEPOSIT_NFT: case STARKWARE_DEPOSIT_NFT_RECLAIM: strlcpy(msg->title, "TokenID", msg->titleLength); - starkware_print_stark_key(dataContext.tokenContext.quantum, msg->msg); + starkware_print_stark_key(dataContext.tokenContext.quantum, + sizeof(dataContext.tokenContext.quantum), + msg->msg, + msg->msgLength); break; case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN: diff --git a/tests/snapshots/nanos_disable_blind_signing/00001.png b/tests/snapshots/nanos_disable_blind_signing/00001.png index 78f3ae4..29a6bd3 100644 Binary files a/tests/snapshots/nanos_disable_blind_signing/00001.png and b/tests/snapshots/nanos_disable_blind_signing/00001.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00000.png b/tests/snapshots/nanos_starkware_usdt_deposit/00000.png new file mode 100644 index 0000000..2994983 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00000.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00001.png b/tests/snapshots/nanos_starkware_usdt_deposit/00001.png new file mode 100644 index 0000000..888cad3 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00001.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00002.png b/tests/snapshots/nanos_starkware_usdt_deposit/00002.png new file mode 100644 index 0000000..637a898 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00002.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00003.png b/tests/snapshots/nanos_starkware_usdt_deposit/00003.png new file mode 100644 index 0000000..ef02a09 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00003.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00004.png b/tests/snapshots/nanos_starkware_usdt_deposit/00004.png new file mode 100644 index 0000000..3372d18 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00004.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00005.png b/tests/snapshots/nanos_starkware_usdt_deposit/00005.png new file mode 100644 index 0000000..0805b33 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00005.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00006.png b/tests/snapshots/nanos_starkware_usdt_deposit/00006.png new file mode 100644 index 0000000..d7891ee Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00006.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00007.png b/tests/snapshots/nanos_starkware_usdt_deposit/00007.png new file mode 100644 index 0000000..5bf1130 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00007.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00008.png b/tests/snapshots/nanos_starkware_usdt_deposit/00008.png new file mode 100644 index 0000000..a0286ff Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00008.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00009.png b/tests/snapshots/nanos_starkware_usdt_deposit/00009.png new file mode 100644 index 0000000..c602bbd Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00009.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00010.png b/tests/snapshots/nanos_starkware_usdt_deposit/00010.png new file mode 100644 index 0000000..c81ed09 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00010.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00011.png b/tests/snapshots/nanos_starkware_usdt_deposit/00011.png new file mode 100644 index 0000000..d762697 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00011.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00012.png b/tests/snapshots/nanos_starkware_usdt_deposit/00012.png new file mode 100644 index 0000000..a595174 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00012.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00013.png b/tests/snapshots/nanos_starkware_usdt_deposit/00013.png new file mode 100644 index 0000000..3158ea6 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00013.png differ diff --git a/tests/snapshots/nanos_starkware_usdt_deposit/00014.png b/tests/snapshots/nanos_starkware_usdt_deposit/00014.png new file mode 100644 index 0000000..0bef4f3 Binary files /dev/null and b/tests/snapshots/nanos_starkware_usdt_deposit/00014.png differ diff --git a/tests/snapshots/nanox_disable_blind_signing/00001.png b/tests/snapshots/nanox_disable_blind_signing/00001.png index 77762c6..bf49b96 100644 Binary files a/tests/snapshots/nanox_disable_blind_signing/00001.png and b/tests/snapshots/nanox_disable_blind_signing/00001.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00000.png b/tests/snapshots/nanox_starkware_usdt_deposit/00000.png new file mode 100644 index 0000000..4a982c5 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00000.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00001.png b/tests/snapshots/nanox_starkware_usdt_deposit/00001.png new file mode 100644 index 0000000..c1ca56b Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00001.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00002.png b/tests/snapshots/nanox_starkware_usdt_deposit/00002.png new file mode 100644 index 0000000..0329541 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00002.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00003.png b/tests/snapshots/nanox_starkware_usdt_deposit/00003.png new file mode 100644 index 0000000..51b084f Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00003.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00004.png b/tests/snapshots/nanox_starkware_usdt_deposit/00004.png new file mode 100644 index 0000000..214f330 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00004.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00005.png b/tests/snapshots/nanox_starkware_usdt_deposit/00005.png new file mode 100644 index 0000000..b062f58 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00005.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00006.png b/tests/snapshots/nanox_starkware_usdt_deposit/00006.png new file mode 100644 index 0000000..5c759f5 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00006.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00007.png b/tests/snapshots/nanox_starkware_usdt_deposit/00007.png new file mode 100644 index 0000000..882d04d Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00007.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00008.png b/tests/snapshots/nanox_starkware_usdt_deposit/00008.png new file mode 100644 index 0000000..7d24221 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00008.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00009.png b/tests/snapshots/nanox_starkware_usdt_deposit/00009.png new file mode 100644 index 0000000..a2cb8f9 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00009.png differ diff --git a/tests/snapshots/nanox_starkware_usdt_deposit/00010.png b/tests/snapshots/nanox_starkware_usdt_deposit/00010.png new file mode 100644 index 0000000..7a77cb1 Binary files /dev/null and b/tests/snapshots/nanox_starkware_usdt_deposit/00010.png differ diff --git a/tests/src/contract_data_warning.test.js b/tests/src/contract_data_warning.test.js index 33fd434..2ebb16f 100644 --- a/tests/src/contract_data_warning.test.js +++ b/tests/src/contract_data_warning.test.js @@ -7,7 +7,7 @@ import Zemu from '@zondax/zemu'; test('[Nano S] Try to blind sign with setting disabled', zemu("nanos", async (sim, eth) => { // disable blind signing - await sim.navigateAndCompareSnapshots('.', 'nanos_disable_blind_signing', [2, 0, 0, 3, 0]); + await sim.navigateAndCompareSnapshots('.', 'nanos_disable_blind_signing', [-2, 0, 0, 3, 0]); // we can't use eth.signTransaction because it detects that contract data is disabled and fails early let transport = await sim.getTransport(); @@ -23,7 +23,7 @@ test('[Nano S] Try to blind sign with setting disabled', zemu("nanos", async (si test('[Nano X] Try to blind sign with setting disabled', zemu("nanox", async (sim, eth) => { // disable blind signing - await sim.navigateAndCompareSnapshots('.', 'nanox_disable_blind_signing', [2, 0, 0, 3, 0]); + await sim.navigateAndCompareSnapshots('.', 'nanox_disable_blind_signing', [-2, 0, 0, 3, 0]); // we can't use eth.signTransaction because it detects that contract data is disabled and fails early let transport = await sim.getTransport(); diff --git a/tests/src/starkware.test.js b/tests/src/starkware.test.js new file mode 100644 index 0000000..84bb16e --- /dev/null +++ b/tests/src/starkware.test.js @@ -0,0 +1,65 @@ +import "core-js/stable"; +import "regenerator-runtime/runtime"; +import { waitForAppScreen, zemu } from './test.fixture'; +import { byContractAddressAndChainId } from '@ledgerhq/hw-app-eth/erc20' +import { BigNumber } from "bignumber.js"; + +test('[Nano S] Transfer Ether on Ethereum app', zemu("nanos", async (sim, eth) => { + + // Provide USDT token info to the app + const usdt_info = byContractAddressAndChainId("0xdac17f958d2ee523a2206206994597c13d831ec7", 1); + await eth.provideERC20TokenInformation(usdt_info); + + // Provide Stark quantum + const quantization = new BigNumber(1); + await eth.starkProvideQuantum_v2( + "0xdac17f958d2ee523a2206206994597c13d831ec7", + "erc20", + quantization, + null + ) + + const tx = eth.signTransaction( + "44'/60'/1'/0/0", + 'f8b5018a0472698b413b43200000825208940102030405060708090a0b0c0d0e0f1011121314872bd72a24874000b8842505c3d9010101010101010102020202020202020303030303030303040404040404040402ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000030d40808080', + ); + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots('.', 'nanos_starkware_usdt_deposit', [13, 0]); + + await expect(tx).resolves.toEqual({ + "r": "14c368c0d32e399470d6113cf796c5f4cd70300766337d8b0ba71ecad21b3d52", + "s": "4207c027959e84fc2242a1f4fd955603f137ba28f67268ffc91fef5d65071b0a", + "v": "1c", + }); +})); + +test('[Nano X] Transfer Ether on Ethereum app', zemu("nanox", async (sim, eth) => { + + // Provide USDT token info to the app + const usdt_info = byContractAddressAndChainId("0xdac17f958d2ee523a2206206994597c13d831ec7", 1); + await eth.provideERC20TokenInformation(usdt_info); + + // Provide Stark quantum + const quantization = new BigNumber(1); + await eth.starkProvideQuantum_v2( + "0xdac17f958d2ee523a2206206994597c13d831ec7", + "erc20", + quantization, + null + ) + + const tx = eth.signTransaction( + "44'/60'/1'/0/0", + 'f8b5018a0472698b413b43200000825208940102030405060708090a0b0c0d0e0f1011121314872bd72a24874000b8842505c3d9010101010101010102020202020202020303030303030303040404040404040402ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000030d40808080', + ); + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots('.', 'nanox_starkware_usdt_deposit', [9, 0]); + + await expect(tx).resolves.toEqual({ + "r": "14c368c0d32e399470d6113cf796c5f4cd70300766337d8b0ba71ecad21b3d52", + "s": "4207c027959e84fc2242a1f4fd955603f137ba28f67268ffc91fef5d65071b0a", + "v": "1c", + }); +}));