Plugins support WIP
This commit is contained in:
committed by
TamtamHero
parent
3d40be2db0
commit
38da718b00
@@ -34,7 +34,6 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength
|
||||
dataLength -= 4;
|
||||
}
|
||||
dataPresent = false;
|
||||
contractProvisioned = CONTRACT_NONE;
|
||||
initTx(&txContext, &global_sha3, &tmpContent.txContent, customProcessor, NULL);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -5,39 +5,10 @@
|
||||
#ifdef HAVE_STARKWARE
|
||||
#include "stark_utils.h"
|
||||
#endif
|
||||
|
||||
#define TOKEN_TRANSFER_DATA_SIZE 4 + 32 + 32
|
||||
static const uint8_t const TOKEN_TRANSFER_ID[] = { 0xa9, 0x05, 0x9c, 0xbb };
|
||||
|
||||
#define ALLOWANCE_DATA_SIZE 4 + 32 + 32
|
||||
static const uint8_t const ALLOWANCE_ID[] = { 0x09, 0x5e, 0xa7, 0xb3 };
|
||||
#include "eth_plugin_handler.h"
|
||||
|
||||
#define ERR_SILENT_MODE_CHECK_FAILED 0x6001
|
||||
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
#define STARKWARE_REGISTER_DATA_SIZE 4 + 32
|
||||
static const uint8_t const STARKWARE_REGISTER_ID[] = { 0x76, 0x57, 0x18, 0xd7 };
|
||||
#define STARKWARE_DEPOSIT_TOKEN_DATA_SIZE 4 + 32 + 32 + 32
|
||||
static const uint8_t const STARKWARE_DEPOSIT_TOKEN_ID[] = { 0x00, 0xae, 0xef, 0x8a };
|
||||
#define STARKWARE_DEPOSIT_ETH_DATA_SIZE 4 + 32 + 32
|
||||
static const uint8_t const STARKWARE_DEPOSIT_ETH_ID[] = { 0xe2, 0xbb, 0xb1, 0x58 };
|
||||
#define STARKWARE_DEPOSIT_CANCEL_DATA_SIZE 4 + 32 + 32
|
||||
static const uint8_t const STARKWARE_DEPOSIT_CANCEL_ID[] = { 0xc7, 0xfb, 0x11, 0x7c };
|
||||
#define STARKWARE_DEPOSIT_RECLAIM_DATA_SIZE 4 + 32 + 32
|
||||
static const uint8_t const STARKWARE_DEPOSIT_RECLAIM_ID[] = { 0x4e, 0xab, 0x38, 0xf4 };
|
||||
#define STARKWARE_WITHDRAW_DATA_SIZE 4 + 32
|
||||
static const uint8_t const STARKWARE_WITHDRAW_ID[] = { 0x2e, 0x1a, 0x7d, 0x4d };
|
||||
#define STARKWARE_FULL_WITHDRAWAL_DATA_SIZE 4 + 32
|
||||
static const uint8_t const STARKWARE_FULL_WITHDRAWAL_ID[] = { 0x27, 0x6d, 0xd1, 0xde };
|
||||
#define STARKWARE_FREEZE_DATA_SIZE 4 + 32
|
||||
static const uint8_t const STARKWARE_FREEZE_ID[] = { 0xb9, 0x10, 0x72, 0x09 };
|
||||
#define STARKWARE_ESCAPE_DATA_SIZE 4 + 32 + 32 + 32 + 32
|
||||
static const uint8_t const STARKWARE_ESCAPE_ID[] = { 0x9e, 0x3a, 0xda, 0xc4 };
|
||||
static const uint8_t const STARKWARE_VERIFY_ESCAPE_ID[] = { 0x2d, 0xd5, 0x30, 0x06 };
|
||||
|
||||
#endif
|
||||
|
||||
uint32_t splitBinaryParameterPart(char *result, uint8_t *parameter) {
|
||||
uint32_t i;
|
||||
for (i=0; i<8; i++) {
|
||||
@@ -66,191 +37,108 @@ customStatus_e customProcessor(txContext_t *context) {
|
||||
return CUSTOM_NOT_HANDLED;
|
||||
}
|
||||
if (context->currentFieldPos == 0) {
|
||||
ethPluginInitContract_t pluginInit;
|
||||
// If handling the beginning of the data field, assume that the function selector is present
|
||||
if (context->commandLength < 4) {
|
||||
PRINTF("Missing function selector\n");
|
||||
return CUSTOM_FAULT;
|
||||
}
|
||||
// Initial check to see if the call can be processed
|
||||
if ((context->currentFieldLength == TOKEN_TRANSFER_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, TOKEN_TRANSFER_ID, 4) == 0) &&
|
||||
(getKnownToken(tmpContent.txContent.destination) != NULL)) {
|
||||
contractProvisioned = CONTRACT_ERC20;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == ALLOWANCE_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, ALLOWANCE_ID, 4) == 0)) {
|
||||
contractProvisioned = CONTRACT_ALLOWANCE;
|
||||
}
|
||||
#ifdef HAVE_STARKWARE
|
||||
else
|
||||
if ((context->currentFieldLength >= STARKWARE_REGISTER_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_REGISTER_ID, 4) == 0)) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_REGISTER;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_DEPOSIT_ETH_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_DEPOSIT_ETH_ID, 4) == 0)) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_DEPOSIT_ETH;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_DEPOSIT_TOKEN_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_DEPOSIT_TOKEN_ID, 4) == 0) &&
|
||||
quantumSet) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_DEPOSIT_TOKEN;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_WITHDRAW_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_WITHDRAW_ID, 4) == 0) &&
|
||||
quantumSet) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_WITHDRAW;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_DEPOSIT_CANCEL_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_DEPOSIT_CANCEL_ID, 4) == 0)) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_DEPOSIT_CANCEL;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_DEPOSIT_RECLAIM_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_DEPOSIT_RECLAIM_ID, 4) == 0)) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_DEPOSIT_RECLAIM;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_FULL_WITHDRAWAL_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_FULL_WITHDRAWAL_ID, 4) == 0)) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_FULL_WITHDRAWAL;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_FREEZE_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_FREEZE_ID, 4) == 0)) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_FREEZE;
|
||||
}
|
||||
else
|
||||
if ((context->currentFieldLength == STARKWARE_ESCAPE_DATA_SIZE) &&
|
||||
(os_memcmp(context->workBuffer, STARKWARE_ESCAPE_ID, 4) == 0) &&
|
||||
quantumSet) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_ESCAPE;
|
||||
}
|
||||
else
|
||||
if (os_memcmp(context->workBuffer, STARKWARE_VERIFY_ESCAPE_ID, 4) == 0) {
|
||||
contractProvisioned = CONTRACT_STARKWARE_VERIFY_ESCAPE;
|
||||
eth_plugin_prepare_init(&pluginInit, context->workBuffer, context->currentFieldLength);
|
||||
dataContext.tokenContext.pluginAvailable = eth_plugin_perform_init(tmpContent.txContent.destination, &pluginInit);
|
||||
PRINTF("pluginAvailable %d\n", dataContext.tokenContext.pluginAvailable);
|
||||
if (dataContext.tokenContext.pluginAvailable) {
|
||||
dataContext.tokenContext.fieldIndex = 0;
|
||||
dataContext.tokenContext.fieldOffset = 0;
|
||||
copyTxData(context, NULL, 4);
|
||||
}
|
||||
}
|
||||
uint32_t blockSize;
|
||||
uint32_t copySize;
|
||||
uint32_t fieldPos = context->currentFieldPos;
|
||||
if (fieldPos == 0) { // not reached if a plugin is available
|
||||
if (!N_storage.dataAllowed) {
|
||||
PRINTF("Data field forbidden\n");
|
||||
return CUSTOM_FAULT;
|
||||
}
|
||||
if (!N_storage.contractDetails) {
|
||||
return CUSTOM_NOT_HANDLED;
|
||||
}
|
||||
dataContext.tokenContext.fieldIndex = 0;
|
||||
dataContext.tokenContext.fieldOffset = 0;
|
||||
blockSize = 4;
|
||||
}
|
||||
else {
|
||||
blockSize = 32 - (dataContext.tokenContext.fieldOffset % 32);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
// Sanity check
|
||||
// Also handle exception that only need to process the beginning of the data
|
||||
if ((contractProvisioned != CONTRACT_NONE) &&
|
||||
#ifdef HAVE_STARKWARE
|
||||
(contractProvisioned != CONTRACT_STARKWARE_VERIFY_ESCAPE) &&
|
||||
(contractProvisioned != CONTRACT_STARKWARE_REGISTER) &&
|
||||
#endif
|
||||
(context->currentFieldLength > sizeof(dataContext.tokenContext.data))) {
|
||||
PRINTF("Data field overflow - dropping customization\n");
|
||||
contractProvisioned = CONTRACT_NONE;
|
||||
}
|
||||
PRINTF("contractProvisioned %d\n", contractProvisioned);
|
||||
if (contractProvisioned != CONTRACT_NONE) {
|
||||
if (context->currentFieldPos < context->currentFieldLength) {
|
||||
uint32_t copySize = MIN(context->commandLength,
|
||||
context->currentFieldLength - context->currentFieldPos);
|
||||
// Handle the case where we only need to handle the beginning of the data parameter
|
||||
if ((context->currentFieldPos + copySize) < sizeof(dataContext.tokenContext.data)) {
|
||||
copyTxData(context,
|
||||
dataContext.tokenContext.data + context->currentFieldPos,
|
||||
// Sanity check
|
||||
if ((context->currentFieldLength - fieldPos) < blockSize) {
|
||||
PRINTF("Unconsistent data\n");
|
||||
return CUSTOM_FAULT;
|
||||
}
|
||||
|
||||
copySize = (context->commandLength < blockSize ? context->commandLength : blockSize);
|
||||
|
||||
PRINTF("currentFieldPos %d copySize %d\n", context->currentFieldPos, copySize);
|
||||
|
||||
copyTxData(context,
|
||||
dataContext.tokenContext.data + dataContext.tokenContext.fieldOffset,
|
||||
copySize);
|
||||
}
|
||||
else {
|
||||
if (context->currentFieldPos < sizeof(dataContext.tokenContext.data)) {
|
||||
uint32_t copySize2 = sizeof(dataContext.tokenContext.data) - context->currentFieldPos;
|
||||
copyTxData(context,
|
||||
dataContext.tokenContext.data + context->currentFieldPos,
|
||||
copySize2);
|
||||
copySize -= copySize2;
|
||||
}
|
||||
copyTxData(context, NULL, copySize);
|
||||
}
|
||||
}
|
||||
if (context->currentFieldPos == context->currentFieldLength) {
|
||||
context->currentField++;
|
||||
context->processingField = false;
|
||||
}
|
||||
return CUSTOM_HANDLED;
|
||||
}
|
||||
else {
|
||||
uint32_t blockSize;
|
||||
uint32_t copySize;
|
||||
uint32_t fieldPos = context->currentFieldPos;
|
||||
if (fieldPos == 0) {
|
||||
if (!N_storage.dataAllowed) {
|
||||
PRINTF("Data field forbidden\n");
|
||||
|
||||
if (context->currentFieldPos == context->currentFieldLength) {
|
||||
context->currentField++;
|
||||
context->processingField = false;
|
||||
}
|
||||
|
||||
dataContext.tokenContext.fieldOffset += copySize;
|
||||
|
||||
if (copySize == blockSize) {
|
||||
// Can process or display
|
||||
if (dataContext.tokenContext.pluginAvailable) {
|
||||
ethPluginProvideParameter_t pluginProvideParameter;
|
||||
eth_plugin_prepare_provide_parameter(&pluginProvideParameter,
|
||||
dataContext.tokenContext.data,
|
||||
dataContext.tokenContext.fieldIndex * 32 + 4);
|
||||
if (!eth_plugin_call(NULL, ETH_PLUGIN_PROVIDE_PARAMETER, (void*)&pluginProvideParameter)) {
|
||||
PRINTF("Plugin parameter call failed\n");
|
||||
return CUSTOM_FAULT;
|
||||
}
|
||||
if (!N_storage.contractDetails) {
|
||||
return CUSTOM_NOT_HANDLED;
|
||||
}
|
||||
dataContext.rawDataContext.fieldIndex = 0;
|
||||
dataContext.rawDataContext.fieldOffset = 0;
|
||||
blockSize = 4;
|
||||
}
|
||||
else {
|
||||
if (!N_storage.contractDetails) {
|
||||
return CUSTOM_NOT_HANDLED;
|
||||
}
|
||||
blockSize = 32 - (dataContext.rawDataContext.fieldOffset % 32);
|
||||
}
|
||||
|
||||
// Sanity check
|
||||
if ((context->currentFieldLength - fieldPos) < blockSize) {
|
||||
PRINTF("Unconsistent data\n");
|
||||
return CUSTOM_FAULT;
|
||||
}
|
||||
|
||||
copySize = (context->commandLength < blockSize ? context->commandLength : blockSize);
|
||||
copyTxData(context,
|
||||
dataContext.rawDataContext.data + dataContext.rawDataContext.fieldOffset,
|
||||
copySize);
|
||||
|
||||
if (context->currentFieldPos == context->currentFieldLength) {
|
||||
context->currentField++;
|
||||
context->processingField = false;
|
||||
}
|
||||
|
||||
dataContext.rawDataContext.fieldOffset += copySize;
|
||||
|
||||
if (copySize == blockSize) {
|
||||
// Can display
|
||||
if (fieldPos != 0) {
|
||||
dataContext.rawDataContext.fieldIndex++;
|
||||
}
|
||||
dataContext.rawDataContext.fieldOffset = 0;
|
||||
if (fieldPos == 0) {
|
||||
array_hexstr(strings.tmp.tmp, dataContext.rawDataContext.data, 4);
|
||||
ux_flow_init(0, ux_confirm_selector_flow, NULL);
|
||||
}
|
||||
else {
|
||||
uint32_t offset = 0;
|
||||
uint32_t i;
|
||||
snprintf(strings.tmp.tmp2, sizeof(strings.tmp.tmp2), "Field %d", dataContext.rawDataContext.fieldIndex);
|
||||
for (i=0; i<4; i++) {
|
||||
offset += splitBinaryParameterPart(strings.tmp.tmp + offset, dataContext.rawDataContext.data + 8 * i);
|
||||
if (i != 3) {
|
||||
strings.tmp.tmp[offset++] = ':';
|
||||
}
|
||||
}
|
||||
ux_flow_init(0, ux_confirm_parameter_flow, NULL);
|
||||
}
|
||||
}
|
||||
else {
|
||||
dataContext.tokenContext.fieldIndex++;
|
||||
dataContext.tokenContext.fieldOffset = 0;
|
||||
return CUSTOM_HANDLED;
|
||||
}
|
||||
}
|
||||
|
||||
return CUSTOM_SUSPENDED;
|
||||
}
|
||||
if (fieldPos != 0) {
|
||||
dataContext.tokenContext.fieldIndex++;
|
||||
}
|
||||
dataContext.tokenContext.fieldOffset = 0;
|
||||
if (fieldPos == 0) {
|
||||
array_hexstr(strings.tmp.tmp, dataContext.tokenContext.data, 4);
|
||||
ux_flow_init(0, ux_confirm_selector_flow, NULL);
|
||||
}
|
||||
else {
|
||||
uint32_t offset = 0;
|
||||
uint32_t i;
|
||||
snprintf(strings.tmp.tmp2, sizeof(strings.tmp.tmp2), "Field %d", dataContext.tokenContext.fieldIndex);
|
||||
for (i=0; i<4; i++) {
|
||||
offset += splitBinaryParameterPart(strings.tmp.tmp + offset, dataContext.tokenContext.data + 8 * i);
|
||||
if (i != 3) {
|
||||
strings.tmp.tmp[offset++] = ':';
|
||||
}
|
||||
}
|
||||
ux_flow_init(0, ux_confirm_parameter_flow, NULL);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return CUSTOM_HANDLED;
|
||||
}
|
||||
|
||||
return CUSTOM_SUSPENDED;
|
||||
}
|
||||
return CUSTOM_NOT_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
void to_uppercase(char* str, unsigned char size){
|
||||
for (unsigned char i = 0; i < size && str[i] != 0; i++)
|
||||
{
|
||||
@@ -273,117 +161,23 @@ void compareOrCopy(char* preapproved_string, char* parsed_string, bool silent_mo
|
||||
}
|
||||
}
|
||||
|
||||
void finalizeParsing(bool direct) {
|
||||
uint256_t gasPrice, startGas, uint256;
|
||||
uint32_t i;
|
||||
char displayBuffer[50];
|
||||
uint8_t decimals = WEI_TO_ETHER;
|
||||
uint8_t *ticker = (uint8_t *)PIC(chainConfig->coinName);
|
||||
uint8_t *feeTicker = (uint8_t *)PIC(chainConfig->coinName);
|
||||
uint8_t tickerOffset = 0;
|
||||
void reportFinalizeError(bool direct) {
|
||||
reset_app_context();
|
||||
if (direct) {
|
||||
THROW(0x6A80);
|
||||
}
|
||||
else {
|
||||
io_seproxyhal_send_status(0x6A80);
|
||||
ui_idle();
|
||||
}
|
||||
}
|
||||
|
||||
void computeFees(char *displayBuffer, uint32_t displayBufferSize) {
|
||||
uint256_t gasPrice, startGas, uint256;
|
||||
uint8_t *feeTicker = (uint8_t *)PIC(chainConfig->coinName);
|
||||
uint8_t tickerOffset = 0;
|
||||
uint32_t i;
|
||||
|
||||
// Verify the chain
|
||||
if (chainConfig->chainId != 0) {
|
||||
uint32_t v = getV(&tmpContent.txContent);
|
||||
if (chainConfig->chainId != v) {
|
||||
reset_app_context();
|
||||
PRINTF("Invalid chainId %d expected %d\n", v, chainConfig->chainId);
|
||||
if (direct) {
|
||||
THROW(0x6A80);
|
||||
}
|
||||
else {
|
||||
io_seproxyhal_send_status(0x6A80);
|
||||
ui_idle();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Store the hash
|
||||
cx_hash((cx_hash_t *)&global_sha3, CX_LAST, tmpCtx.transactionContext.hash, 0, tmpCtx.transactionContext.hash, 32);
|
||||
#ifdef HAVE_STARKWARE
|
||||
if ((contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_ETH) ||
|
||||
(contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_TOKEN) ||
|
||||
(contractProvisioned == CONTRACT_STARKWARE_WITHDRAW) ||
|
||||
(contractProvisioned == CONTRACT_STARKWARE_ESCAPE)) {
|
||||
// For a deposit / withdrawal / escape, check if the token ID is known or can't parse
|
||||
uint8_t tokenIdOffset = (4 + ((contractProvisioned == CONTRACT_STARKWARE_ESCAPE) ? 32 + 32 : 0));
|
||||
if (quantumSet) {
|
||||
tokenDefinition_t *currentToken = NULL;
|
||||
if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) {
|
||||
currentToken = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex];
|
||||
}
|
||||
compute_token_id(&global_sha3,
|
||||
(currentToken != NULL ? currentToken->address : NULL),
|
||||
dataContext.tokenContext.quantum, G_io_apdu_buffer + 100);
|
||||
if (os_memcmp(dataContext.tokenContext.data + tokenIdOffset, G_io_apdu_buffer + 100, 32) != 0) {
|
||||
PRINTF("Token ID not matching - computed %.*H\n", 32, G_io_apdu_buffer + 100);
|
||||
PRINTF("Current quantum %.*H\n", 32, dataContext.tokenContext.quantum);
|
||||
PRINTF("Requested %.*H\n", 32, dataContext.tokenContext.data + tokenIdOffset);
|
||||
contractProvisioned = CONTRACT_NONE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
PRINTF("Quantum not set\n");
|
||||
contractProvisioned = CONTRACT_NONE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// If there is a token to process, check if it is well known
|
||||
if ((contractProvisioned == CONTRACT_ERC20) || (contractProvisioned == CONTRACT_ALLOWANCE)) {
|
||||
tokenDefinition_t *currentToken = getKnownToken(tmpContent.txContent.destination);
|
||||
if (currentToken != NULL) {
|
||||
dataPresent = false;
|
||||
decimals = currentToken->decimals;
|
||||
ticker = currentToken->ticker;
|
||||
tmpContent.txContent.destinationLength = 20;
|
||||
os_memmove(tmpContent.txContent.destination, dataContext.tokenContext.data + 4 + 12, 20);
|
||||
os_memmove(tmpContent.txContent.value.value, dataContext.tokenContext.data + 4 + 32, 32);
|
||||
tmpContent.txContent.value.length = 32;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (dataPresent && contractProvisioned == CONTRACT_NONE && !N_storage.dataAllowed) {
|
||||
reset_app_context();
|
||||
PRINTF("Data field forbidden\n");
|
||||
if (direct) {
|
||||
THROW(0x6A80);
|
||||
}
|
||||
else {
|
||||
io_seproxyhal_send_status(0x6A80);
|
||||
ui_idle();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Add address
|
||||
if (tmpContent.txContent.destinationLength != 0) {
|
||||
displayBuffer[0] = '0';
|
||||
displayBuffer[1] = 'x';
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, (uint8_t*)displayBuffer+2, &global_sha3, chainConfig);
|
||||
compareOrCopy(strings.common.fullAddress, displayBuffer, called_from_swap);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(strings.common.fullAddress, "Contract");
|
||||
}
|
||||
if ((contractProvisioned == CONTRACT_NONE) || (contractProvisioned == CONTRACT_ERC20) ||
|
||||
(contractProvisioned == CONTRACT_ALLOWANCE)) {
|
||||
// Add amount in ethers or tokens
|
||||
if ((contractProvisioned == CONTRACT_ALLOWANCE) && ismaxint(tmpContent.txContent.value.value, 32)) {
|
||||
i = 0;
|
||||
tickerOffset = 0;
|
||||
while (ticker[tickerOffset]) {
|
||||
displayBuffer[tickerOffset] = ticker[tickerOffset];
|
||||
tickerOffset++;
|
||||
}
|
||||
strcpy(displayBuffer + tickerOffset, "Unlimited");
|
||||
}
|
||||
else {
|
||||
amountToString(tmpContent.txContent.value.value, tmpContent.txContent.value.length, decimals, (char*)ticker, displayBuffer, sizeof(displayBuffer));
|
||||
}
|
||||
compareOrCopy(strings.common.fullAmount, displayBuffer, called_from_swap);
|
||||
}
|
||||
// Compute maximum fee
|
||||
PRINTF("Max fee\n");
|
||||
PRINTF("Gasprice %.*H\n", tmpContent.txContent.gasprice.length, tmpContent.txContent.gasprice.value);
|
||||
PRINTF("Startgas %.*H\n", tmpContent.txContent.startgas.length, tmpContent.txContent.startgas.value);
|
||||
@@ -398,7 +192,7 @@ void finalizeParsing(bool direct) {
|
||||
adjustDecimals((char *)(G_io_apdu_buffer + 100), i, (char *)G_io_apdu_buffer, 100, WEI_TO_ETHER);
|
||||
i = 0;
|
||||
tickerOffset=0;
|
||||
memset(displayBuffer, 0, sizeof(displayBuffer));
|
||||
memset(displayBuffer, 0, displayBufferSize);
|
||||
while (feeTicker[tickerOffset]) {
|
||||
displayBuffer[tickerOffset] = feeTicker[tickerOffset];
|
||||
tickerOffset++;
|
||||
@@ -408,7 +202,128 @@ void finalizeParsing(bool direct) {
|
||||
i++;
|
||||
}
|
||||
displayBuffer[tickerOffset + i] = '\0';
|
||||
compareOrCopy(strings.common.maxFee, displayBuffer, called_from_swap);
|
||||
}
|
||||
|
||||
void finalizeParsing(bool direct) {
|
||||
char displayBuffer[50];
|
||||
uint8_t decimals = WEI_TO_ETHER;
|
||||
uint8_t *ticker = (uint8_t *)PIC(chainConfig->coinName);
|
||||
ethPluginFinalize_t pluginFinalize;
|
||||
tokenDefinition_t *token1 = NULL, *token2 = NULL;
|
||||
bool genericUI = true;
|
||||
|
||||
// Verify the chain
|
||||
if (chainConfig->chainId != 0) {
|
||||
uint32_t v = getV(&tmpContent.txContent);
|
||||
if (chainConfig->chainId != v) {
|
||||
reset_app_context();
|
||||
PRINTF("Invalid chainId %d expected %d\n", v, chainConfig->chainId);
|
||||
reportFinalizeError(direct);
|
||||
if (!direct) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Store the hash
|
||||
cx_hash((cx_hash_t *)&global_sha3, CX_LAST, tmpCtx.transactionContext.hash, 0, tmpCtx.transactionContext.hash, 32);
|
||||
|
||||
// Finalize the plugin handling
|
||||
if (dataContext.tokenContext.pluginAvailable) {
|
||||
genericUI = false;
|
||||
eth_plugin_prepare_finalize(&pluginFinalize);
|
||||
if (!eth_plugin_call(NULL, ETH_PLUGIN_FINALIZE, (void*)&pluginFinalize)) {
|
||||
PRINTF("Plugin finalize call failed\n");
|
||||
reportFinalizeError(direct);
|
||||
if (!direct) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Lookup tokens if requested
|
||||
if (pluginFinalize.tokenLookup1 != NULL) {
|
||||
ethPluginProvideToken_t pluginProvideToken;
|
||||
token1 = getKnownToken(pluginFinalize.tokenLookup1);
|
||||
if (pluginFinalize.tokenLookup2 != NULL) {
|
||||
token2 = getKnownToken(pluginFinalize.tokenLookup2);
|
||||
}
|
||||
eth_plugin_prepare_provide_token(&pluginProvideToken, token1, token2);
|
||||
if (!eth_plugin_call(NULL, ETH_PLUGIN_PROVIDE_TOKEN, (void*)&pluginProvideToken)) {
|
||||
PRINTF("Plugin provide token call failed\n");
|
||||
reportFinalizeError(direct);
|
||||
if (!direct) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
pluginFinalize.result = pluginProvideToken.result;
|
||||
}
|
||||
if (pluginFinalize.result != ETH_PLUGIN_RESULT_FALLBACK) {
|
||||
// Handle the right interface
|
||||
switch(pluginFinalize.uiType) {
|
||||
case ETH_UI_TYPE_GENERIC:
|
||||
dataPresent = false;
|
||||
dataContext.tokenContext.pluginUiMaxItems = pluginFinalize.numScreens;
|
||||
break;
|
||||
case ETH_UI_TYPE_AMOUNT_ADDRESS:
|
||||
genericUI = true;
|
||||
dataPresent = false;
|
||||
if ((pluginFinalize.amount == NULL) || (pluginFinalize.address == NULL)) {
|
||||
PRINTF("Incorrect amount/address set by plugin\n");
|
||||
reportFinalizeError(direct);
|
||||
if (!direct) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
memmove(tmpContent.txContent.value.value, pluginFinalize.amount, 32);
|
||||
tmpContent.txContent.value.length = 32;
|
||||
memmove(tmpContent.txContent.destination, pluginFinalize.address, 20);
|
||||
tmpContent.txContent.destinationLength = 20;
|
||||
if (token1 != NULL) {
|
||||
decimals = token1->decimals;
|
||||
ticker = token1->ticker;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
PRINTF("ui type %d not supported\n", pluginFinalize.uiType);
|
||||
reportFinalizeError(direct);
|
||||
if (!direct) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
genericUI = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (dataPresent && !N_storage.dataAllowed) {
|
||||
PRINTF("Data field forbidden\n");
|
||||
reportFinalizeError(direct);
|
||||
if (!direct) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Prepare destination address to display
|
||||
if (genericUI) {
|
||||
if (tmpContent.txContent.destinationLength != 0) {
|
||||
displayBuffer[0] = '0';
|
||||
displayBuffer[1] = 'x';
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, (uint8_t*)displayBuffer+2, &global_sha3, chainConfig);
|
||||
compareOrCopy(strings.common.fullAddress, displayBuffer, called_from_swap);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(strings.common.fullAddress, "Contract");
|
||||
}
|
||||
}
|
||||
// Prepare amount to display
|
||||
if (genericUI) {
|
||||
amountToString(tmpContent.txContent.value.value, tmpContent.txContent.value.length, decimals, (char*)ticker, displayBuffer, sizeof(displayBuffer));
|
||||
compareOrCopy(strings.common.fullAmount, displayBuffer, called_from_swap);
|
||||
}
|
||||
// Compute maximum fee
|
||||
if (genericUI) {
|
||||
computeFees(displayBuffer, sizeof(displayBuffer));
|
||||
compareOrCopy(strings.common.maxFee, displayBuffer, called_from_swap);
|
||||
}
|
||||
|
||||
bool no_consent = false;
|
||||
|
||||
@@ -423,57 +338,14 @@ void finalizeParsing(bool direct) {
|
||||
}
|
||||
else{
|
||||
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_REGISTER) {
|
||||
ux_flow_init(0, ux_approval_starkware_register_flow, NULL);
|
||||
return;
|
||||
if (genericUI) {
|
||||
ux_flow_init(0,
|
||||
((dataPresent && !N_storage.contractDetails) ? ux_approval_tx_data_warning_flow : ux_approval_tx_flow),
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_TOKEN) {
|
||||
ux_flow_init(0, ux_approval_starkware_deposit_flow, NULL);
|
||||
return;
|
||||
else {
|
||||
plugin_ui_start();
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_ETH) {
|
||||
ux_flow_init(0, ux_approval_starkware_deposit_flow, NULL);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if ((contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_CANCEL) ||
|
||||
(contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_RECLAIM) ||
|
||||
(contractProvisioned == CONTRACT_STARKWARE_FULL_WITHDRAWAL) ||
|
||||
(contractProvisioned == CONTRACT_STARKWARE_FREEZE)) {
|
||||
ux_flow_init(0, ux_approval_starkware_verify_vault_id_flow, NULL);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_WITHDRAW) {
|
||||
ux_flow_init(0, ux_approval_starkware_withdraw_flow, NULL);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_ESCAPE) {
|
||||
ux_flow_init(0, ux_approval_starkware_escape_flow, NULL);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_VERIFY_ESCAPE) {
|
||||
ux_flow_init(0, ux_approval_starkware_verify_escape_flow, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (contractProvisioned == CONTRACT_ALLOWANCE) {
|
||||
ux_flow_init(0, ux_approval_allowance_flow, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
ux_flow_init(0,
|
||||
((dataPresent && !N_storage.contractDetails) ? ux_approval_tx_data_warning_flow : ux_approval_tx_flow),
|
||||
NULL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
#include "shared_context.h"
|
||||
#include "ui_callbacks.h"
|
||||
#include "utils.h"
|
||||
|
||||
void prepare_deposit_3() {
|
||||
uint8_t address[41];
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, address, &global_sha3, chainConfig);
|
||||
strings.common.fullAddress[0] = '0';
|
||||
strings.common.fullAddress[1] = 'x';
|
||||
os_memmove((unsigned char *)strings.common.fullAddress+2, address, 40);
|
||||
strings.common.fullAddress[42] = '\0';
|
||||
}
|
||||
|
||||
void prepare_deposit_4() {
|
||||
snprintf(strings.common.fullAddress, 10, "%d", U4BE(dataContext.tokenContext.data, 4 + 32 + 32 - 4));
|
||||
}
|
||||
|
||||
void prepare_deposit_5() {
|
||||
uint256_t amount, amountPre, quantum;
|
||||
uint8_t decimals;
|
||||
char *ticker = (char*)PIC(chainConfig->coinName);
|
||||
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_ETH) {
|
||||
decimals = WEI_TO_ETHER;
|
||||
convertUint256BE(tmpContent.txContent.value.value, tmpContent.txContent.value.length, &amountPre);
|
||||
}
|
||||
else {
|
||||
tokenDefinition_t *token = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex];
|
||||
decimals = token->decimals;
|
||||
ticker = (char*)token->ticker;
|
||||
readu256BE(dataContext.tokenContext.data + 4 + 32 + 32, &amountPre);
|
||||
}
|
||||
readu256BE(dataContext.tokenContext.quantum, &quantum);
|
||||
mul256(&amountPre, &quantum, &amount);
|
||||
tostring256(&amount, 10, (char*)(G_io_apdu_buffer + 100), 100);
|
||||
strcpy(strings.common.fullAmount, ticker);
|
||||
adjustDecimals((char*)(G_io_apdu_buffer + 100), strlen((char*)(G_io_apdu_buffer + 100)), strings.common.fullAmount + strlen(ticker), 50 - strlen(ticker), decimals);
|
||||
}
|
||||
|
||||
UX_STEP_NOCB(ux_approval_starkware_deposit_1_step,
|
||||
pnn,
|
||||
{
|
||||
&C_icon_eye,
|
||||
"Review",
|
||||
"transaction",
|
||||
});
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_deposit_2_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Deposit",
|
||||
.text = " "
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_deposit_3_step,
|
||||
bnnn_paging,
|
||||
prepare_deposit_3(),
|
||||
{
|
||||
.title = "Contract Name",
|
||||
.text = strings.common.fullAddress,
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_deposit_4_step,
|
||||
bnnn_paging,
|
||||
prepare_deposit_4(),
|
||||
{
|
||||
.title = "Token Account",
|
||||
.text = strings.common.fullAddress
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_deposit_5_step,
|
||||
bnnn_paging,
|
||||
prepare_deposit_5(),
|
||||
{
|
||||
.title = "Amount",
|
||||
.text = strings.common.fullAmount
|
||||
});
|
||||
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_deposit_6_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Max Fees",
|
||||
.text = strings.common.maxFee,
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_deposit_7_step,
|
||||
pbb,
|
||||
io_seproxyhal_touch_tx_ok(NULL),
|
||||
{
|
||||
&C_icon_validate_14,
|
||||
"Accept",
|
||||
"and send",
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_deposit_8_step,
|
||||
pb,
|
||||
io_seproxyhal_touch_tx_cancel(NULL),
|
||||
{
|
||||
&C_icon_crossmark,
|
||||
"Reject",
|
||||
});
|
||||
|
||||
UX_FLOW(ux_approval_starkware_deposit_flow,
|
||||
&ux_approval_starkware_deposit_1_step,
|
||||
&ux_approval_starkware_deposit_2_step,
|
||||
&ux_approval_starkware_deposit_3_step,
|
||||
&ux_approval_starkware_deposit_4_step,
|
||||
&ux_approval_starkware_deposit_5_step,
|
||||
&ux_approval_starkware_deposit_6_step,
|
||||
&ux_approval_starkware_deposit_7_step,
|
||||
&ux_approval_starkware_deposit_8_step
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
#include "shared_context.h"
|
||||
#include "ui_callbacks.h"
|
||||
|
||||
void prepare_escape_3() {
|
||||
uint8_t address[41];
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, address, &global_sha3, chainConfig);
|
||||
strings.common.fullAddress[0] = '0';
|
||||
strings.common.fullAddress[1] = 'x';
|
||||
os_memmove((unsigned char *)strings.common.fullAddress+2, address, 40);
|
||||
strings.common.fullAddress[42] = '\0';
|
||||
}
|
||||
|
||||
void prepare_escape_4() {
|
||||
uint256_t amount, amountPre, quantum;
|
||||
uint8_t decimals;
|
||||
char *ticker = (char*)PIC(chainConfig->coinName);
|
||||
|
||||
if (dataContext.tokenContext.quantumIndex == MAX_TOKEN) {
|
||||
decimals = WEI_TO_ETHER;
|
||||
}
|
||||
else {
|
||||
tokenDefinition_t *token = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex];
|
||||
decimals = token->decimals;
|
||||
ticker = (char*)token->ticker;
|
||||
}
|
||||
readu256BE(dataContext.tokenContext.data + 4 + 32 + 32 + 32, &amountPre);
|
||||
readu256BE(dataContext.tokenContext.quantum, &quantum);
|
||||
mul256(&amountPre, &quantum, &amount);
|
||||
tostring256(&amount, 10, (char*)(G_io_apdu_buffer + 100), 100);
|
||||
strcpy(strings.common.fullAmount, ticker);
|
||||
adjustDecimals((char*)(G_io_apdu_buffer + 100), strlen((char*)(G_io_apdu_buffer + 100)), strings.common.fullAmount + strlen(ticker), 50 - strlen(ticker), decimals);
|
||||
}
|
||||
|
||||
void prepare_escape_5() {
|
||||
snprintf(strings.tmp.tmp, 70, "0x%.*H", 32, dataContext.tokenContext.data + 4 + 32);
|
||||
}
|
||||
|
||||
void prepare_escape_6() {
|
||||
snprintf(strings.common.fullAddress, 10, "%d", U4BE(dataContext.tokenContext.data, 4 + 32 - 4));
|
||||
}
|
||||
|
||||
UX_STEP_NOCB(ux_approval_starkware_escape_1_step,
|
||||
pnn,
|
||||
{
|
||||
&C_icon_eye,
|
||||
"Review",
|
||||
"transaction",
|
||||
});
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_escape_2_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Escape",
|
||||
.text = " "
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_escape_3_step,
|
||||
bnnn_paging,
|
||||
prepare_escape_3(),
|
||||
{
|
||||
.title = "Contract Name",
|
||||
.text = strings.common.fullAddress,
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_escape_4_step,
|
||||
bnnn_paging,
|
||||
prepare_escape_4(),
|
||||
{
|
||||
.title = "Amount",
|
||||
.text = strings.common.fullAmount
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_escape_5_step,
|
||||
bnnn_paging,
|
||||
prepare_escape_5(),
|
||||
{
|
||||
.title = "Master Account",
|
||||
.text = strings.tmp.tmp
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_escape_6_step,
|
||||
bnnn_paging,
|
||||
prepare_escape_6(),
|
||||
{
|
||||
.title = "Token Account",
|
||||
.text = strings.common.fullAddress
|
||||
});
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_escape_7_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Max Fees",
|
||||
.text = strings.common.maxFee,
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_escape_8_step,
|
||||
pbb,
|
||||
io_seproxyhal_touch_tx_ok(NULL),
|
||||
{
|
||||
&C_icon_validate_14,
|
||||
"Accept",
|
||||
"and send",
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_escape_9_step,
|
||||
pb,
|
||||
io_seproxyhal_touch_tx_cancel(NULL),
|
||||
{
|
||||
&C_icon_crossmark,
|
||||
"Reject",
|
||||
});
|
||||
|
||||
UX_FLOW(ux_approval_starkware_escape_flow,
|
||||
&ux_approval_starkware_escape_1_step,
|
||||
&ux_approval_starkware_escape_2_step,
|
||||
&ux_approval_starkware_escape_3_step,
|
||||
&ux_approval_starkware_escape_4_step,
|
||||
&ux_approval_starkware_escape_5_step,
|
||||
&ux_approval_starkware_escape_6_step,
|
||||
&ux_approval_starkware_escape_7_step,
|
||||
&ux_approval_starkware_escape_8_step,
|
||||
&ux_approval_starkware_escape_9_step
|
||||
);
|
||||
|
||||
#endif
|
||||
@@ -1,123 +0,0 @@
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
#include "shared_context.h"
|
||||
#include "ui_callbacks.h"
|
||||
|
||||
void prepare_register_3() {
|
||||
uint8_t address[41];
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, address, &global_sha3, chainConfig);
|
||||
strings.common.fullAddress[0] = '0';
|
||||
strings.common.fullAddress[1] = 'x';
|
||||
os_memmove((unsigned char *)strings.common.fullAddress+2, address, 40);
|
||||
strings.common.fullAddress[42] = '\0';
|
||||
}
|
||||
|
||||
void prepare_register_4() {
|
||||
uint8_t privateKeyData[32];
|
||||
uint8_t address[41];
|
||||
cx_ecfp_private_key_t privateKey;
|
||||
cx_ecfp_public_key_t publicKey;
|
||||
os_perso_derive_node_bip32(CX_CURVE_256K1, tmpCtx.transactionContext.bip32Path,
|
||||
tmpCtx.transactionContext.pathLength,
|
||||
privateKeyData, NULL);
|
||||
cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey);
|
||||
io_seproxyhal_io_heartbeat();
|
||||
cx_ecfp_generate_pair(CX_CURVE_256K1, &publicKey, &privateKey, 1);
|
||||
os_memset(&privateKey, 0, sizeof(privateKey));
|
||||
os_memset(privateKeyData, 0, sizeof(privateKeyData));
|
||||
io_seproxyhal_io_heartbeat();
|
||||
getEthAddressStringFromKey(&publicKey, address, &global_sha3, chainConfig);
|
||||
strings.common.fullAddress[0] = '0';
|
||||
strings.common.fullAddress[1] = 'x';
|
||||
os_memmove((unsigned char *)strings.common.fullAddress+2, address, 40);
|
||||
strings.common.fullAddress[42] = '\0';
|
||||
}
|
||||
|
||||
void prepare_register_5() {
|
||||
snprintf(strings.tmp.tmp, 70, "0x%.*H", 32, dataContext.tokenContext.data + 4);
|
||||
}
|
||||
|
||||
UX_STEP_NOCB(ux_approval_starkware_register_1_step,
|
||||
pnn,
|
||||
{
|
||||
&C_icon_eye,
|
||||
"Review",
|
||||
"transaction",
|
||||
});
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_register_2_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Registration",
|
||||
.text = " "
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_register_3_step,
|
||||
bnnn_paging,
|
||||
prepare_register_3(),
|
||||
{
|
||||
.title = "Contract Name",
|
||||
.text = strings.common.fullAddress,
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_register_4_step,
|
||||
bnnn_paging,
|
||||
prepare_register_4(),
|
||||
{
|
||||
.title = "From ETH address",
|
||||
.text = strings.common.fullAddress
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_register_5_step,
|
||||
bnnn_paging,
|
||||
prepare_register_5(),
|
||||
{
|
||||
.title = "Master account",
|
||||
.text = strings.tmp.tmp
|
||||
});
|
||||
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_register_6_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Max Fees",
|
||||
.text = strings.common.maxFee,
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_register_7_step,
|
||||
pbb,
|
||||
io_seproxyhal_touch_tx_ok(NULL),
|
||||
{
|
||||
&C_icon_validate_14,
|
||||
"Accept",
|
||||
"and send",
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_register_8_step,
|
||||
pb,
|
||||
io_seproxyhal_touch_tx_cancel(NULL),
|
||||
{
|
||||
&C_icon_crossmark,
|
||||
"Reject",
|
||||
});
|
||||
|
||||
UX_FLOW(ux_approval_starkware_register_flow,
|
||||
&ux_approval_starkware_register_1_step,
|
||||
&ux_approval_starkware_register_2_step,
|
||||
&ux_approval_starkware_register_3_step,
|
||||
&ux_approval_starkware_register_4_step,
|
||||
&ux_approval_starkware_register_5_step,
|
||||
&ux_approval_starkware_register_6_step,
|
||||
&ux_approval_starkware_register_7_step,
|
||||
&ux_approval_starkware_register_8_step
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
#include "shared_context.h"
|
||||
#include "ui_callbacks.h"
|
||||
|
||||
void prepare_verify_escape_3() {
|
||||
uint8_t address[41];
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, address, &global_sha3, chainConfig);
|
||||
strings.common.fullAddress[0] = '0';
|
||||
strings.common.fullAddress[1] = 'x';
|
||||
os_memmove((unsigned char *)strings.common.fullAddress+2, address, 40);
|
||||
strings.common.fullAddress[42] = '\0';
|
||||
}
|
||||
|
||||
UX_STEP_NOCB(ux_approval_starkware_verify_escape_1_step,
|
||||
pnn,
|
||||
{
|
||||
&C_icon_eye,
|
||||
"Review",
|
||||
"transaction",
|
||||
});
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_verify_escape_2_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Verify Escape",
|
||||
.text = " "
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_verify_escape_3_step,
|
||||
bnnn_paging,
|
||||
prepare_verify_escape_3(),
|
||||
{
|
||||
.title = "Contract Name",
|
||||
.text = strings.common.fullAddress,
|
||||
});
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_verify_escape_4_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Max Fees",
|
||||
.text = strings.common.maxFee,
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_verify_escape_5_step,
|
||||
pbb,
|
||||
io_seproxyhal_touch_tx_ok(NULL),
|
||||
{
|
||||
&C_icon_validate_14,
|
||||
"Accept",
|
||||
"and send",
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_verify_escape_6_step,
|
||||
pb,
|
||||
io_seproxyhal_touch_tx_cancel(NULL),
|
||||
{
|
||||
&C_icon_crossmark,
|
||||
"Reject",
|
||||
});
|
||||
|
||||
UX_FLOW(ux_approval_starkware_verify_escape_flow,
|
||||
&ux_approval_starkware_verify_escape_1_step,
|
||||
&ux_approval_starkware_verify_escape_2_step,
|
||||
&ux_approval_starkware_verify_escape_3_step,
|
||||
&ux_approval_starkware_verify_escape_4_step,
|
||||
&ux_approval_starkware_verify_escape_5_step,
|
||||
&ux_approval_starkware_verify_escape_6_step
|
||||
);
|
||||
|
||||
#endif
|
||||
@@ -1,115 +0,0 @@
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
#include "shared_context.h"
|
||||
#include "ui_callbacks.h"
|
||||
|
||||
void prepare_verify_vault_id_2() {
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_CANCEL) {
|
||||
strcpy(strings.common.fullAddress, "Cancel Deposit");
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_RECLAIM) {
|
||||
strcpy(strings.common.fullAddress, "Reclaim Deposit");
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_FULL_WITHDRAWAL) {
|
||||
strcpy(strings.common.fullAddress, "Full Withdrawal");
|
||||
}
|
||||
else
|
||||
if (contractProvisioned == CONTRACT_STARKWARE_FREEZE) {
|
||||
strcpy(strings.common.fullAddress, "Freeze");
|
||||
}
|
||||
}
|
||||
|
||||
void prepare_verify_vault_id_3() {
|
||||
uint8_t address[41];
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, address, &global_sha3, chainConfig);
|
||||
strings.common.fullAddress[0] = '0';
|
||||
strings.common.fullAddress[1] = 'x';
|
||||
os_memmove((unsigned char *)strings.common.fullAddress+2, address, 40);
|
||||
strings.common.fullAddress[42] = '\0';
|
||||
}
|
||||
|
||||
void prepare_verify_vault_id_4() {
|
||||
uint8_t offset = 0;
|
||||
if ((contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_CANCEL) || (contractProvisioned == CONTRACT_STARKWARE_DEPOSIT_RECLAIM)) {
|
||||
offset = 32;
|
||||
}
|
||||
snprintf(strings.common.fullAddress, 10, "%d", U4BE(dataContext.tokenContext.data, 4 + offset + 32 - 4));
|
||||
}
|
||||
|
||||
UX_STEP_NOCB(ux_approval_starkware_verify_vault_id_1_step,
|
||||
pnn,
|
||||
{
|
||||
&C_icon_eye,
|
||||
"Review",
|
||||
"transaction",
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_verify_vault_id_2_step,
|
||||
bnnn_paging,
|
||||
prepare_verify_vault_id_2(),
|
||||
{
|
||||
.title = strings.common.fullAddress,
|
||||
.text = " "
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_verify_vault_id_3_step,
|
||||
bnnn_paging,
|
||||
prepare_verify_vault_id_3(),
|
||||
{
|
||||
.title = "Contract Name",
|
||||
.text = strings.common.fullAddress,
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_verify_vault_id_4_step,
|
||||
bnnn_paging,
|
||||
prepare_verify_vault_id_4(),
|
||||
{
|
||||
.title = "Token Account",
|
||||
.text = strings.common.fullAddress
|
||||
});
|
||||
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_verify_vault_id_5_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Max Fees",
|
||||
.text = strings.common.maxFee,
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_verify_vault_id_6_step,
|
||||
pbb,
|
||||
io_seproxyhal_touch_tx_ok(NULL),
|
||||
{
|
||||
&C_icon_validate_14,
|
||||
"Accept",
|
||||
"and send",
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_verify_vault_id_7_step,
|
||||
pb,
|
||||
io_seproxyhal_touch_tx_cancel(NULL),
|
||||
{
|
||||
&C_icon_crossmark,
|
||||
"Reject",
|
||||
});
|
||||
|
||||
UX_FLOW(ux_approval_starkware_verify_vault_id_flow,
|
||||
&ux_approval_starkware_verify_vault_id_1_step,
|
||||
&ux_approval_starkware_verify_vault_id_2_step,
|
||||
&ux_approval_starkware_verify_vault_id_3_step,
|
||||
&ux_approval_starkware_verify_vault_id_4_step,
|
||||
&ux_approval_starkware_verify_vault_id_5_step,
|
||||
&ux_approval_starkware_verify_vault_id_6_step,
|
||||
&ux_approval_starkware_verify_vault_id_7_step
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
#ifdef HAVE_STARKWARE
|
||||
|
||||
#include "shared_context.h"
|
||||
#include "ui_callbacks.h"
|
||||
|
||||
void prepare_register_4();
|
||||
|
||||
void prepare_withdraw_3() {
|
||||
uint8_t address[41];
|
||||
getEthAddressStringFromBinary(tmpContent.txContent.destination, address, &global_sha3, chainConfig);
|
||||
strings.common.fullAddress[0] = '0';
|
||||
strings.common.fullAddress[1] = 'x';
|
||||
os_memmove((unsigned char *)strings.common.fullAddress+2, address, 40);
|
||||
strings.common.fullAddress[42] = '\0';
|
||||
}
|
||||
|
||||
void prepare_withdraw_5() {
|
||||
char *ticker = (char*)PIC(chainConfig->coinName);
|
||||
|
||||
if (dataContext.tokenContext.quantumIndex != MAX_TOKEN) {
|
||||
tokenDefinition_t *token = &tmpCtx.transactionContext.tokens[dataContext.tokenContext.quantumIndex];
|
||||
ticker = (char*)token->ticker;
|
||||
}
|
||||
strcpy(strings.common.fullAmount, ticker);
|
||||
}
|
||||
|
||||
UX_STEP_NOCB(ux_approval_starkware_withdraw_1_step,
|
||||
pnn,
|
||||
{
|
||||
&C_icon_eye,
|
||||
"Review",
|
||||
"transaction",
|
||||
});
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_withdraw_2_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Withdrawal",
|
||||
.text = " "
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_withdraw_3_step,
|
||||
bnnn_paging,
|
||||
prepare_withdraw_3(),
|
||||
{
|
||||
.title = "Contract Name",
|
||||
.text = strings.common.fullAddress,
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_withdraw_4_step,
|
||||
bnnn_paging,
|
||||
prepare_register_4(),
|
||||
{
|
||||
.title = "To Eth Address",
|
||||
.text = strings.common.fullAddress
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_approval_starkware_withdraw_5_step,
|
||||
bnnn_paging,
|
||||
prepare_withdraw_5(),
|
||||
{
|
||||
.title = "Token Symbol",
|
||||
.text = strings.common.fullAmount
|
||||
});
|
||||
|
||||
|
||||
UX_STEP_NOCB(
|
||||
ux_approval_starkware_withdraw_6_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = "Max Fees",
|
||||
.text = strings.common.maxFee,
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_withdraw_7_step,
|
||||
pbb,
|
||||
io_seproxyhal_touch_tx_ok(NULL),
|
||||
{
|
||||
&C_icon_validate_14,
|
||||
"Accept",
|
||||
"and send",
|
||||
});
|
||||
|
||||
UX_STEP_CB(
|
||||
ux_approval_starkware_withdraw_8_step,
|
||||
pb,
|
||||
io_seproxyhal_touch_tx_cancel(NULL),
|
||||
{
|
||||
&C_icon_crossmark,
|
||||
"Reject",
|
||||
});
|
||||
|
||||
UX_FLOW(ux_approval_starkware_withdraw_flow,
|
||||
&ux_approval_starkware_withdraw_1_step,
|
||||
&ux_approval_starkware_withdraw_2_step,
|
||||
&ux_approval_starkware_withdraw_3_step,
|
||||
&ux_approval_starkware_withdraw_4_step,
|
||||
&ux_approval_starkware_withdraw_5_step,
|
||||
&ux_approval_starkware_withdraw_6_step,
|
||||
&ux_approval_starkware_withdraw_7_step,
|
||||
&ux_approval_starkware_withdraw_8_step
|
||||
);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user