Merge pull request #247 from LedgerHQ/apr/bugfix/no_nft_info_crash
Fix NFT transaction crash
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
#include "eth_plugin_internal.h"
|
#include "eth_plugin_internal.h"
|
||||||
#include "shared_context.h"
|
#include "shared_context.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
void eth_plugin_prepare_init(ethPluginInitContract_t *init, uint8_t *selector, uint32_t dataSize) {
|
void eth_plugin_prepare_init(ethPluginInitContract_t *init, uint8_t *selector, uint32_t dataSize) {
|
||||||
memset((uint8_t *) init, 0, sizeof(ethPluginInitContract_t));
|
memset((uint8_t *) init, 0, sizeof(ethPluginInitContract_t));
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "cx.h"
|
#include "cx.h"
|
||||||
#include "os_io_seproxyhal.h"
|
#include "os_io_seproxyhal.h"
|
||||||
#include "ethUstream.h"
|
#include "ethUstream.h"
|
||||||
#include "ethUtils.h"
|
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
#include "tokens.h"
|
#include "tokens.h"
|
||||||
#include "chainConfig.h"
|
#include "chainConfig.h"
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "stark_utils.h"
|
#include "stark_utils.h"
|
||||||
#include "ui_callbacks.h"
|
#include "ui_callbacks.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
static unsigned char const C_cx_Stark256_n[] = {
|
static unsigned char const C_cx_Stark256_n[] = {
|
||||||
// n: 0x0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f
|
// n: 0x0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f
|
||||||
|
|||||||
@@ -237,6 +237,12 @@ void getEthDisplayableAddress(uint8_t *in,
|
|||||||
getEthAddressStringFromBinary(in, out + 2, sha3, chainId);
|
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,
|
bool adjustDecimals(char *src,
|
||||||
uint32_t srcLength,
|
uint32_t srcLength,
|
||||||
char *target,
|
char *target,
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#include "cx.h"
|
#include "cx.h"
|
||||||
#include "chainConfig.h"
|
#include "chainConfig.h"
|
||||||
|
#include "eth_plugin_interface.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Decode an RLP encoded field - see
|
* @brief Decode an RLP encoded field - see
|
||||||
* https://github.com/ethereum/wiki/wiki/RLP
|
* https://github.com/ethereum/wiki/wiki/RLP
|
||||||
@@ -57,6 +59,8 @@ void getEthDisplayableAddress(uint8_t *in,
|
|||||||
cx_sha3_t *sha3,
|
cx_sha3_t *sha3,
|
||||||
uint64_t chainId);
|
uint64_t chainId);
|
||||||
|
|
||||||
|
uint8_t *getNftContractAddress(const ethQueryContractUI_t *const msg);
|
||||||
|
|
||||||
bool adjustDecimals(char *src,
|
bool adjustDecimals(char *src,
|
||||||
uint32_t srcLength,
|
uint32_t srcLength,
|
||||||
char *target,
|
char *target,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "ui_flow.h"
|
#include "ui_flow.h"
|
||||||
#include "feature_getPublicKey.h"
|
#include "feature_getPublicKey.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
void handleGetPublicKey(uint8_t p1,
|
void handleGetPublicKey(uint8_t p1,
|
||||||
uint8_t p2,
|
uint8_t p2,
|
||||||
|
|||||||
@@ -227,7 +227,7 @@ void handleSetPlugin(uint8_t p1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t signatureLen = workBuffer[offset];
|
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) {
|
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",
|
PRINTF("SignatureLen too big or too small. Must be between %d and %d, got %d\n",
|
||||||
MIN_DER_SIG_SIZE,
|
MIN_DER_SIG_SIZE,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "shared_context.h"
|
#include "shared_context.h"
|
||||||
#include "apdu_constants.h"
|
#include "apdu_constants.h"
|
||||||
#include "ui_flow.h"
|
#include "ui_flow.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
void handleStarkwareProvideQuantum(uint8_t p1,
|
void handleStarkwareProvideQuantum(uint8_t p1,
|
||||||
__attribute__((unused)) uint8_t p2,
|
__attribute__((unused)) uint8_t p2,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "ui_flow.h"
|
#include "ui_flow.h"
|
||||||
#include "poorstream.h"
|
#include "poorstream.h"
|
||||||
#include "ui_callbacks.h"
|
#include "ui_callbacks.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
#define U8BE(buf, off) \
|
#define U8BE(buf, off) \
|
||||||
(uint64_t)((((uint64_t) U4BE(buf, off)) << 32) | (((uint64_t) U4BE(buf, off + 4)) & 0xFFFFFFFF))
|
(uint64_t)((((uint64_t) U4BE(buf, off)) << 32) | (((uint64_t) U4BE(buf, off + 4)) & 0xFFFFFFFF))
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "shared_context.h"
|
#include "shared_context.h"
|
||||||
#include "ui_callbacks.h"
|
#include "ui_callbacks.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
unsigned int io_seproxyhal_touch_stark_ok(const bagl_element_t *e);
|
unsigned int io_seproxyhal_touch_stark_ok(const bagl_element_t *e);
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "shared_context.h" // TODO : rewrite as independant code
|
#include "shared_context.h" // TODO : rewrite as independant code
|
||||||
#include "eth_plugin_internal.h" // TODO : rewrite as independant code
|
#include "eth_plugin_internal.h" // TODO : rewrite as independant code
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
COMPOUND_REDEEM_UNDERLYING = 0,
|
COMPOUND_REDEEM_UNDERLYING = 0,
|
||||||
|
|||||||
@@ -63,10 +63,12 @@ static void handle_finalize(void *parameters) {
|
|||||||
case SAFE_TRANSFER:
|
case SAFE_TRANSFER:
|
||||||
msg->numScreens = 5;
|
msg->numScreens = 5;
|
||||||
break;
|
break;
|
||||||
case SET_APPROVAL_FOR_ALL:
|
|
||||||
case SAFE_BATCH_TRANSFER:
|
case SAFE_BATCH_TRANSFER:
|
||||||
msg->numScreens = 4;
|
msg->numScreens = 4;
|
||||||
break;
|
break;
|
||||||
|
case SET_APPROVAL_FOR_ALL:
|
||||||
|
msg->numScreens = 3;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc1155_context_t
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||||
getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination,
|
getEthDisplayableAddress(getNftContractAddress(msg),
|
||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength,
|
msg->msgLength,
|
||||||
&global_sha3,
|
&global_sha3,
|
||||||
@@ -59,7 +59,7 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||||
getEthDisplayableAddress((uint8_t *) msg->item1->nft.contractAddress,
|
getEthDisplayableAddress(getNftContractAddress(msg),
|
||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength,
|
msg->msgLength,
|
||||||
&global_sha3,
|
&global_sha3,
|
||||||
@@ -105,7 +105,7 @@ static void set_batch_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||||
getEthDisplayableAddress((uint8_t *) msg->item1->nft.contractAddress,
|
getEthDisplayableAddress(getNftContractAddress(msg),
|
||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength,
|
msg->msgLength,
|
||||||
&global_sha3,
|
&global_sha3,
|
||||||
|
|||||||
@@ -13,16 +13,16 @@ static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context
|
|||||||
chainConfig->chainId);
|
chainConfig->chainId);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
strlcpy(msg->title, "To Spend Your", msg->titleLength);
|
strlcpy(msg->title, "To Manage Your", msg->titleLength);
|
||||||
if (msg->item1) {
|
if (msg->item1) {
|
||||||
strlcpy(msg->msg, (const char *) &msg->item1->nft.collectionName, msg->msgLength);
|
strlcpy(msg->msg, (const char *) &msg->item1->nft.collectionName, msg->msgLength);
|
||||||
} else {
|
} else {
|
||||||
strlcpy(msg->msg, "Not found", msg->msgLength);
|
strlcpy(msg->msg, "Not Found", msg->msgLength);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||||
getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination,
|
getEthDisplayableAddress(getNftContractAddress(msg),
|
||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength,
|
msg->msgLength,
|
||||||
&global_sha3,
|
&global_sha3,
|
||||||
@@ -35,14 +35,6 @@ static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context
|
|||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength);
|
msg->msgLength);
|
||||||
break;
|
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:
|
default:
|
||||||
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
||||||
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
||||||
@@ -74,20 +66,12 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc721_context_t
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||||
getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination,
|
getEthDisplayableAddress(getNftContractAddress(msg),
|
||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength,
|
msg->msgLength,
|
||||||
&global_sha3,
|
&global_sha3,
|
||||||
chainConfig->chainId);
|
chainConfig->chainId);
|
||||||
break;
|
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:
|
default:
|
||||||
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
||||||
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
||||||
@@ -115,7 +99,7 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc721_context_t *context
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||||
getEthDisplayableAddress((uint8_t *) msg->item1->nft.contractAddress,
|
getEthDisplayableAddress(getNftContractAddress(msg),
|
||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength,
|
msg->msgLength,
|
||||||
&global_sha3,
|
&global_sha3,
|
||||||
@@ -128,14 +112,6 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc721_context_t *context
|
|||||||
msg->msg,
|
msg->msg,
|
||||||
msg->msgLength);
|
msg->msgLength);
|
||||||
break;
|
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:
|
default:
|
||||||
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
||||||
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "eth_plugin_internal.h" // TODO : rewrite as independant code
|
#include "eth_plugin_internal.h" // TODO : rewrite as independant code
|
||||||
#include "stark_utils.h"
|
#include "stark_utils.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "ethUtils.h"
|
||||||
|
|
||||||
#ifdef HAVE_STARKWARE
|
#ifdef HAVE_STARKWARE
|
||||||
|
|
||||||
|
|||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00000.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00000.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00000.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00001.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00001.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00001.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00002.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00002.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00002.png
|
||||||
BIN
tests/snapshots/nanox_erc1155_transfer_wo_info/00003.png
Normal file
BIN
tests/snapshots/nanox_erc1155_transfer_wo_info/00003.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 457 B |
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00004.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00004.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00004.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00005.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00005.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00005.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00006.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00006.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00006.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00007.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00007.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00007.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00008.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00008.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00008.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00009.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00009.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00009.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00010.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00010.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00010.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00011.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00011.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00011.png
|
||||||
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00012.png
Symbolic link
1
tests/snapshots/nanox_erc1155_transfer_wo_info/00012.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc1155_transfer/00012.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00000.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00000.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00000.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00001.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00001.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00001.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00002.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00002.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00002.png
|
||||||
BIN
tests/snapshots/nanox_erc721_transfer_wo_info/00003.png
Normal file
BIN
tests/snapshots/nanox_erc721_transfer_wo_info/00003.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 457 B |
1
tests/snapshots/nanox_erc721_transfer_wo_info/00004.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00004.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00004.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00005.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00005.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00005.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00006.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00006.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00006.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00007.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00007.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00007.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00008.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00008.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00008.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00009.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00009.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00009.png
|
||||||
1
tests/snapshots/nanox_erc721_transfer_wo_info/00010.png
Symbolic link
1
tests/snapshots/nanox_erc721_transfer_wo_info/00010.png
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../nanox_erc721_transfer/00010.png
|
||||||
@@ -1,48 +1,71 @@
|
|||||||
import "core-js/stable";
|
import "core-js/stable";
|
||||||
import "regenerator-runtime/runtime";
|
import "regenerator-runtime/runtime";
|
||||||
import Zemu from '@zondax/zemu';
|
import Zemu from '@zondax/zemu';
|
||||||
|
import { TransportStatusError } from "@ledgerhq/errors";
|
||||||
import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture';
|
import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture';
|
||||||
|
|
||||||
|
// Only LNX
|
||||||
const model = nano_models[1];
|
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');
|
test('[Nano ' + model.letter + '] Transfer ERC-1155', zemu(model, async (sim, eth) => {
|
||||||
const provide_nft_info = apdu_as_string('e01400007b0101124f70656e53656120436f6c6c656374696f6e495f947276749ce646f68ac8c248420045cb7b5e0000000000000001000147304502210083e357a828f13d574b1296214a3749c194ab1df1f8a243655c053b1c72f91e0c02201ed93cfac7e87759445c4da2e4bfd6e1cf0405ea37c7293bc965948f51bef5cc');
|
const current_screen = sim.getMainMenuSnapshot();
|
||||||
const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f901090b8520b673dd0082bcb394495f947276749ce646f68ac8c248420045cb7b5e80b8e4f242432a0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596cabf06640f8ca8fc5e0ed471b10befcdf65a33e4300000000');
|
await send_apdu(eth.transport, set_plugin);
|
||||||
const sign_more = apdu_as_string('e00480008b00006a0000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080');
|
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 waitForAppScreen(sim, current_screen);
|
||||||
await send_apdu(eth.transport, set_plugin);
|
await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_transfer', [10, -1, 0]);
|
||||||
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 sign_promise;
|
||||||
await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_transfer', [10, -1, 0]);
|
}));
|
||||||
|
|
||||||
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) => {
|
test('[Nano ' + model.letter + '] Batch transfer ERC-1155', zemu(model, async (sim, eth) => {
|
||||||
|
|
||||||
const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5e2eb2c2d60000000000000001000147304502210087b35cefc53fd94e25404933eb0d5ff08f20ba655d181de3b24ff0099dc3317f02204a216aa9e0b84bef6e20fcb036bd49647bf0cab66732b99b49ec277ffb682aa1');
|
const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5e2eb2c2d60000000000000001000147304502210087b35cefc53fd94e25404933eb0d5ff08f20ba655d181de3b24ff0099dc3317f02204a216aa9e0b84bef6e20fcb036bd49647bf0cab66732b99b49ec277ffb682aa1');
|
||||||
const provide_nft_info = apdu_as_string('e0140000820101194f70656e536561205368617265642053746f726566726f6e74495f947276749ce646f68ac8c248420045cb7b5e00000000000000010001473045022100c74cd613a27a9f4887210f5a3a0e12745e1ba0ab3a0d284cb6485d89c3cce4e602205a13e62a91164985cf58a838f8f531c0b91b980d206a5ba8df28270023ef93a3');
|
const provide_nft_info = apdu_as_string('e0140000820101194f70656e536561205368617265642053746f726566726f6e74495f947276749ce646f68ac8c248420045cb7b5e00000000000000010001473045022100c74cd613a27a9f4887210f5a3a0e12745e1ba0ab3a0d284cb6485d89c3cce4e602205a13e62a91164985cf58a838f8f531c0b91b980d206a5ba8df28270023ef93a3');
|
||||||
const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f9020b0e850d8cfd86008301617d94495f947276749ce646f68ac8c248420045cb7b5e80b901e42eb2c2d60000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c00000000000000000000000000000000000000000000');
|
const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f9020b0e850d8cfd86008301617d94495f947276749ce646f68ac8c248420045cb7b5e80b901e42eb2c2d60000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c00000000000000000000000000000000000000000000');
|
||||||
const sign_more_1 = apdu_as_string('e004800096000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a0000000064def9d99ff495856496c028c0');
|
const sign_more_1 = apdu_as_string('e004800096000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a0000000064def9d99ff495856496c028c0');
|
||||||
const sign_more_2 = apdu_as_string('e00480009689732473fcd0bbbe000000000000a30000000001abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a00000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000');
|
const sign_more_2 = apdu_as_string('e00480009689732473fcd0bbbe000000000000a30000000001abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a00000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000');
|
||||||
const sign_more_3 = apdu_as_string('e00480006100000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080');
|
const sign_more_3 = apdu_as_string('e00480006100000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080');
|
||||||
|
|
||||||
const current_screen = sim.getMainMenuSnapshot();
|
const current_screen = sim.getMainMenuSnapshot();
|
||||||
await send_apdu(eth.transport, set_plugin);
|
await send_apdu(eth.transport, set_plugin);
|
||||||
await send_apdu(eth.transport, provide_nft_info);
|
await send_apdu(eth.transport, provide_nft_info);
|
||||||
await send_apdu(eth.transport, sign_first);
|
await send_apdu(eth.transport, sign_first);
|
||||||
await send_apdu(eth.transport, sign_more_1);
|
await send_apdu(eth.transport, sign_more_1);
|
||||||
await send_apdu(eth.transport, sign_more_2);
|
await send_apdu(eth.transport, sign_more_2);
|
||||||
let sign_promise = send_apdu(eth.transport, sign_more_3);
|
let sign_promise = send_apdu(eth.transport, sign_more_3);
|
||||||
|
|
||||||
await waitForAppScreen(sim, current_screen);
|
await waitForAppScreen(sim, current_screen);
|
||||||
await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_batch_transfer', [8, -1, 0]);
|
await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_batch_transfer', [8, -1, 0]);
|
||||||
|
|
||||||
await sign_promise;
|
await sign_promise;
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -1,25 +1,46 @@
|
|||||||
import "core-js/stable";
|
import "core-js/stable";
|
||||||
import "regenerator-runtime/runtime";
|
import "regenerator-runtime/runtime";
|
||||||
import Zemu from '@zondax/zemu';
|
import Zemu from '@zondax/zemu';
|
||||||
|
import { TransportStatusError } from "@ledgerhq/errors";
|
||||||
import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture';
|
import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture';
|
||||||
|
|
||||||
|
// Only LNX
|
||||||
const model = nano_models[1];
|
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) => {
|
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');
|
await waitForAppScreen(sim, current_screen);
|
||||||
const provide_nft_info = apdu_as_string('e01400007001010752617269626c6560f80121c31a0d46b5279700f9df786054aa5ee500000000000000010001473045022025696986ef5f0ee2f72d9c6e41d7e2bf2e4f06373ab26d73ebe326c7fd4c7a6602210084f6b064d8750ae68ed5dd012296f37030390ec06ff534c5da6f0f4a4460af33');
|
await sim.navigateAndCompareSnapshots('.', model.name + '_erc721_transfer', [8, -1, 0]);
|
||||||
const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f88a0a852c3ce1ec008301f5679460f80121c31a0d46b5279700f9df786054aa5ee580b86442842e0e0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c000000000000000000000000000000000000000000000000');
|
|
||||||
const sign_more = apdu_as_string('e00480000b0000000000112999018080');
|
|
||||||
|
|
||||||
const current_screen = sim.getMainMenuSnapshot();
|
await sign_promise;
|
||||||
await send_apdu(eth.transport, set_plugin);
|
}));
|
||||||
await send_apdu(eth.transport, provide_nft_info);
|
|
||||||
await send_apdu(eth.transport, sign_first);
|
test('[Nano ' + model.letter + '] Transfer ERC-721 w/o NFT_PROVIDE_INFORMATION', zemu(model, async(sim, eth) => {
|
||||||
let sign_promise = send_apdu(eth.transport, sign_more);
|
const current_screen = sim.getMainMenuSnapshot();
|
||||||
|
await send_apdu(eth.transport, set_plugin);
|
||||||
await waitForAppScreen(sim, current_screen);
|
await send_apdu(eth.transport, sign_first);
|
||||||
await sim.navigateAndCompareSnapshots('.', model.name + '_erc721_transfer', [8, -1, 0]);
|
let sign_promise = send_apdu(eth.transport, sign_more);
|
||||||
|
|
||||||
await sign_promise;
|
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));
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -50,11 +50,11 @@ function apdu_as_string(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function send_apdu(ts, apdu) {
|
async function send_apdu(ts, apdu) {
|
||||||
await ts.send(apdu.cla,
|
return ts.send(apdu.cla,
|
||||||
apdu.ins,
|
apdu.ins,
|
||||||
apdu.p1,
|
apdu.p1,
|
||||||
apdu.p2,
|
apdu.p2,
|
||||||
apdu.data);
|
apdu.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generates a serializedTransaction from a rawHexTransaction copy pasted from etherscan.
|
// Generates a serializedTransaction from a rawHexTransaction copy pasted from etherscan.
|
||||||
|
|||||||
Reference in New Issue
Block a user