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:
Jean P
2021-12-17 12:04:51 +01:00
committed by GitHub
parent 586155c0d4
commit a53a2428cc
40 changed files with 735 additions and 208 deletions

View File

@@ -5,11 +5,21 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/) The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/). and this project adheres to [Semantic Versioning](http://semver.org/).
## [1.9.14](https://github.com/ledgerhq/app-ethereum/compare/1.9.13...1.9.14) - 2021-11-22 ## [1.9.15](https://github.com/ledgerhq/app-ethereum/compare/1.9.14...1.9.15) - 2021-12-15
### Added ### Added
- Support for Non-Fungible Token (ERC 721 & ERC 1155) - Support for Non-Fungible Token (ERC-721 & ERC-1155)
## [1.9.14](https://github.com/ledgerhq/app-ethereum/compare/1.9.13...1.9.14) - 2021-11-30
### Added
- Added Moonriver BIP44 1285
### Fixed
- Fixed stark order signature on LNS
## [1.9.13](https://github.com/ledgerhq/app-ethereum/compare/1.9.12...1.9.13) - 2021-11-17 ## [1.9.13](https://github.com/ledgerhq/app-ethereum/compare/1.9.12...1.9.13) - 2021-11-17

View File

@@ -30,7 +30,7 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'"
APPVERSION_M=1 APPVERSION_M=1
APPVERSION_N=9 APPVERSION_N=9
APPVERSION_P=14 APPVERSION_P=15
APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)
APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION) APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION)
@@ -306,11 +306,15 @@ ifneq ($(BYPASS_SIGNATURES),0)
DEFINES += HAVE_BYPASS_SIGNATURES DEFINES += HAVE_BYPASS_SIGNATURES
endif endif
# NFTs
ifeq ($(TARGET_NAME), TARGET_NANOX)
DEFINES += HAVE_NFT_SUPPORT
# Enable the NFT testing key # Enable the NFT testing key
NFT_TESTING_KEY:=0 NFT_TESTING_KEY:=0
ifneq ($(NFT_TESTING_KEY),0) ifneq ($(NFT_TESTING_KEY),0)
DEFINES += HAVE_NFT_TESTING_KEY DEFINES += HAVE_NFT_TESTING_KEY
endif endif
endif
# Enabling debug PRINTF # Enabling debug PRINTF

View File

@@ -72,69 +72,77 @@ void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI,
queryContractUI->msgLength = msgLength; queryContractUI->msgLength = msgLength;
} }
static void eth_plugin_perform_init_default(uint8_t *contractAddress,
ethPluginInitContract_t *init) {
// check if the registered external plugin matches the TX contract address / selector
if (memcmp(contractAddress,
dataContext.tokenContext.contractAddress,
sizeof(dataContext.tokenContext.contractAddress)) != 0) {
PRINTF("Got contract: %.*H\n", ADDRESS_LENGTH, contractAddress);
PRINTF("Expected contract: %.*H\n",
ADDRESS_LENGTH,
dataContext.tokenContext.contractAddress);
os_sched_exit(0);
}
if (memcmp(init->selector,
dataContext.tokenContext.methodSelector,
sizeof(dataContext.tokenContext.methodSelector)) != 0) {
PRINTF("Got selector: %.*H\n", SELECTOR_SIZE, init->selector);
PRINTF("Expected selector: %.*H\n", SELECTOR_SIZE, dataContext.tokenContext.methodSelector);
os_sched_exit(0);
}
PRINTF("Plugin will be used\n");
dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_OK;
}
static bool eth_plugin_perform_init_old_internal(uint8_t *contractAddress,
ethPluginInitContract_t *init) {
uint8_t i, j;
const uint8_t **selectors;
// Search internal plugin list
for (i = 0;; i++) {
selectors = (const uint8_t **) PIC(INTERNAL_ETH_PLUGINS[i].selectors);
if (selectors == NULL) {
break;
}
for (j = 0; ((j < INTERNAL_ETH_PLUGINS[i].num_selectors) && (contractAddress != NULL));
j++) {
if (memcmp(init->selector, (const void *) PIC(selectors[j]), SELECTOR_SIZE) == 0) {
if ((INTERNAL_ETH_PLUGINS[i].availableCheck == NULL) ||
((PluginAvailableCheck) PIC(INTERNAL_ETH_PLUGINS[i].availableCheck))()) {
strlcpy(dataContext.tokenContext.pluginName,
INTERNAL_ETH_PLUGINS[i].alias,
PLUGIN_ID_LENGTH);
dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_OK;
return true;
}
}
}
}
return false;
}
eth_plugin_result_t eth_plugin_perform_init(uint8_t *contractAddress, eth_plugin_result_t eth_plugin_perform_init(uint8_t *contractAddress,
ethPluginInitContract_t *init) { ethPluginInitContract_t *init) {
uint8_t i;
const uint8_t **selectors;
dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_UNAVAILABLE; dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_UNAVAILABLE;
PRINTF("Selector %.*H\n", 4, init->selector); PRINTF("Selector %.*H\n", 4, init->selector);
switch (pluginType) { switch (pluginType) {
case NOT_OLD_INTERNAL: #ifdef HAVE_NFT_SUPPORT
case ERC1155: case ERC1155:
case ERC721: case ERC721:
case EXTERNAL: { #endif // HAVE_NFT_SUPPORT
// check if the registered external plugin matches the TX contract address / selector case EXTERNAL:
if (memcmp(contractAddress, eth_plugin_perform_init_default(contractAddress, init);
dataContext.tokenContext.contractAddress,
sizeof(dataContext.tokenContext.contractAddress)) != 0) {
PRINTF("Got contract: %.*H\n", ADDRESS_LENGTH, contractAddress);
PRINTF("Expected contract: %.*H\n",
ADDRESS_LENGTH,
dataContext.tokenContext.contractAddress);
os_sched_exit(0);
}
if (memcmp(init->selector,
dataContext.tokenContext.methodSelector,
sizeof(dataContext.tokenContext.methodSelector)) != 0) {
PRINTF("Got selector: %.*H\n", SELECTOR_SIZE, init->selector);
PRINTF("Expected selector: %.*H\n",
SELECTOR_SIZE,
dataContext.tokenContext.methodSelector);
os_sched_exit(0);
}
PRINTF("Plugin will be used\n");
// TODO: Add check for chainid.
dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_OK;
contractAddress = NULL; contractAddress = NULL;
} break; break;
case OLD_INTERNAL: { case OLD_INTERNAL:
// Search internal plugin list if (eth_plugin_perform_init_old_internal(contractAddress, init)) {
for (i = 0;; i++) { contractAddress = NULL;
uint8_t j;
selectors = (const uint8_t **) PIC(INTERNAL_ETH_PLUGINS[i].selectors);
if (selectors == NULL) {
break;
}
for (j = 0;
((j < INTERNAL_ETH_PLUGINS[i].num_selectors) && (contractAddress != NULL));
j++) {
if (memcmp(init->selector, (const void *) PIC(selectors[j]), SELECTOR_SIZE) ==
0) {
if ((INTERNAL_ETH_PLUGINS[i].availableCheck == NULL) ||
((PluginAvailableCheck) PIC(
INTERNAL_ETH_PLUGINS[i].availableCheck))()) {
strlcpy(dataContext.tokenContext.pluginName,
INTERNAL_ETH_PLUGINS[i].alias,
PLUGIN_ID_LENGTH);
dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_OK;
contractAddress = NULL;
break;
}
}
}
} }
} break; break;
default: default:
PRINTF("Unsupported pluginType %d\n", pluginType); PRINTF("Unsupported pluginType %d\n", pluginType);
os_sched_exit(0); os_sched_exit(0);
@@ -242,8 +250,6 @@ eth_plugin_result_t eth_plugin_call(int method, void *parameter) {
} }
switch (pluginType) { switch (pluginType) {
case NOT_OLD_INTERNAL:
break;
case EXTERNAL: { case EXTERNAL: {
uint32_t params[3]; uint32_t params[3];
params[0] = (uint32_t) alias; params[0] = (uint32_t) alias;
@@ -262,6 +268,7 @@ eth_plugin_result_t eth_plugin_call(int method, void *parameter) {
END_TRY; END_TRY;
break; break;
} }
#ifdef HAVE_NFT_SUPPORT
case ERC721: { case ERC721: {
erc721_plugin_call(method, parameter); erc721_plugin_call(method, parameter);
break; break;
@@ -270,6 +277,7 @@ eth_plugin_result_t eth_plugin_call(int method, void *parameter) {
erc1155_plugin_call(method, parameter); erc1155_plugin_call(method, parameter);
break; break;
} }
#endif // HAVE_NFT_SUPPORT
case OLD_INTERNAL: { case OLD_INTERNAL: {
// Perform the call // Perform the call
for (i = 0;; i++) { for (i = 0;; i++) {

View File

@@ -513,6 +513,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
tx); tx);
break; break;
#ifdef HAVE_NFT_SUPPORT
case INS_PROVIDE_NFT_INFORMATION: case INS_PROVIDE_NFT_INFORMATION:
handleProvideNFTInformation(G_io_apdu_buffer[OFFSET_P1], handleProvideNFTInformation(G_io_apdu_buffer[OFFSET_P1],
G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer[OFFSET_P2],
@@ -521,6 +522,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) {
flags, flags,
tx); tx);
break; break;
#endif // HAVE_NFT_SUPPORT
case INS_SET_EXTERNAL_PLUGIN: case INS_SET_EXTERNAL_PLUGIN:
handleSetExternalPlugin(G_io_apdu_buffer[OFFSET_P1], handleSetExternalPlugin(G_io_apdu_buffer[OFFSET_P1],

View File

@@ -207,8 +207,7 @@ typedef enum {
EXTERNAL, // External plugin, set by setExternalPlugin. EXTERNAL, // External plugin, set by setExternalPlugin.
ERC721, // Specific ERC721 internal plugin, set by setPlugin. ERC721, // Specific ERC721 internal plugin, set by setPlugin.
ERC1155, // Specific ERC1155 internal plugin, set by setPlugin ERC1155, // Specific ERC1155 internal plugin, set by setPlugin
OLD_INTERNAL, // Old internal plugin, not set by any command. OLD_INTERNAL // Old internal plugin, not set by any command.
NOT_OLD_INTERNAL, // Do not treat this tx as an old internal transaction.
} pluginType_t; } pluginType_t;
extern pluginType_t pluginType; extern pluginType_t pluginType;

View File

@@ -1,3 +1,5 @@
#ifdef HAVE_NFT_SUPPORT
#include "shared_context.h" #include "shared_context.h"
#include "apdu_constants.h" #include "apdu_constants.h"
#include "ui_flow.h" #include "ui_flow.h"
@@ -16,8 +18,8 @@
#define MIN_DER_SIG_SIZE 67 #define MIN_DER_SIG_SIZE 67
#define MAX_DER_SIG_SIZE 72 #define MAX_DER_SIG_SIZE 72
#define TESTING_KEY 0 #define TEST_NFT_METADATA_KEY 0
#define NFT_METADATA_KEY_1 1 #define PROD_NFT_METADATA_KEY 1
#define ALGORITHM_ID_1 1 #define ALGORITHM_ID_1 1
@@ -25,17 +27,22 @@
#define VERSION_1 1 #define VERSION_1 1
static const uint8_t LEDGER_NFT_METADATA_PUBLIC_KEY[] = {
#ifdef HAVE_NFT_TESTING_KEY #ifdef HAVE_NFT_TESTING_KEY
static const uint8_t LEDGER_NFT_PUBLIC_KEY[] = {
0x04, 0xf5, 0x70, 0x0c, 0xa1, 0xe8, 0x74, 0x24, 0xc7, 0xc7, 0xd1, 0x19, 0xe7, 0x04, 0xf5, 0x70, 0x0c, 0xa1, 0xe8, 0x74, 0x24, 0xc7, 0xc7, 0xd1, 0x19, 0xe7,
0xe3, 0xc1, 0x89, 0xb1, 0x62, 0x50, 0x94, 0xdb, 0x6e, 0xa0, 0x40, 0x87, 0xc8, 0xe3, 0xc1, 0x89, 0xb1, 0x62, 0x50, 0x94, 0xdb, 0x6e, 0xa0, 0x40, 0x87, 0xc8,
0x30, 0x00, 0x7d, 0x0b, 0x46, 0x9a, 0x53, 0x11, 0xee, 0x6a, 0x1a, 0xcd, 0x1d, 0x30, 0x00, 0x7d, 0x0b, 0x46, 0x9a, 0x53, 0x11, 0xee, 0x6a, 0x1a, 0xcd, 0x1d,
0xa5, 0xaa, 0xb0, 0xf5, 0xc6, 0xdf, 0x13, 0x15, 0x8d, 0x28, 0xcc, 0x12, 0xd1, 0xa5, 0xaa, 0xb0, 0xf5, 0xc6, 0xdf, 0x13, 0x15, 0x8d, 0x28, 0xcc, 0x12, 0xd1,
0xdd, 0xa6, 0xec, 0xe9, 0x46, 0xb8, 0x9d, 0x5c, 0x05, 0x49, 0x92, 0x59, 0xc4}; 0xdd, 0xa6, 0xec, 0xe9, 0x46, 0xb8, 0x9d, 0x5c, 0x05, 0x49, 0x92, 0x59, 0xc4
#else #else
static const uint8_t LEDGER_NFT_PUBLIC_KEY[] = {}; 0x04, 0x98, 0x8d, 0xa6, 0xb2, 0x46, 0xf2, 0x8e, 0x77, 0xc1, 0xba, 0xb6, 0x75,
0xcb, 0x2a, 0x27, 0x44, 0xf7, 0xf5, 0xce, 0xc5, 0x6a, 0xe6, 0xe0, 0x32, 0x23,
0x33, 0x7b, 0x57, 0x94, 0xcd, 0x6a, 0xe0, 0x7d, 0x48, 0xb3, 0x0d, 0xb9, 0xcc,
0xb4, 0x0f, 0x5a, 0x02, 0xa1, 0x1a, 0x3a, 0xb9, 0x9d, 0x5f, 0x59, 0x5a, 0x3d,
0x50, 0xa0, 0xe1, 0x30, 0x23, 0xfd, 0x0d, 0x95, 0x87, 0x92, 0xd7, 0x97, 0x01
#endif #endif
};
typedef bool verificationAlgo(const cx_ecfp_public_key_t *, typedef bool verificationAlgo(const cx_ecfp_public_key_t *,
int, int,
@@ -129,9 +136,14 @@ void handleProvideNFTInformation(uint8_t p1,
PRINTF("Address: %.*H\n", ADDRESS_LENGTH, workBuffer + offset); PRINTF("Address: %.*H\n", ADDRESS_LENGTH, workBuffer + offset);
offset += ADDRESS_LENGTH; offset += ADDRESS_LENGTH;
// TODO: store chainID and assert that tx is using the same chainid. uint64_t chainId = u64_from_BE(workBuffer + offset, CHAIN_ID_SIZE);
// uint64_t chainid = u64_from_BE(workBuffer + offset, CHAIN_ID_SIZE); // this prints raw data, so to have a more meaningful print, display
// PRINTF("ChainID: %.*H\n", sizeof(chainid), &chainid); // the buffer before the endianness swap
PRINTF("ChainID: %.*H\n", sizeof(chainId), (workBuffer + offset));
if ((chainConfig->chainId != 0) && (chainConfig->chainId != chainId)) {
PRINTF("Chain ID token mismatch\n");
THROW(0x6A80);
}
offset += CHAIN_ID_SIZE; offset += CHAIN_ID_SIZE;
uint8_t keyId = workBuffer[offset]; uint8_t keyId = workBuffer[offset];
@@ -141,11 +153,11 @@ void handleProvideNFTInformation(uint8_t p1,
PRINTF("KeyID: %d\n", keyId); PRINTF("KeyID: %d\n", keyId);
switch (keyId) { switch (keyId) {
#ifdef HAVE_NFT_TESTING_KEY #ifdef HAVE_NFT_TESTING_KEY
case TESTING_KEY: case TEST_NFT_METADATA_KEY:
#endif #endif
case NFT_METADATA_KEY_1: case PROD_NFT_METADATA_KEY:
rawKey = (uint8_t *) LEDGER_NFT_PUBLIC_KEY; rawKey = (uint8_t *) LEDGER_NFT_METADATA_PUBLIC_KEY;
rawKeyLen = sizeof(LEDGER_NFT_PUBLIC_KEY); rawKeyLen = sizeof(LEDGER_NFT_METADATA_PUBLIC_KEY);
break; break;
default: default:
PRINTF("KeyID %d not supported\n", keyId); PRINTF("KeyID %d not supported\n", keyId);
@@ -210,10 +222,9 @@ void handleProvideNFTInformation(uint8_t p1,
THROW(0x6A80); THROW(0x6A80);
#endif #endif
} }
// Set this to `NOT_OLD_INTERNAL` because otherwise the tx might be treated as an
// internal plugin and we might get a collision and hence some BIG problems.
pluginType = NOT_OLD_INTERNAL;
tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1;
THROW(0x9000); THROW(0x9000);
} }
#endif // HAVE_NFT_SUPPORT

View File

@@ -4,6 +4,7 @@
#include "tokens.h" #include "tokens.h"
#include "eth_plugin_interface.h" #include "eth_plugin_interface.h"
#include "eth_plugin_internal.h" #include "eth_plugin_internal.h"
#include "utils.h"
// Supported internal plugins // Supported internal plugins
#define ERC721_STR "ERC721" #define ERC721_STR "ERC721"
@@ -31,10 +32,9 @@ typedef enum Version {
} Version; } Version;
typedef enum KeyId { typedef enum KeyId {
TEST_KEY = 0x00, TEST_PLUGIN_KEY = 0x00,
PERSO_V2_KEY_1 = 0x01,
// Must ONLY be used with ERC721 and ERC1155 plugin // Must ONLY be used with ERC721 and ERC1155 plugin
AWS_PLUGIN_KEY_1 = 0x02, PROD_PLUGIN_KEY = 0x02,
} KeyId; } KeyId;
// Algorithm Id consists of a Key spec and an algorithm spec. // Algorithm Id consists of a Key spec and an algorithm spec.
@@ -43,18 +43,22 @@ typedef enum AlgorithmID {
ECC_SECG_P256K1__ECDSA_SHA_256 = 0x01, ECC_SECG_P256K1__ECDSA_SHA_256 = 0x01,
} AlgorithmID; } AlgorithmID;
// Only used for signing NFT plugins (ERC721 and ERC1155)
static const uint8_t LEDGER_NFT_SELECTOR_PUBLIC_KEY[] = {
#ifdef HAVE_NFT_TESTING_KEY #ifdef HAVE_NFT_TESTING_KEY
static const uint8_t LEDGER_TESTING_KEY[] = {
0x04, 0xf5, 0x70, 0x0c, 0xa1, 0xe8, 0x74, 0x24, 0xc7, 0xc7, 0xd1, 0x19, 0xe7, 0x04, 0xf5, 0x70, 0x0c, 0xa1, 0xe8, 0x74, 0x24, 0xc7, 0xc7, 0xd1, 0x19, 0xe7,
0xe3, 0xc1, 0x89, 0xb1, 0x62, 0x50, 0x94, 0xdb, 0x6e, 0xa0, 0x40, 0x87, 0xc8, 0xe3, 0xc1, 0x89, 0xb1, 0x62, 0x50, 0x94, 0xdb, 0x6e, 0xa0, 0x40, 0x87, 0xc8,
0x30, 0x00, 0x7d, 0x0b, 0x46, 0x9a, 0x53, 0x11, 0xee, 0x6a, 0x1a, 0xcd, 0x1d, 0x30, 0x00, 0x7d, 0x0b, 0x46, 0x9a, 0x53, 0x11, 0xee, 0x6a, 0x1a, 0xcd, 0x1d,
0xa5, 0xaa, 0xb0, 0xf5, 0xc6, 0xdf, 0x13, 0x15, 0x8d, 0x28, 0xcc, 0x12, 0xd1, 0xa5, 0xaa, 0xb0, 0xf5, 0xc6, 0xdf, 0x13, 0x15, 0x8d, 0x28, 0xcc, 0x12, 0xd1,
0xdd, 0xa6, 0xec, 0xe9, 0x46, 0xb8, 0x9d, 0x5c, 0x05, 0x49, 0x92, 0x59, 0xc4}; 0xdd, 0xa6, 0xec, 0xe9, 0x46, 0xb8, 0x9d, 0x5c, 0x05, 0x49, 0x92, 0x59, 0xc4
#else
0x04, 0xd8, 0x62, 0x6e, 0x01, 0x9e, 0x55, 0x3e, 0x19, 0x69, 0x56, 0xf1, 0x17,
0x4d, 0xcd, 0xb8, 0x9a, 0x1c, 0xda, 0xc4, 0x93, 0x90, 0x08, 0xbc, 0x79, 0x77,
0x33, 0x6d, 0x78, 0x24, 0xee, 0xe3, 0xa2, 0x62, 0x24, 0x1a, 0x62, 0x73, 0x52,
0x3b, 0x09, 0xb8, 0xd0, 0xce, 0x0d, 0x39, 0xe8, 0x60, 0xc9, 0x4d, 0x02, 0x53,
0x58, 0xdb, 0xdc, 0x25, 0x92, 0xc7, 0xc6, 0x48, 0x0d, 0x39, 0xce, 0xbb, 0xa3
#endif #endif
static const uint8_t LEDGER_PERSO_V2_PUBLIC_KEY[] = {}; };
// Only used for signing NFT plugins (ERC721 and ERC1155)
static const uint8_t LEDGER_NFT_SELECTOR_PUBLIC_KEY[] = {};
// Verification function used to verify the signature // Verification function used to verify the signature
typedef bool verificationAlgo(const cx_ecfp_public_key_t *, typedef bool verificationAlgo(const cx_ecfp_public_key_t *,
@@ -164,9 +168,14 @@ void handleSetPlugin(uint8_t p1,
PRINTF("Selector: %.*H\n", SELECTOR_SIZE, tokenContext->methodSelector); PRINTF("Selector: %.*H\n", SELECTOR_SIZE, tokenContext->methodSelector);
offset += SELECTOR_SIZE; offset += SELECTOR_SIZE;
// TODO: store chainID and assert that tx is using the same chainid. uint64_t chainId = u64_from_BE(workBuffer + offset, CHAIN_ID_SIZE);
// uint64_t chainid = u64_from_BE(workBuffer + offset, CHAIN_ID_SIZE); // this prints raw data, so to have a more meaningful print, display
// PRINTF("ChainID: %.*H\n", sizeof(chainid), &chainid); // the buffer before the endianness swap
PRINTF("ChainID: %.*H\n", sizeof(chainId), (workBuffer + offset));
if ((chainConfig->chainId != 0) && (chainConfig->chainId != chainId)) {
PRINTF("Chain ID token mismatch\n");
THROW(0x6A80);
}
offset += CHAIN_ID_SIZE; offset += CHAIN_ID_SIZE;
enum KeyId keyId = workBuffer[offset]; enum KeyId keyId = workBuffer[offset];
@@ -176,16 +185,9 @@ void handleSetPlugin(uint8_t p1,
PRINTF("KeyID: %d\n", keyId); PRINTF("KeyID: %d\n", keyId);
switch (keyId) { switch (keyId) {
#ifdef HAVE_NFT_TESTING_KEY #ifdef HAVE_NFT_TESTING_KEY
case TEST_KEY: case TEST_PLUGIN_KEY:
rawKey = LEDGER_TESTING_KEY;
rawKeyLen = sizeof(LEDGER_TESTING_KEY);
break;
#endif #endif
case PERSO_V2_KEY_1: case PROD_PLUGIN_KEY:
rawKey = LEDGER_PERSO_V2_PUBLIC_KEY;
rawKeyLen = sizeof(LEDGER_PERSO_V2_PUBLIC_KEY);
break;
case AWS_PLUGIN_KEY_1:
rawKey = LEDGER_NFT_SELECTOR_PUBLIC_KEY; rawKey = LEDGER_NFT_SELECTOR_PUBLIC_KEY;
rawKeyLen = sizeof(LEDGER_NFT_SELECTOR_PUBLIC_KEY); rawKeyLen = sizeof(LEDGER_NFT_SELECTOR_PUBLIC_KEY);
break; break;
@@ -255,7 +257,7 @@ void handleSetPlugin(uint8_t p1,
} }
pluginType = getPluginType(tokenContext->pluginName, pluginNameLength); pluginType = getPluginType(tokenContext->pluginName, pluginNameLength);
if (keyId == AWS_PLUGIN_KEY_1) { if (keyId == PROD_PLUGIN_KEY) {
if (pluginType != ERC721 && pluginType != ERC1155) { if (pluginType != ERC721 && pluginType != ERC1155) {
PRINTF("AWS key must only be used to set NFT internal plugins\n"); PRINTF("AWS key must only be used to set NFT internal plugins\n");
THROW(0x6A80); THROW(0x6A80);

View File

@@ -13,6 +13,11 @@ void handleSign(uint8_t p1,
UNUSED(tx); UNUSED(tx);
parserStatus_e txResult; parserStatus_e txResult;
uint32_t i; uint32_t i;
if (os_global_pin_is_validated() != BOLOS_UX_OK) {
PRINTF("Device is PIN-locked");
THROW(0x6982);
}
if (p1 == P1_FIRST) { if (p1 == P1_FIRST) {
if (dataLength < 1) { if (dataLength < 1) {
PRINTF("Invalid data\n"); PRINTF("Invalid data\n");

View File

@@ -1,9 +1,11 @@
#ifdef HAVE_NFT_SUPPORT
#include "erc1155_plugin.h" #include "erc1155_plugin.h"
#include "eth_plugin_internal.h" #include "eth_plugin_internal.h"
static const uint8_t ERC1155_APPROVE_FOR_ALL_SELECTOR[SELECTOR_SIZE] = {0xa2, 0x2c, 0xb4, 0x65}; static const uint8_t ERC1155_APPROVE_FOR_ALL_SELECTOR[SELECTOR_SIZE] = {0xa2, 0x2c, 0xb4, 0x65};
static const uint8_t ERC1155_SAFE_TRANSFER_SELECTOR[SELECTOR_SIZE] = {0xf2, 0x42, 0x43, 0x2a}; static const uint8_t ERC1155_SAFE_TRANSFER_SELECTOR[SELECTOR_SIZE] = {0xf2, 0x42, 0x43, 0x2a};
static const uint8_t ERC1155_SAFE_BATCH_TRANSFER[SELECTOR_SIZE] = {0xf2, 0x42, 0x43, 0x2a}; static const uint8_t ERC1155_SAFE_BATCH_TRANSFER[SELECTOR_SIZE] = {0x2e, 0xb2, 0xc2, 0xd6};
const uint8_t *const ERC1155_SELECTORS[NUM_ERC1155_SELECTORS] = { const uint8_t *const ERC1155_SELECTORS[NUM_ERC1155_SELECTORS] = {
ERC1155_APPROVE_FOR_ALL_SELECTOR, ERC1155_APPROVE_FOR_ALL_SELECTOR,
@@ -59,11 +61,11 @@ static void handle_finalize(void *parameters) {
msg->tokenLookup2 = NULL; msg->tokenLookup2 = NULL;
switch (context->selectorIndex) { switch (context->selectorIndex) {
case SAFE_TRANSFER: case SAFE_TRANSFER:
msg->numScreens = 4; msg->numScreens = 5;
break; break;
case SET_APPROVAL_FOR_ALL: case SET_APPROVAL_FOR_ALL:
case SAFE_BATCH_TRANSFER: case SAFE_BATCH_TRANSFER:
msg->numScreens = 3; msg->numScreens = 4;
break; break;
default: default:
msg->result = ETH_PLUGIN_RESULT_ERROR; msg->result = ETH_PLUGIN_RESULT_ERROR;
@@ -99,9 +101,11 @@ static void handle_query_contract_id(void *parameters) {
strlcpy(msg->version, "Allowance", msg->versionLength); strlcpy(msg->version, "Allowance", msg->versionLength);
break; break;
case SAFE_TRANSFER: case SAFE_TRANSFER:
case SAFE_BATCH_TRANSFER:
strlcpy(msg->version, "Transfer", msg->versionLength); strlcpy(msg->version, "Transfer", msg->versionLength);
break; break;
case SAFE_BATCH_TRANSFER:
strlcpy(msg->version, "Batch Transfer", msg->versionLength);
break;
default: default:
PRINTF("Unsupported selector %d\n", context->selectorIndex); PRINTF("Unsupported selector %d\n", context->selectorIndex);
msg->result = ETH_PLUGIN_RESULT_ERROR; msg->result = ETH_PLUGIN_RESULT_ERROR;
@@ -134,3 +138,5 @@ void erc1155_plugin_call(int message, void *parameters) {
break; break;
} }
} }
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,3 +1,5 @@
#ifdef HAVE_NFT_SUPPORT
#pragma once #pragma once
#include <string.h> #include <string.h>
@@ -5,6 +7,7 @@
#include "shared_context.h" #include "shared_context.h"
#include "ethUtils.h" #include "ethUtils.h"
#include "utils.h" #include "utils.h"
#include "uint256.h"
// Internal plugin for EIP 1155: https://eips.ethereum.org/EIPS/eip-1155 // Internal plugin for EIP 1155: https://eips.ethereum.org/EIPS/eip-1155
@@ -31,19 +34,22 @@ typedef enum {
} erc1155_selector_field; } erc1155_selector_field;
typedef struct erc1155_context_t { typedef struct erc1155_context_t {
uint8_t address[ADDRESS_LENGTH]; uint8_t address[ADDRESS_LENGTH];
uint8_t tokenId[INT256_LENGTH]; uint8_t tokenId[INT256_LENGTH];
uint8_t value[INT256_LENGTH]; uint256_t value;
uint32_t valueOffset; uint16_t ids_array_len;
uint32_t tokenIdsOffset; uint32_t ids_offset;
uint32_t targetOffset; uint16_t values_array_len;
uint32_t values_offset;
uint16_t array_index;
bool approved; bool approved;
erc1155_selector_field next_param; erc1155_selector_field next_param;
uint8_t selectorIndex; uint8_t selectorIndex;
} erc1155_context_t; } erc1155_context_t;
// TODO: Find out why there is a duplicate if we remove 1155 suffix
void handle_provide_parameter_1155(void *parameters); void handle_provide_parameter_1155(void *parameters);
void handle_query_contract_ui_1155(void *parameters); void handle_query_contract_ui_1155(void *parameters);
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,7 +1,11 @@
#ifdef HAVE_NFT_SUPPORT
#include "erc1155_plugin.h" #include "erc1155_plugin.h"
#include "eth_plugin_internal.h" #include "eth_plugin_internal.h"
static void handle_safe_transfer(ethPluginProvideParameter_t *msg, erc1155_context_t *context) { static void handle_safe_transfer(ethPluginProvideParameter_t *msg, erc1155_context_t *context) {
uint8_t new_value[INT256_LENGTH];
switch (context->next_param) { switch (context->next_param) {
case FROM: case FROM:
context->next_param = TO; context->next_param = TO;
@@ -15,7 +19,8 @@ static void handle_safe_transfer(ethPluginProvideParameter_t *msg, erc1155_conte
context->next_param = VALUE; context->next_param = VALUE;
break; break;
case VALUE: case VALUE:
copy_parameter(context->value, msg->parameter, sizeof(context->value)); copy_parameter(new_value, msg->parameter, sizeof(new_value));
convertUint256BE(new_value, INT256_LENGTH, &context->value);
context->next_param = NONE; context->next_param = NONE;
break; break;
default: default:
@@ -25,31 +30,74 @@ static void handle_safe_transfer(ethPluginProvideParameter_t *msg, erc1155_conte
} }
static void handle_batch_transfer(ethPluginProvideParameter_t *msg, erc1155_context_t *context) { static void handle_batch_transfer(ethPluginProvideParameter_t *msg, erc1155_context_t *context) {
uint256_t new_value;
switch (context->next_param) { switch (context->next_param) {
case FROM: case FROM:
context->next_param = TO; context->next_param = TO;
break; break;
case TO: case TO:
copy_address(context->address, msg->parameter, sizeof(context->address)); copy_address(context->address, msg->parameter, sizeof(context->address));
context->next_param = TOKEN_ID; context->next_param = TOKEN_IDS_OFFSET;
break; break;
case TOKEN_IDS_OFFSET: case TOKEN_IDS_OFFSET:
context->tokenIdsOffset = U4BE(msg->parameter, PARAMETER_LENGTH - 4); context->ids_offset = \
U4BE(msg->parameter,
PARAMETER_LENGTH - sizeof(context->ids_offset)) + 4;
context->next_param = VALUE_OFFSET; context->next_param = VALUE_OFFSET;
break; break;
case VALUE_OFFSET: case VALUE_OFFSET:
context->targetOffset = context->tokenIdsOffset; context->values_offset = \
context->next_param = TOKEN_ID; U4BE(msg->parameter,
PARAMETER_LENGTH - sizeof(context->values_offset)) + 4;
context->next_param = TOKEN_IDS_LENGTH;
break;
case TOKEN_IDS_LENGTH:
if ((msg->parameterOffset + PARAMETER_LENGTH) > context->ids_offset)
{
context->ids_array_len = \
U2BE(msg->parameter,
PARAMETER_LENGTH - sizeof(context->ids_array_len));
context->next_param = TOKEN_ID;
// set to zero for next step
context->array_index = 0;
}
break; break;
case TOKEN_ID: case TOKEN_ID:
copy_parameter(context->tokenId, msg->parameter, sizeof(context->tokenId)); // don't copy anything since we won't display it
context->targetOffset = context->valueOffset; if (--context->ids_array_len == 0)
context->next_param = VALUE; {
context->next_param = VALUE_LENGTH;
}
context->array_index++;
break;
case VALUE_LENGTH:
if ((msg->parameterOffset + PARAMETER_LENGTH) > context->values_offset)
{
context->values_array_len = \
U2BE(msg->parameter,
PARAMETER_LENGTH - sizeof(context->values_array_len));
if (context->values_array_len != context->array_index)
{
PRINTF("Token ids and values array sizes mismatch!");
}
context->next_param = VALUE;
// set to zero for next step
context->array_index = 0;
explicit_bzero(&context->value, sizeof(context->value));
}
break; break;
case VALUE: case VALUE:
copy_parameter(context->value, msg->parameter, sizeof(context->value)); // put it temporarily in token id since we don't use it in batch transfer
context->targetOffset = 0; copy_parameter(context->tokenId, msg->parameter, sizeof(context->value));
context->next_param = NONE; convertUint256BE(context->tokenId, sizeof(context->tokenId), &new_value);
add256(&context->value, &new_value, &context->value);
if (--context->values_array_len == 0)
{
context->next_param = NONE;
}
context->array_index++;
break;
default: default:
// Some extra data might be present so don't error. // Some extra data might be present so don't error.
break; break;
@@ -84,10 +132,10 @@ void handle_provide_parameter_1155(void *parameters) {
msg->result = ETH_PLUGIN_RESULT_SUCCESSFUL; msg->result = ETH_PLUGIN_RESULT_SUCCESSFUL;
if (context->targetOffset > SELECTOR_SIZE && //if (context->targetOffset > SELECTOR_SIZE &&
context->targetOffset != msg->parameterOffset - SELECTOR_SIZE) { // context->targetOffset != msg->parameterOffset - SELECTOR_SIZE) {
return; // return;
} //}
switch (context->selectorIndex) { switch (context->selectorIndex) {
case SAFE_TRANSFER: case SAFE_TRANSFER:
handle_safe_transfer(msg, context); handle_safe_transfer(msg, context);
@@ -103,4 +151,6 @@ void handle_provide_parameter_1155(void *parameters) {
msg->result = ETH_PLUGIN_RESULT_ERROR; msg->result = ETH_PLUGIN_RESULT_ERROR;
break; break;
} }
} }
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,3 +1,5 @@
#ifdef HAVE_NFT_SUPPORT
#include "erc1155_plugin.h" #include "erc1155_plugin.h"
static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc1155_context_t *context) { 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) { static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *context) {
switch (msg->screenIndex) { switch (msg->screenIndex) {
case 0: 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); strlcpy(msg->title, "To", msg->titleLength);
getEthDisplayableAddress(context->address, getEthDisplayableAddress(context->address,
msg->msg, msg->msg,
@@ -61,9 +49,17 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex
&global_sha3, &global_sha3,
chainConfig->chainId); chainConfig->chainId);
break; 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: case 2:
strlcpy(msg->title, "NFT Address", msg->titleLength); strlcpy(msg->title, "NFT Address", msg->titleLength);
getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination, getEthDisplayableAddress((uint8_t *)msg->item1->nft.contractAddress,
msg->msg, msg->msg,
msg->msgLength, msg->msgLength,
&global_sha3, &global_sha3,
@@ -76,6 +72,10 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex
msg->msg, msg->msg,
msg->msgLength); msg->msgLength);
break; break;
case 4:
strlcpy(msg->title, "Quantity", msg->titleLength);
tostring256(&context->value, 10, msg->msg, msg->msgLength);
break;
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;
@@ -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) { static void set_batch_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *context) {
char quantity_str[48];
switch (msg->screenIndex) { switch (msg->screenIndex) {
case 0: 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); strlcpy(msg->title, "To", msg->titleLength);
getEthDisplayableAddress(context->address, getEthDisplayableAddress(context->address,
msg->msg, msg->msg,
msg->msgLength, msg->msgLength,
&global_sha3, &global_sha3,
chainConfig->chainId); 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: case 2:
strlcpy(msg->title, "NFT Address", msg->titleLength); strlcpy(msg->title, "NFT Address", msg->titleLength);
getEthDisplayableAddress(msg->pluginSharedRO->txContent->destination, getEthDisplayableAddress((uint8_t *)msg->item1->nft.contractAddress,
msg->msg, msg->msg,
msg->msgLength, msg->msgLength,
&global_sha3, &global_sha3,
chainConfig->chainId); chainConfig->chainId);
break; 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: 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;
@@ -132,4 +147,6 @@ void handle_query_contract_ui_1155(void *parameters) {
PRINTF("Unsupported selector index %d\n", context->selectorIndex); PRINTF("Unsupported selector index %d\n", context->selectorIndex);
break; break;
} }
} }
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,11 +1,13 @@
#ifdef HAVE_NFT_SUPPORT
#include "erc721_plugin.h" #include "erc721_plugin.h"
#include "eth_plugin_internal.h" #include "eth_plugin_internal.h"
static const uint8_t ERC721_APPROVE_SELECTOR[SELECTOR_SIZE] = {0x13, 0x37, 0x42, 0x42}; static const uint8_t ERC721_APPROVE_SELECTOR[SELECTOR_SIZE] = {0x09, 0x5e, 0xa7, 0xb3};
static const uint8_t ERC721_APPROVE_FOR_ALL_SELECTOR[SELECTOR_SIZE] = {0xa2, 0x2c, 0xb4, 0x65}; static const uint8_t ERC721_APPROVE_FOR_ALL_SELECTOR[SELECTOR_SIZE] = {0xa2, 0x2c, 0xb4, 0x65};
static const uint8_t ERC721_TRANSFER_SELECTOR[SELECTOR_SIZE] = {0x23, 0xb8, 0x72, 0xdd}; static const uint8_t ERC721_TRANSFER_SELECTOR[SELECTOR_SIZE] = {0x23, 0xb8, 0x72, 0xdd};
static const uint8_t ERC721_SAFE_TRANSFER_SELECTOR[SELECTOR_SIZE] = {0x42, 0x84, 0x2e, 0x0e}; static const uint8_t ERC721_SAFE_TRANSFER_SELECTOR[SELECTOR_SIZE] = {0x42, 0x84, 0x2e, 0x0e};
static const uint8_t ERC721_SAFE_TRANSFER_DATA_SELECTOR[SELECTOR_SIZE] = {0xf2, 0x42, 0x43, 0x2a}; static const uint8_t ERC721_SAFE_TRANSFER_DATA_SELECTOR[SELECTOR_SIZE] = {0xb8, 0x8d, 0x4f, 0xde};
const uint8_t *const ERC721_SELECTORS[NUM_ERC721_SELECTORS] = { const uint8_t *const ERC721_SELECTORS[NUM_ERC721_SELECTORS] = {
ERC721_APPROVE_SELECTOR, ERC721_APPROVE_SELECTOR,
@@ -62,12 +64,12 @@ static void handle_finalize(void *parameters) {
case TRANSFER: case TRANSFER:
case SAFE_TRANSFER: case SAFE_TRANSFER:
case SAFE_TRANSFER_DATA: case SAFE_TRANSFER_DATA:
case SET_APPROVAL_FOR_ALL:
msg->numScreens = 3;
break;
case APPROVE: case APPROVE:
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;
@@ -125,7 +127,7 @@ void erc721_plugin_call(int message, void *parameters) {
handle_init_contract(parameters); handle_init_contract(parameters);
} break; } break;
case ETH_PLUGIN_PROVIDE_PARAMETER: { case ETH_PLUGIN_PROVIDE_PARAMETER: {
handle_provide_parameter(parameters); handle_provide_parameter_721(parameters);
} break; } break;
case ETH_PLUGIN_FINALIZE: { case ETH_PLUGIN_FINALIZE: {
handle_finalize(parameters); handle_finalize(parameters);
@@ -137,10 +139,12 @@ void erc721_plugin_call(int message, void *parameters) {
handle_query_contract_id(parameters); handle_query_contract_id(parameters);
} break; } break;
case ETH_PLUGIN_QUERY_CONTRACT_UI: { case ETH_PLUGIN_QUERY_CONTRACT_UI: {
handle_query_contract_ui(parameters); handle_query_contract_ui_721(parameters);
} break; } break;
default: default:
PRINTF("Unhandled message %d\n", message); PRINTF("Unhandled message %d\n", message);
break; break;
} }
} }
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,3 +1,5 @@
#ifdef HAVE_NFT_SUPPORT
#pragma once #pragma once
#include <string.h> #include <string.h>
@@ -38,5 +40,7 @@ typedef struct erc721_context_t {
uint8_t selectorIndex; uint8_t selectorIndex;
} erc721_context_t; } erc721_context_t;
void handle_provide_parameter(void *parameters); void handle_provide_parameter_721(void *parameters);
void handle_query_contract_ui(void *parameters); void handle_query_contract_ui_721(void *parameters);
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,3 +1,5 @@
#ifdef HAVE_NFT_SUPPORT
#include "erc721_plugin.h" #include "erc721_plugin.h"
#include "eth_plugin_internal.h" #include "eth_plugin_internal.h"
@@ -60,7 +62,7 @@ static void handle_approval_for_all(ethPluginProvideParameter_t *msg, erc721_con
} }
} }
void handle_provide_parameter(void *parameters) { void handle_provide_parameter_721(void *parameters) {
ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters; ethPluginProvideParameter_t *msg = (ethPluginProvideParameter_t *) parameters;
erc721_context_t *context = (erc721_context_t *) msg->pluginContext; erc721_context_t *context = (erc721_context_t *) msg->pluginContext;
@@ -90,4 +92,6 @@ void handle_provide_parameter(void *parameters) {
msg->result = ETH_PLUGIN_RESULT_ERROR; msg->result = ETH_PLUGIN_RESULT_ERROR;
break; break;
} }
} }
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,3 +1,5 @@
#ifdef HAVE_NFT_SUPPORT
#include "erc721_plugin.h" #include "erc721_plugin.h"
static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context) { static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context) {
@@ -113,7 +115,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(msg->pluginSharedRO->txContent->destination, getEthDisplayableAddress((uint8_t *)msg->item1->nft.contractAddress,
msg->msg, msg->msg,
msg->msgLength, msg->msgLength,
&global_sha3, &global_sha3,
@@ -141,7 +143,7 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc721_context_t *context
} }
} }
void handle_query_contract_ui(void *parameters) { void handle_query_contract_ui_721(void *parameters) {
ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters; ethQueryContractUI_t *msg = (ethQueryContractUI_t *) parameters;
erc721_context_t *context = (erc721_context_t *) msg->pluginContext; erc721_context_t *context = (erc721_context_t *) msg->pluginContext;
@@ -163,4 +165,6 @@ void handle_query_contract_ui(void *parameters) {
PRINTF("Unsupported selector index %d\n", context->selectorIndex); PRINTF("Unsupported selector index %d\n", context->selectorIndex);
break; break;
} }
} }
#endif // HAVE_NFT_SUPPORT

View File

@@ -1,34 +1,44 @@
#!/bin/bash #!/usr/bin/env bash
TESTS_FULL_PATH=$(dirname "$(realpath "$0")")
# FILL THESE WITH YOUR OWN SDKs PATHS # FILL THESE WITH YOUR OWN SDKs PATHS
NANOS_SDK=$TWO # NANOS_SDK=
NANOX_SDK=$X # NANOX_SDK=
# list of apps required by tests that we want to build here # list of apps required by tests that we want to build here
appnames=("ethereum") APPS=("ethereum" "ethereum_classic")
# create elfs folder if it doesn't exist # list of SDKS
NANO_SDKS=("$NANOS_SDK" "$NANOX_SDK")
# list of target elf file name suffix
FILE_SUFFIXES=("nanos" "nanox")
# move to the tests directory
cd "$TESTS_FULL_PATH" || exit 1
# Do it only now since before the cd command, we might not have been inside the repository
GIT_REPO_ROOT=$(git rev-parse --show-toplevel)
TESTS_REL_PATH=$(realpath --relative-to="$GIT_REPO_ROOT" "$TESTS_FULL_PATH")
# create elfs directory if it doesn't exist
mkdir -p elfs mkdir -p elfs
# move to repo's root to build apps # move to repo's root to build apps
cd .. cd "$GIT_REPO_ROOT" || exit 1
echo "*Building elfs for Nano S..." for ((sdk_idx=0; sdk_idx < "${#NANO_SDKS[@]}"; sdk_idx++))
for app in "${appnames[@]}"
do do
echo "**Building $app for Nano S..." nano_sdk="${NANO_SDKS[$sdk_idx]}"
make clean BOLOS_SDK=$NANOS_SDK elf_suffix="${FILE_SUFFIXES[$sdk_idx]}"
make -j ALLOW_DATA=1 NFT_TESTING_KEY=1 DEBUG=1 BOLOS_SDK=$NANOS_SDK CHAIN=$app echo "* Building elfs for $(basename "$nano_sdk")..."
cp bin/app.elf "tests/elfs/${app}_nanos.elf" for appname in "${APPS[@]}"
do
echo "** Building app $appname..."
make clean BOLOS_SDK="$nano_sdk"
make -j DEBUG=1 NFT_TESTING_KEY=1 BOLOS_SDK="$nano_sdk" CHAIN="$appname"
cp bin/app.elf "$TESTS_REL_PATH/elfs/${appname}_${elf_suffix}.elf"
done
done done
# echo "*Building elfs for Nano X..."
# for app in "${appnames[@]}"
# do
# echo "**Building $app for Nano X..."
# make clean BOLOS_SDK=$NANOX_SDK
# make -j DEBUG=1 BOLOS_SDK=$NANOX_SDK CHAIN=$app
# cp bin/app.elf "tests/elfs/${app}_nanox.elf"
# done
echo "done" echo "done"

View File

@@ -20,6 +20,7 @@
"bip32-path": "^0.4.2", "bip32-path": "^0.4.2",
"core-js": "^3.7.0", "core-js": "^3.7.0",
"ethereum-tx-decoder": "^3.0.0", "ethereum-tx-decoder": "^3.0.0",
"ethers": "^5.5.1",
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
"google-protobuf": "^3.11.0", "google-protobuf": "^3.11.0",
"jest-serial-runner": "^1.1.0", "jest-serial-runner": "^1.1.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

View File

@@ -19,7 +19,7 @@ test('[Nano S] Approve DAI tokens', zemu("nanos", async (sim, eth) => {
}); });
})); }));
test('[Nano X] Approve DAI tokens', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Approve DAI tokens', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",

View File

@@ -3,6 +3,8 @@ import "regenerator-runtime/runtime";
import { waitForAppScreen, zemu } from './test.fixture'; import { waitForAppScreen, zemu } from './test.fixture';
test('[Nano S] Deposit ETH on compound, blind sign', zemu("nanos", async (sim, eth) => { test('[Nano S] Deposit ETH on compound, blind sign', zemu("nanos", async (sim, eth) => {
// Enable blind-signing
await sim.navigateAndCompareSnapshots('.', 'nanos_enable_blind_signing', [-2, 0, 0, 3, 0]);
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",
@@ -19,7 +21,7 @@ test('[Nano S] Deposit ETH on compound, blind sign', zemu("nanos", async (sim, e
}); });
})); }));
test('[Nano X] Deposit ETH on compound, blind sign', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Deposit ETH on compound, blind sign', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",

View File

@@ -36,7 +36,7 @@ test('[Nano S] Transfer on palm network on Ethereum', zemu("nanos", async (sim,
}); });
})); }));
test('[Nano X] Transfer on network 112233445566 on Ethereum', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Transfer on network 112233445566 on Ethereum', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",
@@ -53,7 +53,7 @@ test('[Nano X] Transfer on network 112233445566 on Ethereum', zemu("nanox", asyn
}); });
})); }));
test('[Nano X] Transfer on palm network on Ethereum', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Transfer on palm network on Ethereum', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",
@@ -68,4 +68,4 @@ test('[Nano X] Transfer on palm network on Ethereum', zemu("nanox", async (sim,
"s": "3698e84564e58477a49f7a9cea572ef5d672a5538db08f3ee42df5eb75a1b907", "s": "3698e84564e58477a49f7a9cea572ef5d672a5538db08f3ee42df5eb75a1b907",
"v": "0542b8613d", "v": "0542b8613d",
}); });
})); }));

View File

@@ -6,9 +6,6 @@ import { waitForAppScreen, zemu } from './test.fixture';
import Zemu from '@zondax/zemu'; import Zemu from '@zondax/zemu';
test('[Nano S] Try to blind sign with setting disabled', zemu("nanos", async (sim, eth) => { 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]);
// we can't use eth.signTransaction because it detects that contract data is disabled and fails early // we can't use eth.signTransaction because it detects that contract data is disabled and fails early
let transport = await sim.getTransport(); let transport = await sim.getTransport();
let buffer = Buffer.from("058000002c8000003c800000010000000000000000f849208506fc23ac008303dc3194f650c3d88d12db855b8bf7d11be6c55a4e07dcc980a4a1712d6800000000000000000000000000000000000000000000000000000000000acbc7018080", "hex"); let buffer = Buffer.from("058000002c8000003c800000010000000000000000f849208506fc23ac008303dc3194f650c3d88d12db855b8bf7d11be6c55a4e07dcc980a4a1712d6800000000000000000000000000000000000000000000000000000000000acbc7018080", "hex");
@@ -21,7 +18,7 @@ test('[Nano S] Try to blind sign with setting disabled', zemu("nanos", async (si
await sim.navigateAndCompareSnapshots('.', 'nanos_try_to_blind_sign_with_setting_disabled', [1, 0]); await sim.navigateAndCompareSnapshots('.', 'nanos_try_to_blind_sign_with_setting_disabled', [1, 0]);
})); }));
test('[Nano X] Try to blind sign with setting disabled', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Try to blind sign with setting disabled', zemu("nanox", async (sim, eth) => {
// disable blind signing // 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]);
@@ -35,4 +32,4 @@ test('[Nano X] Try to blind sign with setting disabled', zemu("nanox", async (si
await Zemu.sleep(1000); await Zemu.sleep(1000);
await waitForAppScreen(sim); await waitForAppScreen(sim);
await sim.navigateAndCompareSnapshots('.', 'nanox_try_to_blind_sign_with_setting_disabled', [0]); await sim.navigateAndCompareSnapshots('.', 'nanox_try_to_blind_sign_with_setting_disabled', [0]);
})); }));

View File

@@ -20,7 +20,7 @@ test('[Nano S] Transfer eip1559', zemu("nanos", async (sim, eth) => {
})); }));
test('[Nano X] Transfer eip1559', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Transfer eip1559', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/0'/0/0", "44'/60'/0'/0/0",
@@ -36,4 +36,4 @@ test('[Nano X] Transfer eip1559', zemu("nanox", async (sim, eth) => {
"v": "01" "v": "01"
}); });
})); }));

View File

@@ -2,7 +2,7 @@ import "core-js/stable";
import "regenerator-runtime/runtime"; import "regenerator-runtime/runtime";
import { waitForAppScreen, zemu, txFromEtherscan } from './test.fixture'; import { waitForAppScreen, zemu, txFromEtherscan } from './test.fixture';
test('[Nano S] Transfer erc721', zemu("nanos", async (sim, eth) => { test.skip('[Nano S] Transfer erc721', zemu("nanos", async (sim, eth) => {
// https://etherscan.io/tx/0x73cec4fc07de3a24ba42e8756e13b7ddfa9bd449126c37640881195e8ea9e679 // https://etherscan.io/tx/0x73cec4fc07de3a24ba42e8756e13b7ddfa9bd449126c37640881195e8ea9e679
// Modified to put a bigger token id // Modified to put a bigger token id
@@ -24,7 +24,7 @@ test('[Nano S] Transfer erc721', zemu("nanos", async (sim, eth) => {
}); });
})); }));
test('[Nano S] Transfer erc721 with attached ETH', zemu("nanos", async (sim, eth) => { test.skip('[Nano S] Transfer erc721 with attached ETH', zemu("nanos", async (sim, eth) => {
const rawTx = "0x02f8d601058459682f0085233da9943e8301865b94bd3531da5cf5857e7cfaa92426877b022e612cf8854242424242b86423b872dd0000000000000000000000004cc568b73c0dcf8e90db26d7fd3a6cfadca108a3000000000000000000000000d4c9b20950c3eca38fc1f33f54bdf9694e4887990000000000000000000000000000000000000000000000000000000000000f21c080a094c8632fe7277aa8c54cea9d81a15911cfa4970a2bf7356d14d04cc5afbcdab7a013a77b8c79e5d9b2b35edb3c44db3bb41b92f5c463ff126bf19d213b2b9ba8b5" const rawTx = "0x02f8d601058459682f0085233da9943e8301865b94bd3531da5cf5857e7cfaa92426877b022e612cf8854242424242b86423b872dd0000000000000000000000004cc568b73c0dcf8e90db26d7fd3a6cfadca108a3000000000000000000000000d4c9b20950c3eca38fc1f33f54bdf9694e4887990000000000000000000000000000000000000000000000000000000000000f21c080a094c8632fe7277aa8c54cea9d81a15911cfa4970a2bf7356d14d04cc5afbcdab7a013a77b8c79e5d9b2b35edb3c44db3bb41b92f5c463ff126bf19d213b2b9ba8b5"
const serializedTx = txFromEtherscan(rawTx); const serializedTx = txFromEtherscan(rawTx);
@@ -45,7 +45,7 @@ test('[Nano S] Transfer erc721 with attached ETH', zemu("nanos", async (sim, eth
}); });
})); }));
test('[Nano S] set approval for all erc721', zemu("nanos", async (sim, eth) => { test.skip('[Nano S] set approval for all erc721', zemu("nanos", async (sim, eth) => {
// https://etherscan.io/tx/0x86b936db53c19fddf26b8d145f165e1c7fdff3c0f8b14b7758a38f0400cfd93f // https://etherscan.io/tx/0x86b936db53c19fddf26b8d145f165e1c7fdff3c0f8b14b7758a38f0400cfd93f
const rawTx = "0x02f8b0010c8459682f00852cfbb00ee682b54294d4e4078ca3495de5b1d4db434bebc5a98619778280b844a22cb4650000000000000000000000002efcb1e8d4472d35356b9747bea8a051eac2e3f50000000000000000000000000000000000000000000000000000000000000001c001a0c5b8c024c15ca1452ce8a13eacfcdc25f1c6f581bb3ce570e82f08f1b792b3aca03be4dba0302ae190618a72eb1202ce3af3e17afd7d8a94345a48cae5cad15541"; const rawTx = "0x02f8b0010c8459682f00852cfbb00ee682b54294d4e4078ca3495de5b1d4db434bebc5a98619778280b844a22cb4650000000000000000000000002efcb1e8d4472d35356b9747bea8a051eac2e3f50000000000000000000000000000000000000000000000000000000000000001c001a0c5b8c024c15ca1452ce8a13eacfcdc25f1c6f581bb3ce570e82f08f1b792b3aca03be4dba0302ae190618a72eb1202ce3af3e17afd7d8a94345a48cae5cad15541";
@@ -87,7 +87,7 @@ test.skip('[Nano S] approval erc721', zemu("nanos", async (sim, eth) => {
}); });
})); }));
test('[Nano S] safe transfer erc721', zemu("nanos", async (sim, eth) => { test.skip('[Nano S] safe transfer erc721', zemu("nanos", async (sim, eth) => {
// https://etherscan.io/tx/0x1ee6ce9be1c9fe6f030ff124ba8c88a410223c022816547e4b3fedd3a4d2dc1e // https://etherscan.io/tx/0x1ee6ce9be1c9fe6f030ff124ba8c88a410223c022816547e4b3fedd3a4d2dc1e
const rawTx = "0xf8cc82028585077359400083061a8094d4e4078ca3495de5b1d4db434bebc5a98619778280b86442842e0e000000000000000000000000c352b534e8b987e036a93539fd6897f53488e56a0000000000000000000000000a9287d9339c175cd3ea0ad4228f734a9f75ee6200000000000000000000000000000000000000000000000000000000000000621ca08250f4b2c8f28c5e4ef621dba4682990d1faf930c8cb6d032c6e7278e8951d92a03c1e1f6d63ed339041f69f24c6c0968ba26f244f779cb4fa7a468f3ba3d3e06e"; const rawTx = "0xf8cc82028585077359400083061a8094d4e4078ca3495de5b1d4db434bebc5a98619778280b86442842e0e000000000000000000000000c352b534e8b987e036a93539fd6897f53488e56a0000000000000000000000000a9287d9339c175cd3ea0ad4228f734a9f75ee6200000000000000000000000000000000000000000000000000000000000000621ca08250f4b2c8f28c5e4ef621dba4682990d1faf930c8cb6d032c6e7278e8951d92a03c1e1f6d63ed339041f69f24c6c0968ba26f244f779cb4fa7a468f3ba3d3e06e";
@@ -127,4 +127,4 @@ test.skip('[Nano S] safe transfer with data erc721', zemu("nanos", async (sim, e
await expect(tx).resolves.toEqual({ await expect(tx).resolves.toEqual({
}); });
})); }));

View File

@@ -47,7 +47,7 @@ test('[Nano S] Transfer Ether on network 5234 on Ethereum app', zemu("nanos", as
}); });
})); }));
test('[Nano X] Transfer Ether on Ethereum app', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Transfer Ether on Ethereum app', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",
@@ -64,7 +64,7 @@ test('[Nano X] Transfer Ether on Ethereum app', zemu("nanox", async (sim, eth) =
}); });
})); }));
test('[Nano X] Transfer Ether on network 5234 on Ethereum app', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Transfer Ether on network 5234 on Ethereum app', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",

View File

@@ -19,7 +19,7 @@ test('[Nano S] Transfer bsc', zemu("nanos", async (sim, eth) => {
}); });
})); }));
test('[Nano X] Transfer bsc', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Transfer bsc', zemu("nanox", async (sim, eth) => {
const tx = eth.signTransaction( const tx = eth.signTransaction(
"44'/60'/1'/0/0", "44'/60'/1'/0/0",
@@ -34,4 +34,4 @@ test('[Nano X] Transfer bsc', zemu("nanox", async (sim, eth) => {
"s": "6b35492b7108d9d9e1cc7aede536ed6b3173197b56dd873cbc3b43e041d6f407", "s": "6b35492b7108d9d9e1cc7aede536ed6b3173197b56dd873cbc3b43e041d6f407",
"v": "93", "v": "93",
}); });
})); }));

View File

@@ -60,7 +60,7 @@ test("[Nano S] Transfer on network 5234 on Ethereum clone", async () => {
} }
}); });
test("[Nano X] Transfer on Ethereum clone app", async () => { test.skip("[Nano X] Transfer on Ethereum clone app", async () => {
jest.setTimeout(TIMEOUT); jest.setTimeout(TIMEOUT);
const sim = new Zemu(NANOX_CLONE_ELF_PATH, NANOX_ETH_LIB); const sim = new Zemu(NANOX_CLONE_ELF_PATH, NANOX_ETH_LIB);
@@ -89,7 +89,7 @@ test("[Nano X] Transfer on Ethereum clone app", async () => {
} }
}); });
test("[Nano X] Transfer on network 5234 on Ethereum clone", async () => { test.skip("[Nano X] Transfer on network 5234 on Ethereum clone", async () => {
jest.setTimeout(TIMEOUT); jest.setTimeout(TIMEOUT);
const sim = new Zemu(NANOX_CLONE_ELF_PATH, NANOX_ETH_LIB); const sim = new Zemu(NANOX_CLONE_ELF_PATH, NANOX_ETH_LIB);
@@ -111,4 +111,4 @@ test("[Nano X] Transfer on network 5234 on Ethereum clone", async () => {
} finally { } finally {
await sim.close(); await sim.close();
} }
}); });

View File

@@ -34,7 +34,7 @@ test('[Nano S] Transfer Ether on Ethereum app', zemu("nanos", async (sim, eth) =
}); });
})); }));
test('[Nano X] Transfer Ether on Ethereum app', zemu("nanox", async (sim, eth) => { test.skip('[Nano X] Transfer Ether on Ethereum app', zemu("nanox", async (sim, eth) => {
// Provide USDT token info to the app // Provide USDT token info to the app
const usdt_info = byContractAddressAndChainId("0xdac17f958d2ee523a2206206994597c13d831ec7", 1); const usdt_info = byContractAddressAndChainId("0xdac17f958d2ee523a2206206994597c13d831ec7", 1);

View File

@@ -966,6 +966,21 @@
"@ethersproject/properties" "^5.4.0" "@ethersproject/properties" "^5.4.0"
"@ethersproject/strings" "^5.4.0" "@ethersproject/strings" "^5.4.0"
"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613"
integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==
dependencies:
"@ethersproject/address" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/constants" "^5.5.0"
"@ethersproject/hash" "^5.5.0"
"@ethersproject/keccak256" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0": "@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0":
version "5.4.1" version "5.4.1"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e"
@@ -979,6 +994,19 @@
"@ethersproject/transactions" "^5.4.0" "@ethersproject/transactions" "^5.4.0"
"@ethersproject/web" "^5.4.0" "@ethersproject/web" "^5.4.0"
"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0":
version "5.5.1"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5"
integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==
dependencies:
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/networks" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/transactions" "^5.5.0"
"@ethersproject/web" "^5.5.0"
"@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0": "@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0":
version "5.4.1" version "5.4.1"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81"
@@ -990,6 +1018,17 @@
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/properties" "^5.4.0" "@ethersproject/properties" "^5.4.0"
"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d"
integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==
dependencies:
"@ethersproject/abstract-provider" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0": "@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3"
@@ -1001,6 +1040,17 @@
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/rlp" "^5.4.0" "@ethersproject/rlp" "^5.4.0"
"@ethersproject/address@5.5.0", "@ethersproject/address@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f"
integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==
dependencies:
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/keccak256" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/rlp" "^5.5.0"
"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": "@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a"
@@ -1008,6 +1058,13 @@
dependencies: dependencies:
"@ethersproject/bytes" "^5.4.0" "@ethersproject/bytes" "^5.4.0"
"@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090"
integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": "@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6"
@@ -1016,6 +1073,14 @@
"@ethersproject/bytes" "^5.4.0" "@ethersproject/bytes" "^5.4.0"
"@ethersproject/properties" "^5.4.0" "@ethersproject/properties" "^5.4.0"
"@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3"
integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/bignumber@5.4.1", "@ethersproject/bignumber@^5.4.0": "@ethersproject/bignumber@5.4.1", "@ethersproject/bignumber@^5.4.0":
version "5.4.1" version "5.4.1"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.1.tgz#64399d3b9ae80aa83d483e550ba57ea062c1042d" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.1.tgz#64399d3b9ae80aa83d483e550ba57ea062c1042d"
@@ -1025,6 +1090,15 @@
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
bn.js "^4.11.9" bn.js "^4.11.9"
"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527"
integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
bn.js "^4.11.9"
"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0": "@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e"
@@ -1032,6 +1106,13 @@
dependencies: dependencies:
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c"
integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==
dependencies:
"@ethersproject/logger" "^5.5.0"
"@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0": "@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a"
@@ -1039,6 +1120,13 @@
dependencies: dependencies:
"@ethersproject/bignumber" "^5.4.0" "@ethersproject/bignumber" "^5.4.0"
"@ethersproject/constants@5.5.0", "@ethersproject/constants@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e"
integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==
dependencies:
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/contracts@5.4.1": "@ethersproject/contracts@5.4.1":
version "5.4.1" version "5.4.1"
resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470"
@@ -1055,6 +1143,22 @@
"@ethersproject/properties" "^5.4.0" "@ethersproject/properties" "^5.4.0"
"@ethersproject/transactions" "^5.4.0" "@ethersproject/transactions" "^5.4.0"
"@ethersproject/contracts@5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197"
integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg==
dependencies:
"@ethersproject/abi" "^5.5.0"
"@ethersproject/abstract-provider" "^5.5.0"
"@ethersproject/abstract-signer" "^5.5.0"
"@ethersproject/address" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/constants" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/transactions" "^5.5.0"
"@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0": "@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0"
@@ -1069,6 +1173,20 @@
"@ethersproject/properties" "^5.4.0" "@ethersproject/properties" "^5.4.0"
"@ethersproject/strings" "^5.4.0" "@ethersproject/strings" "^5.4.0"
"@ethersproject/hash@5.5.0", "@ethersproject/hash@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9"
integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==
dependencies:
"@ethersproject/abstract-signer" "^5.5.0"
"@ethersproject/address" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/keccak256" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": "@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac"
@@ -1087,6 +1205,24 @@
"@ethersproject/transactions" "^5.4.0" "@ethersproject/transactions" "^5.4.0"
"@ethersproject/wordlists" "^5.4.0" "@ethersproject/wordlists" "^5.4.0"
"@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6"
integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q==
dependencies:
"@ethersproject/abstract-signer" "^5.5.0"
"@ethersproject/basex" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/pbkdf2" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/sha2" "^5.5.0"
"@ethersproject/signing-key" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@ethersproject/transactions" "^5.5.0"
"@ethersproject/wordlists" "^5.5.0"
"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": "@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95"
@@ -1106,6 +1242,25 @@
aes-js "3.0.0" aes-js "3.0.0"
scrypt-js "3.0.1" scrypt-js "3.0.1"
"@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325"
integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ==
dependencies:
"@ethersproject/abstract-signer" "^5.5.0"
"@ethersproject/address" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/hdnode" "^5.5.0"
"@ethersproject/keccak256" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/pbkdf2" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/random" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@ethersproject/transactions" "^5.5.0"
aes-js "3.0.0"
scrypt-js "3.0.1"
"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0": "@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318"
@@ -1114,11 +1269,24 @@
"@ethersproject/bytes" "^5.4.0" "@ethersproject/bytes" "^5.4.0"
js-sha3 "0.5.7" js-sha3 "0.5.7"
"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492"
integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==
dependencies:
"@ethersproject/bytes" "^5.5.0"
js-sha3 "0.8.0"
"@ethersproject/logger@5.4.0", "@ethersproject/logger@^5.4.0": "@ethersproject/logger@5.4.0", "@ethersproject/logger@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9"
integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ== integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==
"@ethersproject/logger@5.5.0", "@ethersproject/logger@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d"
integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==
"@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0": "@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0":
version "5.4.2" version "5.4.2"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35"
@@ -1126,6 +1294,13 @@
dependencies: dependencies:
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/networks@5.5.0", "@ethersproject/networks@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.0.tgz#babec47cab892c51f8dd652ce7f2e3e14283981a"
integrity sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA==
dependencies:
"@ethersproject/logger" "^5.5.0"
"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": "@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c"
@@ -1134,6 +1309,14 @@
"@ethersproject/bytes" "^5.4.0" "@ethersproject/bytes" "^5.4.0"
"@ethersproject/sha2" "^5.4.0" "@ethersproject/sha2" "^5.4.0"
"@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050"
integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/sha2" "^5.5.0"
"@ethersproject/properties@5.4.0", "@ethersproject/properties@^5.4.0": "@ethersproject/properties@5.4.0", "@ethersproject/properties@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7"
@@ -1141,6 +1324,13 @@
dependencies: dependencies:
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/properties@5.5.0", "@ethersproject/properties@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995"
integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==
dependencies:
"@ethersproject/logger" "^5.5.0"
"@ethersproject/providers@5.4.4": "@ethersproject/providers@5.4.4":
version "5.4.4" version "5.4.4"
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.4.tgz#6729120317942fc0ab0ecdb35e944ec6bbedb795" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.4.tgz#6729120317942fc0ab0ecdb35e944ec6bbedb795"
@@ -1166,6 +1356,31 @@
bech32 "1.1.4" bech32 "1.1.4"
ws "7.4.6" ws "7.4.6"
"@ethersproject/providers@5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.0.tgz#bc2876a8fe5e0053ed9828b1f3767ae46e43758b"
integrity sha512-xqMbDnS/FPy+J/9mBLKddzyLLAQFjrVff5g00efqxPzcAwXiR+SiCGVy6eJ5iAIirBOATjx7QLhDNPGV+AEQsw==
dependencies:
"@ethersproject/abstract-provider" "^5.5.0"
"@ethersproject/abstract-signer" "^5.5.0"
"@ethersproject/address" "^5.5.0"
"@ethersproject/basex" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/constants" "^5.5.0"
"@ethersproject/hash" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/networks" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/random" "^5.5.0"
"@ethersproject/rlp" "^5.5.0"
"@ethersproject/sha2" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@ethersproject/transactions" "^5.5.0"
"@ethersproject/web" "^5.5.0"
bech32 "1.1.4"
ws "7.4.6"
"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": "@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16"
@@ -1174,6 +1389,14 @@
"@ethersproject/bytes" "^5.4.0" "@ethersproject/bytes" "^5.4.0"
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/random@5.5.0", "@ethersproject/random@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.0.tgz#305ed9e033ca537735365ac12eed88580b0f81f9"
integrity sha512-egGYZwZ/YIFKMHcoBUo8t3a8Hb/TKYX8BCBoLjudVCZh892welR3jOxgOmb48xznc9bTcMm7Tpwc1gHC1PFNFQ==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": "@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931"
@@ -1182,6 +1405,14 @@
"@ethersproject/bytes" "^5.4.0" "@ethersproject/bytes" "^5.4.0"
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0"
integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": "@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371"
@@ -1191,6 +1422,15 @@
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
hash.js "1.1.7" hash.js "1.1.7"
"@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7"
integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
hash.js "1.1.7"
"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": "@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec"
@@ -1203,6 +1443,18 @@
elliptic "6.5.4" elliptic "6.5.4"
hash.js "1.1.7" hash.js "1.1.7"
"@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0"
integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
bn.js "^4.11.9"
elliptic "6.5.4"
hash.js "1.1.7"
"@ethersproject/solidity@5.4.0": "@ethersproject/solidity@5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec"
@@ -1214,6 +1466,18 @@
"@ethersproject/sha2" "^5.4.0" "@ethersproject/sha2" "^5.4.0"
"@ethersproject/strings" "^5.4.0" "@ethersproject/strings" "^5.4.0"
"@ethersproject/solidity@5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f"
integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw==
dependencies:
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/keccak256" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/sha2" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0": "@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a"
@@ -1223,6 +1487,15 @@
"@ethersproject/constants" "^5.4.0" "@ethersproject/constants" "^5.4.0"
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/strings@5.5.0", "@ethersproject/strings@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549"
integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/constants" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0": "@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0"
@@ -1238,6 +1511,21 @@
"@ethersproject/rlp" "^5.4.0" "@ethersproject/rlp" "^5.4.0"
"@ethersproject/signing-key" "^5.4.0" "@ethersproject/signing-key" "^5.4.0"
"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908"
integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==
dependencies:
"@ethersproject/address" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/constants" "^5.5.0"
"@ethersproject/keccak256" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/rlp" "^5.5.0"
"@ethersproject/signing-key" "^5.5.0"
"@ethersproject/units@5.4.0": "@ethersproject/units@5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe"
@@ -1247,6 +1535,15 @@
"@ethersproject/constants" "^5.4.0" "@ethersproject/constants" "^5.4.0"
"@ethersproject/logger" "^5.4.0" "@ethersproject/logger" "^5.4.0"
"@ethersproject/units@5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e"
integrity sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag==
dependencies:
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/constants" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/wallet@5.4.0": "@ethersproject/wallet@5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353"
@@ -1268,6 +1565,27 @@
"@ethersproject/transactions" "^5.4.0" "@ethersproject/transactions" "^5.4.0"
"@ethersproject/wordlists" "^5.4.0" "@ethersproject/wordlists" "^5.4.0"
"@ethersproject/wallet@5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75"
integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q==
dependencies:
"@ethersproject/abstract-provider" "^5.5.0"
"@ethersproject/abstract-signer" "^5.5.0"
"@ethersproject/address" "^5.5.0"
"@ethersproject/bignumber" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/hash" "^5.5.0"
"@ethersproject/hdnode" "^5.5.0"
"@ethersproject/json-wallets" "^5.5.0"
"@ethersproject/keccak256" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/random" "^5.5.0"
"@ethersproject/signing-key" "^5.5.0"
"@ethersproject/transactions" "^5.5.0"
"@ethersproject/wordlists" "^5.5.0"
"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": "@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f"
@@ -1279,6 +1597,17 @@
"@ethersproject/properties" "^5.4.0" "@ethersproject/properties" "^5.4.0"
"@ethersproject/strings" "^5.4.0" "@ethersproject/strings" "^5.4.0"
"@ethersproject/web@5.5.0", "@ethersproject/web@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.0.tgz#0e5bb21a2b58fb4960a705bfc6522a6acf461e28"
integrity sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA==
dependencies:
"@ethersproject/base64" "^5.5.0"
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": "@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0":
version "5.4.0" version "5.4.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7"
@@ -1290,6 +1619,17 @@
"@ethersproject/properties" "^5.4.0" "@ethersproject/properties" "^5.4.0"
"@ethersproject/strings" "^5.4.0" "@ethersproject/strings" "^5.4.0"
"@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f"
integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q==
dependencies:
"@ethersproject/bytes" "^5.5.0"
"@ethersproject/hash" "^5.5.0"
"@ethersproject/logger" "^5.5.0"
"@ethersproject/properties" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
"@grpc/grpc-js@^1.3.4": "@grpc/grpc-js@^1.3.4":
version "1.3.7" version "1.3.7"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.7.tgz#58b687aff93b743aafde237fd2ee9a3259d7f2d8" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.3.7.tgz#58b687aff93b743aafde237fd2ee9a3259d7f2d8"
@@ -3176,6 +3516,42 @@ ethers@^5.4.4:
"@ethersproject/web" "5.4.0" "@ethersproject/web" "5.4.0"
"@ethersproject/wordlists" "5.4.0" "@ethersproject/wordlists" "5.4.0"
ethers@^5.5.1:
version "5.5.1"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.1.tgz#d3259a95a42557844aa543906c537106c0406fbf"
integrity sha512-RodEvUFZI+EmFcE6bwkuJqpCYHazdzeR1nMzg+YWQSmQEsNtfl1KHGfp/FWZYl48bI/g7cgBeP2IlPthjiVngw==
dependencies:
"@ethersproject/abi" "5.5.0"
"@ethersproject/abstract-provider" "5.5.1"
"@ethersproject/abstract-signer" "5.5.0"
"@ethersproject/address" "5.5.0"
"@ethersproject/base64" "5.5.0"
"@ethersproject/basex" "5.5.0"
"@ethersproject/bignumber" "5.5.0"
"@ethersproject/bytes" "5.5.0"
"@ethersproject/constants" "5.5.0"
"@ethersproject/contracts" "5.5.0"
"@ethersproject/hash" "5.5.0"
"@ethersproject/hdnode" "5.5.0"
"@ethersproject/json-wallets" "5.5.0"
"@ethersproject/keccak256" "5.5.0"
"@ethersproject/logger" "5.5.0"
"@ethersproject/networks" "5.5.0"
"@ethersproject/pbkdf2" "5.5.0"
"@ethersproject/properties" "5.5.0"
"@ethersproject/providers" "5.5.0"
"@ethersproject/random" "5.5.0"
"@ethersproject/rlp" "5.5.0"
"@ethersproject/sha2" "5.5.0"
"@ethersproject/signing-key" "5.5.0"
"@ethersproject/solidity" "5.5.0"
"@ethersproject/strings" "5.5.0"
"@ethersproject/transactions" "5.5.0"
"@ethersproject/units" "5.5.0"
"@ethersproject/wallet" "5.5.0"
"@ethersproject/web" "5.5.0"
"@ethersproject/wordlists" "5.5.0"
events@^3.0.0, events@^3.3.0: events@^3.0.0, events@^3.3.0:
version "3.3.0" version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
@@ -4806,6 +5182,11 @@ js-sha3@0.5.7:
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=
js-sha3@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"