stub btc tx confirmation
This commit is contained in:
parent
9b4769a9c4
commit
2a30adddd5
|
@ -0,0 +1,62 @@
|
||||||
|
#ifndef __BITCOIN__
|
||||||
|
#define __BITCOIN__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "bitcoin/psbt.h"
|
||||||
|
|
||||||
|
#define BTC_MAX_INPUTS 20
|
||||||
|
#define BTC_MAX_OUTPUTS 20
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BTC_INPUT_TYPE_LEGACY,
|
||||||
|
BTC_INPUT_TYPE_LEGACY_WITH_REDEEM,
|
||||||
|
BTC_INPUT_TYPE_P2WPKH,
|
||||||
|
BTC_INPUT_TYPE_P2WSH,
|
||||||
|
} btc_input_type_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SIGHASH_DEFAULT = 0x00,
|
||||||
|
SIGHASH_ALL = 0x01,
|
||||||
|
SIGHASH_NONE = 0x02,
|
||||||
|
SIGHASH_SINGLE = 0x03,
|
||||||
|
} btc_sighash_flag_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t* script_pubkey;
|
||||||
|
size_t script_pubkey_len;
|
||||||
|
uint8_t* redeem_script;
|
||||||
|
size_t redeem_script_len;
|
||||||
|
uint8_t* witness_script;
|
||||||
|
size_t witness_script_len;
|
||||||
|
uint8_t* nonwitness_utxo;
|
||||||
|
size_t nonwitness_utxo_len;
|
||||||
|
uint8_t* amount;
|
||||||
|
uint8_t* bip32_path;
|
||||||
|
uint32_t bip32_path_len;
|
||||||
|
uint32_t master_fingerprint;
|
||||||
|
uint32_t sighash_flag;
|
||||||
|
btc_input_type_t input_type;
|
||||||
|
bool witness;
|
||||||
|
bool can_sign;
|
||||||
|
} psbt_input_data_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
psbt_tx_t tx;
|
||||||
|
psbt_txin_t inputs[BTC_MAX_INPUTS];
|
||||||
|
psbt_txout_t outputs[BTC_MAX_OUTPUTS];
|
||||||
|
psbt_input_data_t input_data[BTC_MAX_INPUTS];
|
||||||
|
size_t input_count;
|
||||||
|
size_t output_count;
|
||||||
|
|
||||||
|
psbt_t psbt_out;
|
||||||
|
size_t index_in;
|
||||||
|
size_t index_out;
|
||||||
|
uint8_t hash_prevouts[SHA256_DIGEST_LENGTH];
|
||||||
|
uint8_t hash_sequence[SHA256_DIGEST_LENGTH];
|
||||||
|
uint8_t hash_outputs[SHA256_DIGEST_LENGTH];
|
||||||
|
|
||||||
|
app_err_t error;
|
||||||
|
} btc_tx_ctx_t;
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,5 +1,6 @@
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
#include "bitcoin/bitcoin.h"
|
||||||
#include "bitcoin/psbt.h"
|
#include "bitcoin/psbt.h"
|
||||||
#include "bitcoin/compactsize.h"
|
#include "bitcoin/compactsize.h"
|
||||||
#include "crypto/script.h"
|
#include "crypto/script.h"
|
||||||
|
@ -9,9 +10,6 @@
|
||||||
#include "ur/ur_encode.h"
|
#include "ur/ur_encode.h"
|
||||||
#include "util/tlv.h"
|
#include "util/tlv.h"
|
||||||
|
|
||||||
#define BTC_MAX_INPUTS 20
|
|
||||||
#define BTC_MAX_OUTPUTS 20
|
|
||||||
|
|
||||||
#define BTC_TXID_LEN 32
|
#define BTC_TXID_LEN 32
|
||||||
#define BTC_MSG_MAGIC_LEN 25
|
#define BTC_MSG_MAGIC_LEN 25
|
||||||
#define BTC_MSG_SIG_LEN 65
|
#define BTC_MSG_SIG_LEN 65
|
||||||
|
@ -26,59 +24,8 @@ static const uint8_t P2PKH_SCRIPT_POST[2] = { 0x88, 0xac };
|
||||||
|
|
||||||
const uint8_t *const BTC_MSG_MAGIC = (uint8_t *) "\030Bitcoin Signed Message:\n";
|
const uint8_t *const BTC_MSG_MAGIC = (uint8_t *) "\030Bitcoin Signed Message:\n";
|
||||||
|
|
||||||
enum btc_input_type {
|
|
||||||
BTC_INPUT_TYPE_LEGACY,
|
|
||||||
BTC_INPUT_TYPE_LEGACY_WITH_REDEEM,
|
|
||||||
BTC_INPUT_TYPE_P2WPKH,
|
|
||||||
BTC_INPUT_TYPE_P2WSH,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum btc_sighash_flag {
|
|
||||||
SIGHASH_DEFAULT = 0x00,
|
|
||||||
SIGHASH_ALL = 0x01,
|
|
||||||
SIGHASH_NONE = 0x02,
|
|
||||||
SIGHASH_SINGLE = 0x03,
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t* script_pubkey;
|
|
||||||
size_t script_pubkey_len;
|
|
||||||
uint8_t* redeem_script;
|
|
||||||
size_t redeem_script_len;
|
|
||||||
uint8_t* witness_script;
|
|
||||||
size_t witness_script_len;
|
|
||||||
uint8_t* nonwitness_utxo;
|
|
||||||
size_t nonwitness_utxo_len;
|
|
||||||
uint8_t* amount;
|
|
||||||
uint8_t* bip32_path;
|
|
||||||
uint32_t bip32_path_len;
|
|
||||||
uint32_t master_fingerprint;
|
|
||||||
uint32_t sighash_flag;
|
|
||||||
enum btc_input_type input_type;
|
|
||||||
bool witness;
|
|
||||||
bool can_sign;
|
|
||||||
} psbt_input_data_t;
|
|
||||||
|
|
||||||
struct btc_tx_ctx {
|
|
||||||
psbt_tx_t tx;
|
|
||||||
psbt_txin_t inputs[BTC_MAX_INPUTS];
|
|
||||||
psbt_txout_t outputs[BTC_MAX_OUTPUTS];
|
|
||||||
psbt_input_data_t input_data[BTC_MAX_INPUTS];
|
|
||||||
size_t input_count;
|
|
||||||
size_t output_count;
|
|
||||||
|
|
||||||
psbt_t psbt_out;
|
|
||||||
size_t index_in;
|
|
||||||
size_t index_out;
|
|
||||||
uint8_t hash_prevouts[SHA256_DIGEST_LENGTH];
|
|
||||||
uint8_t hash_sequence[SHA256_DIGEST_LENGTH];
|
|
||||||
uint8_t hash_outputs[SHA256_DIGEST_LENGTH];
|
|
||||||
|
|
||||||
app_err_t error;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct btc_utxo_ctx {
|
struct btc_utxo_ctx {
|
||||||
struct btc_tx_ctx* tx_ctx;
|
btc_tx_ctx_t* tx_ctx;
|
||||||
uint32_t output_count;
|
uint32_t output_count;
|
||||||
uint32_t input_index;
|
uint32_t input_index;
|
||||||
};
|
};
|
||||||
|
@ -100,7 +47,7 @@ static void core_btc_utxo_handler(psbt_txelem_t* elem) {
|
||||||
utxo_ctx->tx_ctx->input_data[utxo_ctx->input_index].script_pubkey_len = tx_out->script_len;
|
utxo_ctx->tx_ctx->input_data[utxo_ctx->input_index].script_pubkey_len = tx_out->script_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void core_btc_psbt_rec_handler(struct btc_tx_ctx* tx_ctx, size_t index, psbt_record_t* rec) {
|
static void core_btc_psbt_rec_handler(btc_tx_ctx_t* tx_ctx, size_t index, psbt_record_t* rec) {
|
||||||
if (rec->scope != PSBT_SCOPE_INPUTS) {
|
if (rec->scope != PSBT_SCOPE_INPUTS) {
|
||||||
return;
|
return;
|
||||||
} else if (index >= tx_ctx->input_count) {
|
} else if (index >= tx_ctx->input_count) {
|
||||||
|
@ -150,7 +97,7 @@ static void core_btc_psbt_rec_handler(struct btc_tx_ctx* tx_ctx, size_t index, p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void core_btc_txelem_handler(struct btc_tx_ctx* tx_ctx, psbt_txelem_t* elem) {
|
static void core_btc_txelem_handler(btc_tx_ctx_t* tx_ctx, psbt_txelem_t* elem) {
|
||||||
switch (elem->elem_type) {
|
switch (elem->elem_type) {
|
||||||
case PSBT_TXELEM_TX:
|
case PSBT_TXELEM_TX:
|
||||||
memcpy(&tx_ctx->tx, elem->elem.tx, sizeof(psbt_tx_t));
|
memcpy(&tx_ctx->tx, elem->elem.tx, sizeof(psbt_tx_t));
|
||||||
|
@ -175,7 +122,7 @@ static void core_btc_txelem_handler(struct btc_tx_ctx* tx_ctx, psbt_txelem_t* el
|
||||||
}
|
}
|
||||||
|
|
||||||
static void core_btc_parser_cb(psbt_elem_t* rec) {
|
static void core_btc_parser_cb(psbt_elem_t* rec) {
|
||||||
struct btc_tx_ctx* tx_ctx = (struct btc_tx_ctx*) rec->user_data;
|
btc_tx_ctx_t* tx_ctx = (btc_tx_ctx_t*) rec->user_data;
|
||||||
|
|
||||||
if (rec->type == PSBT_ELEM_RECORD) {
|
if (rec->type == PSBT_ELEM_RECORD) {
|
||||||
core_btc_psbt_rec_handler(tx_ctx, rec->index, rec->elem.rec);
|
core_btc_psbt_rec_handler(tx_ctx, rec->index, rec->elem.rec);
|
||||||
|
@ -184,7 +131,7 @@ static void core_btc_parser_cb(psbt_elem_t* rec) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static app_err_t core_btc_hash_legacy(struct btc_tx_ctx* tx_ctx, size_t index, uint8_t digest[SHA256_DIGEST_LENGTH]) {
|
static app_err_t core_btc_hash_legacy(btc_tx_ctx_t* tx_ctx, size_t index, uint8_t digest[SHA256_DIGEST_LENGTH]) {
|
||||||
SHA256_CTX sha256;
|
SHA256_CTX sha256;
|
||||||
sha256_Init(&sha256);
|
sha256_Init(&sha256);
|
||||||
|
|
||||||
|
@ -263,7 +210,7 @@ static app_err_t core_btc_hash_legacy(struct btc_tx_ctx* tx_ctx, size_t index, u
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static app_err_t core_btc_hash_segwit(struct btc_tx_ctx* tx_ctx, size_t index, uint8_t digest[SHA256_DIGEST_LENGTH]) {
|
static app_err_t core_btc_hash_segwit(btc_tx_ctx_t* tx_ctx, size_t index, uint8_t digest[SHA256_DIGEST_LENGTH]) {
|
||||||
SHA256_CTX sha256;
|
SHA256_CTX sha256;
|
||||||
sha256_Init(&sha256);
|
sha256_Init(&sha256);
|
||||||
|
|
||||||
|
@ -365,7 +312,7 @@ static app_err_t core_btc_read_signature(uint8_t* data, uint8_t sighash, psbt_re
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static app_err_t core_btc_sign_input(struct btc_tx_ctx* tx_ctx, size_t index) {
|
static app_err_t core_btc_sign_input(btc_tx_ctx_t* tx_ctx, size_t index) {
|
||||||
if (!tx_ctx->input_data[index].can_sign) {
|
if (!tx_ctx->input_data[index].can_sign) {
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
@ -419,7 +366,7 @@ static app_err_t core_btc_sign_input(struct btc_tx_ctx* tx_ctx, size_t index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void core_btc_sign_handler(psbt_elem_t* rec) {
|
static void core_btc_sign_handler(psbt_elem_t* rec) {
|
||||||
struct btc_tx_ctx* tx_ctx = (struct btc_tx_ctx*) rec->user_data;
|
btc_tx_ctx_t* tx_ctx = (btc_tx_ctx_t*) rec->user_data;
|
||||||
|
|
||||||
if ((rec->type == PSBT_ELEM_TXELEM) || tx_ctx->error != ERR_OK) {
|
if ((rec->type == PSBT_ELEM_TXELEM) || tx_ctx->error != ERR_OK) {
|
||||||
return;
|
return;
|
||||||
|
@ -524,7 +471,7 @@ static inline bool btc_validate_tx_hash(uint8_t* tx, size_t tx_len, uint8_t expe
|
||||||
return memcmp(expected_hash, digest, SHA256_DIGEST_LENGTH) == 0;
|
return memcmp(expected_hash, digest, SHA256_DIGEST_LENGTH) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static app_err_t core_btc_validate(struct btc_tx_ctx* tx_ctx) {
|
static app_err_t core_btc_validate(btc_tx_ctx_t* tx_ctx) {
|
||||||
uint32_t mfp;
|
uint32_t mfp;
|
||||||
|
|
||||||
if (core_get_fingerprint(g_core.bip44_path, 0, &mfp) != ERR_OK) {
|
if (core_get_fingerprint(g_core.bip44_path, 0, &mfp) != ERR_OK) {
|
||||||
|
@ -592,12 +539,11 @@ static app_err_t core_btc_validate(struct btc_tx_ctx* tx_ctx) {
|
||||||
return can_sign_something ? ERR_OK : ERR_MISMATCH;
|
return can_sign_something ? ERR_OK : ERR_MISMATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
static app_err_t core_btc_confirm(struct btc_tx_ctx* tx_ctx) {
|
static inline app_err_t core_btc_confirm(btc_tx_ctx_t* tx_ctx) {
|
||||||
//TODO: implement
|
return ui_display_btc_tx(tx_ctx) == CORE_EVT_UI_OK ? ERR_OK : ERR_CANCEL;
|
||||||
return ERR_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void core_btc_common_hashes(struct btc_tx_ctx* tx_ctx) {
|
static void core_btc_common_hashes(btc_tx_ctx_t* tx_ctx) {
|
||||||
SHA256_CTX sha256;
|
SHA256_CTX sha256;
|
||||||
sha256_Init(&sha256);
|
sha256_Init(&sha256);
|
||||||
|
|
||||||
|
@ -630,10 +576,10 @@ static void core_btc_common_hashes(struct btc_tx_ctx* tx_ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static app_err_t core_btc_psbt_run(const uint8_t* psbt_in, size_t psbt_len, uint8_t** psbt_out, size_t* out_len) {
|
static app_err_t core_btc_psbt_run(const uint8_t* psbt_in, size_t psbt_len, uint8_t** psbt_out, size_t* out_len) {
|
||||||
struct btc_tx_ctx* tx_ctx = (struct btc_tx_ctx*) g_camera_fb[1];
|
btc_tx_ctx_t* tx_ctx = (btc_tx_ctx_t*) g_camera_fb[1];
|
||||||
memset(tx_ctx, 0, sizeof(struct btc_tx_ctx));
|
memset(tx_ctx, 0, sizeof(btc_tx_ctx_t));
|
||||||
*psbt_out = &g_camera_fb[1][(sizeof(struct btc_tx_ctx) + 3) & ~0x3];
|
*psbt_out = &g_camera_fb[1][(sizeof(btc_tx_ctx_t) + 3) & ~0x3];
|
||||||
size_t psbt_out_len = CAMERA_FB_SIZE - ((sizeof(struct btc_tx_ctx) + 3) & ~0x3);
|
size_t psbt_out_len = CAMERA_FB_SIZE - ((sizeof(btc_tx_ctx_t) + 3) & ~0x3);
|
||||||
|
|
||||||
psbt_t psbt;
|
psbt_t psbt;
|
||||||
psbt_init(&psbt, (uint8_t*) psbt_in, psbt_len);
|
psbt_init(&psbt, (uint8_t*) psbt_in, psbt_len);
|
||||||
|
|
|
@ -62,7 +62,7 @@ static app_err_t core_eth_sign(keycard_t* kc, uint8_t* out) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline app_err_t core_eth_wait_tx_confirmation() {
|
static inline app_err_t core_eth_wait_tx_confirmation() {
|
||||||
return ui_display_tx(g_core.address, &g_core.data.eth_tx.content) == CORE_EVT_UI_OK ? ERR_OK : ERR_CANCEL;
|
return ui_display_eth_tx(g_core.address, &g_core.data.eth_tx.content) == CORE_EVT_UI_OK ? ERR_OK : ERR_CANCEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline app_err_t core_eth_wait_msg_confirmation(const uint8_t* msg, size_t msg_len) {
|
static inline app_err_t core_eth_wait_msg_confirmation(const uint8_t* msg, size_t msg_len) {
|
||||||
|
|
|
@ -50,8 +50,11 @@ void ui_task_entry(void* pvParameters) {
|
||||||
case UI_CMD_MENU:
|
case UI_CMD_MENU:
|
||||||
g_ui_cmd.result = menu_run();
|
g_ui_cmd.result = menu_run();
|
||||||
break;
|
break;
|
||||||
case UI_CMD_DISPLAY_TXN:
|
case UI_CMD_DISPLAY_ETH_TX:
|
||||||
g_ui_cmd.result = dialog_confirm_tx();
|
g_ui_cmd.result = dialog_confirm_eth_tx();
|
||||||
|
break;
|
||||||
|
case UI_CMD_DISPLAY_BTC_TX:
|
||||||
|
g_ui_cmd.result = dialog_confirm_btc_tx();
|
||||||
break;
|
break;
|
||||||
case UI_CMD_DISPLAY_MSG:
|
case UI_CMD_DISPLAY_MSG:
|
||||||
g_ui_cmd.result = dialog_confirm_msg();
|
g_ui_cmd.result = dialog_confirm_msg();
|
||||||
|
|
|
@ -185,8 +185,8 @@ static void dialog_calculate_fees(bignum256* fees) {
|
||||||
bignum256 gas_amount;
|
bignum256 gas_amount;
|
||||||
bignum256 prime;
|
bignum256 prime;
|
||||||
bn_read_be(secp256k1.prime, &prime);
|
bn_read_be(secp256k1.prime, &prime);
|
||||||
bn_read_compact_be(g_ui_cmd.params.txn.tx->startgas.value, g_ui_cmd.params.txn.tx->startgas.length, &gas_amount);
|
bn_read_compact_be(g_ui_cmd.params.eth_tx.tx->startgas.value, g_ui_cmd.params.eth_tx.tx->startgas.length, &gas_amount);
|
||||||
bn_read_compact_be(g_ui_cmd.params.txn.tx->gasprice.value, g_ui_cmd.params.txn.tx->gasprice.length, fees);
|
bn_read_compact_be(g_ui_cmd.params.eth_tx.tx->gasprice.value, g_ui_cmd.params.eth_tx.tx->gasprice.length, fees);
|
||||||
bn_multiply(&gas_amount, fees, &prime);
|
bn_multiply(&gas_amount, fees, &prime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,10 +209,10 @@ static i18n_str_id_t dialog_recognize_data(const txContent_t* tx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
app_err_t dialog_confirm_tx() {
|
app_err_t dialog_confirm_eth_tx() {
|
||||||
chain_desc_t chain;
|
chain_desc_t chain;
|
||||||
erc20_desc_t token;
|
erc20_desc_t token;
|
||||||
chain.chain_id = g_ui_cmd.params.txn.tx->chainID;
|
chain.chain_id = g_ui_cmd.params.eth_tx.tx->chainID;
|
||||||
|
|
||||||
uint8_t num[11];
|
uint8_t num[11];
|
||||||
if (eth_db_lookup_chain(&chain) != ERR_OK) {
|
if (eth_db_lookup_chain(&chain) != ERR_OK) {
|
||||||
|
@ -222,17 +222,17 @@ app_err_t dialog_confirm_tx() {
|
||||||
|
|
||||||
i18n_str_id_t title;
|
i18n_str_id_t title;
|
||||||
const uint8_t* to;
|
const uint8_t* to;
|
||||||
i18n_str_id_t data_type = dialog_recognize_data(g_ui_cmd.params.txn.tx);
|
i18n_str_id_t data_type = dialog_recognize_data(g_ui_cmd.params.eth_tx.tx);
|
||||||
|
|
||||||
if (data_type == TX_DATA_ERC20) {
|
if (data_type == TX_DATA_ERC20) {
|
||||||
title = TX_CONFIRM_ERC20_TITLE;
|
title = TX_CONFIRM_ERC20_TITLE;
|
||||||
token.chain = chain.chain_id;
|
token.chain = chain.chain_id;
|
||||||
token.addr = g_ui_cmd.params.txn.tx->destination;
|
token.addr = g_ui_cmd.params.eth_tx.tx->destination;
|
||||||
|
|
||||||
memmove((uint8_t*) g_ui_cmd.params.txn.tx->value.value, &g_ui_cmd.params.txn.tx->data[ETH_ERC20_VALUE_OFF], INT256_LENGTH);
|
memmove((uint8_t*) g_ui_cmd.params.eth_tx.tx->value.value, &g_ui_cmd.params.eth_tx.tx->data[ETH_ERC20_VALUE_OFF], INT256_LENGTH);
|
||||||
((txContent_t*) g_ui_cmd.params.txn.tx)->value.length = INT256_LENGTH;
|
((txContent_t*) g_ui_cmd.params.eth_tx.tx)->value.length = INT256_LENGTH;
|
||||||
|
|
||||||
to = &g_ui_cmd.params.txn.tx->data[ETH_ERC20_ADDR_OFF];
|
to = &g_ui_cmd.params.eth_tx.tx->data[ETH_ERC20_ADDR_OFF];
|
||||||
|
|
||||||
if (eth_db_lookup_erc20(&token) != ERR_OK) {
|
if (eth_db_lookup_erc20(&token) != ERR_OK) {
|
||||||
token.ticker = "???";
|
token.ticker = "???";
|
||||||
|
@ -244,7 +244,7 @@ app_err_t dialog_confirm_tx() {
|
||||||
title = TX_CONFIRM_TITLE;
|
title = TX_CONFIRM_TITLE;
|
||||||
token.ticker = chain.ticker;
|
token.ticker = chain.ticker;
|
||||||
token.decimals = 18;
|
token.decimals = 18;
|
||||||
to = g_ui_cmd.params.txn.tx->destination;
|
to = g_ui_cmd.params.eth_tx.tx->destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
dialog_title(LSTR(title));
|
dialog_title(LSTR(title));
|
||||||
|
@ -252,13 +252,13 @@ app_err_t dialog_confirm_tx() {
|
||||||
screen_text_ctx_t ctx;
|
screen_text_ctx_t ctx;
|
||||||
ctx.y = TH_TITLE_HEIGHT;
|
ctx.y = TH_TITLE_HEIGHT;
|
||||||
|
|
||||||
dialog_address(&ctx, TX_SIGNER, ADDR_ETH, g_ui_cmd.params.txn.addr);
|
dialog_address(&ctx, TX_SIGNER, ADDR_ETH, g_ui_cmd.params.eth_tx.addr);
|
||||||
dialog_address(&ctx, TX_ADDRESS, ADDR_ETH, to);
|
dialog_address(&ctx, TX_ADDRESS, ADDR_ETH, to);
|
||||||
dialog_chain(&ctx, chain.name);
|
dialog_chain(&ctx, chain.name);
|
||||||
dialog_tx_data(&ctx, data_type);
|
dialog_tx_data(&ctx, data_type);
|
||||||
|
|
||||||
bignum256 data;
|
bignum256 data;
|
||||||
bn_read_compact_be(g_ui_cmd.params.txn.tx->value.value, g_ui_cmd.params.txn.tx->value.length, &data);
|
bn_read_compact_be(g_ui_cmd.params.eth_tx.tx->value.value, g_ui_cmd.params.eth_tx.tx->value.length, &data);
|
||||||
dialog_amount(&ctx, TX_AMOUNT, &data, token.decimals, token.ticker);
|
dialog_amount(&ctx, TX_AMOUNT, &data, token.decimals, token.ticker);
|
||||||
|
|
||||||
dialog_calculate_fees(&data);
|
dialog_calculate_fees(&data);
|
||||||
|
@ -281,6 +281,10 @@ app_err_t dialog_confirm_tx() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app_err_t dialog_confirm_btc_tx() {
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static void dialog_draw_message(const char* txt) {
|
static void dialog_draw_message(const char* txt) {
|
||||||
dialog_title("");
|
dialog_title("");
|
||||||
dialog_footer(TH_TITLE_HEIGHT);
|
dialog_footer(TH_TITLE_HEIGHT);
|
||||||
|
|
|
@ -16,7 +16,8 @@ app_err_t dialog_nav_hints_colors(icons_t left, icons_t right, uint16_t bg, uint
|
||||||
app_err_t dialog_pager(size_t page, size_t last_page);
|
app_err_t dialog_pager(size_t page, size_t last_page);
|
||||||
app_err_t dialog_margin(uint16_t yOff, uint16_t height);
|
app_err_t dialog_margin(uint16_t yOff, uint16_t height);
|
||||||
|
|
||||||
app_err_t dialog_confirm_tx();
|
app_err_t dialog_confirm_eth_tx();
|
||||||
|
app_err_t dialog_confirm_btc_tx();
|
||||||
app_err_t dialog_confirm_msg();
|
app_err_t dialog_confirm_msg();
|
||||||
app_err_t dialog_confirm_eip712();
|
app_err_t dialog_confirm_eip712();
|
||||||
|
|
||||||
|
|
14
app/ui/ui.c
14
app/ui/ui.c
|
@ -32,10 +32,16 @@ core_evt_t ui_menu(const char* title, const menu_t* menu, i18n_str_id_t* selecte
|
||||||
return ui_signal_wait(allow_usb);
|
return ui_signal_wait(allow_usb);
|
||||||
}
|
}
|
||||||
|
|
||||||
core_evt_t ui_display_tx(const uint8_t* address, const txContent_t* tx) {
|
core_evt_t ui_display_eth_tx(const uint8_t* address, const txContent_t* tx) {
|
||||||
g_ui_cmd.type = UI_CMD_DISPLAY_TXN;
|
g_ui_cmd.type = UI_CMD_DISPLAY_ETH_TX;
|
||||||
g_ui_cmd.params.txn.addr = address;
|
g_ui_cmd.params.eth_tx.addr = address;
|
||||||
g_ui_cmd.params.txn.tx = tx;
|
g_ui_cmd.params.eth_tx.tx = tx;
|
||||||
|
return ui_signal_wait(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
core_evt_t ui_display_btc_tx(const btc_tx_ctx_t* tx) {
|
||||||
|
g_ui_cmd.type = UI_CMD_DISPLAY_BTC_TX;
|
||||||
|
g_ui_cmd.params.btc_tx.tx = tx;
|
||||||
return ui_signal_wait(0);
|
return ui_signal_wait(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "crypto/address.h"
|
#include "crypto/address.h"
|
||||||
|
#include "bitcoin/bitcoin.h"
|
||||||
#include "ethereum/ethUstream.h"
|
#include "ethereum/ethUstream.h"
|
||||||
#include "ethereum/eip712.h"
|
#include "ethereum/eip712.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
|
@ -22,7 +23,8 @@ typedef enum {
|
||||||
core_evt_t ui_qrscan(ur_type_t type, void* out);
|
core_evt_t ui_qrscan(ur_type_t type, void* out);
|
||||||
core_evt_t ui_qrscan_tx(ur_type_t* type, void* out);
|
core_evt_t ui_qrscan_tx(ur_type_t* type, void* out);
|
||||||
core_evt_t ui_menu(const char* title, const menu_t* menu, i18n_str_id_t* selected, i18n_str_id_t marked, uint8_t allow_usb);
|
core_evt_t ui_menu(const char* title, const menu_t* menu, i18n_str_id_t* selected, i18n_str_id_t marked, uint8_t allow_usb);
|
||||||
core_evt_t ui_display_tx(const uint8_t* address, const txContent_t* tx);
|
core_evt_t ui_display_eth_tx(const uint8_t* address, const txContent_t* tx);
|
||||||
|
core_evt_t ui_display_btc_tx(const btc_tx_ctx_t* tx);
|
||||||
core_evt_t ui_display_msg(addr_type_t addr_type, const uint8_t* address, const uint8_t* msg, uint32_t len);
|
core_evt_t ui_display_msg(addr_type_t addr_type, const uint8_t* address, const uint8_t* msg, uint32_t len);
|
||||||
core_evt_t ui_display_eip712(const uint8_t* address, const eip712_ctx_t* eip712);
|
core_evt_t ui_display_eip712(const uint8_t* address, const eip712_ctx_t* eip712);
|
||||||
core_evt_t ui_display_ur_qr(const char* title, const uint8_t* data, uint32_t len, ur_type_t type);
|
core_evt_t ui_display_ur_qr(const char* title, const uint8_t* data, uint32_t len, ur_type_t type);
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "keypad/keypad.h"
|
#include "keypad/keypad.h"
|
||||||
|
#include "bitcoin/bitcoin.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "ethereum/ethUstream.h"
|
#include "ethereum/ethUstream.h"
|
||||||
#include "qrcode/qrcode.h"
|
#include "qrcode/qrcode.h"
|
||||||
|
@ -24,7 +25,8 @@ enum cmd_type {
|
||||||
UI_CMD_INFO,
|
UI_CMD_INFO,
|
||||||
UI_CMD_PROMPT,
|
UI_CMD_PROMPT,
|
||||||
UI_CMD_MENU,
|
UI_CMD_MENU,
|
||||||
UI_CMD_DISPLAY_TXN,
|
UI_CMD_DISPLAY_ETH_TX,
|
||||||
|
UI_CMD_DISPLAY_BTC_TX,
|
||||||
UI_CMD_DISPLAY_MSG,
|
UI_CMD_DISPLAY_MSG,
|
||||||
UI_CMD_DISPLAY_EIP712,
|
UI_CMD_DISPLAY_EIP712,
|
||||||
UI_CMD_DISPLAY_QR,
|
UI_CMD_DISPLAY_QR,
|
||||||
|
@ -56,11 +58,15 @@ struct cmd_wrong_auth {
|
||||||
uint8_t retries;
|
uint8_t retries;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cmd_txn {
|
struct cmd_eth_txn {
|
||||||
const uint8_t* addr;
|
const uint8_t* addr;
|
||||||
const txContent_t* tx;
|
const txContent_t* tx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct cmd_btc_txn {
|
||||||
|
const btc_tx_ctx_t* tx;
|
||||||
|
};
|
||||||
|
|
||||||
struct cmd_msg {
|
struct cmd_msg {
|
||||||
addr_type_t addr_type;
|
addr_type_t addr_type;
|
||||||
const uint8_t* addr;
|
const uint8_t* addr;
|
||||||
|
@ -133,7 +139,8 @@ union cmd_params {
|
||||||
struct cmd_info info;
|
struct cmd_info info;
|
||||||
struct cmd_prompt prompt;
|
struct cmd_prompt prompt;
|
||||||
struct cmd_wrong_auth wrong_auth;
|
struct cmd_wrong_auth wrong_auth;
|
||||||
struct cmd_txn txn;
|
struct cmd_eth_txn eth_tx;
|
||||||
|
struct cmd_btc_txn btc_tx;
|
||||||
struct cmd_msg msg;
|
struct cmd_msg msg;
|
||||||
struct cmd_eip712 eip712;
|
struct cmd_eip712 eip712;
|
||||||
struct cmd_qrout qrout;
|
struct cmd_qrout qrout;
|
||||||
|
|
Loading…
Reference in New Issue