Add Deversifi proxy support

This commit is contained in:
BTChip github
2021-04-05 14:56:56 +02:00
parent b09ba946d5
commit c7e3bfda08
4 changed files with 204 additions and 11 deletions

View File

@@ -30,8 +30,8 @@ APP_LOAD_PARAMS += --path "45'"
APPVERSION_M=1
APPVERSION_N=6
APPVERSION_P=5
APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)
APPVERSION_P=6
APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dvf1
APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION)
ifeq ($(CHAIN),)

View File

@@ -67,6 +67,10 @@ static const uint8_t const STARKWARE_DEPOSIT_NFT_RECLAIM_ID[SELECTOR_SIZE] = {0x
static const uint8_t const STARKWARE_WITHDRAW_AND_MINT_ID[SELECTOR_SIZE] = {0xd9, 0x14, 0x43, 0xb7};
static const uint8_t const STARKWARE_WITHDRAW_NFT_ID[SELECTOR_SIZE] = {0x01, 0x9b, 0x41, 0x7a};
static const uint8_t const STARKWARE_WITHDRAW_NFT_TO_ID[SELECTOR_SIZE] = {0xeb, 0xef, 0x0f, 0xd0};
static const uint8_t const STARKWARE_REGISTER_AND_DEPOSIT_TOKEN_ID[SELECTOR_SIZE] = { 0x10, 0x82, 0x08, 0xcf };
static const uint8_t const STARKWARE_REGISTER_AND_DEPOSIT_ETH_ID[SELECTOR_SIZE] = { 0xa7, 0x78, 0xc0, 0xc3 };
static const uint8_t const STARKWARE_PROXY_DEPOSIT_TOKEN_ID[SELECTOR_SIZE] = { 0xdc, 0xca, 0xd5, 0x24 };
static const uint8_t const STARKWARE_PROXY_DEPOSIT_ETH_ID[SELECTOR_SIZE] = { 0x6c, 0xe5, 0xd9, 0x57 };
const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS] = {
STARKWARE_REGISTER_ID,
@@ -84,7 +88,12 @@ const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS] = {
STARKWARE_DEPOSIT_NFT_RECLAIM_ID,
STARKWARE_WITHDRAW_AND_MINT_ID,
STARKWARE_WITHDRAW_NFT_ID,
STARKWARE_WITHDRAW_NFT_TO_ID};
STARKWARE_WITHDRAW_NFT_TO_ID,
STARKWARE_REGISTER_AND_DEPOSIT_TOKEN_ID,
STARKWARE_REGISTER_AND_DEPOSIT_ETH_ID,
STARKWARE_PROXY_DEPOSIT_TOKEN_ID,
STARKWARE_PROXY_DEPOSIT_ETH_ID
};
#endif

View File

@@ -32,7 +32,7 @@ extern const uint8_t* const ETH2_SELECTORS[NUM_ETH2_SELECTORS];
#ifdef HAVE_STARKWARE
#define NUM_STARKWARE_SELECTORS 16
#define NUM_STARKWARE_SELECTORS 20
extern const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS];
#endif

View File

@@ -24,14 +24,24 @@ typedef enum {
STARKWARE_DEPOSIT_NFT_RECLAIM,
STARKWARE_WITHDRAW_AND_MINT,
STARKWARE_WITHDRAW_NFT,
STARKWARE_WITHDRAW_NFT_TO
STARKWARE_WITHDRAW_NFT_TO,
STARKWARE_REGISTER_AND_DEPOSIT_TOKEN,
STARKWARE_REGISTER_AND_DEPOSIT_ETH,
STARKWARE_PROXY_DEPOSIT_TOKEN,
STARKWARE_PROXY_DEPOSIT_ETH,
} starkwareSelector_t;
#ifndef HAVE_TOKENS_EXTRA_LIST
static const uint8_t DEVERSIFI_CONTRACT[] = {0x01, 0x5d, 0x22, 0x04, 0x5d, 0xac, 0xea,
0xb0, 0x3b, 0x15, 0x80, 0x31, 0xec, 0xb7,
0xd9, 0xd0, 0x6f, 0xad, 0x24, 0x60, 0x9b};
static const uint8_t DEVERSIFI_CONTRACT[] = {0x02,
0x5d, 0x22, 0x04, 0x5d, 0xac, 0xea, 0xb0,
0x3b, 0x15, 0x80, 0x31, 0xec, 0xb7, 0xd9,
0xd0, 0x6f, 0xad, 0x24, 0x60, 0x9b,
0x7d, 0xe1, 0xf0, 0x42, 0x04, 0xef, 0x29,
0x22, 0x9d, 0x84, 0xe7, 0xc0, 0xc2, 0xd1,
0x21, 0x6c, 0x28, 0x64, 0x5a, 0x15};
#else
@@ -112,6 +122,19 @@ static const uint8_t DEVERSIFI_CONTRACT[] = {
// To Eth Address
// NFT Contract
// Token ID
// register and deposit token : stark key (32), variable signature, verify assetType (32), vault Id (4), quantized amount (32), token address (20), quantum (32)
// Register and deposit
// Contract Name
// From ETH address
// Master account
// Token Account
// Amount
// register and deposit : stark key (32), variable signature, verify assetType (32), vault Id (4)
// flow similar to register and deposit
// deposit token proxy : stark key (32), verify assetType (32), vault Id (4), quantized Amount (32), token address (20), quantum (32)
// flow similar to deposit
// deposit proxy : stark key (32), verify assetType (32), vault Id (4)
// flow similar to deposit
static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = {0,
4 + 32 + 32 + 32 + 32,
@@ -128,7 +151,11 @@ static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = {0,
4 + 32 + 32 + 32 + 32,
0,
4 + 32 + 32 + 32,
4 + 32 + 32 + 32 + 32};
4 + 32 + 32 + 32 + 32,
0,
0,
4 + 32 + 32 + 32 + 32 + 32 + 32,
4 + 32 + 32 + 32};
static const uint8_t STARKWARE_NUM_SCREENS[] = {4 - 1,
5 - 1,
@@ -145,7 +172,11 @@ static const uint8_t STARKWARE_NUM_SCREENS[] = {4 - 1,
6 - 1,
4 - 1,
6 - 1,
6 - 1};
6 - 1,
6 - 1,
6 - 1,
5 - 1,
5 - 1};
typedef struct starkware_parameters_t {
uint8_t vaultId[4];
@@ -198,6 +229,49 @@ bool starkware_verify_asset_id(uint8_t *tmp32, uint8_t *tokenId, bool assetTypeO
return true;
}
bool starkware_verify_token(uint8_t *token) {
if (quantumSet) {
if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) {
tokenDefinition_t *currentToken = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex];
if (memcmp(token + 32 - 20, currentToken->address, 20) != 0) {
PRINTF("Token not matching got %.*H\n", 20, token + 32 - 20);
PRINTF("Current token %.*H\n", 20, currentToken->address);
return false;
}
}
else {
PRINTF("Quantum not set\n");
return false;
}
}
else {
PRINTF("Quantum not set\n");
return false;
}
return true;
}
bool starkware_verify_quantum(uint8_t *quantum) {
if (quantumSet) {
if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) {
if (memcmp(quantum, dataContext.tokenContext.quantum, 32) != 0) {
PRINTF("Quantum not matching got %.*H\n", 32, quantum);
PRINTF("Current quantum %.*H\n", 32, dataContext.tokenContext.quantum);
return false;
}
}
else {
PRINTF("Quantum not set\n");
return false;
}
}
else {
PRINTF("Quantum not set\n");
return false;
}
return true;
}
bool starkware_verify_nft_token_id(uint8_t *tokenId) {
if (!quantumSet) {
PRINTF("Quantum not set\n");
@@ -389,6 +463,10 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_AND_MINT:
case STARKWARE_WITHDRAW_NFT:
case STARKWARE_WITHDRAW_NFT_TO:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
memmove(context->starkKey, msg->parameter, 32);
break;
@@ -426,10 +504,17 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_AND_MINT:
case STARKWARE_WITHDRAW_NFT:
case STARKWARE_WITHDRAW_NFT_TO:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
context->validToken =
starkware_verify_asset_id(context->amount, msg->parameter, true);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
// drop variable byte array signature offset
break;
default:
break;
}
@@ -439,6 +524,8 @@ void starkware_plugin_call(int message, void *parameters) {
case 4 + 32 + 32:
switch (context->selectorIndex) {
case STARKWARE_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
context->validToken =
starkware_verify_asset_id(context->amount, msg->parameter, true);
break;
@@ -449,6 +536,8 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_NFT:
case STARKWARE_DEPOSIT_NFT_RECLAIM:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
memmove(context->vaultId, msg->parameter + 32 - 4, 4);
break;
@@ -471,6 +560,7 @@ void starkware_plugin_call(int message, void *parameters) {
switch (context->selectorIndex) {
case STARKWARE_ESCAPE:
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
memmove(context->amount, msg->parameter, 32);
break;
@@ -483,16 +573,77 @@ void starkware_plugin_call(int message, void *parameters) {
context->validToken = starkware_verify_nft_token_id(msg->parameter);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
memmove(context->vaultId, msg->parameter + 32 - 4, 4);
break;
default:
break;
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
case 4 + 32 + 32 + 32 + 32:
switch(context->selectorIndex) {
switch(context->selectorIndex) {
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
memmove(context->amount, msg->parameter, 32);
break;
case STARKWARE_PROXY_DEPOSIT_TOKEN:
context->validToken = starkware_verify_token(msg->parameter);
break;
default:
break;
}
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
case 4 + 32 + 32 + 32 + 32 + 32:
switch(context->selectorIndex) {
switch(context->selectorIndex) {
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
context->validToken = starkware_verify_token(msg->parameter);
break;
case STARKWARE_PROXY_DEPOSIT_TOKEN:
context->validToken = starkware_verify_quantum(msg->parameter);
break;
default:
break;
}
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
case 4 + 32 + 32 + 32 + 32 + 32 + 32:
switch(context->selectorIndex) {
switch(context->selectorIndex) {
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
context->validToken = starkware_verify_quantum(msg->parameter);
break;
default:
break;
}
}
msg->result = ETH_PLUGIN_RESULT_OK;
break;
default:
switch (context->selectorIndex) {
case STARKWARE_REGISTER:
case STARKWARE_VERIFY_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
msg->result = ETH_PLUGIN_RESULT_OK;
break;
@@ -527,6 +678,8 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_NFT:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
strcpy(msg->name, "Deposit");
break;
case STARKWARE_DEPOSIT_CANCEL:
@@ -557,6 +710,10 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_NFT_TO:
strcpy(msg->name, "Withdrawal To");
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->name, "Register&Deposit");
break;
default:
break;
@@ -583,6 +740,8 @@ void starkware_plugin_call(int message, void *parameters) {
case 1:
switch (context->selectorIndex) {
case STARKWARE_REGISTER:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "From ETH Address");
starkware_print_eth_address(context->amount, msg->msg);
break;
@@ -592,6 +751,8 @@ void starkware_plugin_call(int message, void *parameters) {
break;
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_CANCEL:
case STARKWARE_DEPOSIT_RECLAIM:
case STARKWARE_WITHDRAW:
@@ -619,12 +780,16 @@ void starkware_plugin_call(int message, void *parameters) {
switch (context->selectorIndex) {
case STARKWARE_REGISTER:
case STARKWARE_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "Master Account");
starkware_print_stark_key(context->starkKey, msg->msg);
break;
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_CANCEL:
case STARKWARE_DEPOSIT_RECLAIM:
case STARKWARE_FULL_WITHDRAW:
@@ -666,9 +831,12 @@ void starkware_plugin_call(int message, void *parameters) {
break;
case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
strcpy(msg->title, "Amount");
starkware_print_amount(
(context->selectorIndex == STARKWARE_DEPOSIT_ETH ? NULL
(((context->selectorIndex == STARKWARE_DEPOSIT_ETH) ||
(context->selectorIndex == STARKWARE_PROXY_DEPOSIT_ETH)) ? NULL
: context->amount),
msg->msg,
false);
@@ -687,6 +855,12 @@ void starkware_plugin_call(int message, void *parameters) {
starkware_print_asset_contract(msg->msg);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "Token Account");
starkware_print_vault_id(U4BE(context->vaultId, 0), msg->msg);
break;
default:
PRINTF("Unexpected screen %d for %d\n",
msg->screenIndex,
@@ -706,6 +880,16 @@ void starkware_plugin_call(int message, void *parameters) {
starkware_print_stark_key(dataContext.tokenContext.quantum, msg->msg);
break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "Amount");
starkware_print_amount(
((context->selectorIndex == STARKWARE_REGISTER_AND_DEPOSIT_ETH) ? NULL
: context->amount),
msg->msg,
false);
break;
default:
PRINTF("Unexpected screen %d for %d\n",
msg->screenIndex,