Fix nft transactions (#229)
* Removed pluginType "hack" * Fix some ERC 721 & 1155 function signature hashes * Fix UI for ERC721 operations * Explicit Batch Transfer UI with ERC1155 * Unified some ERC721 & 1155 non-static functions naming * Fix UI for ERC1155 operations * Added missing pin-lock check when signing transactions * Fix the shell script that builds the elf files for testing * Add tests dependency ethers * Removed the space in the test filename * Tests build script refactoring * Now works when called from anywhere (not just the script's directory) * Now handles LNS & LNX builds together (less duplicated code) * Temporarily disable Nano X tests Until Zemu supports Nano X 2.0 SDK * Tests now start with blind signing disabled Makes it closer to reality & very few of them requires it * Update to the latest sdk version * make eth_plugin_perform_init() readable Introduce 2 functions. * Now properly parses the apdu and displays the total quantity of NFT IDs transferred in ERC1155 batch transfer * Add NFT prod public keys * Added extra checks for the chain ID handling Following the security review * NFTs now only supported by LNS * Version bump Co-authored-by: Alexandre Paillier <alexandre.paillier@ledger.fr> Co-authored-by: greenknot <greenknot@users.noreply.github.com>
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
#ifdef HAVE_NFT_SUPPORT
|
||||
|
||||
#include "erc1155_plugin.h"
|
||||
|
||||
static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc1155_context_t *context) {
|
||||
@@ -40,20 +42,6 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc1155_context_t
|
||||
static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *context) {
|
||||
switch (msg->screenIndex) {
|
||||
case 0:
|
||||
// What will be displayed on the screen is:
|
||||
// | Send |
|
||||
// | `X` `COLLECTION_NAME` |
|
||||
// where `X` is `value`
|
||||
strlcpy(msg->title, "Send", msg->titleLength);
|
||||
uint256_to_decimal(context->value, sizeof(context->value), msg->msg, msg->msgLength);
|
||||
strlcat(msg->msg, " ", msg->msgLength);
|
||||
if (msg->item1) {
|
||||
strlcat(msg->msg, (const char *) &msg->item1->nft.collectionName, msg->msgLength);
|
||||
} else {
|
||||
strlcat(msg->msg, "Items", msg->msgLength);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
strlcpy(msg->title, "To", msg->titleLength);
|
||||
getEthDisplayableAddress(context->address,
|
||||
msg->msg,
|
||||
@@ -61,9 +49,17 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex
|
||||
&global_sha3,
|
||||
chainConfig->chainId);
|
||||
break;
|
||||
case 1:
|
||||
strlcpy(msg->title, "Collection Name", msg->titleLength);
|
||||
if (msg->item1) {
|
||||
strlcpy(msg->msg, (const char *) &msg->item1->nft.collectionName, msg->msgLength);
|
||||
} else {
|
||||
strlcpy(msg->msg, "Not Found", msg->msgLength);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||
getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination,
|
||||
getEthDisplayableAddress((uint8_t *)msg->item1->nft.contractAddress,
|
||||
msg->msg,
|
||||
msg->msgLength,
|
||||
&global_sha3,
|
||||
@@ -76,6 +72,10 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex
|
||||
msg->msg,
|
||||
msg->msgLength);
|
||||
break;
|
||||
case 4:
|
||||
strlcpy(msg->title, "Quantity", msg->titleLength);
|
||||
tostring256(&context->value, 10, msg->msg, msg->msgLength);
|
||||
break;
|
||||
default:
|
||||
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
||||
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
||||
@@ -84,27 +84,42 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex
|
||||
}
|
||||
|
||||
static void set_batch_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *context) {
|
||||
char quantity_str[48];
|
||||
|
||||
switch (msg->screenIndex) {
|
||||
case 0:
|
||||
strlcpy(msg->title, "Send NFTs From", msg->titleLength);
|
||||
uint256_to_decimal(context->value, sizeof(context->value), msg->msg, msg->msgLength);
|
||||
strlcat(msg->msg, " Different Collections", msg->msgLength);
|
||||
break;
|
||||
case 1:
|
||||
strlcpy(msg->title, "To", msg->titleLength);
|
||||
getEthDisplayableAddress(context->address,
|
||||
msg->msg,
|
||||
msg->msgLength,
|
||||
&global_sha3,
|
||||
chainConfig->chainId);
|
||||
break;
|
||||
case 1:
|
||||
strlcpy(msg->title, "Collection Name", msg->titleLength);
|
||||
if (msg->item1) {
|
||||
strlcpy(msg->msg, (const char *) &msg->item1->nft.collectionName, msg->msgLength);
|
||||
} else {
|
||||
strlcpy(msg->msg, "Not Found", msg->msgLength);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
strlcpy(msg->title, "NFT Address", msg->titleLength);
|
||||
getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination,
|
||||
getEthDisplayableAddress((uint8_t *)msg->item1->nft.contractAddress,
|
||||
msg->msg,
|
||||
msg->msgLength,
|
||||
&global_sha3,
|
||||
chainConfig->chainId);
|
||||
break;
|
||||
case 3:
|
||||
strlcpy(msg->title, "Total Quantity", msg->titleLength);
|
||||
tostring256(&context->value, 10, &quantity_str[0], sizeof(quantity_str));
|
||||
snprintf(msg->msg,
|
||||
msg->msgLength,
|
||||
"%s from %d NFT IDs",
|
||||
quantity_str,
|
||||
context->array_index);
|
||||
break;
|
||||
default:
|
||||
PRINTF("Unsupported screen index %d\n", msg->screenIndex);
|
||||
msg->result = ETH_PLUGIN_RESULT_ERROR;
|
||||
@@ -132,4 +147,6 @@ void handle_query_contract_ui_1155(void *parameters) {
|
||||
PRINTF("Unsupported selector index %d\n", context->selectorIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // HAVE_NFT_SUPPORT
|
||||
|
||||
Reference in New Issue
Block a user