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_M=1
APPVERSION_N=6 APPVERSION_N=6
APPVERSION_P=5 APPVERSION_P=6
APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dvf1
APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION) APP_LOAD_FLAGS= --appFlags 0x240 --dep Ethereum:$(APPVERSION)
ifeq ($(CHAIN),) 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_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_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_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] = { const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS] = {
STARKWARE_REGISTER_ID, STARKWARE_REGISTER_ID,
@@ -84,7 +88,12 @@ const uint8_t* const STARKWARE_SELECTORS[NUM_STARKWARE_SELECTORS] = {
STARKWARE_DEPOSIT_NFT_RECLAIM_ID, STARKWARE_DEPOSIT_NFT_RECLAIM_ID,
STARKWARE_WITHDRAW_AND_MINT_ID, STARKWARE_WITHDRAW_AND_MINT_ID,
STARKWARE_WITHDRAW_NFT_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 #endif

View File

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

View File

@@ -24,14 +24,24 @@ typedef enum {
STARKWARE_DEPOSIT_NFT_RECLAIM, STARKWARE_DEPOSIT_NFT_RECLAIM,
STARKWARE_WITHDRAW_AND_MINT, STARKWARE_WITHDRAW_AND_MINT,
STARKWARE_WITHDRAW_NFT, 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; } starkwareSelector_t;
#ifndef HAVE_TOKENS_EXTRA_LIST #ifndef HAVE_TOKENS_EXTRA_LIST
static const uint8_t DEVERSIFI_CONTRACT[] = {0x01, 0x5d, 0x22, 0x04, 0x5d, 0xac, 0xea, static const uint8_t DEVERSIFI_CONTRACT[] = {0x02,
0xb0, 0x3b, 0x15, 0x80, 0x31, 0xec, 0xb7,
0xd9, 0xd0, 0x6f, 0xad, 0x24, 0x60, 0x9b}; 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 #else
@@ -112,6 +122,19 @@ static const uint8_t DEVERSIFI_CONTRACT[] = {
// To Eth Address // To Eth Address
// NFT Contract // NFT Contract
// Token ID // 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, static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = {0,
4 + 32 + 32 + 32 + 32, 4 + 32 + 32 + 32 + 32,
@@ -128,7 +151,11 @@ static const uint8_t STARKWARE_EXPECTED_DATA_SIZE[] = {0,
4 + 32 + 32 + 32 + 32, 4 + 32 + 32 + 32 + 32,
0, 0,
4 + 32 + 32 + 32, 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, static const uint8_t STARKWARE_NUM_SCREENS[] = {4 - 1,
5 - 1, 5 - 1,
@@ -145,7 +172,11 @@ static const uint8_t STARKWARE_NUM_SCREENS[] = {4 - 1,
6 - 1, 6 - 1,
4 - 1, 4 - 1,
6 - 1, 6 - 1,
6 - 1}; 6 - 1,
6 - 1,
6 - 1,
5 - 1,
5 - 1};
typedef struct starkware_parameters_t { typedef struct starkware_parameters_t {
uint8_t vaultId[4]; uint8_t vaultId[4];
@@ -198,6 +229,49 @@ bool starkware_verify_asset_id(uint8_t *tmp32, uint8_t *tokenId, bool assetTypeO
return true; 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) { bool starkware_verify_nft_token_id(uint8_t *tokenId) {
if (!quantumSet) { if (!quantumSet) {
PRINTF("Quantum not set\n"); 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_AND_MINT:
case STARKWARE_WITHDRAW_NFT: case STARKWARE_WITHDRAW_NFT:
case STARKWARE_WITHDRAW_NFT_TO: 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); memmove(context->starkKey, msg->parameter, 32);
break; break;
@@ -426,10 +504,17 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_AND_MINT: case STARKWARE_WITHDRAW_AND_MINT:
case STARKWARE_WITHDRAW_NFT: case STARKWARE_WITHDRAW_NFT:
case STARKWARE_WITHDRAW_NFT_TO: case STARKWARE_WITHDRAW_NFT_TO:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
context->validToken = context->validToken =
starkware_verify_asset_id(context->amount, msg->parameter, true); starkware_verify_asset_id(context->amount, msg->parameter, true);
break; break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
// drop variable byte array signature offset
break;
default: default:
break; break;
} }
@@ -439,6 +524,8 @@ void starkware_plugin_call(int message, void *parameters) {
case 4 + 32 + 32: case 4 + 32 + 32:
switch (context->selectorIndex) { switch (context->selectorIndex) {
case STARKWARE_ESCAPE: case STARKWARE_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
context->validToken = context->validToken =
starkware_verify_asset_id(context->amount, msg->parameter, true); starkware_verify_asset_id(context->amount, msg->parameter, true);
break; break;
@@ -449,6 +536,8 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_DEPOSIT_TOKEN: case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_NFT: case STARKWARE_DEPOSIT_NFT:
case STARKWARE_DEPOSIT_NFT_RECLAIM: case STARKWARE_DEPOSIT_NFT_RECLAIM:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
memmove(context->vaultId, msg->parameter + 32 - 4, 4); memmove(context->vaultId, msg->parameter + 32 - 4, 4);
break; break;
@@ -471,6 +560,7 @@ void starkware_plugin_call(int message, void *parameters) {
switch (context->selectorIndex) { switch (context->selectorIndex) {
case STARKWARE_ESCAPE: case STARKWARE_ESCAPE:
case STARKWARE_DEPOSIT_TOKEN: case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
memmove(context->amount, msg->parameter, 32); memmove(context->amount, msg->parameter, 32);
break; break;
@@ -483,16 +573,77 @@ void starkware_plugin_call(int message, void *parameters) {
context->validToken = starkware_verify_nft_token_id(msg->parameter); context->validToken = starkware_verify_nft_token_id(msg->parameter);
break; break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
memmove(context->vaultId, msg->parameter + 32 - 4, 4);
break;
default: default:
break; break;
} }
msg->result = ETH_PLUGIN_RESULT_OK; msg->result = ETH_PLUGIN_RESULT_OK;
break; 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: default:
switch (context->selectorIndex) { switch (context->selectorIndex) {
case STARKWARE_REGISTER: case STARKWARE_REGISTER:
case STARKWARE_VERIFY_ESCAPE: case STARKWARE_VERIFY_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
msg->result = ETH_PLUGIN_RESULT_OK; msg->result = ETH_PLUGIN_RESULT_OK;
break; break;
@@ -527,6 +678,8 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_DEPOSIT_TOKEN: case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH: case STARKWARE_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_NFT: case STARKWARE_DEPOSIT_NFT:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
strcpy(msg->name, "Deposit"); strcpy(msg->name, "Deposit");
break; break;
case STARKWARE_DEPOSIT_CANCEL: case STARKWARE_DEPOSIT_CANCEL:
@@ -557,6 +710,10 @@ void starkware_plugin_call(int message, void *parameters) {
case STARKWARE_WITHDRAW_NFT_TO: case STARKWARE_WITHDRAW_NFT_TO:
strcpy(msg->name, "Withdrawal To"); strcpy(msg->name, "Withdrawal To");
break; break;
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->name, "Register&Deposit");
break;
default: default:
break; break;
@@ -583,6 +740,8 @@ void starkware_plugin_call(int message, void *parameters) {
case 1: case 1:
switch (context->selectorIndex) { switch (context->selectorIndex) {
case STARKWARE_REGISTER: case STARKWARE_REGISTER:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "From ETH Address"); strcpy(msg->title, "From ETH Address");
starkware_print_eth_address(context->amount, msg->msg); starkware_print_eth_address(context->amount, msg->msg);
break; break;
@@ -592,6 +751,8 @@ void starkware_plugin_call(int message, void *parameters) {
break; break;
case STARKWARE_DEPOSIT_TOKEN: case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH: case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_CANCEL: case STARKWARE_DEPOSIT_CANCEL:
case STARKWARE_DEPOSIT_RECLAIM: case STARKWARE_DEPOSIT_RECLAIM:
case STARKWARE_WITHDRAW: case STARKWARE_WITHDRAW:
@@ -619,12 +780,16 @@ void starkware_plugin_call(int message, void *parameters) {
switch (context->selectorIndex) { switch (context->selectorIndex) {
case STARKWARE_REGISTER: case STARKWARE_REGISTER:
case STARKWARE_ESCAPE: case STARKWARE_ESCAPE:
case STARKWARE_REGISTER_AND_DEPOSIT_TOKEN:
case STARKWARE_REGISTER_AND_DEPOSIT_ETH:
strcpy(msg->title, "Master Account"); strcpy(msg->title, "Master Account");
starkware_print_stark_key(context->starkKey, msg->msg); starkware_print_stark_key(context->starkKey, msg->msg);
break; break;
case STARKWARE_DEPOSIT_TOKEN: case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH: case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
case STARKWARE_DEPOSIT_CANCEL: case STARKWARE_DEPOSIT_CANCEL:
case STARKWARE_DEPOSIT_RECLAIM: case STARKWARE_DEPOSIT_RECLAIM:
case STARKWARE_FULL_WITHDRAW: case STARKWARE_FULL_WITHDRAW:
@@ -666,9 +831,12 @@ void starkware_plugin_call(int message, void *parameters) {
break; break;
case STARKWARE_DEPOSIT_TOKEN: case STARKWARE_DEPOSIT_TOKEN:
case STARKWARE_DEPOSIT_ETH: case STARKWARE_DEPOSIT_ETH:
case STARKWARE_PROXY_DEPOSIT_TOKEN:
case STARKWARE_PROXY_DEPOSIT_ETH:
strcpy(msg->title, "Amount"); strcpy(msg->title, "Amount");
starkware_print_amount( starkware_print_amount(
(context->selectorIndex == STARKWARE_DEPOSIT_ETH ? NULL (((context->selectorIndex == STARKWARE_DEPOSIT_ETH) ||
(context->selectorIndex == STARKWARE_PROXY_DEPOSIT_ETH)) ? NULL
: context->amount), : context->amount),
msg->msg, msg->msg,
false); false);
@@ -687,6 +855,12 @@ void starkware_plugin_call(int message, void *parameters) {
starkware_print_asset_contract(msg->msg); starkware_print_asset_contract(msg->msg);
break; 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: default:
PRINTF("Unexpected screen %d for %d\n", PRINTF("Unexpected screen %d for %d\n",
msg->screenIndex, msg->screenIndex,
@@ -706,6 +880,16 @@ void starkware_plugin_call(int message, void *parameters) {
starkware_print_stark_key(dataContext.tokenContext.quantum, msg->msg); starkware_print_stark_key(dataContext.tokenContext.quantum, msg->msg);
break; 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: default:
PRINTF("Unexpected screen %d for %d\n", PRINTF("Unexpected screen %d for %d\n",
msg->screenIndex, msg->screenIndex,