|
|
|
@ -232,15 +232,59 @@ static HDNode *fsm_getDerivedNode(const char *curve, const uint32_t *address_n,
|
|
|
|
|
static bool fsm_layoutAddress(const char *address, const char *desc,
|
|
|
|
|
bool ignorecase, size_t prefixlen,
|
|
|
|
|
const uint32_t *address_n, size_t address_n_count,
|
|
|
|
|
bool address_is_account) {
|
|
|
|
|
bool qrcode = false;
|
|
|
|
|
bool address_is_account,
|
|
|
|
|
const MultisigRedeemScriptType *multisig,
|
|
|
|
|
int multisig_index, const CoinInfo *coin) {
|
|
|
|
|
int screen = 0, screens = 2;
|
|
|
|
|
if (multisig) {
|
|
|
|
|
screens += 2 * cryptoMultisigPubkeyCount(multisig);
|
|
|
|
|
}
|
|
|
|
|
for (;;) {
|
|
|
|
|
const char *display_addr = address;
|
|
|
|
|
if (prefixlen && !qrcode) {
|
|
|
|
|
display_addr += prefixlen;
|
|
|
|
|
switch (screen) {
|
|
|
|
|
case 0: { // show address
|
|
|
|
|
const char *display_addr = address;
|
|
|
|
|
// strip cashaddr prefix
|
|
|
|
|
if (prefixlen) {
|
|
|
|
|
display_addr += prefixlen;
|
|
|
|
|
}
|
|
|
|
|
layoutAddress(display_addr, desc, false, ignorecase, address_n,
|
|
|
|
|
address_n_count, address_is_account);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case 1: { // show QR code
|
|
|
|
|
layoutAddress(address, desc, true, ignorecase, address_n,
|
|
|
|
|
address_n_count, address_is_account);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default: { // show XPUBs
|
|
|
|
|
int index = (screen - 2) / 2;
|
|
|
|
|
int page = (screen - 2) % 2;
|
|
|
|
|
char xpub[112] = {0};
|
|
|
|
|
const HDNodeType *node_ptr = NULL;
|
|
|
|
|
if (multisig->nodes_count) { // use multisig->nodes
|
|
|
|
|
node_ptr = &(multisig->nodes[index]);
|
|
|
|
|
} else if (multisig->pubkeys_count) { // use multisig->pubkeys
|
|
|
|
|
node_ptr = &(multisig->pubkeys[index].node);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!node_ptr) {
|
|
|
|
|
strlcat(xpub, "ERROR", sizeof(xpub));
|
|
|
|
|
} else {
|
|
|
|
|
HDNode node;
|
|
|
|
|
if (!hdnode_from_xpub(node_ptr->depth, node_ptr->child_num,
|
|
|
|
|
node_ptr->chain_code.bytes,
|
|
|
|
|
node_ptr->public_key.bytes, coin->curve_name,
|
|
|
|
|
&node)) {
|
|
|
|
|
strlcat(xpub, "ERROR", sizeof(xpub));
|
|
|
|
|
} else {
|
|
|
|
|
hdnode_serialize_public(&node, node_ptr->fingerprint,
|
|
|
|
|
coin->xpub_magic, xpub, sizeof(xpub));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
layoutXPUB(xpub, index, page, multisig_index == index);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
layoutAddress(display_addr, desc, qrcode, ignorecase, address_n,
|
|
|
|
|
address_n_count, address_is_account);
|
|
|
|
|
if (protectButton(ButtonRequestType_ButtonRequest_Address, false)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
@ -249,7 +293,7 @@ static bool fsm_layoutAddress(const char *address, const char *desc,
|
|
|
|
|
layoutHome();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
qrcode = !qrcode;
|
|
|
|
|
screen = (screen + 1) % screens;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|