diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index b82c6a5..accc232 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -3,6 +3,7 @@ #include "eth_plugin_internal.h" #include "shared_context.h" #include "network.h" +#include "ethUtils.h" void eth_plugin_prepare_init(ethPluginInitContract_t *init, uint8_t *selector, uint32_t dataSize) { memset((uint8_t *) init, 0, sizeof(ethPluginInitContract_t)); diff --git a/src/shared_context.h b/src/shared_context.h index 035f7c2..43dc533 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -10,7 +10,6 @@ #include "cx.h" #include "os_io_seproxyhal.h" #include "ethUstream.h" -#include "ethUtils.h" #include "uint256.h" #include "tokens.h" #include "chainConfig.h" diff --git a/src/stark_crypto.c b/src/stark_crypto.c index 990216a..8f33a01 100644 --- a/src/stark_crypto.c +++ b/src/stark_crypto.c @@ -4,6 +4,7 @@ #include "stark_utils.h" #include "ui_callbacks.h" #include "utils.h" +#include "ethUtils.h" static unsigned char const C_cx_Stark256_n[] = { // n: 0x0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f @@ -16,13 +17,13 @@ static unsigned char const STARK_DERIVE_BIAS[] = { 0x38, 0xa1, 0x3b, 0x4b, 0x92, 0x0e, 0x94, 0x11, 0xae, 0x6d, 0xa5, 0xf4, 0x0b, 0x03, 0x58, 0xb1}; void starkDerivePrivateKey(uint32_t *bip32Path, uint32_t bip32PathLength, uint8_t *privateKeyData) { -#if 0 - // Sanity check +#if 0 + // Sanity check if (bip32Path[0] != STARK_BIP32_PATH_0) { PRINTF("Invalid Stark derivation path %d\n", bip32Path[0]); THROW(0x6a80); } - os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, privateKeyData, NULL); + os_perso_derive_node_bip32(CX_CURVE_256K1, bip32Path, bip32PathLength, privateKeyData, NULL); PRINTF("Private key before processing %.*H\n", 32, privateKeyData); // TODO - support additional schemes cx_math_modm(privateKeyData, 32, C_cx_Stark256_n, 32); diff --git a/src_common/ethUtils.c b/src_common/ethUtils.c index eb9ddf6..d3c71b0 100644 --- a/src_common/ethUtils.c +++ b/src_common/ethUtils.c @@ -237,6 +237,12 @@ void getEthDisplayableAddress(uint8_t *in, getEthAddressStringFromBinary(in, out + 2, sha3, chainId); } +uint8_t *getNftContractAddress(const ethQueryContractUI_t *const msg) { + // In case of no PROVIDE_NFT_INFO, we already have the address from the SET_PLUGIN + return ((msg->item1) ? ((uint8_t *) msg->item1->nft.contractAddress) + : msg->pluginSharedRO->txContent->destination); +} + bool adjustDecimals(char *src, uint32_t srcLength, char *target, diff --git a/src_common/ethUtils.h b/src_common/ethUtils.h index 2f66b29..af88517 100644 --- a/src_common/ethUtils.h +++ b/src_common/ethUtils.h @@ -22,6 +22,8 @@ #include "cx.h" #include "chainConfig.h" +#include "eth_plugin_interface.h" + /** * @brief Decode an RLP encoded field - see * https://github.com/ethereum/wiki/wiki/RLP @@ -57,6 +59,8 @@ void getEthDisplayableAddress(uint8_t *in, cx_sha3_t *sha3, uint64_t chainId); +uint8_t *getNftContractAddress(const ethQueryContractUI_t *const msg); + bool adjustDecimals(char *src, uint32_t srcLength, char *target, diff --git a/src_features/getPublicKey/cmd_getPublicKey.c b/src_features/getPublicKey/cmd_getPublicKey.c index ef521c4..59c9fb8 100644 --- a/src_features/getPublicKey/cmd_getPublicKey.c +++ b/src_features/getPublicKey/cmd_getPublicKey.c @@ -3,6 +3,7 @@ #include "ui_flow.h" #include "feature_getPublicKey.h" +#include "ethUtils.h" void handleGetPublicKey(uint8_t p1, uint8_t p2, diff --git a/src_features/setPlugin/cmd_setPlugin.c b/src_features/setPlugin/cmd_setPlugin.c index 7615812..58ad8bf 100644 --- a/src_features/setPlugin/cmd_setPlugin.c +++ b/src_features/setPlugin/cmd_setPlugin.c @@ -227,7 +227,7 @@ void handleSetPlugin(uint8_t p1, } uint8_t signatureLen = workBuffer[offset]; - PRINTF("Sigature len: %d\n", signatureLen); + PRINTF("Signature len: %d\n", signatureLen); if (signatureLen < MIN_DER_SIG_SIZE || signatureLen > MAX_DER_SIG_SIZE) { PRINTF("SignatureLen too big or too small. Must be between %d and %d, got %d\n", MIN_DER_SIG_SIZE, diff --git a/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c b/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c index 4d390dd..1796fe5 100644 --- a/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c +++ b/src_features/stark_provideQuantum/cmd_stark_provideQuantum.c @@ -3,6 +3,7 @@ #include "shared_context.h" #include "apdu_constants.h" #include "ui_flow.h" +#include "ethUtils.h" void handleStarkwareProvideQuantum(uint8_t p1, __attribute__((unused)) uint8_t p2, diff --git a/src_features/stark_sign/cmd_stark_sign.c b/src_features/stark_sign/cmd_stark_sign.c index 9329838..58ca944 100644 --- a/src_features/stark_sign/cmd_stark_sign.c +++ b/src_features/stark_sign/cmd_stark_sign.c @@ -6,6 +6,7 @@ #include "ui_flow.h" #include "poorstream.h" #include "ui_callbacks.h" +#include "ethUtils.h" #define U8BE(buf, off) \ (uint64_t)((((uint64_t) U4BE(buf, off)) << 32) | (((uint64_t) U4BE(buf, off + 4)) & 0xFFFFFFFF)) diff --git a/src_features/stark_sign/ui_flow_stark_sign.c b/src_features/stark_sign/ui_flow_stark_sign.c index 4ef5ddc..23c9319 100644 --- a/src_features/stark_sign/ui_flow_stark_sign.c +++ b/src_features/stark_sign/ui_flow_stark_sign.c @@ -2,6 +2,7 @@ #include "shared_context.h" #include "ui_callbacks.h" +#include "ethUtils.h" unsigned int io_seproxyhal_touch_stark_ok(const bagl_element_t *e); diff --git a/src_plugins/compound/compound_plugin.c b/src_plugins/compound/compound_plugin.c index a933d89..cbb68dd 100644 --- a/src_plugins/compound/compound_plugin.c +++ b/src_plugins/compound/compound_plugin.c @@ -3,6 +3,7 @@ #include "shared_context.h" // TODO : rewrite as independant code #include "eth_plugin_internal.h" // TODO : rewrite as independant code #include "utils.h" +#include "ethUtils.h" typedef enum { COMPOUND_REDEEM_UNDERLYING = 0, diff --git a/src_plugins/erc1155/erc1155_plugin.c b/src_plugins/erc1155/erc1155_plugin.c index dbc1b8e..ea65515 100644 --- a/src_plugins/erc1155/erc1155_plugin.c +++ b/src_plugins/erc1155/erc1155_plugin.c @@ -63,10 +63,12 @@ static void handle_finalize(void *parameters) { case SAFE_TRANSFER: msg->numScreens = 5; break; - case SET_APPROVAL_FOR_ALL: case SAFE_BATCH_TRANSFER: msg->numScreens = 4; break; + case SET_APPROVAL_FOR_ALL: + msg->numScreens = 3; + break; default: msg->result = ETH_PLUGIN_RESULT_ERROR; return; diff --git a/src_plugins/erc1155/erc1155_ui.c b/src_plugins/erc1155/erc1155_ui.c index 5b4e941..e2679d4 100644 --- a/src_plugins/erc1155/erc1155_ui.c +++ b/src_plugins/erc1155/erc1155_ui.c @@ -26,7 +26,7 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc1155_context_t break; case 2: strlcpy(msg->title, "NFT Address", msg->titleLength); - getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination, + getEthDisplayableAddress(getNftContractAddress(msg), msg->msg, msg->msgLength, &global_sha3, @@ -59,7 +59,7 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex break; case 2: strlcpy(msg->title, "NFT Address", msg->titleLength); - getEthDisplayableAddress((uint8_t *) msg->item1->nft.contractAddress, + getEthDisplayableAddress(getNftContractAddress(msg), msg->msg, msg->msgLength, &global_sha3, @@ -105,7 +105,7 @@ static void set_batch_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t * break; case 2: strlcpy(msg->title, "NFT Address", msg->titleLength); - getEthDisplayableAddress((uint8_t *) msg->item1->nft.contractAddress, + getEthDisplayableAddress(getNftContractAddress(msg), msg->msg, msg->msgLength, &global_sha3, diff --git a/src_plugins/erc721/erc721_ui.c b/src_plugins/erc721/erc721_ui.c index e312932..ce0c4f5 100644 --- a/src_plugins/erc721/erc721_ui.c +++ b/src_plugins/erc721/erc721_ui.c @@ -13,16 +13,16 @@ static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context chainConfig->chainId); break; case 1: - strlcpy(msg->title, "To Spend Your", msg->titleLength); + strlcpy(msg->title, "To Manage Your", msg->titleLength); if (msg->item1) { strlcpy(msg->msg, (const char *) &msg->item1->nft.collectionName, msg->msgLength); } else { - strlcpy(msg->msg, "Not found", msg->msgLength); + strlcpy(msg->msg, "Not Found", msg->msgLength); } break; case 2: strlcpy(msg->title, "NFT Address", msg->titleLength); - getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination, + getEthDisplayableAddress(getNftContractAddress(msg), msg->msg, msg->msgLength, &global_sha3, @@ -35,14 +35,6 @@ static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context msg->msg, msg->msgLength); break; - case 4: - strlcpy(msg->title, "And send", msg->titleLength); - amountToString((uint8_t *) &msg->pluginSharedRO->txContent->value, - sizeof(msg->pluginSharedRO->txContent->value), - WEI_TO_ETHER, - msg->network_ticker, - msg->msg, - msg->msgLength); default: PRINTF("Unsupported screen index %d\n", msg->screenIndex); msg->result = ETH_PLUGIN_RESULT_ERROR; @@ -74,20 +66,12 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc721_context_t break; case 2: strlcpy(msg->title, "NFT Address", msg->titleLength); - getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination, + getEthDisplayableAddress(getNftContractAddress(msg), msg->msg, msg->msgLength, &global_sha3, chainConfig->chainId); break; - case 3: - strlcpy(msg->title, "And send", msg->titleLength); - amountToString((uint8_t *) &msg->pluginSharedRO->txContent->value, - sizeof(msg->pluginSharedRO->txContent->value), - WEI_TO_ETHER, - msg->network_ticker, - msg->msg, - msg->msgLength); default: PRINTF("Unsupported screen index %d\n", msg->screenIndex); msg->result = ETH_PLUGIN_RESULT_ERROR; @@ -115,7 +99,7 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc721_context_t *context break; case 2: strlcpy(msg->title, "NFT Address", msg->titleLength); - getEthDisplayableAddress((uint8_t *) msg->item1->nft.contractAddress, + getEthDisplayableAddress(getNftContractAddress(msg), msg->msg, msg->msgLength, &global_sha3, @@ -128,14 +112,6 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc721_context_t *context msg->msg, msg->msgLength); break; - case 4: - strlcpy(msg->title, "And send", msg->titleLength); - amountToString((uint8_t *) &msg->pluginSharedRO->txContent->value, - sizeof(msg->pluginSharedRO->txContent->value), - WEI_TO_ETHER, - msg->network_ticker, - msg->msg, - msg->msgLength); default: PRINTF("Unsupported screen index %d\n", msg->screenIndex); msg->result = ETH_PLUGIN_RESULT_ERROR; diff --git a/src_plugins/starkware/starkware_plugin.c b/src_plugins/starkware/starkware_plugin.c index f4ba5f1..104675b 100644 --- a/src_plugins/starkware/starkware_plugin.c +++ b/src_plugins/starkware/starkware_plugin.c @@ -4,6 +4,7 @@ #include "eth_plugin_internal.h" // TODO : rewrite as independant code #include "stark_utils.h" #include "utils.h" +#include "ethUtils.h" #ifdef HAVE_STARKWARE diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00000.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00000.png new file mode 120000 index 0000000..a808e25 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00000.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00000.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00001.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00001.png new file mode 120000 index 0000000..18b62b5 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00001.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00001.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00002.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00002.png new file mode 120000 index 0000000..3ba3b50 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00002.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00002.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00003.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00003.png new file mode 100644 index 0000000..b34af53 Binary files /dev/null and b/tests/snapshots/nanox_erc1155_transfer_wo_info/00003.png differ diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00004.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00004.png new file mode 120000 index 0000000..d5f5958 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00004.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00004.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00005.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00005.png new file mode 120000 index 0000000..0d2033d --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00005.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00005.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00006.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00006.png new file mode 120000 index 0000000..ce62159 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00006.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00006.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00007.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00007.png new file mode 120000 index 0000000..e9c683a --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00007.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00007.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00008.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00008.png new file mode 120000 index 0000000..8dc9044 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00008.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00008.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00009.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00009.png new file mode 120000 index 0000000..8293fcb --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00009.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00009.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00010.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00010.png new file mode 120000 index 0000000..76c0110 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00010.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00010.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00011.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00011.png new file mode 120000 index 0000000..e2f4374 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00011.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00011.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc1155_transfer_wo_info/00012.png b/tests/snapshots/nanox_erc1155_transfer_wo_info/00012.png new file mode 120000 index 0000000..24a2c61 --- /dev/null +++ b/tests/snapshots/nanox_erc1155_transfer_wo_info/00012.png @@ -0,0 +1 @@ +../nanox_erc1155_transfer/00012.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00000.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00000.png new file mode 120000 index 0000000..eaca370 --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00000.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00000.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00001.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00001.png new file mode 120000 index 0000000..3f02420 --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00001.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00001.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00002.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00002.png new file mode 120000 index 0000000..55b219f --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00002.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00002.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00003.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00003.png new file mode 100644 index 0000000..b34af53 Binary files /dev/null and b/tests/snapshots/nanox_erc721_transfer_wo_info/00003.png differ diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00004.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00004.png new file mode 120000 index 0000000..4e66c9a --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00004.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00004.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00005.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00005.png new file mode 120000 index 0000000..b538cb6 --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00005.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00005.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00006.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00006.png new file mode 120000 index 0000000..9d4b343 --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00006.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00006.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00007.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00007.png new file mode 120000 index 0000000..8851ec8 --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00007.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00007.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00008.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00008.png new file mode 120000 index 0000000..7faf831 --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00008.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00008.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00009.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00009.png new file mode 120000 index 0000000..d3f938b --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00009.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00009.png \ No newline at end of file diff --git a/tests/snapshots/nanox_erc721_transfer_wo_info/00010.png b/tests/snapshots/nanox_erc721_transfer_wo_info/00010.png new file mode 120000 index 0000000..8e81364 --- /dev/null +++ b/tests/snapshots/nanox_erc721_transfer_wo_info/00010.png @@ -0,0 +1 @@ +../nanox_erc721_transfer/00010.png \ No newline at end of file diff --git a/tests/src/erc1155.test.js b/tests/src/erc1155.test.js index a0117ca..471cb91 100644 --- a/tests/src/erc1155.test.js +++ b/tests/src/erc1155.test.js @@ -1,48 +1,71 @@ import "core-js/stable"; import "regenerator-runtime/runtime"; import Zemu from '@zondax/zemu'; +import { TransportStatusError } from "@ledgerhq/errors"; import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture'; +// Only LNX const model = nano_models[1]; -test('[Nano ' + model.letter + '] Transfer ERC-1155', zemu(model, async (sim, eth) => { +{ + const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5ef242432a00000000000000010001473045022100ec4377d17e8d98d424bf16b29c691bc1a010825fb5b8a35de0268a9dc22eab2402206701b016fe6718bf519d18cc12e9838e9ef898cc4c143017839023c3260b2d74'); + const provide_nft_info = apdu_as_string('e01400007b0101124f70656e53656120436f6c6c656374696f6e495f947276749ce646f68ac8c248420045cb7b5e0000000000000001000147304502210083e357a828f13d574b1296214a3749c194ab1df1f8a243655c053b1c72f91e0c02201ed93cfac7e87759445c4da2e4bfd6e1cf0405ea37c7293bc965948f51bef5cc'); + const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f901090b8520b673dd0082bcb394495f947276749ce646f68ac8c248420045cb7b5e80b8e4f242432a0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596cabf06640f8ca8fc5e0ed471b10befcdf65a33e4300000000'); + const sign_more = apdu_as_string('e00480008b00006a0000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080'); - const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5ef242432a00000000000000010001473045022100ec4377d17e8d98d424bf16b29c691bc1a010825fb5b8a35de0268a9dc22eab2402206701b016fe6718bf519d18cc12e9838e9ef898cc4c143017839023c3260b2d74'); - const provide_nft_info = apdu_as_string('e01400007b0101124f70656e53656120436f6c6c656374696f6e495f947276749ce646f68ac8c248420045cb7b5e0000000000000001000147304502210083e357a828f13d574b1296214a3749c194ab1df1f8a243655c053b1c72f91e0c02201ed93cfac7e87759445c4da2e4bfd6e1cf0405ea37c7293bc965948f51bef5cc'); - const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f901090b8520b673dd0082bcb394495f947276749ce646f68ac8c248420045cb7b5e80b8e4f242432a0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596cabf06640f8ca8fc5e0ed471b10befcdf65a33e4300000000'); - const sign_more = apdu_as_string('e00480008b00006a0000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080'); + test('[Nano ' + model.letter + '] Transfer ERC-1155', zemu(model, async (sim, eth) => { + const current_screen = sim.getMainMenuSnapshot(); + await send_apdu(eth.transport, set_plugin); + await send_apdu(eth.transport, provide_nft_info); + await send_apdu(eth.transport, sign_first); + let sign_promise = send_apdu(eth.transport, sign_more); - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - await send_apdu(eth.transport, provide_nft_info); - await send_apdu(eth.transport, sign_first); - let sign_promise = send_apdu(eth.transport, sign_more); + await waitForAppScreen(sim, current_screen); + await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_transfer', [10, -1, 0]); - await waitForAppScreen(sim, current_screen); - await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_transfer', [10, -1, 0]); + await sign_promise; + })); - await sign_promise; -})); + test('[Nano ' + model.letter + '] Transfer ERC-1155 w/o PROVIDE_NFT_INFORMATION', zemu(model, async (sim, eth) => { + const current_screen = sim.getMainMenuSnapshot(); + await send_apdu(eth.transport, set_plugin); + await send_apdu(eth.transport, sign_first); + let sign_promise = send_apdu(eth.transport, sign_more); + + await waitForAppScreen(sim, current_screen); + await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_transfer_wo_info', [10, -1, 0]); + + await sign_promise; + })); + + test('[Nano ' + model.letter + '] Transfer ERC-1155 w/o SET_PLUGIN', zemu(model, async (sim, eth) => { + const current_screen = sim.getMainMenuSnapshot(); + await send_apdu(eth.transport, provide_nft_info); + let sign_tx = send_apdu(eth.transport, sign_first); + + await expect(sign_tx).rejects.toEqual(new TransportStatusError(0x6a80)); + })); +} test('[Nano ' + model.letter + '] Batch transfer ERC-1155', zemu(model, async (sim, eth) => { - const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5e2eb2c2d60000000000000001000147304502210087b35cefc53fd94e25404933eb0d5ff08f20ba655d181de3b24ff0099dc3317f02204a216aa9e0b84bef6e20fcb036bd49647bf0cab66732b99b49ec277ffb682aa1'); - const provide_nft_info = apdu_as_string('e0140000820101194f70656e536561205368617265642053746f726566726f6e74495f947276749ce646f68ac8c248420045cb7b5e00000000000000010001473045022100c74cd613a27a9f4887210f5a3a0e12745e1ba0ab3a0d284cb6485d89c3cce4e602205a13e62a91164985cf58a838f8f531c0b91b980d206a5ba8df28270023ef93a3'); - const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f9020b0e850d8cfd86008301617d94495f947276749ce646f68ac8c248420045cb7b5e80b901e42eb2c2d60000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c00000000000000000000000000000000000000000000'); - const sign_more_1 = apdu_as_string('e004800096000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a0000000064def9d99ff495856496c028c0'); - const sign_more_2 = apdu_as_string('e00480009689732473fcd0bbbe000000000000a30000000001abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a00000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000'); - const sign_more_3 = apdu_as_string('e00480006100000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080'); + const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5e2eb2c2d60000000000000001000147304502210087b35cefc53fd94e25404933eb0d5ff08f20ba655d181de3b24ff0099dc3317f02204a216aa9e0b84bef6e20fcb036bd49647bf0cab66732b99b49ec277ffb682aa1'); + const provide_nft_info = apdu_as_string('e0140000820101194f70656e536561205368617265642053746f726566726f6e74495f947276749ce646f68ac8c248420045cb7b5e00000000000000010001473045022100c74cd613a27a9f4887210f5a3a0e12745e1ba0ab3a0d284cb6485d89c3cce4e602205a13e62a91164985cf58a838f8f531c0b91b980d206a5ba8df28270023ef93a3'); + const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f9020b0e850d8cfd86008301617d94495f947276749ce646f68ac8c248420045cb7b5e80b901e42eb2c2d60000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c00000000000000000000000000000000000000000000'); + const sign_more_1 = apdu_as_string('e004800096000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a0000000064def9d99ff495856496c028c0'); + const sign_more_2 = apdu_as_string('e00480009689732473fcd0bbbe000000000000a30000000001abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a00000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000'); + const sign_more_3 = apdu_as_string('e00480006100000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080'); - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - await send_apdu(eth.transport, provide_nft_info); - await send_apdu(eth.transport, sign_first); - await send_apdu(eth.transport, sign_more_1); - await send_apdu(eth.transport, sign_more_2); - let sign_promise = send_apdu(eth.transport, sign_more_3); + const current_screen = sim.getMainMenuSnapshot(); + await send_apdu(eth.transport, set_plugin); + await send_apdu(eth.transport, provide_nft_info); + await send_apdu(eth.transport, sign_first); + await send_apdu(eth.transport, sign_more_1); + await send_apdu(eth.transport, sign_more_2); + let sign_promise = send_apdu(eth.transport, sign_more_3); - await waitForAppScreen(sim, current_screen); - await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_batch_transfer', [8, -1, 0]); + await waitForAppScreen(sim, current_screen); + await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_batch_transfer', [8, -1, 0]); - await sign_promise; + await sign_promise; })); diff --git a/tests/src/erc721.test.js b/tests/src/erc721.test.js index 1b9f575..9dca820 100644 --- a/tests/src/erc721.test.js +++ b/tests/src/erc721.test.js @@ -1,25 +1,46 @@ import "core-js/stable"; import "regenerator-runtime/runtime"; import Zemu from '@zondax/zemu'; +import { TransportStatusError } from "@ledgerhq/errors"; import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture'; +// Only LNX const model = nano_models[1]; +const set_plugin = apdu_as_string('e01600007301010645524337323160f80121c31a0d46b5279700f9df786054aa5ee542842e0e0000000000000001000147304502202e2282d7d3ea714da283010f517af469e1d59654aaee0fc438f017aa557eaea50221008b369679381065bbe01135723a4f9adb229295017d37c4d30138b90a51cf6ab6'); +const provide_nft_info = apdu_as_string('e01400007001010752617269626c6560f80121c31a0d46b5279700f9df786054aa5ee500000000000000010001473045022025696986ef5f0ee2f72d9c6e41d7e2bf2e4f06373ab26d73ebe326c7fd4c7a6602210084f6b064d8750ae68ed5dd012296f37030390ec06ff534c5da6f0f4a4460af33'); +const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f88a0a852c3ce1ec008301f5679460f80121c31a0d46b5279700f9df786054aa5ee580b86442842e0e0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c000000000000000000000000000000000000000000000000'); +const sign_more = apdu_as_string('e00480000b0000000000112999018080'); + test('[Nano ' + model.letter + '] Transfer ERC-721', zemu(model, async (sim, eth) => { + const current_screen = sim.getMainMenuSnapshot(); + await send_apdu(eth.transport, set_plugin); + await send_apdu(eth.transport, provide_nft_info); + await send_apdu(eth.transport, sign_first); + let sign_promise = send_apdu(eth.transport, sign_more); - const set_plugin = apdu_as_string('e01600007301010645524337323160f80121c31a0d46b5279700f9df786054aa5ee542842e0e0000000000000001000147304502202e2282d7d3ea714da283010f517af469e1d59654aaee0fc438f017aa557eaea50221008b369679381065bbe01135723a4f9adb229295017d37c4d30138b90a51cf6ab6'); - const provide_nft_info = apdu_as_string('e01400007001010752617269626c6560f80121c31a0d46b5279700f9df786054aa5ee500000000000000010001473045022025696986ef5f0ee2f72d9c6e41d7e2bf2e4f06373ab26d73ebe326c7fd4c7a6602210084f6b064d8750ae68ed5dd012296f37030390ec06ff534c5da6f0f4a4460af33'); - const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f88a0a852c3ce1ec008301f5679460f80121c31a0d46b5279700f9df786054aa5ee580b86442842e0e0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c000000000000000000000000000000000000000000000000'); - const sign_more = apdu_as_string('e00480000b0000000000112999018080'); + await waitForAppScreen(sim, current_screen); + await sim.navigateAndCompareSnapshots('.', model.name + '_erc721_transfer', [8, -1, 0]); - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - await send_apdu(eth.transport, provide_nft_info); - await send_apdu(eth.transport, sign_first); - let sign_promise = send_apdu(eth.transport, sign_more); - - await waitForAppScreen(sim, current_screen); - await sim.navigateAndCompareSnapshots('.', model.name + '_erc721_transfer', [8, -1, 0]); - - await sign_promise; + await sign_promise; +})); + +test('[Nano ' + model.letter + '] Transfer ERC-721 w/o NFT_PROVIDE_INFORMATION', zemu(model, async(sim, eth) => { + const current_screen = sim.getMainMenuSnapshot(); + await send_apdu(eth.transport, set_plugin); + await send_apdu(eth.transport, sign_first); + let sign_promise = send_apdu(eth.transport, sign_more); + + await waitForAppScreen(sim, current_screen); + await sim.navigateAndCompareSnapshots('.', model.name + '_erc721_transfer_wo_info', [8, -1, 0]); + + await sign_promise; +})); + +test('[Nano ' + model.letter + '] Transfer ERC-721 w/o SET_PLUGIN', zemu(model, async (sim, eth) => { + const current_screen = sim.getMainMenuSnapshot(); + await send_apdu(eth.transport, provide_nft_info); + let sign_tx = send_apdu(eth.transport, sign_first); + + await expect(sign_tx).rejects.toEqual(new TransportStatusError(0x6a80)); })); diff --git a/tests/src/test.fixture.js b/tests/src/test.fixture.js index beffd71..c29dbad 100644 --- a/tests/src/test.fixture.js +++ b/tests/src/test.fixture.js @@ -50,11 +50,11 @@ function apdu_as_string(str) { } async function send_apdu(ts, apdu) { - await ts.send(apdu.cla, - apdu.ins, - apdu.p1, - apdu.p2, - apdu.data); + return ts.send(apdu.cla, + apdu.ins, + apdu.p1, + apdu.p2, + apdu.data); } // Generates a serializedTransaction from a rawHexTransaction copy pasted from etherscan.