What changed, and why it matters
This commit is a large code cleanup and refactoring of the wallet connection feature in the Keystone 3 firmware. It removes many duplicated Rust modules and C functions that generated QR-code sync data for specific wallets (Aptos, Solana, Sui, XBull, Keystone companion app, etc.) and replaces them with a single generic function. It also fixes some memory leaks by adding SRAM_FREE calls and removes unused/commented-out code. There is no direct evidence in the commit of a security vulnerability being fixed; it appears to be a maintenance refactor.
Treat as routine maintenance. Review the new unified UR generation paths for correct handling of master fingerprint length and path parsing, and verify the added SRAM_FREE calls cover all allocation sites. No urgent security action is indicated by this commit alone.
Security signals we found
Large code deletion/refactor with no explicit security claim
Memory management improvements: addition of SRAM_FREE calls for allocated public_keys and paths
Removal of duplicated wallet-specific UR generation logic reduces attack surface
No new unsafe blocks, no weakened length checks, no cryptographic changes observed
Evidence from the diff
The diff shows a broad refactor across Rust and C layers. In rust/apps/wallets, per-coin sync modules (aptos.rs, solana.rs, sui.rs, xbull.rs, keystone.rs, companion_app.rs) are deleted and replaced by a shared generate_crypto_multi_accounts_sync_ur utility. In rust/rust_c, many per-wallet FFI entry points are removed in favor of generate_common_crypto_multi_accounts_ur and generate_btc_crypto_account_ur. The C UI layer is updated to call these unified functions, adds SRAM_FREE for previously leaked allocations, and removes dead code such as Yoroi wallet references and unused coin-badge helpers. A few minor improvements appear, e.g., changing &Vec
Changed components
rust/apps/wallets/src/*rust/rust_c/src/wallet/*src/ui/gui_wallet/*src/ui/gui_widgets/*Inspect captured patch +450 / −1986
diff --git a/rust/apps/wallets/src/aptos.rs b/rust/apps/wallets/src/aptos.rs
deleted file mode 100644
index 37d2395..0000000
--- a/rust/apps/wallets/src/aptos.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-use crate::utils::generate_crypto_multi_accounts_sync_ur;
-use alloc::collections::BTreeMap;
-use alloc::string::String;
-use bitcoin::bip32::DerivationPath;
-use ur_registry::error::URResult;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-
-pub const DEVICE_TYPE: &str = "keystone 3";
-
-pub fn generate_sync_ur(
- master_fingerprint: &[u8; 4],
- public_keys: BTreeMap<DerivationPath, String>,
-) -> URResult<CryptoMultiAccounts> {
- generate_crypto_multi_accounts_sync_ur(master_fingerprint, public_keys, "APT")
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_generate_sync_ur() {
- let master_fingerprint = [0u8; 4];
- let public_keys = BTreeMap::new();
- let result = generate_sync_ur(&master_fingerprint, public_keys);
- assert!(result.is_ok());
- assert_eq!(result.unwrap().get_master_fingerprint(), master_fingerprint);
- }
-}
diff --git a/rust/apps/wallets/src/companion_app.rs b/rust/apps/wallets/src/companion_app.rs
deleted file mode 100644
index a046e5e..0000000
--- a/rust/apps/wallets/src/companion_app.rs
+++ /dev/null
@@ -1,138 +0,0 @@
-use alloc::string::{String, ToString};
-use alloc::vec;
-use alloc::vec::Vec;
-use hex;
-use ur_registry::bytes::Bytes;
-use ur_registry::error::URResult;
-use ur_registry::pb;
-use ur_registry::pb::protoc;
-use ur_registry::pb::protoc::base::Content;
-use ur_registry::pb::protoc::{payload, Account, Base, Coin, Payload};
-
-use crate::DEVICE_TYPE;
-
-pub const DESCRIPTION: &str = "keystone qrcode";
-
-pub struct AccountConfig {
- pub hd_path: String,
- pub x_pub: String,
- pub address_length: i32,
- pub is_multi_sign: bool,
-}
-
-pub struct CoinConfig {
- pub is_active: bool,
- pub coin_code: String,
- pub accounts: Vec<AccountConfig>,
-}
-
-pub fn generate_companion_app_sync_ur(
- master_fingerprint: &[u8; 4],
- cold_version: i32,
- coin_configs: Vec<CoinConfig>,
-) -> URResult<Bytes> {
- let mut coins: Vec<Coin> = vec![];
- for coin_config in coin_configs {
- coins.push(generate_coin_by_config(coin_config));
- }
- let payload = Payload {
- r#type: payload::Type::Sync.into(),
- xfp: hex::encode(master_fingerprint).to_uppercase(),
- content: Some(payload::Content::Sync(protoc::Sync { coins })),
- };
- let base = Base {
- data: Some(payload),
- version: 1,
- content: Some(Content::ColdVersion(cold_version)),
- description: DESCRIPTION.to_string(),
- device_type: DEVICE_TYPE.to_string(),
- };
- let encode_result = pb::protobuf_parser::serialize_protobuf(base);
- let zip_data = pb::protobuf_parser::zip(&encode_result)?;
- Ok(Bytes::new(zip_data))
-}
-
-fn generate_coin_by_config(coin_config: CoinConfig) -> Coin {
- let mut accounts: Vec<Account> = vec![];
- for account in coin_config.accounts {
- accounts.push(Account {
- hd_path: account.hd_path,
- x_pub: account.x_pub,
- address_length: account.address_length,
- is_multi_sign: account.is_multi_sign,
- })
- }
- Coin {
- coin_code: coin_config.coin_code,
- active: coin_config.is_active,
- accounts,
- }
-}
-
-#[cfg(test)]
-mod tests {
- extern crate std;
-
- use super::AccountConfig;
- use super::CoinConfig;
- use alloc::string::ToString;
- use alloc::vec::Vec;
- use hex;
- use hex::FromHex;
-
- use super::*;
-
- const BTC_COIN_CODE: &str = "BTC";
- const BTC_PATH: &str = "M/49'/0'/0'";
-
- const BTC_LEGACY_COIN_CODE: &str = "BTC_LEGACY";
- const BTC_LEGACY_PATH: &str = "M/44'/0'/0'";
-
- const BTC_NATIVE_SEGWIT_COIN_CODE: &str = "BTC_NATIVE_SEGWIT";
- const BTC_NATIVE_SEGWIT_PATH: &str = "M/84'/0'/0'";
-
- #[test]
- fn test_generate_crypto_account() {
- let mfp = "73C5DA0A";
- let mfp = Vec::from_hex(mfp).unwrap();
- let mfp: [u8; 4] = mfp.try_into().unwrap();
-
- let btc = CoinConfig {
- coin_code: BTC_COIN_CODE.to_string(),
- is_active: true,
- accounts: vec![AccountConfig {
- hd_path: BTC_PATH.to_string(),
- x_pub: "xpub6C6nQwHaWbSrzs5tZ1q7m5R9cPK9eYpNMFesiXsYrgc1P8bvLLAet9JfHjYXKjToD8cBRswJXXbbFpXgwsswVPAZzKMa1jUp2kVkGVUaJa7".to_string(),
- address_length: 20,
- is_multi_sign: false,
- }],
- };
- let btc_legacy = CoinConfig {
- coin_code: BTC_LEGACY_COIN_CODE.to_string(),
- is_active: true,
- accounts: vec![AccountConfig {
- hd_path: BTC_LEGACY_PATH.to_string(),
- x_pub: "xpub6BosfCnifzxcFwrSzQiqu2DBVTshkCXacvNsWGYJVVhhawA7d4R5WSWGFNbi8Aw6ZRc1brxMyWMzG3DSSSSoekkudhUd9yLb6qx39T9nMdj".to_string(),
- address_length: 20,
- is_multi_sign: false,
- }],
- };
-
- let btc_native_segwit = CoinConfig {
- coin_code: BTC_NATIVE_SEGWIT_COIN_CODE.to_string(),
- is_active: true,
- accounts: vec![AccountConfig {
- hd_path: BTC_NATIVE_SEGWIT_PATH.to_string(),
- x_pub: "xpub6CatWdiZiodmUeTDp8LT5or8nmbKNcuyvz7WyksVFkKB4RHwCD3XyuvPEbvqAQY3rAPshWcMLoP2fMFMKHPJ4ZeZXYVUhLv1VMrjPC7PW6V".to_string(),
- address_length: 20,
- is_multi_sign: false,
- }],
- };
- let result =
- generate_companion_app_sync_ur(&mfp, 31000, vec![btc, btc_legacy, btc_native_segwit])
- .unwrap();
-
- assert_eq!("1f8b08000000000000035dd1376edb60000560105a0c0648313c189abc259b2d516c238b48990d14cbcfb2186c320bc4f68ba4c82973b66c3e4c6e90dbe404a180c406fcf0a6377dc0bb42ae3f15c9084f5599dc356d54c5c9f2f7625eaf488cc379e68159fe5aa03f1074c15adc6764f91d413fa8f71bfaebfdc3a5d7d5b9ee428223cafdb00b9cd06c27889ffc55431e71838e74994ebc5a538504662ef4dae768a55361af284c72a2a5c32ef75c39b72a9e8a58030e92eb86a150bbcf038403d0197f92d56095dbf5ba008508ec400ac8db1bf42782a233e649d98a0ce7bd993617d0dc7f26b68207aecc0ed3391286d69cf659d3ad791658302d3837887a0d3aa2270190a6c1c090f1c6c01dd311052dcc2866207c235a85ed591d1d751231de9c532545d1c5a91dd3a31212cd19a32dba54e37c36bd20e8978b4963ac47b07d32b7a2f368bdd2a877342e383971e667557cb4138baf29c5c2ab962a8fa1ac45ddd84fa43316100885cc6e8cddc0f1983b76bdbe0dfb86d97b58cbe830752255a9f4f541155479a74b1b3ff15d0fd8a9d2af80dae63a47ea0e016e6fbebdfc41d61fe5ff1763777a5bfd053ac4f633f5010000",
- hex::encode(result.get_bytes()));
- }
-}
diff --git a/rust/apps/wallets/src/keystone.rs b/rust/apps/wallets/src/keystone.rs
deleted file mode 100644
index dbccc4d..0000000
--- a/rust/apps/wallets/src/keystone.rs
+++ /dev/null
@@ -1,200 +0,0 @@
-use alloc::{
- string::{String, ToString},
- vec::Vec,
-};
-
-use ur_registry::bytes::Bytes;
-use {
- bitcoin::bip32::ChildNumber,
- ur_registry::{
- crypto_hd_key::CryptoHDKey,
- crypto_key_path::{CryptoKeyPath, PathComponent},
- error::{URError, URResult},
- extend::crypto_multi_accounts::CryptoMultiAccounts,
- },
-};
-
-use crate::companion_app::{AccountConfig, CoinConfig};
-use crate::{common::get_path_component, ExtendedPublicKey};
-
-fn get_device_id(serial_number: &str) -> String {
- use cryptoxide::hashing::sha256;
- hex::encode(&sha256(&sha256(serial_number.as_bytes()))[0..20])
-}
-
-const BTC_LEGACY_PREFIX: &str = "44'/0'/0'";
-const BTC_SEGWIT_PREFIX: &str = "49'/0'/0'";
-const BTC_NATIVE_SEGWIT_PREFIX: &str = "84'/0'/0'";
-const ETH_STANDARD_PREFIX: &str = "44'/60'/0'";
-const BCH_PREFIX: &str = "44'/145'/0'";
-const DASH_PREFIX: &str = "44'/5'/0'";
-const LTC_PREFIX: &str = "49'/2'/0'";
-const TRX_PREFIX: &str = "44'/195'/0'";
-const XRP_PREFIX: &str = "44'/144'/0'";
-
-fn path_to_coin_code(path: &str) -> String {
- let path = path
- .split('/')
- .take(4)
- .collect::<Vec<&str>>()
- .join("/")
- .to_lowercase();
- match path.as_str() {
- BTC_LEGACY_PREFIX => "BTC_LEGACY".to_string(),
- BTC_SEGWIT_PREFIX => "BTC".to_string(),
- BTC_NATIVE_SEGWIT_PREFIX => "BTC_NATIVE_SEGWIT".to_string(),
- ETH_STANDARD_PREFIX => "ETH".to_string(),
- BCH_PREFIX => "BCH".to_string(),
- DASH_PREFIX => "DASH".to_string(),
- LTC_PREFIX => "LTC".to_string(),
- TRX_PREFIX => "TRON".to_string(),
- XRP_PREFIX => "XRP".to_string(),
- _ => "Unknown".to_string(),
- }
-}
-
-pub fn generate_crypto_multi_accounts(
- master_fingerprint: [u8; 4],
- serial_number: &str,
- extended_public_keys: Vec<ExtendedPublicKey>,
- device_type: &str,
- device_version: &str,
-) -> URResult<Bytes> {
- let device_id = get_device_id(serial_number);
- let mut keys = vec![];
- let k1_keys = vec![
- BTC_LEGACY_PREFIX.to_string(),
- BTC_SEGWIT_PREFIX.to_string(),
- BTC_NATIVE_SEGWIT_PREFIX.to_string(),
- ETH_STANDARD_PREFIX.to_string(),
- BCH_PREFIX.to_string(),
- DASH_PREFIX.to_string(),
- LTC_PREFIX.to_string(),
- TRX_PREFIX.to_string(),
- XRP_PREFIX.to_string(),
- ];
- for ele in extended_public_keys {
- match ele.get_path() {
- _path if k1_keys.contains(&_path.to_string().to_lowercase()) => {
- keys.push(generate_k1_normal_key(
- master_fingerprint,
- ele.clone(),
- None,
- )?);
- }
- _path if _path.to_string().to_lowercase().eq(ETH_STANDARD_PREFIX) => {
- keys.push(generate_k1_normal_key(
- master_fingerprint,
- ele.clone(),
- Some("account.standard".to_string()),
- )?);
- }
- _ => {
- return Err(URError::UrEncodeError(format!(
- "Unknown key path: {}",
- ele.path
- )))
- }
- }
- }
- let data = CryptoMultiAccounts::new(
- master_fingerprint,
- keys,
- Some(device_type.to_string()),
- Some(device_id),
- Some(device_version.to_string()),
- );
-
- // convert crypto_multi_accounts to keystone sync ur
- let mut coin_configs: Vec<CoinConfig> = vec![];
- for key in data.get_keys() {
- let mut accounts: Vec<AccountConfig> = vec![];
- let hd_path =
- "M/".to_string() + &*key.get_origin().unwrap().get_path().unwrap().to_string();
-
- let x_pub = key.get_bip32_key();
-
- let coin_code = path_to_coin_code(&hd_path);
- if coin_code == "Unknown" {
- continue;
- }
-
- let account = AccountConfig {
- hd_path: "M/".to_string() + &*hd_path,
- x_pub,
- address_length: 1,
- is_multi_sign: false,
- };
- accounts.push(account);
- let coin_config = CoinConfig {
- coin_code,
- is_active: true,
- accounts,
- };
- coin_configs.push(coin_config);
- }
- // device version: 1.5.6 == 31506
- let cold_wallet_device_version_str = device_version.split('.').collect::<Vec<&str>>();
- // 30_000 is the base version
- let first = cold_wallet_device_version_str[0].parse::<i32>().unwrap() * 1000;
- let second = cold_wallet_device_version_str[1].parse::<i32>().unwrap() * 100;
- let third = cold_wallet_device_version_str[2].parse::<i32>().unwrap();
- let cold_wallet_device_version = 30_000 + first + second + third;
- let keystone_sync_ur = crate::companion_app::generate_companion_app_sync_ur(
- &master_fingerprint,
- cold_wallet_device_version,
- coin_configs,
- )?;
-
- // this below is the expected output , and will send to the keystone solfware
- // let mfp = "1250B6BC";
- // let mfp = Vec::from_hex(mfp).unwrap();
- // let mfp: [u8; 4] = mfp.try_into().unwrap();
- // Base { version: 1, description: "keystone qrcode",
- // data: Some(Payload { r#type: Sync, xfp: "1250B6BC",
- // content: Some(Sync(Sync {
- // coins: [
- // Coin { coin_code: "BTC", active: true, accounts: [Account { hd_path: "M/49'/0'/0'", x_pub: "xpub6BqcZUPst99NuHmP1TNcCXftBBUjf87UAgZYfGYLKnafbhSo9rjoQoVhXDYwcf4Bt7wv2CszAiBXfrhgx5yoJNo8qe1FVQPNyTEtsaWJp52", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "BTC_LEGACY", active: false, accounts: [Account { hd_path: "M/44'/0'/0'", x_pub: "xpub6CzHiXpZKvPYnCwnd6qq511yn8B63yB8rCtxsY4azeuCxPYJn6B7KNEa6sDCkNAj54H5AW3zYY8QLSzG6qe7SZBvKW3ighdPGTYQgDXxfHQ", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "BTC_NATIVE_SEGWIT", active: false, accounts: [Account { hd_path: "M/84'/0'/0'", x_pub: "xpub6CpjN9cV2eSSHvzA5113pRqD5qaWRhUXS7ABs5AqGiau3BbAnW2fx1JwEEwn9ugVAgx6vbpXAKEjQbKjYHHPCjaxHEwyfLcUvwxjbaBEPRe", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "ETH", active: true, accounts: [Account { hd_path: "M/44'/60'/0'", x_pub: "xpub6CPJYBVf9pKYuMRpT7PhAPoCnCwh8KyYXndnFGpQPUM7uzB4n4gRcdbest2t3yFkyquPYqRrVY69dZ68kJWjGspZewyNW8rXG6YYQppUUi9", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "BCH", active: true, accounts: [Account { hd_path: "M/44'/145'/0'", x_pub: "xpub6Ce7XFJkp8aearw9nhdoiuaeuocR9ZuEzSMnR5WKtU99fbXmMgnobXMn35kQJGaF32JZDNS9UtEJ3sonSZ6JVDSuKFU2vRD1qbaE2zyG4V4", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "DASH", active: true, accounts: [Account { hd_path: "M/44'/5'/0'", x_pub: "xpub6CdBLESkJwrjUMoMV6Z3doPTLZSJ9knVp22mGmkJjH74hJ4riU8z9JCJf9APwSgWFpBkC17Are9Z8Sk6qi2XaXNnHUi9A5BbvJLaBh5WwkF", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "LTC", active: true, accounts: [Account { hd_path: "M/49'/2'/0'", x_pub: "xpub6CASR9TUvDwDP4u3RiH6x6bNMgprtwz9KaXzGT6w9HnoAeYDgG2Re88mZePxncSmNSrcLXeCGW3U8cGmiTpPih7PoYDpmonFygdyxDFqZZZ", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "TRON", active: true, accounts: [Account { hd_path: "M/44'/195'/0'", x_pub: "xpub6C5UAFMYy6o6CucPhqniZxZEtBKYS9xY433C9DunttXBwM9sNmnsuCdZFADLgUXsSjjThUYQLKWwHnPraacNJAHRvCe7Q3wrWE1wmw6dvyp", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "XRP", active: true, accounts: [Account { hd_path: "M/44'/144'/0'", x_pub: "xpub6BmXbwNG7wfcEs5VUsBKK5CwJk3Vf8QFKF3wTeutW1zWwStQ7qGZJr9W6KxdBF5pyzju17Hrsus4kjdjvYfu3PB46BsUQY61WQ2d9rP5v7i", address_length: 1, is_multi_sign: false }] },
- // Coin { coin_code: "DOT", active: true, accounts: [Account { hd_path: "//polkadot", x_pub: "xpub68wKPdEKjbZ4o1mSG7eN6b7b6vHXpShMTxJE4emZ98Fbs93cPxrkKxRmLkq7pi937qPyjxvXk4Zn2nUCvuQg6zbRvqQpVzXQyaM8miwcs7E", address_length: 1, is_multi_sign: false }] }] })) }),
- // device_type: "keystone Pro", content: Some(ColdVersion(31206)) }
- Ok(keystone_sync_ur)
-}
-
-fn generate_k1_normal_key(
- mfp: [u8; 4],
- key: ExtendedPublicKey,
- note: Option<String>,
-) -> URResult<CryptoHDKey> {
- let xpub = bitcoin::bip32::Xpub::decode(&key.get_key())
- .map_err(|_e| URError::UrEncodeError(_e.to_string()))?;
- let path = key.get_path();
- let key_path = CryptoKeyPath::new(
- path.into_iter()
- .map(|v| match v {
- ChildNumber::Normal { index } => get_path_component(Some(*index), false),
- ChildNumber::Hardened { index } => get_path_component(Some(*index), true),
- })
- .collect::<URResult<Vec<PathComponent>>>()?,
- Some(mfp),
- Some(xpub.depth as u32),
- );
- Ok(CryptoHDKey::new_extended_key(
- Some(false),
- xpub.public_key.serialize().to_vec(),
- Some(xpub.chain_code.to_bytes().to_vec()),
- None,
- Some(key_path),
- None,
- Some(xpub.parent_fingerprint.to_bytes()),
- Some("Keystone".to_string()),
- note,
- ))
-}
diff --git a/rust/apps/wallets/src/lib.rs b/rust/apps/wallets/src/lib.rs
index b824645..d79771c 100644
--- a/rust/apps/wallets/src/lib.rs
+++ b/rust/apps/wallets/src/lib.rs
@@ -12,28 +12,25 @@ use alloc::vec::Vec;
use app_utils::impl_public_struct;
use bitcoin::bip32::DerivationPath;
-pub mod aptos;
pub mod backpack;
pub mod bitget;
pub mod blue_wallet;
mod common;
-pub mod companion_app;
pub mod core_wallet;
pub mod keplr;
-pub mod keystone;
pub mod keystone_connect;
pub mod metamask;
pub mod okx;
-pub mod solana;
-pub mod sui;
pub mod thor_wallet;
pub mod tonkeeper;
mod utils;
-pub mod xbull;
pub mod xrp_toolkit;
pub mod zcash;
//TODO: get these value from device
pub const DEVICE_TYPE: &str = "Keystone 3 Pro";
+pub const DESCRIPTION: &str = "keystone qrcode";
+
+pub use utils::generate_crypto_multi_accounts_sync_ur;
//key maybe 78 bytes xpub (k1) or just 32 bytes public key(ed25519) or 64 bytes bip32-ed25519 xpub
//they are differed in path
diff --git a/rust/apps/wallets/src/metamask.rs b/rust/apps/wallets/src/metamask.rs
index bb0637b..63d72e9 100644
--- a/rust/apps/wallets/src/metamask.rs
+++ b/rust/apps/wallets/src/metamask.rs
@@ -85,7 +85,7 @@ pub fn generate_standard_legacy_hd_key(
pub fn generate_ledger_live_account(
master_fingerprint: &[u8; 4],
- extended_public_keys: &Vec<String>,
+ extended_public_keys: &[String],
) -> URResult<CryptoAccount> {
let mut outputs: Vec<CryptoOutput> = Vec::new();
for (i, x) in extended_public_keys.iter().enumerate() {
diff --git a/rust/apps/wallets/src/solana.rs b/rust/apps/wallets/src/solana.rs
deleted file mode 100644
index 5e58345..0000000
--- a/rust/apps/wallets/src/solana.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-use crate::utils::generate_crypto_multi_accounts_sync_ur;
-use alloc::collections::BTreeMap;
-use alloc::string::String;
-use bitcoin::bip32::DerivationPath;
-use ur_registry::error::URResult;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-
-pub fn generate_sync_ur(
- master_fingerprint: &[u8; 4],
- public_keys: BTreeMap<DerivationPath, String>,
-) -> URResult<CryptoMultiAccounts> {
- generate_crypto_multi_accounts_sync_ur(master_fingerprint, public_keys, "SOL")
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_generate_sync_ur() {
- let master_fingerprint = [0u8; 4];
- let public_keys = BTreeMap::new();
- let result = generate_sync_ur(&master_fingerprint, public_keys);
- assert!(result.is_ok());
- assert_eq!(result.unwrap().get_master_fingerprint(), master_fingerprint);
- }
-}
diff --git a/rust/apps/wallets/src/sui.rs b/rust/apps/wallets/src/sui.rs
deleted file mode 100644
index 1e80b02..0000000
--- a/rust/apps/wallets/src/sui.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-use crate::utils::generate_crypto_multi_accounts_sync_ur;
-use alloc::collections::BTreeMap;
-use alloc::string::String;
-use bitcoin::bip32::DerivationPath;
-use ur_registry::error::URResult;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-
-pub fn generate_sync_ur(
- master_fingerprint: &[u8; 4],
- public_keys: BTreeMap<DerivationPath, String>,
-) -> URResult<CryptoMultiAccounts> {
- generate_crypto_multi_accounts_sync_ur(master_fingerprint, public_keys, "SUI")
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_generate_sync_ur() {
- let master_fingerprint = [0u8; 4];
- let public_keys = BTreeMap::new();
- let result = generate_sync_ur(&master_fingerprint, public_keys);
- assert!(result.is_ok());
- assert_eq!(result.unwrap().get_master_fingerprint(), master_fingerprint);
- }
-}
diff --git a/rust/apps/wallets/src/xbull.rs b/rust/apps/wallets/src/xbull.rs
deleted file mode 100644
index 19a7da4..0000000
--- a/rust/apps/wallets/src/xbull.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-use crate::utils::generate_crypto_multi_accounts_sync_ur;
-use alloc::collections::BTreeMap;
-use alloc::string::String;
-use bitcoin::bip32::DerivationPath;
-use ur_registry::error::URResult;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-
-pub fn generate_sync_ur(
- master_fingerprint: &[u8; 4],
- public_keys: BTreeMap<DerivationPath, String>,
-) -> URResult<CryptoMultiAccounts> {
- generate_crypto_multi_accounts_sync_ur(master_fingerprint, public_keys, "STELLAR")
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_generate_sync_ur() {
- let master_fingerprint = [0u8; 4];
- let public_keys = BTreeMap::new();
- let result = generate_sync_ur(&master_fingerprint, public_keys);
- assert!(result.is_ok());
- assert_eq!(result.unwrap().get_master_fingerprint(), master_fingerprint);
- }
-}
diff --git a/rust/rust_c/src/common/keystone.rs b/rust/rust_c/src/common/keystone.rs
index 646af70..666bf16 100644
--- a/rust/rust_c/src/common/keystone.rs
+++ b/rust/rust_c/src/common/keystone.rs
@@ -10,7 +10,7 @@ use alloc::string::{String, ToString};
use alloc::vec::Vec;
use app_bitcoin::addresses::xyzpub::{convert_version, Version};
use app_utils;
-use app_wallets::{companion_app::DESCRIPTION, DEVICE_TYPE};
+use app_wallets::{DESCRIPTION, DEVICE_TYPE};
use core::str::FromStr;
use hex;
use ur_registry::bytes::Bytes;
diff --git a/rust/rust_c/src/test_cmd/btc_test_cmd.rs b/rust/rust_c/src/test_cmd/btc_test_cmd.rs
index 5199c1c..092f89c 100644
--- a/rust/rust_c/src/test_cmd/btc_test_cmd.rs
+++ b/rust/rust_c/src/test_cmd/btc_test_cmd.rs
@@ -18,8 +18,6 @@ use crate::common::ur::{
};
use crate::common::utils::convert_c_char;
-use crate::wallet::get_connect_blue_wallet_ur;
-
#[no_mangle]
pub unsafe extern "C" fn test_get_crypto_psbt() -> *mut URParseResult {
let psbt = CryptoPSBT::new(hex::decode("70736274ff01005202000000016d41e6873468f85aff76d7709a93b47180ea0784edaac748228d2c474396ca550000000000fdffffff01a00f0000000000001600146623828c1f87be7841a9b1cc360d38ae0a8b6ed0000000000001011f6817000000000000160014d0c4a3ef09e997b6e99e397e518fe3e41a118ca1220602e7ab2537b5d49e970309aae06e9e49f36ce1c9febbd44ec8e0d1cca0b4f9c3191873c5da0a54000080010000800000008000000000000000000000").unwrap());
@@ -97,41 +95,3 @@ pub unsafe extern "C" fn test_decode_crypto_psbt_3(decoder: PtrDecoder) -> *mut
let ur3 = "ur:crypto-psbt/3-3/lpaxaxcfaxiacyvwhdfhndhkadclpklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypklkahssqzwfvslofzoxwkrewngotktbmwjkwdcmnefsaaehrlolkskncnktlbaypknseoskve";
receive(convert_c_char(ur3.to_string()), decoder)
}
-
-#[no_mangle]
-pub unsafe extern "C" fn test_connect_blue_wallet() -> *mut UREncodeResult {
- let mfp: [u8; 4] = [115, 197, 218, 10];
-
- let mfp = Box::into_raw(Box::new(mfp)) as *mut u8;
- let length = 4;
- let legacy_x_pub = "xpub6CatWdiZiodmUeTDp8LT5or8nmbKNcuyvz7WyksVFkKB4RHwCD3XyuvPEbvqAQY3rAPshWcMLoP2fMFMKHPJ4ZeZXYVUhLv1VMrjPC7PW6V";
- let nested_x_pub = "xpub6BosfCnifzxcFwrSzQiqu2DBVTshkCXacvNsWGYJVVhhawA7d4R5WSWGFNbi8Aw6ZRc1brxMyWMzG3DSSSSoekkudhUd9yLb6qx39T9nMdj";
- let native_x_pub = "xpub6C6nQwHaWbSrzs5tZ1q7m5R9cPK9eYpNMFesiXsYrgc1P8bvLLAet9JfHjYXKjToD8cBRswJXXbbFpXgwsswVPAZzKMa1jUp2kVkGVUaJa7";
-
- let legacy_x_pub = convert_c_char(legacy_x_pub.to_string());
- let nested_x_pub = convert_c_char(nested_x_pub.to_string());
- let native_x_pub = convert_c_char(native_x_pub.to_string());
-
- let k1 = ExtendedPublicKey {
- path: convert_c_char("m/84'/0'/0'".to_string()),
- xpub: native_x_pub,
- };
- let k2 = ExtendedPublicKey {
- path: convert_c_char("m/49'/0'/0'".to_string()),
- xpub: nested_x_pub,
- };
- let k3 = ExtendedPublicKey {
- path: convert_c_char("m/44'/0'/0'".to_string()),
- xpub: legacy_x_pub,
- };
-
- let mut keys = [k1, k2, k3];
- let ptr = keys.as_mut_ptr();
- let extended_public_keys = CSliceFFI {
- data: ptr,
- size: keys.len(),
- }
- .c_ptr();
-
- get_connect_blue_wallet_ur(mfp, length, extended_public_keys)
-}
diff --git a/rust/rust_c/src/wallet/btc_only_wallet.rs b/rust/rust_c/src/wallet/btc_only_wallet.rs
index 3733b6c..38f5e23 100644
--- a/rust/rust_c/src/wallet/btc_only_wallet.rs
+++ b/rust/rust_c/src/wallet/btc_only_wallet.rs
@@ -1,6 +1,7 @@
-use alloc::string::ToString;
+use alloc::format;
+use alloc::string::{String, ToString};
+use alloc::vec;
use alloc::vec::Vec;
-use alloc::{format, vec};
use app_utils::normalize_path;
use crate::common::errors::RustCError;
@@ -22,7 +23,7 @@ use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
use ur_registry::traits::RegistryItem;
#[no_mangle]
-pub unsafe extern "C" fn get_connect_blue_wallet_ur(
+pub unsafe extern "C" fn generate_btc_crypto_account_ur(
master_fingerprint: *mut u8,
length: u32,
public_keys: PtrT<CSliceFFI<ExtendedPublicKey>>,
@@ -35,243 +36,42 @@ pub unsafe extern "C" fn get_connect_blue_wallet_ur(
}
let mfp = extract_array!(master_fingerprint, u8, length as usize);
let keys = recover_c_array(public_keys);
- let key1 = keys.first();
- let key2 = keys.get(1);
- let key3 = keys.get(2);
- if let (Some(k1), Some(k2), Some(k3)) = (key1, key2, key3) {
- let k1_x_pub = recover_c_char(k1.xpub);
- let k1_x_pub_path = recover_c_char(k1.path);
- let k2_x_pub = recover_c_char(k2.xpub);
- let k2_x_pub_path = recover_c_char(k2.path);
- let k3_x_pub = recover_c_char(k3.xpub);
- let k3_x_pub_path = recover_c_char(k3.path);
- let extended_public_keys = [k1_x_pub.trim(), k2_x_pub.trim(), k3_x_pub.trim()];
- let extend_public_key_paths = [
- k1_x_pub_path.trim(),
- k2_x_pub_path.trim(),
- k3_x_pub_path.trim(),
- ];
- let mfp = match <&[u8; 4]>::try_from(mfp) {
- Ok(mfp) => mfp,
- Err(e) => {
- return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr();
- }
- };
+ let extended_public_keys_str: Vec<String> = keys
+ .iter()
+ .map(|k| recover_c_char(k.xpub).trim().to_string())
+ .collect();
+ let extend_public_key_paths_str: Vec<String> = keys
+ .iter()
+ .map(|k| recover_c_char(k.path).trim().to_string())
+ .collect();
- let result = app_wallets::blue_wallet::generate_crypto_account(
- mfp,
- &extended_public_keys,
- &extend_public_key_paths,
- );
- match result.map(|v| v.try_into()) {
- Ok(v) => match v {
- Ok(data) => UREncodeResult::encode(
- data,
- CryptoAccount::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(e) => UREncodeResult::from(e).c_ptr(),
- },
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- } else {
- UREncodeResult::from(URError::UrEncodeError("getting key error".to_string())).c_ptr()
- }
-}
-
-#[no_mangle]
-pub unsafe extern "C" fn get_connect_sparrow_wallet_ur(
- master_fingerprint: *mut u8,
- length: u32,
- public_keys: PtrT<CSliceFFI<ExtendedPublicKey>>,
-) -> *mut UREncodeResult {
- if length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {length}"
- )))
- .c_ptr();
- }
- let mfp = extract_array!(master_fingerprint, u8, length as usize);
- let keys = recover_c_array(public_keys);
- let key1 = keys.first();
- let key2 = keys.get(1);
- let key3 = keys.get(2);
- let key4 = keys.get(3);
- if let (Some(k1), Some(k2), Some(k3), Some(k4)) = (key1, key2, key3, key4) {
- let k1_x_pub = recover_c_char(k1.xpub);
- let k1_x_pub_path = recover_c_char(k1.path);
- let k2_x_pub = recover_c_char(k2.xpub);
- let k2_x_pub_path = recover_c_char(k2.path);
- let k3_x_pub = recover_c_char(k3.xpub);
- let k3_x_pub_path = recover_c_char(k3.path);
- let k4_x_pub = recover_c_char(k4.xpub);
- let k4_x_pub_path = recover_c_char(k4.path);
- let extended_public_keys = [
- k1_x_pub.trim(),
- k2_x_pub.trim(),
- k3_x_pub.trim(),
- k4_x_pub.trim(),
- ];
- let extend_public_key_paths = [
- k1_x_pub_path.trim(),
- k2_x_pub_path.trim(),
- k3_x_pub_path.trim(),
- k4_x_pub_path.trim(),
- ];
- let mfp = match <&[u8; 4]>::try_from(mfp) {
- Ok(mfp) => mfp,
- Err(e) => {
- return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr();
- }
- };
-
- let result = app_wallets::blue_wallet::generate_crypto_account(
- mfp,
- &extended_public_keys,
- &extend_public_key_paths,
- );
- match result.map(|v| v.try_into()) {
- Ok(v) => match v {
- Ok(data) => UREncodeResult::encode(
- data,
- CryptoAccount::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(e) => UREncodeResult::from(e).c_ptr(),
- },
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- } else {
- UREncodeResult::from(URError::UrEncodeError("getting key error".to_string())).c_ptr()
- }
-}
-
-#[no_mangle]
-pub extern "C" fn get_connect_specter_wallet_ur(
- master_fingerprint: *mut u8,
- length: u32,
- public_keys: PtrT<CSliceFFI<ExtendedPublicKey>>,
-) -> *mut UREncodeResult {
- if length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {length}"
- )))
- .c_ptr();
- }
- unsafe {
- let mfp = slice::from_raw_parts(master_fingerprint, length as usize);
- let keys = recover_c_array(public_keys);
- let key1 = keys.first();
- let key2 = keys.get(1);
- if let (Some(k1), Some(k2)) = (key1, key2) {
- let k1_x_pub = recover_c_char(k1.xpub);
- let k1_x_pub_path = recover_c_char(k1.path);
- let k2_x_pub = recover_c_char(k2.xpub);
- let k2_x_pub_path = recover_c_char(k2.path);
-
- let extended_public_keys = [k1_x_pub.trim(), k2_x_pub.trim()];
- let extend_public_key_paths = [k1_x_pub_path.trim(), k2_x_pub_path.trim()];
- let mfp = match <&[u8; 4]>::try_from(mfp) {
- Ok(mfp) => mfp,
- Err(e) => {
- return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr();
- }
- };
-
- let result = app_wallets::blue_wallet::generate_crypto_account(
- mfp,
- &extended_public_keys,
- &extend_public_key_paths,
- );
- match result.map(|v| v.try_into()) {
- Ok(v) => match v {
- Ok(data) => UREncodeResult::encode(
- data,
- CryptoAccount::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(e) => UREncodeResult::from(e).c_ptr(),
- },
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- } else {
- UREncodeResult::from(URError::UrEncodeError("getting key error".to_string())).c_ptr()
- }
- }
-}
-
-#[repr(C)]
-#[derive(Clone)]
-pub struct AccountConfig {
- pub hd_path: PtrString,
- pub x_pub: PtrString,
- pub address_length: int32_t,
- pub is_multi_sign: bool,
-}
-
-impl AccountConfig {
- pub unsafe fn into(&self) -> app_wallets::companion_app::AccountConfig {
- app_wallets::companion_app::AccountConfig {
- hd_path: recover_c_char(self.hd_path),
- x_pub: recover_c_char(self.x_pub),
- address_length: self.address_length,
- is_multi_sign: self.is_multi_sign,
- }
- }
-}
-
-#[repr(C)]
-#[derive(Clone)]
-pub struct CoinConfig {
- pub is_active: bool,
- pub coin_code: PtrString,
- pub accounts: *mut AccountConfig,
- pub accounts_length: uint32_t,
-}
-
-impl CoinConfig {
- pub unsafe fn into(&self) -> app_wallets::companion_app::CoinConfig {
- app_wallets::companion_app::CoinConfig {
- is_active: self.is_active,
- coin_code: recover_c_char(self.coin_code),
- accounts: unsafe {
- core::slice::from_raw_parts(self.accounts, self.accounts_length as usize)
- .to_vec()
- .iter()
- .map(|x| x.into())
- .collect()
- },
- }
- }
-}
-
-#[no_mangle]
-pub unsafe extern "C" fn get_connect_companion_app_ur(
- master_fingerprint: PtrBytes,
- master_fingerprint_length: uint32_t,
- cold_version: i32,
- coin_config: PtrT<CoinConfig>,
- coin_config_length: uint32_t,
-) -> PtrT<UREncodeResult> {
- let mfp = extract_array!(master_fingerprint, u8, master_fingerprint_length);
- let coin_config = extract_array!(coin_config, CoinConfig, coin_config_length);
- let coin_config: Vec<app_wallets::companion_app::CoinConfig> =
- coin_config.to_vec().iter().map(|x| x.into()).collect();
let mfp = match <&[u8; 4]>::try_from(mfp) {
Ok(mfp) => mfp,
- Err(e) => return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr(),
+ Err(e) => {
+ return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr();
+ }
};
- let result =
- app_wallets::companion_app::generate_companion_app_sync_ur(mfp, cold_version, coin_config);
+
+ let extended_public_keys: Vec<&str> = extended_public_keys_str
+ .iter()
+ .map(|s| s.as_str())
+ .collect();
+ let extend_public_key_paths: Vec<&str> = extend_public_key_paths_str
+ .iter()
+ .map(|s| s.as_str())
+ .collect();
+
+ let result = app_wallets::blue_wallet::generate_crypto_account(
+ mfp,
+ &extended_public_keys,
+ &extend_public_key_paths,
+ );
match result.map(|v| v.try_into()) {
Ok(v) => match v {
Ok(data) => UREncodeResult::encode(
data,
- Bytes::get_registry_type().get_type(),
+ CryptoAccount::get_registry_type().get_type(),
FRAGMENT_MAX_LENGTH_DEFAULT,
)
.c_ptr(),
@@ -281,57 +81,6 @@ pub unsafe extern "C" fn get_connect_companion_app_ur(
}
}
-#[no_mangle]
-pub unsafe extern "C" fn get_okx_wallet_ur_btc_only(
- master_fingerprint: PtrBytes,
- master_fingerprint_length: u32,
- serial_number: PtrString,
- public_keys: Ptr<CSliceFFI<ExtendedPublicKey>>,
- device_type: PtrString,
- device_version: PtrString,
-) -> Ptr<UREncodeResult> {
- if master_fingerprint_length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {master_fingerprint_length}"
- )))
- .c_ptr();
- }
- let mfp = extract_array!(master_fingerprint, u8, master_fingerprint_length);
- let mfp = match <[u8; 4]>::try_from(mfp) {
- Ok(mfp) => mfp,
- Err(e) => return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr(),
- };
- unsafe {
- let keys = recover_c_array(public_keys);
- let serial_number = recover_c_char(serial_number);
- let device_version = recover_c_char(device_version);
- let device_type = recover_c_char(device_type);
- match normalize_xpub(keys) {
- Ok(_keys) => {
- match app_wallets::okx::generate_crypto_multi_accounts(
- mfp,
- &serial_number,
- _keys,
- &device_type,
- &device_version,
- ) {
- Ok(data) => match data.try_into() {
- Ok(_v) => UREncodeResult::encode(
- _v,
- CryptoMultiAccounts::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(_e) => UREncodeResult::from(_e).c_ptr(),
- },
- Err(_e) => UREncodeResult::from(_e).c_ptr(),
- }
- }
- Err(_e) => UREncodeResult::from(_e).c_ptr(),
- }
- }
-}
-
unsafe fn normalize_xpub(
keys: &[ExtendedPublicKey],
) -> Result<Vec<app_wallets::ExtendedPublicKey>, RustCError> {
diff --git a/rust/rust_c/src/wallet/mod.rs b/rust/rust_c/src/wallet/mod.rs
index cc0d7af..545864c 100644
--- a/rust/rust_c/src/wallet/mod.rs
+++ b/rust/rust_c/src/wallet/mod.rs
@@ -6,13 +6,16 @@ pub mod cypherpunk_wallet;
pub mod multi_coins_wallet;
mod structs;
+use alloc::collections::BTreeMap;
use alloc::format;
use alloc::string::String;
use alloc::string::ToString;
use alloc::vec::Vec;
+use bitcoin::bip32::DerivationPath;
+use core::slice;
+use core::str::FromStr;
-use app_wallets::metamask::ETHAccountTypeApp;
-use app_wallets::DEVICE_TYPE;
+use app_wallets::{generate_crypto_multi_accounts_sync_ur, DEVICE_TYPE};
use cty::uint32_t;
use keystore::algorithms::secp256k1::derive_extend_public_key;
use keystore::errors::KeystoreError;
@@ -30,7 +33,7 @@ use crate::common::errors::RustCError;
use crate::common::ffi::CSliceFFI;
use crate::common::structs::{ExtendedPublicKey, Response};
use crate::common::types::{Ptr, PtrBytes, PtrString, PtrT, PtrUR};
-use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT, FRAGMENT_UNLIMITED_LENGTH};
+use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT};
use crate::common::utils::{recover_c_array, recover_c_char};
use crate::{extract_array, extract_ptr_with_type};
use structs::QRHardwareCallData;
@@ -218,3 +221,60 @@ pub unsafe extern "C" fn generate_key_derivation_ur(
Err(_e) => UREncodeResult::from(_e).c_ptr(),
}
}
+
+#[no_mangle]
+pub unsafe extern "C" fn generate_common_crypto_multi_accounts_ur(
+ master_fingerprint: PtrBytes,
+ master_fingerprint_length: u32,
+ public_keys: Ptr<CSliceFFI<ExtendedPublicKey>>,
+ account_prefix: PtrString,
+) -> Ptr<UREncodeResult> {
+ if master_fingerprint_length != 4 {
+ return UREncodeResult::from(URError::UrEncodeError(format!(
+ "master fingerprint length must be 4, current is {master_fingerprint_length}"
+ )))
+ .c_ptr();
+ }
+ let account_prefix = recover_c_char(account_prefix);
+ unsafe {
+ let mfp = slice::from_raw_parts(master_fingerprint, master_fingerprint_length as usize);
+ let public_keys = recover_c_array(public_keys);
+ let master_fingerprint = bitcoin::bip32::Fingerprint::from_str(hex::encode(mfp).as_str())
+ .map_err(|_e| RustCError::InvalidMasterFingerprint);
+ match master_fingerprint {
+ Ok(fp) => {
+ let mut keys = BTreeMap::new();
+ for x in public_keys {
+ let pubkey = recover_c_char(x.xpub);
+ let path = recover_c_char(x.path);
+ match DerivationPath::from_str(path.to_lowercase().as_str()) {
+ Ok(path) => {
+ keys.insert(path, pubkey);
+ }
+ Err(_e) => {
+ return UREncodeResult::from(RustCError::InvalidHDPath).c_ptr();
+ }
+ }
+ }
+ let result = generate_crypto_multi_accounts_sync_ur(
+ fp.as_ref(),
+ keys,
+ account_prefix.as_str(),
+ );
+ match result.map(|v| v.try_into()) {
+ Ok(v) => match v {
+ Ok(data) => UREncodeResult::encode(
+ data,
+ CryptoMultiAccounts::get_registry_type().get_type(),
+ FRAGMENT_MAX_LENGTH_DEFAULT,
+ )
+ .c_ptr(),
+ Err(e) => UREncodeResult::from(e).c_ptr(),
+ },
+ Err(e) => UREncodeResult::from(e).c_ptr(),
+ }
+ }
+ Err(e) => UREncodeResult::from(e).c_ptr(),
+ }
+ }
+}
diff --git a/rust/rust_c/src/wallet/multi_coins_wallet/aptos.rs b/rust/rust_c/src/wallet/multi_coins_wallet/aptos.rs
deleted file mode 100644
index 3429077..0000000
--- a/rust/rust_c/src/wallet/multi_coins_wallet/aptos.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-use alloc::collections::BTreeMap;
-use alloc::format;
-use bitcoin::bip32::DerivationPath;
-use core::slice;
-use core::str::FromStr;
-use hex;
-use ur_registry::error::URError;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-use ur_registry::traits::RegistryItem;
-
-use crate::common::errors::RustCError;
-use crate::common::ffi::CSliceFFI;
-use crate::common::structs::ExtendedPublicKey;
-use crate::common::types::PtrT;
-use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT};
-use crate::common::utils::{recover_c_array, recover_c_char};
-use app_wallets::aptos::generate_sync_ur;
-
-#[no_mangle]
-pub extern "C" fn get_connect_aptos_wallet_ur(
- master_fingerprint: *mut u8,
- length: u32,
- public_keys: PtrT<CSliceFFI<ExtendedPublicKey>>,
-) -> *mut UREncodeResult {
- if length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {length}"
- )))
- .c_ptr();
- }
- unsafe {
- let mfp = slice::from_raw_parts(master_fingerprint, length as usize);
- let public_keys = recover_c_array(public_keys);
- let master_fingerprint = bitcoin::bip32::Fingerprint::from_str(hex::encode(mfp).as_str())
- .map_err(|_e| RustCError::InvalidMasterFingerprint);
- match master_fingerprint {
- Ok(fp) => {
- let mut keys = BTreeMap::new();
- for x in public_keys {
- let pubkey = recover_c_char(x.xpub);
- let path = recover_c_char(x.path);
- match DerivationPath::from_str(path.to_lowercase().as_str()) {
- Ok(path) => {
- keys.insert(path, pubkey);
- }
- Err(_e) => {
- return UREncodeResult::from(RustCError::InvalidHDPath).c_ptr();
- }
- }
- }
- let result = generate_sync_ur(fp.as_ref(), keys);
- match result.map(|v| v.try_into()) {
- Ok(v) => match v {
- Ok(data) => UREncodeResult::encode(
- data,
- CryptoMultiAccounts::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(e) => UREncodeResult::from(e).c_ptr(),
- },
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
-}
diff --git a/rust/rust_c/src/wallet/multi_coins_wallet/keystone.rs b/rust/rust_c/src/wallet/multi_coins_wallet/keystone.rs
deleted file mode 100644
index 61232fe..0000000
--- a/rust/rust_c/src/wallet/multi_coins_wallet/keystone.rs
+++ /dev/null
@@ -1,58 +0,0 @@
-use crate::common::ffi::CSliceFFI;
-use crate::common::structs::ExtendedPublicKey;
-use crate::common::types::{Ptr, PtrBytes, PtrString};
-use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT};
-use crate::common::utils::{recover_c_array, recover_c_char};
-use crate::extract_array;
-use alloc::{format, string::ToString};
-use ur_registry::error::URError;
-
-use super::utils::normalize_xpub;
-
-#[no_mangle]
-pub unsafe extern "C" fn get_keystone_wallet_ur(
- master_fingerprint: PtrBytes,
- master_fingerprint_length: u32,
- serial_number: PtrString,
- public_keys: Ptr<CSliceFFI<ExtendedPublicKey>>,
- device_type: PtrString,
- device_version: PtrString,
-) -> Ptr<UREncodeResult> {
- if master_fingerprint_length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {master_fingerprint_length}"
- )))
- .c_ptr();
- }
- let mfp = extract_array!(master_fingerprint, u8, master_fingerprint_length);
- let mfp = match <[u8; 4]>::try_from(mfp) {
- Ok(mfp) => mfp,
- Err(e) => return UREncodeResult::from(URError::UrEncodeError(e.to_string())).c_ptr(),
- };
-
- let keys = recover_c_array(public_keys);
- let serial_number = recover_c_char(serial_number);
- let device_version = recover_c_char(device_version);
- let device_type = recover_c_char(device_type);
- match normalize_xpub(keys) {
- Ok(_keys) => {
- match app_wallets::keystone::generate_crypto_multi_accounts(
- mfp,
- &serial_number,
- _keys,
- &device_type,
- &device_version,
- ) {
- Ok(data) => match data.try_into() {
- Ok(_v) => {
- UREncodeResult::encode(_v, "BYTES".to_string(), FRAGMENT_MAX_LENGTH_DEFAULT)
- .c_ptr()
- }
- Err(_e) => UREncodeResult::from(_e).c_ptr(),
- },
- Err(_e) => UREncodeResult::from(_e).c_ptr(),
- }
- }
- Err(_e) => UREncodeResult::from(_e).c_ptr(),
- }
-}
diff --git a/rust/rust_c/src/wallet/multi_coins_wallet/mod.rs b/rust/rust_c/src/wallet/multi_coins_wallet/mod.rs
index ccbeb96..6b6ef4c 100644
--- a/rust/rust_c/src/wallet/multi_coins_wallet/mod.rs
+++ b/rust/rust_c/src/wallet/multi_coins_wallet/mod.rs
@@ -1,18 +1,13 @@
-pub mod aptos;
pub mod arconnect;
pub mod backpack;
pub mod bitget;
mod imtoken;
pub mod keplr;
-pub mod keystone;
pub mod keystone_connect;
pub mod okx;
-pub mod solana;
pub mod structs;
-pub mod sui;
pub mod tonkeeper;
mod utils;
-pub mod xbull;
pub mod xrp_toolkit;
pub mod core_wallet;
diff --git a/rust/rust_c/src/wallet/multi_coins_wallet/solana.rs b/rust/rust_c/src/wallet/multi_coins_wallet/solana.rs
deleted file mode 100644
index 14e2126..0000000
--- a/rust/rust_c/src/wallet/multi_coins_wallet/solana.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-use alloc::collections::BTreeMap;
-use alloc::format;
-use bitcoin::bip32::DerivationPath;
-use core::slice;
-use core::str::FromStr;
-use hex;
-use ur_registry::error::URError;
-use ur_registry::traits::RegistryItem;
-
-use crate::common::errors::RustCError;
-use crate::common::ffi::CSliceFFI;
-use crate::common::structs::ExtendedPublicKey;
-use crate::common::types::PtrT;
-use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT};
-use crate::common::utils::{recover_c_array, recover_c_char};
-use app_wallets::solana::generate_sync_ur;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-
-#[no_mangle]
-pub extern "C" fn get_connect_solana_wallet_ur(
- master_fingerprint: *mut u8,
- length: u32,
- public_keys: PtrT<CSliceFFI<ExtendedPublicKey>>,
-) -> *mut UREncodeResult {
- if length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {length}"
- )))
- .c_ptr();
- }
- unsafe {
- let mfp = slice::from_raw_parts(master_fingerprint, length as usize);
- let public_keys = recover_c_array(public_keys);
- let master_fingerprint = bitcoin::bip32::Fingerprint::from_str(hex::encode(mfp).as_str())
- .map_err(|_e| RustCError::InvalidMasterFingerprint);
- match master_fingerprint {
- Ok(fp) => {
- let mut keys = BTreeMap::new();
- for x in public_keys {
- let pubkey = recover_c_char(x.xpub);
- let path = recover_c_char(x.path);
- match DerivationPath::from_str(path.as_str()) {
- Ok(path) => {
- keys.insert(path, pubkey);
- }
- Err(_e) => {
- return UREncodeResult::from(RustCError::InvalidHDPath).c_ptr();
- }
- }
- }
- let result = generate_sync_ur(fp.as_ref(), keys);
- match result.map(|v| v.try_into()) {
- Ok(v) => match v {
- Ok(data) => UREncodeResult::encode(
- data,
- CryptoMultiAccounts::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(e) => UREncodeResult::from(e).c_ptr(),
- },
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
-}
diff --git a/rust/rust_c/src/wallet/multi_coins_wallet/sui.rs b/rust/rust_c/src/wallet/multi_coins_wallet/sui.rs
deleted file mode 100644
index 90730ed..0000000
--- a/rust/rust_c/src/wallet/multi_coins_wallet/sui.rs
+++ /dev/null
@@ -1,67 +0,0 @@
-use crate::common::errors::RustCError;
-use crate::common::ffi::CSliceFFI;
-use crate::common::structs::ExtendedPublicKey;
-use crate::common::types::PtrT;
-use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT};
-use crate::common::utils::{recover_c_array, recover_c_char};
-use alloc::collections::BTreeMap;
-use alloc::format;
-use app_wallets::sui::generate_sync_ur;
-use bitcoin::bip32::DerivationPath;
-use core::slice;
-use core::str::FromStr;
-use hex;
-use ur_registry::error::URError;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-use ur_registry::traits::RegistryItem;
-
-#[no_mangle]
-pub extern "C" fn get_connect_sui_wallet_ur(
- master_fingerprint: *mut u8,
- length: u32,
- public_keys: PtrT<CSliceFFI<ExtendedPublicKey>>,
-) -> *mut UREncodeResult {
- if length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {length}"
- )))
- .c_ptr();
- }
- unsafe {
- let mfp = slice::from_raw_parts(master_fingerprint, length as usize);
- let public_keys = recover_c_array(public_keys);
- let master_fingerprint = bitcoin::bip32::Fingerprint::from_str(hex::encode(mfp).as_str())
- .map_err(|_e| RustCError::InvalidMasterFingerprint);
- match master_fingerprint {
- Ok(fp) => {
- let mut keys = BTreeMap::new();
- for x in public_keys {
- let pubkey = recover_c_char(x.xpub);
- let path = recover_c_char(x.path);
- match DerivationPath::from_str(path.to_lowercase().as_str()) {
- Ok(path) => {
- keys.insert(path, pubkey);
- }
- Err(_e) => {
- return UREncodeResult::from(RustCError::InvalidHDPath).c_ptr();
- }
- }
- }
- let result = generate_sync_ur(fp.as_ref(), keys);
- match result.map(|v| v.try_into()) {
- Ok(v) => match v {
- Ok(data) => UREncodeResult::encode(
- data,
- CryptoMultiAccounts::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(e) => UREncodeResult::from(e).c_ptr(),
- },
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
-}
diff --git a/rust/rust_c/src/wallet/multi_coins_wallet/xbull.rs b/rust/rust_c/src/wallet/multi_coins_wallet/xbull.rs
deleted file mode 100644
index 69eee30..0000000
--- a/rust/rust_c/src/wallet/multi_coins_wallet/xbull.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-use alloc::collections::BTreeMap;
-use alloc::format;
-use bitcoin::bip32::DerivationPath;
-use core::slice;
-use core::str::FromStr;
-use hex;
-use ur_registry::error::URError;
-use ur_registry::traits::RegistryItem;
-
-use crate::common::errors::RustCError;
-use crate::common::ffi::CSliceFFI;
-use crate::common::structs::ExtendedPublicKey;
-use crate::common::types::PtrT;
-use crate::common::ur::{UREncodeResult, FRAGMENT_MAX_LENGTH_DEFAULT};
-use crate::common::utils::{recover_c_array, recover_c_char};
-use app_wallets::xbull::generate_sync_ur;
-use ur_registry::extend::crypto_multi_accounts::CryptoMultiAccounts;
-
-#[no_mangle]
-pub extern "C" fn get_connect_xbull_wallet_ur(
- master_fingerprint: *mut u8,
- length: u32,
- public_keys: PtrT<CSliceFFI<ExtendedPublicKey>>,
-) -> *mut UREncodeResult {
- if length != 4 {
- return UREncodeResult::from(URError::UrEncodeError(format!(
- "master fingerprint length must be 4, current is {length}"
- )))
- .c_ptr();
- }
- unsafe {
- let mfp = slice::from_raw_parts(master_fingerprint, length as usize);
- let public_keys = recover_c_array(public_keys);
- let master_fingerprint = bitcoin::bip32::Fingerprint::from_str(hex::encode(mfp).as_str())
- .map_err(|_e| RustCError::InvalidMasterFingerprint);
- match master_fingerprint {
- Ok(fp) => {
- let mut keys = BTreeMap::new();
- for x in public_keys {
- let pubkey = recover_c_char(x.xpub);
- let path = recover_c_char(x.path);
- match DerivationPath::from_str(path.as_str()) {
- Ok(path) => {
- keys.insert(path, pubkey);
- }
- Err(_e) => {
- return UREncodeResult::from(RustCError::InvalidHDPath).c_ptr();
- }
- }
- }
- let result = generate_sync_ur(fp.as_ref(), keys);
- match result.map(|v| v.try_into()) {
- Ok(v) => match v {
- Ok(data) => UREncodeResult::encode(
- data,
- CryptoMultiAccounts::get_registry_type().get_type(),
- FRAGMENT_MAX_LENGTH_DEFAULT,
- )
- .c_ptr(),
- Err(e) => UREncodeResult::from(e).c_ptr(),
- },
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
- Err(e) => UREncodeResult::from(e).c_ptr(),
- }
- }
-}
diff --git a/src/ui/gui_chain/gui_chain.c b/src/ui/gui_chain/gui_chain.c
index 887cd70..1bdb29d 100644
--- a/src/ui/gui_chain/gui_chain.c
+++ b/src/ui/gui_chain/gui_chain.c
@@ -1,6 +1,7 @@
#include "define.h"
#include "gui_chain.h"
#include "keystore.h"
+#include "user_memory.h"
typedef TransactionCheckResult *(*CheckUrResultHandler)(void);
diff --git a/src/ui/gui_components/gui_status_bar.c b/src/ui/gui_components/gui_status_bar.c
index 0e0c308..9f045c8 100644
--- a/src/ui/gui_components/gui_status_bar.c
+++ b/src/ui/gui_components/gui_status_bar.c
@@ -138,7 +138,6 @@ const static WalletInfo_t g_walletBtn[] = {
{WALLET_LIST_OKX, "OKX Wallet", &walletOkx},
{WALLET_LIST_ETERNL, "Eternl Wallet", &walletEternl},
{WALLET_LIST_MEDUSA, "Medusa", &walletMedusa},
- // {WALLET_LIST_YOROI, "Yoroi Wallet", &walletYoroi},
{WALLET_LIST_TYPHON, "Typhon Wallet", &walletTyphon},
{WALLET_LIST_BLUE, "BlueWallet", &walletBluewallet},
{WALLET_LIST_ZEUS, "ZEUS Wallet", &walletZeus},
diff --git a/src/ui/gui_wallet/btc_only/gui_wallet.c b/src/ui/gui_wallet/btc_only/gui_wallet.c
index d24e6df..ed50ea4 100644
--- a/src/ui/gui_wallet/btc_only/gui_wallet.c
+++ b/src/ui/gui_wallet/btc_only/gui_wallet.c
@@ -9,8 +9,6 @@
#include "presetting.h"
#include "version.h"
-static UREncodeResult *g_urEncode = NULL;
-
UREncodeResult *GuiGetBlueWalletBtcData(void)
{
uint8_t mfp[4] = {0};
@@ -19,9 +17,10 @@ UREncodeResult *GuiGetBlueWalletBtcData(void)
return export_multi_sig_wallet_by_ur(mfp, sizeof(mfp), GetDefaultMultisigWallet()->walletConfig);
}
PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[3];
+ int length = 3;
+ ExtendedPublicKey keys[length];
public_keys->data = keys;
- public_keys->size = 3;
+ public_keys->size = length;
if (GetIsTestNet()) {
keys[0].path = "m/84'/1'/0'";
@@ -38,9 +37,11 @@ UREncodeResult *GuiGetBlueWalletBtcData(void)
keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
}
- UREncodeResult *urencode = get_connect_blue_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+
+ UREncodeResult *urEncode = generate_btc_crypto_account_ur(mfp, sizeof(mfp), public_keys);
+ CHECK_CHAIN_PRINT(urEncode);
+ SRAM_FREE(public_keys);
+ return urEncode;
}
UREncodeResult *GuiGetSparrowWalletBtcData(void)
@@ -51,9 +52,10 @@ UREncodeResult *GuiGetSparrowWalletBtcData(void)
return export_multi_sig_wallet_by_ur(mfp, sizeof(mfp), GetDefaultMultisigWallet()->walletConfig);
}
PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[4];
+ int length = 4;
+ ExtendedPublicKey keys[length];
public_keys->data = keys;
- public_keys->size = 4;
+ public_keys->size = length;
if (GetIsTestNet()) {
keys[0].path = "m/84'/1'/0'";
@@ -74,9 +76,10 @@ UREncodeResult *GuiGetSparrowWalletBtcData(void)
keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
}
- UREncodeResult *urencode = get_connect_sparrow_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+ UREncodeResult *urEncode = generate_btc_crypto_account_ur(mfp, sizeof(mfp), public_keys);
+ CHECK_CHAIN_PRINT(urEncode);
+ SRAM_FREE(public_keys);
+ return urEncode;
}
UREncodeResult *GuiGetSpecterWalletBtcData(void)
@@ -87,9 +90,10 @@ UREncodeResult *GuiGetSpecterWalletBtcData(void)
return export_multi_sig_wallet_by_ur(mfp, sizeof(mfp), GetDefaultMultisigWallet()->walletConfig);
}
PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[2];
+ int length = 2;
+ ExtendedPublicKey keys[length];
public_keys->data = keys;
- public_keys->size = 2;
+ public_keys->size = length;
if (GetIsTestNet()) {
keys[0].path = "m/84'/1'/0'";
@@ -102,44 +106,8 @@ UREncodeResult *GuiGetSpecterWalletBtcData(void)
keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
}
- UREncodeResult *urencode = get_connect_specter_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
-}
-
-UREncodeResult *GuiGetOkxWalletData(void)
-{
- uint8_t mfp[4] = {0};
- GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- // btc 4
- // + eth 10
- // + trx 1
- // + ltc 1
- // + dash 1
- // + bch 1
- ExtendedPublicKey keys[4];
- public_keys->data = keys;
- public_keys->size = 4;
-
- keys[0].path = "m/44'/0'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
-
- keys[1].path = "m/49'/0'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
-
- keys[2].path = "m/84'/0'/0'";
- keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
-
- keys[3].path = "m/86'/0'/0'";
- keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
- char serialNumber[256];
- GetSerialNumber(serialNumber);
- char firmwareVersion[BUFFER_SIZE_32];
- GetSoftWareVersionNumber(firmwareVersion);
- g_urEncode = get_okx_wallet_ur_btc_only(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
- CHECK_CHAIN_PRINT(g_urEncode);
+ UREncodeResult *urEncode = generate_btc_crypto_account_ur(mfp, sizeof(mfp), public_keys);
+ CHECK_CHAIN_PRINT(urEncode);
SRAM_FREE(public_keys);
- return g_urEncode;
-}
-
+ return urEncode;
+}
\ No newline at end of file
diff --git a/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.c b/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.c
index a86b532..d0a9ec4 100644
--- a/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.c
+++ b/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.c
@@ -11,7 +11,6 @@
void GenerateCakeWalletEncryptPincode(void);
-static UREncodeResult *g_urEncode = NULL;
static uint8_t *g_pincode = NULL;
UREncodeResult *GuiGetBlueWalletBtcData(void)
@@ -19,18 +18,20 @@ UREncodeResult *GuiGetBlueWalletBtcData(void)
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[3];
+ int length = 3;
+ ExtendedPublicKey keys[length];
public_keys->data = keys;
- public_keys->size = 3;
+ public_keys->size = length;
keys[0].path = "m/84'/0'/0'";
keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
keys[1].path = "m/49'/0'/0'";
keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
keys[2].path = "m/44'/0'/0'";
keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
- UREncodeResult *urencode = get_connect_blue_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+ UREncodeResult *urEncode = generate_btc_crypto_account_ur(mfp, sizeof(mfp), public_keys);
+ CHECK_CHAIN_PRINT(urEncode);
+ SRAM_FREE(public_keys);
+ return urEncode;
}
UREncodeResult *GuiGetSparrowWalletBtcData(void)
@@ -38,9 +39,10 @@ UREncodeResult *GuiGetSparrowWalletBtcData(void)
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[4];
+ int length = 4;
+ ExtendedPublicKey keys[length];
public_keys->data = keys;
- public_keys->size = 4;
+ public_keys->size = length;
keys[0].path = "m/84'/0'/0'";
keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
keys[1].path = "m/49'/0'/0'";
@@ -49,39 +51,24 @@ UREncodeResult *GuiGetSparrowWalletBtcData(void)
keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
keys[3].path = "m/86'/0'/0'";
keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
- UREncodeResult *urencode = get_connect_sparrow_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
-}
-
-UREncodeResult *GuiGetSpecterWalletBtcData(void)
-{
- uint8_t mfp[4] = {0};
- GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[2];
- public_keys->data = keys;
- public_keys->size = 2;
- keys[0].path = "m/84'/0'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
- keys[1].path = "m/49'/0'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
- UREncodeResult *urencode = get_connect_specter_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+ UREncodeResult *urEncode = generate_btc_crypto_account_ur(mfp, sizeof(mfp), public_keys);
+ CHECK_CHAIN_PRINT(urEncode);
+ SRAM_FREE(public_keys);
+ return urEncode;
}
UREncodeResult *GuiGetCakeData(void)
{
char *xPub = GetCurrentAccountPublicKey(XPUB_TYPE_MONERO_0);
char *pvk = GetCurrentAccountPublicKey(XPUB_TYPE_MONERO_PVK_0);
+ UREncodeResult *urEncode;
if (g_pincode == NULL) {
- g_urEncode = get_connect_cake_wallet_ur(xPub, pvk);
+ urEncode = get_connect_cake_wallet_ur(xPub, pvk);
} else {
- g_urEncode = get_connect_cake_wallet_ur_encrypted(xPub, pvk, g_pincode);
+ urEncode = get_connect_cake_wallet_ur_encrypted(xPub, pvk, g_pincode);
}
- CHECK_CHAIN_PRINT(g_urEncode);
- return g_urEncode;
+ CHECK_CHAIN_PRINT(urEncode);
+ return urEncode;
}
void ClosePrivateQrMode(void)
diff --git a/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.h b/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.h
index 75d1269..a4209bb 100644
--- a/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.h
+++ b/src/ui/gui_wallet/multi/cypherpunk/gui_wallet.h
@@ -8,8 +8,6 @@
UREncodeResult *GuiGetBlueWalletBtcData(void);
UREncodeResult *GuiGetSparrowWalletBtcData(void);
-UREncodeResult *GuiGetSpecterWalletBtcData(void);
-UREncodeResult *GuiGetKeplrDataByIndex(uint32_t index);
UREncodeResult *GuiGetCompanionAppData(void);
UREncodeResult *GuiGetBitgetWalletData(void);
UREncodeResult *GuiGetCakeData(void);
diff --git a/src/ui/gui_wallet/multi/web3/gui_wallet.c b/src/ui/gui_wallet/multi/web3/gui_wallet.c
index 31624f1..ed1da35 100644
--- a/src/ui/gui_wallet/multi/web3/gui_wallet.c
+++ b/src/ui/gui_wallet/multi/web3/gui_wallet.c
@@ -9,63 +9,145 @@
#include "presetting.h"
#include "version.h"
-static UREncodeResult *g_urEncode = NULL;
+typedef struct {
+ char *path;
+ ChainType chainType;
+} ChainPath_t;
+
+typedef struct {
+ int count;
+ int allocatedStart;
+ int allocatedEnd;
+} PathAddResult_t;
+
+static int AddBTCPathsStandard(ExtendedPublicKey *keys, int startIndex, bool includeTaproot)
+{
+ int index = startIndex;
+ keys[index].path = "m/84'/0'/0'";
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
+ index++;
-UREncodeResult *GuiGetBlueWalletBtcData(void)
+ keys[index].path = "m/49'/0'/0'";
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
+ index++;
+
+ keys[index].path = "m/44'/0'/0'";
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
+ index++;
+
+ if (includeTaproot) {
+ keys[index].path = "m/86'/0'/0'";
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
+ index++;
+ }
+
+ return index - startIndex;
+}
+
+
+static PathAddResult_t AddETHLedgerLivePaths(ExtendedPublicKey *keys, int startIndex)
+{
+ int index = startIndex;
+ for (int i = XPUB_TYPE_ETH_LEDGER_LIVE_0; i <= XPUB_TYPE_ETH_LEDGER_LIVE_9; i++) {
+ keys[index].path = SRAM_MALLOC(BUFFER_SIZE_64);
+ snprintf_s(keys[index].path, BUFFER_SIZE_64, "m/44'/60'/%d'", i - XPUB_TYPE_ETH_LEDGER_LIVE_0);
+ keys[index].xpub = GetCurrentAccountPublicKey(i);
+ index++;
+ }
+ return (PathAddResult_t) {
+ .count = index - startIndex,
+ .allocatedStart = startIndex,
+ .allocatedEnd = index
+ };
+}
+
+static void FreeAllocatedPaths(ExtendedPublicKey *keys, int startIndex, int endIndex)
+{
+ for (int i = startIndex; i < endIndex; i++) {
+ if (keys[i].path != NULL) {
+ SRAM_FREE(keys[i].path);
+ }
+ }
+}
+
+static PtrT_CSliceFFI_ExtendedPublicKey BuildSOLAccountKeys(SOLAccountType accountType, ExtendedPublicKey *keys)
+{
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
+ public_keys->data = keys;
+
+ if (accountType == SOLBip44) {
+ public_keys->size = 10;
+ for (int i = XPUB_TYPE_SOL_BIP44_0; i <= XPUB_TYPE_SOL_BIP44_9; i++) {
+ char *path = SRAM_MALLOC(BUFFER_SIZE_32);
+ snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'/%d'", i - XPUB_TYPE_SOL_BIP44_0);
+ keys[i - XPUB_TYPE_SOL_BIP44_0].path = path;
+ keys[i - XPUB_TYPE_SOL_BIP44_0].xpub = GetCurrentAccountPublicKey(i);
+ }
+ } else if (accountType == SOLBip44ROOT) {
+ public_keys->size = 1;
+ char *path = SRAM_MALLOC(BUFFER_SIZE_32);
+ snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'");
+ keys[0].path = path;
+ keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_SOL_BIP44_ROOT);
+ } else if (accountType == SOLBip44Change) {
+ public_keys->size = 10;
+ for (int i = XPUB_TYPE_SOL_BIP44_CHANGE_0; i <= XPUB_TYPE_SOL_BIP44_CHANGE_9; i++) {
+ char *path = SRAM_MALLOC(BUFFER_SIZE_32);
+ snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'/%d'/0'", i - XPUB_TYPE_SOL_BIP44_CHANGE_0);
+ keys[i - XPUB_TYPE_SOL_BIP44_CHANGE_0].path = path;
+ keys[i - XPUB_TYPE_SOL_BIP44_CHANGE_0].xpub = GetCurrentAccountPublicKey(i);
+ }
+ }
+ return public_keys;
+}
+
+PtrT_CSliceFFI_ExtendedPublicKey BuildChainPaths(ChainPath_t *chainPaths, ExtendedPublicKey *keys, uint8_t size)
{
- uint8_t mfp[4] = {0};
- GetMasterFingerPrint(mfp);
PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[3];
public_keys->data = keys;
- public_keys->size = 3;
- keys[0].path = "m/84'/0'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
- keys[1].path = "m/49'/0'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
- keys[2].path = "m/44'/0'/0'";
- keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
- UREncodeResult *urencode = get_connect_blue_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+ public_keys->size = size;
+ for (uint8_t i = 0; i < size; i++) {
+ keys[i].path = chainPaths[i].path;
+ keys[i].xpub = GetCurrentAccountPublicKey(chainPaths[i].chainType);
+ }
+ return public_keys;
}
-UREncodeResult *GuiGetSparrowWalletBtcData(void)
+UREncodeResult *GuiGetBlueWalletBtcData(void)
{
+ ChainPath_t chainPaths[] = {
+ {.path = "m/84'/0'/0'", .chainType = XPUB_TYPE_BTC_NATIVE_SEGWIT},
+ {.path = "m/49'/0'/0'", .chainType = XPUB_TYPE_BTC},
+ {.path = "m/44'/0'/0'", .chainType = XPUB_TYPE_BTC_LEGACY},
+ };
+ int length = NUMBER_OF_ARRAYS(chainPaths);
+ ExtendedPublicKey keys[length];
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[4];
- public_keys->data = keys;
- public_keys->size = 4;
- keys[0].path = "m/84'/0'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
- keys[1].path = "m/49'/0'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
- keys[2].path = "m/44'/0'/0'";
- keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
- keys[3].path = "m/86'/0'/0'";
- keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
- UREncodeResult *urencode = get_connect_sparrow_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildChainPaths(chainPaths, keys, length);
+ UREncodeResult *urEncode = generate_btc_crypto_account_ur(mfp, sizeof(mfp), public_keys);
+ CHECK_CHAIN_PRINT(urEncode);
+ SRAM_FREE(public_keys);
+ return urEncode;
}
-UREncodeResult *GuiGetSpecterWalletBtcData(void)
+UREncodeResult *GuiGetSparrowWalletBtcData(void)
{
+ ChainPath_t chainPaths[] = {
+ {.path = "m/84'/0'/0'", .chainType = XPUB_TYPE_BTC_NATIVE_SEGWIT},
+ {.path = "m/49'/0'/0'", .chainType = XPUB_TYPE_BTC},
+ {.path = "m/44'/0'/0'", .chainType = XPUB_TYPE_BTC_LEGACY},
+ {.path = "m/86'/0'/0'", .chainType = XPUB_TYPE_BTC_TAPROOT},
+ };
+ int length = NUMBER_OF_ARRAYS(chainPaths);
+ ExtendedPublicKey keys[length];
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[2];
- public_keys->data = keys;
- public_keys->size = 2;
- keys[0].path = "m/84'/0'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
- keys[1].path = "m/49'/0'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
- UREncodeResult *urencode = get_connect_specter_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildChainPaths(chainPaths, keys, length);
+ UREncodeResult *urEncode = generate_btc_crypto_account_ur(mfp, sizeof(mfp), public_keys);
+ CHECK_CHAIN_PRINT(urEncode);
+ SRAM_FREE(public_keys);
+ return urEncode;
}
typedef UREncodeResult *MetamaskUrGetter(PtrBytes master_fingerprint, uint32_t master_fingerprint_length, enum ETHAccountType account_type, PtrT_CSliceFFI_ExtendedPublicKey public_keys);
@@ -114,14 +196,14 @@ static UREncodeResult *BasicGetMetamaskDataForAccountType(ETHAccountType account
return NULL;
}
- g_urEncode = func(mfp, sizeof(mfp), accountType, public_keys);
- if (g_urEncode == NULL) {
+ UREncodeResult *urEncode = func(mfp, sizeof(mfp), accountType, public_keys);
+ if (urEncode == NULL) {
SRAM_FREE(public_keys);
return NULL;
}
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
// copy from gui_btc, need to use real data
UREncodeResult *GetMetamaskDataForAccountType(ETHAccountType accountType)
@@ -144,32 +226,25 @@ UREncodeResult *GuiGetImTokenData(void)
{
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- g_urEncode = get_connect_imtoken_ur(mfp, sizeof(mfp), GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD), GetWalletName());
- CHECK_CHAIN_PRINT(g_urEncode);
- return g_urEncode;
+ UREncodeResult *urEncode = get_connect_imtoken_ur(mfp, sizeof(mfp), GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD), GetWalletName());
+ CHECK_CHAIN_PRINT(urEncode);
+ return urEncode;
}
UREncodeResult *GuiGetCoreWalletData(void)
{
+ ChainPath_t chainPaths[] = {
+ {.path = "m/44'/60'/0'", .chainType = XPUB_TYPE_ETH_BIP44_STANDARD},
+ {.path = "m/44'/9000'/0'", .chainType = XPUB_TYPE_AVAX_X_P},
+ };
+ ExtendedPublicKey keys[NUMBER_OF_ARRAYS(chainPaths)];
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[2];
- public_keys->data = keys;
- public_keys->size = NUMBER_OF_ARRAYS(keys);
-
- keys[0].path = "m/44'/60'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD);
- keys[1].path = "m/44'/9000'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_AVAX_X_P);
-
- g_urEncode = get_core_wallet_ur(mfp, sizeof(mfp), public_keys, "Keystone3");
- if (g_urEncode->error_code == 0) {
- printf("g_urEncode: %s\n", g_urEncode->data);
- }
- CHECK_CHAIN_PRINT(g_urEncode);
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildChainPaths(chainPaths, keys, NUMBER_OF_ARRAYS(chainPaths));
+ UREncodeResult *urEncode = get_core_wallet_ur(mfp, sizeof(mfp), public_keys, "Keystone3");
+ CHECK_CHAIN_PRINT(urEncode);
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetWanderData(void)
@@ -183,52 +258,50 @@ UREncodeResult *GuiGetWanderData(void)
ClearSecretCache();
}
ASSERT(arXpub != NULL);
- g_urEncode = get_connect_arconnect_wallet_ur_from_xpub(mfp, sizeof(mfp), arXpub);
- printf("\ng_urEncode: %s\n", g_urEncode->data);
- CHECK_CHAIN_PRINT(g_urEncode);
- return g_urEncode;
+ UREncodeResult *urEncode = get_connect_arconnect_wallet_ur_from_xpub(mfp, sizeof(mfp), arXpub);
+ CHECK_CHAIN_PRINT(urEncode);
+ return urEncode;
}
-UREncodeResult *GuiGetWalletDataByCoin(bool includeApt)
+UREncodeResult *GuiGetWalletDataByCoin(bool onlySui)
{
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
PtrT_CSliceFFI_ExtendedPublicKey publicKeys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
-#define NIGHTLY_XPUB_COUNT 30
+#define SUI_XPUB_COUNT 10
+#define IOTA_XPUB_COUNT 10
+#define APT_XPUB_COUNT 10
+#define NIGHTLY_XPUB_COUNT (SUI_XPUB_COUNT + IOTA_XPUB_COUNT + APT_XPUB_COUNT)
ExtendedPublicKey keys[NIGHTLY_XPUB_COUNT];
publicKeys->data = keys;
uint8_t xpubIndex = 0;
- for (xpubIndex = 0; xpubIndex < 10; xpubIndex++) {
+ for (xpubIndex = 0; xpubIndex < SUI_XPUB_COUNT; xpubIndex++) {
keys[xpubIndex].path = SRAM_MALLOC(BUFFER_SIZE_32);
snprintf_s(keys[xpubIndex].path, BUFFER_SIZE_32, "m/44'/784'/%u'/0'/0'", xpubIndex);
keys[xpubIndex].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_SUI_0 + xpubIndex);
}
- if (includeApt) {
- for (uint8_t startIndex = 0; startIndex < 10; xpubIndex++, startIndex++) {
+ if (!onlySui) {
+ for (uint8_t startIndex = 0; startIndex < IOTA_XPUB_COUNT; xpubIndex++, startIndex++) {
keys[xpubIndex].path = SRAM_MALLOC(BUFFER_SIZE_32);
snprintf_s(keys[xpubIndex].path, BUFFER_SIZE_32, "m/44'/4218'/%u'/0'/0'", startIndex);
keys[xpubIndex].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_IOTA_0 + startIndex);
}
- for (uint8_t startIndex = 0; startIndex < 10; xpubIndex++, startIndex++) {
+ for (uint8_t startIndex = 0; startIndex < APT_XPUB_COUNT; xpubIndex++, startIndex++) {
keys[xpubIndex].path = SRAM_MALLOC(BUFFER_SIZE_32);
snprintf_s(keys[xpubIndex].path, BUFFER_SIZE_32, "m/44'/637'/%u'/0'/0'", startIndex);
keys[xpubIndex].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_APT_0 + startIndex);
}
publicKeys->size = NIGHTLY_XPUB_COUNT;
} else {
- publicKeys->size = 10;
+ publicKeys->size = SUI_XPUB_COUNT;
}
- g_urEncode = get_connect_sui_wallet_ur(mfp, sizeof(mfp), publicKeys);
- CHECK_CHAIN_PRINT(g_urEncode);
- for (uint8_t i = 0; i < publicKeys->size; i++) {
- if (keys[i].path != NULL) {
- SRAM_FREE(keys[i].path);
- }
- }
+ UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), publicKeys, "SUI");
+ CHECK_CHAIN_PRINT(urEncode);
+ FreeAllocatedPaths(keys, 0, publicKeys->size);
SRAM_FREE(publicKeys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetIotaWalletData(void)
@@ -245,15 +318,11 @@ UREncodeResult *GuiGetIotaWalletData(void)
snprintf_s(keys[startIndex].path, BUFFER_SIZE_32, "m/44'/4218'/%u'/0'/0'", startIndex);
keys[startIndex].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_IOTA_0 + startIndex);
}
- g_urEncode = get_connect_sui_wallet_ur(mfp, sizeof(mfp), publicKeys);
- CHECK_CHAIN_PRINT(g_urEncode);
- for (uint8_t i = 0; i < IOTA_XPUB_COUNT; i++) {
- if (keys[i].path != NULL) {
- SRAM_FREE(keys[i].path);
- }
- }
+ UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), publicKeys, "IOTA");
+ CHECK_CHAIN_PRINT(urEncode);
+ FreeAllocatedPaths(keys, 0, publicKeys->size);
SRAM_FREE(publicKeys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetFewchaDataByCoin(GuiChainCoinType coin)
@@ -284,25 +353,19 @@ UREncodeResult *GuiGetFewchaDataByCoin(GuiChainCoinType coin)
snprintf_s(keys[i].path, BUFFER_SIZE_32, "m/44'/%u'/%u'/0'/0'", coinType, i);
keys[i].xpub = GetCurrentAccountPublicKey(xpubBaseIndex + i);
}
- if (coin == CHAIN_SUI) {
- g_urEncode = get_connect_sui_wallet_ur(mfp, sizeof(mfp), publicKeys);
- } else {
- g_urEncode = get_connect_aptos_wallet_ur(mfp, sizeof(mfp), publicKeys);
- }
- CHECK_CHAIN_PRINT(g_urEncode);
- for (uint8_t i = 0; i < 10; i++) {
- SRAM_FREE(keys[i].path);
- }
+ UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), publicKeys, (coin == CHAIN_SUI) ? "SUI" : "APT");
+ CHECK_CHAIN_PRINT(urEncode);
+ FreeAllocatedPaths(keys, 0, publicKeys->size);
SRAM_FREE(publicKeys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetPetraData(void)
{
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey publicKeys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
ExtendedPublicKey keys[10];
+ PtrT_CSliceFFI_ExtendedPublicKey publicKeys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
publicKeys->data = keys;
publicKeys->size = 10;
for (uint8_t i = 0; i < 10; i++) {
@@ -310,13 +373,11 @@ UREncodeResult *GuiGetPetraData(void)
snprintf_s(keys[i].path, BUFFER_SIZE_32, "m/44'/637'/%u'/0'/0'", i);
keys[i].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_APT_0 + i);
}
- g_urEncode = get_connect_aptos_wallet_ur(mfp, sizeof(mfp), publicKeys);
- CHECK_CHAIN_PRINT(g_urEncode);
- for (uint8_t i = 0; i < 10; i++) {
- SRAM_FREE(keys[i].path);
- }
+ UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), publicKeys, "APT");
+ CHECK_CHAIN_PRINT(urEncode);
+ FreeAllocatedPaths(keys, 0, publicKeys->size);
SRAM_FREE(publicKeys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetADADataByIndex(char *walletName)
@@ -325,8 +386,7 @@ UREncodeResult *GuiGetADADataByIndex(char *walletName)
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
char* xpub = GetCurrentAccountPublicKey(GetAdaXPubTypeByIndexAndDerivationType(
- GetConnectWalletPathIndex(walletName),
- index));
+ GetConnectWalletPathIndex(walletName), index));
char path[BUFFER_SIZE_32] = {0};
sprintf(path, "1852'/1815'/%u'", index);
ExtendedPublicKey xpubs[1];
@@ -366,16 +426,16 @@ UREncodeResult *GuiGetKeplrDataByIndex(uint32_t index)
snprintf_s(keys[i].path, BUFFER_SIZE_32, "M/44'/%u'/0'/0/%u", chain->coinType, index);
}
- g_urEncode = get_connect_keplr_wallet_ur(mfp, sizeof(mfp), publicKeys);
- CHECK_CHAIN_PRINT(g_urEncode);
+ UREncodeResult *urEncode = get_connect_keplr_wallet_ur(mfp, sizeof(mfp), publicKeys);
+ CHECK_CHAIN_PRINT(urEncode);
for (uint8_t i = 0; i < 8; i++) {
SRAM_FREE(keys[i].path);
}
SRAM_FREE(publicKeys);
- return g_urEncode;
+ return urEncode;
}
-UREncodeResult *GuiGetLeapData()
+UREncodeResult *GuiGetLeapData(void)
{
#define CHAIN_AMOUNT 4
uint8_t mfp[4] = {0};
@@ -399,13 +459,13 @@ UREncodeResult *GuiGetLeapData()
snprintf_s(keys[i].path, BUFFER_SIZE_32, "M/44'/%u'/0'/0/0", chain->coinType);
}
- g_urEncode = get_connect_keplr_wallet_ur(mfp, sizeof(mfp), publicKeys);
- CHECK_CHAIN_PRINT(g_urEncode);
+ UREncodeResult *urEncode = get_connect_keplr_wallet_ur(mfp, sizeof(mfp), publicKeys);
+ CHECK_CHAIN_PRINT(urEncode);
for (uint8_t i = 0; i < CHAIN_AMOUNT; i++) {
SRAM_FREE(keys[i].path);
}
SRAM_FREE(publicKeys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetXrpToolkitDataByIndex(uint16_t index)
@@ -416,76 +476,35 @@ UREncodeResult *GuiGetXrpToolkitDataByIndex(uint16_t index)
char *rootPath = "m/44'/144'/0'";
char hdPath[BUFFER_SIZE_32] = {0};
snprintf_s(hdPath, BUFFER_SIZE_32, "%s/0/%u", rootPath, index);
- g_urEncode = get_connect_xrp_toolkit_ur(hdPath, xpub, rootPath);
- CHECK_CHAIN_PRINT(g_urEncode);
- return g_urEncode;
+ UREncodeResult *urEncode = get_connect_xrp_toolkit_ur(hdPath, xpub, rootPath);
+ CHECK_CHAIN_PRINT(urEncode);
+ return urEncode;
}
UREncodeResult *GuiGetKeystoneConnectWalletData(void)
{
+ ChainPath_t chainPaths[] = {
+ {.path = "m/44'/60'/0'", .chainType = XPUB_TYPE_ETH_BIP44_STANDARD},
+ {.path = "m/84'/0'/0'", .chainType = XPUB_TYPE_BTC_NATIVE_SEGWIT},
+ {.path = "m/49'/0'/0'", .chainType = XPUB_TYPE_BTC},
+ {.path = "m/44'/0'/0'", .chainType = XPUB_TYPE_BTC_LEGACY},
+ {.path = "m/86'/0'/0'", .chainType = XPUB_TYPE_BTC_TAPROOT},
+ {.path = GetXPubPath(XPUB_TYPE_TRX), .chainType = XPUB_TYPE_TRX},
+ {.path = GetXPubPath(XPUB_TYPE_DOGE), .chainType = XPUB_TYPE_DOGE},
+ {.path = GetXPubPath(XPUB_TYPE_XRP), .chainType = XPUB_TYPE_XRP},
+ };
+ ExtendedPublicKey keys[NUMBER_OF_ARRAYS(chainPaths)];
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- // btc 4
- // + eth 1
- // + trx 1
- // + doge 1
- // + xrp 1
- ExtendedPublicKey keys[8];
- public_keys->data = keys;
- public_keys->size = NUMBER_OF_ARRAYS(keys);
-
- // eth standard
- keys[0].path = "m/44'/60'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD);
-
- keys[1].path = "m/44'/0'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
-
- keys[2].path = "m/49'/0'/0'";
- keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
-
- keys[3].path = "m/84'/0'/0'";
- keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
-
- keys[4].path = "m/86'/0'/0'";
- keys[4].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
-
- keys[5].path = GetXPubPath(XPUB_TYPE_TRX);
- keys[5].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TRX);
-
- keys[6].path = GetXPubPath(XPUB_TYPE_DOGE);
- keys[6].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_DOGE);
-
- keys[7].path = GetXPubPath(XPUB_TYPE_XRP);
- keys[7].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_XRP);
-
- // keys[3].path = GetXPubPath(XPUB_TYPE_BCH);
- // keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BCH);
-
- // keys[4].path = GetXPubPath(XPUB_TYPE_DASH);
- // keys[4].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_DASH);
-
- // keys[5].path = GetXPubPath(XPUB_TYPE_LTC);
- // keys[5].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_LTC);
-
- // keys[6].path = GetXPubPath(XPUB_TYPE_TRX);
- // keys[6].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TRX);
-
- // keys[7].path = GetXPubPath(XPUB_TYPE_XRP);
- // keys[7].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_XRP);
-
- // keys[8].path = GetXPubPath(XPUB_TYPE_ETH_BIP44_STANDARD);
- // keys[8].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD);
-
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildChainPaths(chainPaths, keys, NUMBER_OF_ARRAYS(chainPaths));
char serialNumber[256];
GetSerialNumber(serialNumber);
char firmwareVersion[12];
GetSoftWareVersionNumber(firmwareVersion);
- g_urEncode = get_keystone_connect_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
- CHECK_CHAIN_PRINT(g_urEncode);
+ UREncodeResult *urEncode = get_keystone_connect_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
+ CHECK_CHAIN_PRINT(urEncode);
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetBitgetWalletData(void)
@@ -498,35 +517,28 @@ UREncodeResult *GuiGetBitgetWalletData(void)
ExtendedPublicKey keys[15];
public_keys->data = keys;
public_keys->size = 15;
- for (int i = XPUB_TYPE_ETH_LEDGER_LIVE_0; i <= XPUB_TYPE_ETH_LEDGER_LIVE_9; i++) {
- keys[i - XPUB_TYPE_ETH_LEDGER_LIVE_0].path = SRAM_MALLOC(BUFFER_SIZE_64);
- snprintf_s(keys[i - XPUB_TYPE_ETH_LEDGER_LIVE_0].path, BUFFER_SIZE_64, "m/44'/60'/%d'", i - XPUB_TYPE_ETH_LEDGER_LIVE_0);
- keys[i - XPUB_TYPE_ETH_LEDGER_LIVE_0].xpub = GetCurrentAccountPublicKey(i);
- }
-
- keys[10].path = "m/44'/0'/0'";
- keys[10].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
-
- keys[11].path = "m/49'/0'/0'";
- keys[11].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
- keys[12].path = "m/84'/0'/0'";
- keys[12].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
+ int index = 0;
+ PathAddResult_t ethResult = AddETHLedgerLivePaths(keys, index);
+ index += ethResult.count;
- keys[13].path = "m/86'/0'/0'";
- keys[13].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
+ index += AddBTCPathsStandard(keys, index, true);
- keys[14].path = GetXPubPath(XPUB_TYPE_TON_BIP39);
- keys[14].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TON_BIP39);
+ keys[index].path = GetXPubPath(XPUB_TYPE_TON_BIP39);
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TON_BIP39);
char serialNumber[256];
GetSerialNumber(serialNumber);
char firmwareVersion[BUFFER_SIZE_32];
GetSoftWareVersionNumber(firmwareVersion);
- g_urEncode = get_bitget_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
- CHECK_CHAIN_PRINT(g_urEncode);
+ UREncodeResult *urEncode = get_bitget_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
+ CHECK_CHAIN_PRINT(urEncode);
+
+ if (ethResult.allocatedStart >= 0) {
+ FreeAllocatedPaths(keys, ethResult.allocatedStart, ethResult.allocatedEnd);
+ }
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetOkxWalletData(void)
@@ -543,44 +555,44 @@ UREncodeResult *GuiGetOkxWalletData(void)
ExtendedPublicKey keys[18];
public_keys->data = keys;
public_keys->size = 18;
- for (int i = XPUB_TYPE_ETH_LEDGER_LIVE_0; i <= XPUB_TYPE_ETH_LEDGER_LIVE_9; i++) {
- keys[i - XPUB_TYPE_ETH_LEDGER_LIVE_0].path = SRAM_MALLOC(BUFFER_SIZE_64);
- snprintf_s(keys[i - XPUB_TYPE_ETH_LEDGER_LIVE_0].path, BUFFER_SIZE_64, "m/44'/60'/%d'", i - XPUB_TYPE_ETH_LEDGER_LIVE_0);
- keys[i - XPUB_TYPE_ETH_LEDGER_LIVE_0].xpub = GetCurrentAccountPublicKey(i);
- }
-
- keys[10].path = "m/44'/0'/0'";
- keys[10].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
- keys[11].path = "m/49'/0'/0'";
- keys[11].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
+ int index = 0;
+ PathAddResult_t ethResult = AddETHLedgerLivePaths(keys, index);
+ index += ethResult.count;
- keys[12].path = "m/84'/0'/0'";
- keys[12].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
+ index += AddBTCPathsStandard(keys, index, false);
- keys[13].path = GetXPubPath(XPUB_TYPE_TRX);
- keys[13].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TRX);
+ keys[index].path = GetXPubPath(XPUB_TYPE_TRX);
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TRX);
+ index++;
- keys[14].path = GetXPubPath(XPUB_TYPE_LTC);
- keys[14].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_LTC);
+ keys[index].path = GetXPubPath(XPUB_TYPE_LTC);
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_LTC);
+ index++;
- keys[15].path = GetXPubPath(XPUB_TYPE_DASH);
- keys[15].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_DASH);
+ keys[index].path = GetXPubPath(XPUB_TYPE_DASH);
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_DASH);
+ index++;
- keys[16].path = GetXPubPath(XPUB_TYPE_BCH);
- keys[16].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BCH);
+ keys[index].path = GetXPubPath(XPUB_TYPE_BCH);
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BCH);
+ index++;
- keys[17].path = "m/86'/0'/0'";
- keys[17].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
+ keys[index].path = "m/86'/0'/0'";
+ keys[index].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_TAPROOT);
char serialNumber[256];
GetSerialNumber(serialNumber);
char firmwareVersion[BUFFER_SIZE_32];
GetSoftWareVersionNumber(firmwareVersion);
- g_urEncode = get_okx_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
- CHECK_CHAIN_PRINT(g_urEncode);
+ UREncodeResult *urEncode = get_okx_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys, "Keystone 3 Pro", firmwareVersion);
+ CHECK_CHAIN_PRINT(urEncode);
+
+ if (ethResult.allocatedStart >= 0) {
+ FreeAllocatedPaths(keys, ethResult.allocatedStart, ethResult.allocatedEnd);
+ }
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetSolflareData(void)
@@ -589,40 +601,15 @@ UREncodeResult *GuiGetSolflareData(void)
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
ExtendedPublicKey keys[10];
- public_keys->data = keys;
-
- if (accountType == SOLBip44) {
- public_keys->size = 10;
- for (int i = XPUB_TYPE_SOL_BIP44_0; i <= XPUB_TYPE_SOL_BIP44_9; i++) {
- char *path = SRAM_MALLOC(BUFFER_SIZE_32);
- snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'/%d'", i - XPUB_TYPE_SOL_BIP44_0);
- keys[i - XPUB_TYPE_SOL_BIP44_0].path = path;
- keys[i - XPUB_TYPE_SOL_BIP44_0].xpub = GetCurrentAccountPublicKey(i);
- }
- } else if (accountType == SOLBip44ROOT) {
- public_keys->size = 1;
- char *path = SRAM_MALLOC(sizeof(char) * 32);
- snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'");
- keys[0].path = path;
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_SOL_BIP44_ROOT);
- } else if (accountType == SOLBip44Change) {
- public_keys->size = 10;
- for (int i = XPUB_TYPE_SOL_BIP44_CHANGE_0; i <= XPUB_TYPE_SOL_BIP44_CHANGE_9; i++) {
- char *path = SRAM_MALLOC(sizeof(char) * 32);
- snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'/%d'/0'", i - XPUB_TYPE_SOL_BIP44_CHANGE_0);
- keys[i - XPUB_TYPE_SOL_BIP44_CHANGE_0].path = path;
- keys[i - XPUB_TYPE_SOL_BIP44_CHANGE_0].xpub = GetCurrentAccountPublicKey(i);
- }
- }
- g_urEncode = get_connect_solana_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(g_urEncode);
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildSOLAccountKeys(accountType, keys);
+ UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), public_keys, "SOL");
+ CHECK_CHAIN_PRINT(urEncode);
for (int i = 0; i < public_keys->size; i++) {
SRAM_FREE(public_keys->data[i].path);
}
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetHeliumData(void)
@@ -631,40 +618,13 @@ UREncodeResult *GuiGetHeliumData(void)
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
ExtendedPublicKey keys[10];
- public_keys->data = keys;
-
- if (accountType == SOLBip44) {
- public_keys->size = 10;
- for (int i = XPUB_TYPE_SOL_BIP44_0; i <= XPUB_TYPE_SOL_BIP44_9; i++) {
- char *path = SRAM_MALLOC(BUFFER_SIZE_32);
- snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'/%d'", i - XPUB_TYPE_SOL_BIP44_0);
- keys[i - XPUB_TYPE_SOL_BIP44_0].path = path;
- keys[i - XPUB_TYPE_SOL_BIP44_0].xpub = GetCurrentAccountPublicKey(i);
- }
- } else if (accountType == SOLBip44ROOT) {
- public_keys->size = 1;
- char *path = SRAM_MALLOC(sizeof(char) * 32);
- snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'");
- keys[0].path = path;
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_SOL_BIP44_ROOT);
- } else if (accountType == SOLBip44Change) {
- public_keys->size = 10;
- for (int i = XPUB_TYPE_SOL_BIP44_CHANGE_0; i <= XPUB_TYPE_SOL_BIP44_CHANGE_9; i++) {
- char *path = SRAM_MALLOC(sizeof(char) * 32);
- snprintf_s(path, BUFFER_SIZE_32, "m/44'/501'/%d'/0'", i - XPUB_TYPE_SOL_BIP44_CHANGE_0);
- keys[i - XPUB_TYPE_SOL_BIP44_CHANGE_0].path = path;
- keys[i - XPUB_TYPE_SOL_BIP44_CHANGE_0].xpub = GetCurrentAccountPublicKey(i);
- }
- }
- g_urEncode = get_connect_solana_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(g_urEncode);
- for (int i = 0; i < public_keys->size; i++) {
- SRAM_FREE(public_keys->data[i].path);
- }
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildSOLAccountKeys(accountType, keys);
+ UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), public_keys, "SOL");
+ CHECK_CHAIN_PRINT(urEncode);
+ FreeAllocatedPaths(keys, 0, public_keys->size);
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetXBullData(void)
@@ -681,13 +641,13 @@ UREncodeResult *GuiGetXBullData(void)
keys[i - XPUB_TYPE_STELLAR_0].path = path;
keys[i - XPUB_TYPE_STELLAR_0].xpub = GetCurrentAccountPublicKey(i);
}
- g_urEncode = get_connect_xbull_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(g_urEncode);
+ UREncodeResult *urEncode = generate_common_crypto_multi_accounts_ur(mfp, sizeof(mfp), public_keys, "STELLAR");
+ CHECK_CHAIN_PRINT(urEncode);
for (int i = 0; i < public_keys->size; i++) {
SRAM_FREE(public_keys->data[i].path);
}
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
UREncodeResult *GuiGetBackpackData(void)
@@ -738,44 +698,36 @@ UREncodeResult *GuiGetBackpackData(void)
keys[count].path = path;
keys[count].xpub = GetCurrentAccountPublicKey(i);
}
- g_urEncode = get_backpack_wallet_ur(mfp, sizeof(mfp), public_keys);
+ UREncodeResult *urEncode = get_backpack_wallet_ur(mfp, sizeof(mfp), public_keys);
- CHECK_CHAIN_PRINT(g_urEncode);
+ CHECK_CHAIN_PRINT(urEncode);
for (int i = 0; i < public_keys->size; i++) {
SRAM_FREE(public_keys->data[i].path);
}
SRAM_FREE(public_keys);
- return g_urEncode;
+ return urEncode;
}
-UREncodeResult *GuiGetThorWalletBtcData(void)
+UREncodeResult *GuiGetThorWalletData(void)
{
+ ChainPath_t chainPaths[] = {
+ {.path = "m/84'/0'/0'", .chainType = XPUB_TYPE_BTC_NATIVE_SEGWIT},
+ {.path = "m/49'/0'/0'", .chainType = XPUB_TYPE_BTC},
+ {.path = "m/44'/0'/0'", .chainType = XPUB_TYPE_BTC_LEGACY},
+ {.path = "m/44'/931'/0'", .chainType = XPUB_TYPE_THOR},
+ {.path = "m/44'/60'/0'", .chainType = XPUB_TYPE_ETH_BIP44_STANDARD},
+ };
+ ExtendedPublicKey keys[NUMBER_OF_ARRAYS(chainPaths)];
uint8_t mfp[4] = {0};
GetMasterFingerPrint(mfp);
-
- PtrT_CSliceFFI_ExtendedPublicKey public_keys =
- SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[5];
- public_keys->data = keys;
- public_keys->size = 5;
- keys[0].path = "m/84'/0'/0'";
- keys[0].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_NATIVE_SEGWIT);
- keys[1].path = "m/49'/0'/0'";
- keys[1].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC);
- keys[2].path = "m/44'/0'/0'";
- keys[2].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_BTC_LEGACY);
- keys[3].path = "m/44'/931'/0'";
- keys[3].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_THOR);
- keys[4].path = "m/44'/60'/0'";
- keys[4].xpub = GetCurrentAccountPublicKey(XPUB_TYPE_ETH_BIP44_STANDARD);
-
+ PtrT_CSliceFFI_ExtendedPublicKey public_keys = BuildChainPaths(chainPaths, keys, NUMBER_OF_ARRAYS(chainPaths));
char serialNumber[256];
GetSerialNumber(serialNumber);
char firmwareVersion[BUFFER_SIZE_32];
GetSoftWareVersionNumber(firmwareVersion);
- UREncodeResult *urencode =
- get_connect_thor_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys,
- "Keystone 3 Pro", firmwareVersion);
- CHECK_CHAIN_PRINT(urencode);
- return urencode;
+ UREncodeResult *urEncode = get_connect_thor_wallet_ur(mfp, sizeof(mfp), serialNumber, public_keys,
+ "Keystone 3 Pro", firmwareVersion);
+ CHECK_CHAIN_PRINT(urEncode);
+ SRAM_FREE(public_keys);
+ return urEncode;
}
\ No newline at end of file
diff --git a/src/ui/gui_wallet/multi/web3/gui_wallet.h b/src/ui/gui_wallet/multi/web3/gui_wallet.h
index db01de8..87e7aba 100644
--- a/src/ui/gui_wallet/multi/web3/gui_wallet.h
+++ b/src/ui/gui_wallet/multi/web3/gui_wallet.h
@@ -8,9 +8,8 @@
UREncodeResult *GuiGetBlueWalletBtcData(void);
UREncodeResult *GuiGetSparrowWalletBtcData(void);
-UREncodeResult *GuiGetSpecterWalletBtcData(void);
UREncodeResult *GuiGetKeplrDataByIndex(uint32_t index);
-UREncodeResult *GuiGetLeapData();
+UREncodeResult *GuiGetLeapData(void);
UREncodeResult *GuiGetWanderData(void);
UREncodeResult *GuiGetCompanionAppData(void);
UREncodeResult *GuiGetOkxWalletData(void);
@@ -18,7 +17,7 @@ UREncodeResult *GuiGetBitgetWalletData(void);
UREncodeResult *GetMetamaskDataForAccountType(ETHAccountType accountType);
UREncodeResult *GetUnlimitedMetamaskDataForAccountType(ETHAccountType accountType);
UREncodeResult *GuiGetMetamaskData(void);
-UREncodeResult *GuiGetWalletDataByCoin(bool includeApt);
+UREncodeResult *GuiGetWalletDataByCoin(bool onlySui);
UREncodeResult *GuiGetFewchaDataByCoin(GuiChainCoinType coin);
UREncodeResult *GuiGetNightlyDataByCoin(GuiChainCoinType coin);
UREncodeResult *GuiGetIotaWalletData(void);
@@ -31,6 +30,6 @@ UREncodeResult *GuiGetXrpToolkitDataByIndex(uint16_t index);
UREncodeResult *GuiGetADADataByIndex(char *walletName);
UREncodeResult *GuiGetImTokenData(void);
UREncodeResult *GuiGetCoreWalletData(void);
-UREncodeResult *GuiGetThorWalletBtcData(void);
+UREncodeResult *GuiGetThorWalletData(void);
UREncodeResult *GuiGetKeystoneConnectWalletData(void);
#endif
diff --git a/src/ui/gui_widgets/gui_connect_wallet_widgets.h b/src/ui/gui_widgets/gui_connect_wallet_widgets.h
index ac4397d..e1afaf9 100644
--- a/src/ui/gui_widgets/gui_connect_wallet_widgets.h
+++ b/src/ui/gui_widgets/gui_connect_wallet_widgets.h
@@ -15,7 +15,6 @@ typedef enum {
WALLET_LIST_OKX,
WALLET_LIST_ETERNL,
WALLET_LIST_MEDUSA,
- // WALLET_LIST_YOROI,
WALLET_LIST_TYPHON,
WALLET_LIST_BLUE,
WALLET_LIST_ZEUS,
diff --git a/src/ui/gui_widgets/gui_wallet_tutorial_widgets.c b/src/ui/gui_widgets/gui_wallet_tutorial_widgets.c
index 9fc04c8..6cbf6b9 100644
--- a/src/ui/gui_widgets/gui_wallet_tutorial_widgets.c
+++ b/src/ui/gui_widgets/gui_wallet_tutorial_widgets.c
@@ -120,8 +120,6 @@ static void WalletTutorialsInit()
g_tutorials[WALLET_LIST_ETERNL].items[0].qrTitle = _("connect_eternl_title");
g_tutorials[WALLET_LIST_ETERNL].items[0].qrUrl = _("connect_eternl_link");
-
-
// WALLET_LIST_MEDUSA
g_tutorials[WALLET_LIST_MEDUSA].len = 1;
g_tutorials[WALLET_LIST_MEDUSA].desc = _("connect_wallet_desc");
@@ -129,13 +127,6 @@ static void WalletTutorialsInit()
g_tutorials[WALLET_LIST_MEDUSA].items[0].url = _("connect_medusa_link");
g_tutorials[WALLET_LIST_MEDUSA].items[0].qrTitle = _("connect_medusa_title");
g_tutorials[WALLET_LIST_MEDUSA].items[0].qrUrl = _("connect_medusa_link");
- // WALLET_LIST_YOROI
- // g_tutorials[WALLET_LIST_YOROI].len = 1;
- // g_tutorials[WALLET_LIST_YOROI].desc = _("connect_wallet_desc");
- // g_tutorials[WALLET_LIST_YOROI].items[0].walletName = _("connect_yoroi_title");
- // g_tutorials[WALLET_LIST_YOROI].items[0].url = _("connect_yoroi_link");
- // g_tutorials[WALLET_LIST_YOROI].items[0].qrTitle = _("connect_yoroi_qr_title");
- // g_tutorials[WALLET_LIST_YOROI].items[0].qrUrl = _("connect_yoroi_qr_link");
// WALLET_LIST_Typhon
g_tutorials[WALLET_LIST_TYPHON].len = 1;
diff --git a/src/ui/gui_widgets/multi/cypherpunk/gui_connect_wallet_widgets.c b/src/ui/gui_widgets/multi/cypherpunk/gui_connect_wallet_widgets.c
index 1fbbdf6..eafc698 100644
--- a/src/ui/gui_widgets/multi/cypherpunk/gui_connect_wallet_widgets.c
+++ b/src/ui/gui_widgets/multi/cypherpunk/gui_connect_wallet_widgets.c
@@ -405,7 +405,6 @@ void GuiConnectWalletSetQrdata(WALLET_LIST_INDEX_ENUM index)
func = GuiGetZecData;
AddZecCoins();
break;
- // case WALLET_LIST_CAKE:
case WALLET_LIST_FEATHER:
func = GuiGetCakeData;
AddCakeCoins();
diff --git a/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c b/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c
index 223902b..c8caaf3 100644
--- a/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c
+++ b/src/ui/gui_widgets/multi/web3/gui_connect_wallet_widgets.c
@@ -71,7 +71,6 @@ WalletListItem_t g_walletListArray[] = {
{WALLET_LIST_SUIET, &walletListSuiet, true, WALLET_FILTER_OTHER},
{WALLET_LIST_IOTA, &walletListIota, true, WALLET_FILTER_OTHER},
{WALLET_LIST_NIGHTLY, &walletListNightly, true, WALLET_FILTER_OTHER},
- // {WALLET_LIST_YOROI, &walletListYoroi, true},
{WALLET_LIST_TYPHON, &walletListTyphon, true, WALLET_FILTER_ADA},
{WALLET_LIST_MEDUSA, &walletListMedusa, true, WALLET_FILTER_ADA},
{WALLET_LIST_SAFE, &walletListSafe, true, WALLET_FILTER_ETH},
@@ -268,14 +267,7 @@ static void ConfirmSelectFewchaCoinsHandler(lv_event_t *e);
static void GuiCreateSelectFewchaCoinWidget();
void ConnectWalletReturnHandler(lv_event_t *e);
static void OpenMoreHandler(lv_event_t *e);
-static void AddMetaMaskCoins(void);
-static void AddOkxWalletCoins(void);
-static void AddBlueWalletCoins(void);
static void AddFewchaCoins(void);
-static void AddCoreWalletCoins(void);
-static void AddSolflareCoins(void);
-static void AddHeliumWalletCoins(void);
-static void AddThorWalletCoins(void);
static void ShowEgAddressCont(lv_obj_t *egCont);
static uint32_t GetCurrentSelectedIndex();
static bool HasSelectAddressWidget();
@@ -333,10 +325,6 @@ static void GuiInitWalletListArray()
case WALLET_LIST_BEACON:
enable = !isTempAccount;
break;
- // open keystone for test
- // case WALLET_LIST_KEYSTONE:
- // enable = isRussian;
- // break;
default:
break;
}
@@ -435,35 +423,31 @@ static void OpenQRCodeHandler(lv_event_t *e)
g_connectWalletTileView.walletIndex = wallet->index;
if (IsEVMChain(g_connectWalletTileView.walletIndex)) {
g_derivationPathDescs = GetDerivationPathDescs(ETH_DERIVATION_PATH_DESC);
- }
- if (IsSOL(g_connectWalletTileView.walletIndex)) {
+ } else if (IsSOL(g_connectWalletTileView.walletIndex)) {
g_derivationPathDescs = GetDerivationPathDescs(SOL_DERIVATION_PATH_DESC);
- }
- if (IsAda(g_connectWalletTileView.walletIndex)) {
+ } else if (IsAda(g_connectWalletTileView.walletIndex)) {
g_derivationPathDescs = GetDerivationPathDescs(ADA_DERIVATION_PATH_DESC);
}
if (g_connectWalletTileView.walletIndex == WALLET_LIST_ETERNL ||
g_connectWalletTileView.walletIndex == WALLET_LIST_TYPHON ||
g_connectWalletTileView.walletIndex == WALLET_LIST_BEGIN ||
- g_connectWalletTileView.walletIndex == WALLET_LIST_MEDUSA
- ) {
+ g_connectWalletTileView.walletIndex == WALLET_LIST_MEDUSA) {
GuiCreateConnectADAWalletWidget(g_connectWalletTileView.walletIndex);
return;
}
- // todo: notice if current wallet is nufi , we show a hintbox to notify user to connect usb
+
if (g_connectWalletTileView.walletIndex == WALLET_LIST_NUFI) {
GuiOpenNufiNoticeWindow();
return;
}
bool skipGenerateArweaveKey = IsArweaveSetupComplete();
- if (g_connectWalletTileView.walletIndex == WALLET_LIST_WANDER && !skipGenerateArweaveKey) {
- GuiOpenARAddressNoticeWindow();
- return;
- }
- if (g_connectWalletTileView.walletIndex == WALLET_LIST_BEACON && !skipGenerateArweaveKey) {
+ if ((g_connectWalletTileView.walletIndex == WALLET_LIST_WANDER ||
+ g_connectWalletTileView.walletIndex == WALLET_LIST_BEACON) &&
+ !skipGenerateArweaveKey) {
GuiOpenARAddressNoticeWindow();
return;
}
+
g_isCoinReselected = false;
GuiEmitSignal(SIG_SETUP_VIEW_TILE_NEXT, NULL, 0);
}
@@ -798,167 +782,6 @@ static void GuiCreateQrCodeWidget(lv_obj_t *parent)
// GuiCreateSupportedNetworks(g_connectWalletTileView.walletIndex);
}
-static void AddMetaMaskCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 5; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_metaMaskCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-
- lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
- lv_img_set_zoom(img, 150);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 132, 2);
-}
-
-static void AddEthWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 4; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_ethWalletCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
- lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
- lv_img_set_zoom(img, 150);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 132, 2);
-}
-
-static void AddOkxWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0;
- i < sizeof(g_okxWalletCoinArray) / sizeof(g_okxWalletCoinArray[0]);
- i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_okxWalletCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
- lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
- lv_img_set_zoom(img, 150);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 132, 2);
-}
-
-static void AddBitgetWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0;
- i < sizeof(g_bitgetWalletCoinArray) / sizeof(g_bitgetWalletCoinArray[0]);
- i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_bitgetWalletCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
-
-static void AddKeystoneWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0;
- i < sizeof(g_keystoneWalletCoinArray) / sizeof(g_keystoneWalletCoinArray[0]);
- i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_keystoneWalletCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
- // lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
- // lv_img_set_zoom(img, 150);
- // lv_img_set_pivot(img, 0, 0);
- // lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
- // lv_obj_align(img, LV_ALIGN_TOP_LEFT, 132, 2);
-}
-
-static void AddBlueWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 1; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_blueWalletCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
-
-static void AddUniSatWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 5; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_UniSatCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
- // Add more
- lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
- lv_img_set_zoom(img, 150);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * 5, 2);
-}
-
-static void AddWanderConnectCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
-
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_wanderCoinArray[0]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 0, 0);
-}
-
-static void AddBeaconCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
-
- for (int i = 0; i < 2; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_beaconCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
-
-static void AddXBullCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
-
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_xbullCoinArray[0]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 0, 0);
-}
static void AddFewchaCoins()
{
@@ -980,55 +803,25 @@ static void AddFewchaCoins()
}
}
-static void AddCoreWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < CORE_COINS_BUTT; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_coreCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
-
-static void AddPetraCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 1; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_petraCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
-static void AddTonCoins(void)
+static void AddCoinsFromArray(const lv_img_dsc_t *coinArray[], uint32_t arraySize,
+ bool showMore, int moreOffsetX)
{
if (lv_obj_get_child_cnt(g_coinCont) > 0) {
lv_obj_clean(g_coinCont);
}
- for (int i = 0; i < 1; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_tonKeeperCoinArray[i]);
+ for (uint32_t i = 0; i < arraySize; i++) {
+ lv_obj_t *img = GuiCreateImg(g_coinCont, coinArray[i]);
lv_img_set_zoom(img, 110);
lv_img_set_pivot(img, 0, 0);
lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
}
-}
-
-static void AddThorWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 3; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_ThorWalletCoinArray[i]);
- lv_img_set_zoom(img, 110);
+ if (showMore) {
+ lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
+ lv_img_set_zoom(img, 150);
lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
+ lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
+ lv_obj_align(img, LV_ALIGN_TOP_LEFT, moreOffsetX, 2);
}
}
@@ -1119,66 +912,6 @@ static void AddKeplrCoinsAndAddressUI(void)
lv_obj_align(label, LV_ALIGN_CENTER, 150, 30);
}
-static void AddLeapCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 8; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_leapCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
- // Add more
- lv_obj_t *img = GuiCreateImg(g_coinCont, &imgMore);
- lv_img_set_zoom(img, 150);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_set_style_img_opa(img, LV_OPA_30, LV_PART_MAIN);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * 8, 2);
-}
-
-static void AddSolflareCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0; i < 1; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_solfareCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
-
-static void AddHeliumWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
-
- for (int i = 0; i < 2; i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_heliumCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
-
-static void AddBackpackWalletCoins(void)
-{
- if (lv_obj_get_child_cnt(g_coinCont) > 0) {
- lv_obj_clean(g_coinCont);
- }
- for (int i = 0;
- i < sizeof(g_backpackWalletCoinArray) / sizeof(g_backpackWalletCoinArray[0]);
- i++) {
- lv_obj_t *img = GuiCreateImg(g_coinCont, g_backpackWalletCoinArray[i]);
- lv_img_set_zoom(img, 110);
- lv_img_set_pivot(img, 0, 0);
- lv_obj_align(img, LV_ALIGN_TOP_LEFT, 32 * i, 0);
- }
-}
void GuiConnectWalletInit(void)
{
@@ -1214,12 +947,12 @@ UREncodeResult *GuiGetFewchaData(void)
UREncodeResult *GuiGetNightlyData(void)
{
- return GuiGetWalletDataByCoin(true);
+ return GuiGetWalletDataByCoin(false);
}
UREncodeResult *GuiGetSuiWalletData(void)
{
- return GuiGetWalletDataByCoin(false);
+ return GuiGetWalletDataByCoin(true);
}
UREncodeResult *GuiGetXrpToolkitData(void)
@@ -1240,22 +973,17 @@ UREncodeResult *GuiGetADAData(void)
UREncodeResult *GuiGetTonData(void)
{
bool isTon = GetMnemonicType() == MNEMONIC_TYPE_TON;
- uint8_t* mfp = NULL;
+ uint8_t mfp[4] = {0};
char* path = NULL;
char* xpub;
if (isTon) {
xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TON_NATIVE);
} else {
- mfp = SRAM_MALLOC(4);
GetMasterFingerPrint(mfp);
xpub = GetCurrentAccountPublicKey(XPUB_TYPE_TON_BIP39);
path = GetXPubPath(XPUB_TYPE_TON_BIP39);
}
- char* walletName = GetWalletName();
- if (walletName == NULL) {
- walletName = "Keystone";
- }
- return get_tonkeeper_wallet_ur(xpub, walletName, mfp, mfp == NULL ? 0 : 4, path);
+ return get_tonkeeper_wallet_ur(xpub, GetWalletName(), mfp, isTon ? 0 : sizeof(mfp), path);
}
void GuiPrepareArConnectWalletView(void)
@@ -1280,7 +1008,7 @@ void GuiConnectWalletSetQrdata(WALLET_LIST_INDEX_ENUM index)
switch (index) {
case WALLET_LIST_METAMASK:
func = GuiGetMetamaskData;
- AddMetaMaskCoins();
+ AddCoinsFromArray(g_metaMaskCoinArray, NUMBER_OF_ARRAYS(g_metaMaskCoinArray), true, 132);
break;
case WALLET_LIST_RABBY:
case WALLET_LIST_SAFE:
@@ -1289,54 +1017,53 @@ void GuiConnectWalletSetQrdata(WALLET_LIST_INDEX_ENUM index)
case WALLET_LIST_YEARN_FINANCE:
case WALLET_LIST_SUSHISWAP:
func = GuiGetMetamaskData;
- AddEthWalletCoins();
+ AddCoinsFromArray(g_ethWalletCoinArray, NUMBER_OF_ARRAYS(g_ethWalletCoinArray), true, 132);
break;
case WALLET_LIST_IMTOKEN:
func = GuiGetImTokenData;
- AddEthWalletCoins();
+ AddCoinsFromArray(g_ethWalletCoinArray, NUMBER_OF_ARRAYS(g_ethWalletCoinArray), true, 132);
break;
case WALLET_LIST_CORE:
func = GuiGetCoreWalletData;
- AddCoreWalletCoins();
+ AddCoinsFromArray(g_coreCoinArray, NUMBER_OF_ARRAYS(g_coreCoinArray), false, 0);
break;
case WALLET_LIST_BITGET:
func = GuiGetBitgetWalletData;
- AddBitgetWalletCoins();
+ AddCoinsFromArray(g_bitgetWalletCoinArray, NUMBER_OF_ARRAYS(g_bitgetWalletCoinArray), false, 0);
break;
case WALLET_LIST_OKX:
func = GuiGetOkxWalletData;
- AddOkxWalletCoins();
+ AddCoinsFromArray(g_okxWalletCoinArray, NUMBER_OF_ARRAYS(g_okxWalletCoinArray), true, 132);
break;
-
case WALLET_LIST_BLUE:
func = GuiGetBlueWalletBtcData;
- AddBlueWalletCoins();
+ AddCoinsFromArray(g_blueWalletCoinArray, NUMBER_OF_ARRAYS(g_blueWalletCoinArray), false, 0);
break;
// todo zeus wallet use same ur logic as sparrow wallet (m/49'/0'/0' 、 m/44'/0'/0' 、 m/84'/0'/0' and m/86'/0'/0' )
case WALLET_LIST_ZEUS:
case WALLET_LIST_SPARROW:
case WALLET_LIST_BABYLON:
func = GuiGetSparrowWalletBtcData;
- AddBlueWalletCoins();
+ AddCoinsFromArray(g_blueWalletCoinArray, NUMBER_OF_ARRAYS(g_blueWalletCoinArray), false, 0);
break;
case WALLET_LIST_UNISAT:
func = GuiGetSparrowWalletBtcData;
- AddUniSatWalletCoins();
+ AddCoinsFromArray(g_UniSatCoinArray, NUMBER_OF_ARRAYS(g_UniSatCoinArray), true, 32 * 5);
lv_label_set_text(g_coinTitleLabel, _("connect_wallet_supported_tokens"));
break;
case WALLET_LIST_SUB:
break;
case WALLET_LIST_SOLFARE:
func = GuiGetSolflareData;
- AddSolflareCoins();
+ AddCoinsFromArray(g_solfareCoinArray, NUMBER_OF_ARRAYS(g_solfareCoinArray), false, 0);
break;
case WALLET_LIST_HELIUM:
func = GuiGetHeliumData;
- AddHeliumWalletCoins();
+ AddCoinsFromArray(g_heliumCoinArray, NUMBER_OF_ARRAYS(g_heliumCoinArray), false, 0);
break;
case WALLET_LIST_BACKPACK:
func = GuiGetBackpackData;
- AddBackpackWalletCoins();
+ AddCoinsFromArray(g_backpackWalletCoinArray, NUMBER_OF_ARRAYS(g_backpackWalletCoinArray), false, 0);
break;
case WALLET_LIST_MINT_SCAN:
case WALLET_LIST_KEPLR:
@@ -1345,19 +1072,19 @@ void GuiConnectWalletSetQrdata(WALLET_LIST_INDEX_ENUM index)
break;
case WALLET_LIST_LEAP:
func = GuiGetLeapData;
- AddLeapCoins();
+ AddCoinsFromArray(g_leapCoinArray, NUMBER_OF_ARRAYS(g_leapCoinArray), true, 32 * 8);
break;
case WALLET_LIST_WANDER:
func = GuiGetWanderData;
- AddWanderConnectCoins();
+ AddCoinsFromArray(g_wanderCoinArray, NUMBER_OF_ARRAYS(g_wanderCoinArray), false, 0);
break;
case WALLET_LIST_BEACON:
func = GuiGetWanderData;
- AddBeaconCoins();
+ AddCoinsFromArray(g_beaconCoinArray, NUMBER_OF_ARRAYS(g_beaconCoinArray), false, 0);
break;
case WALLET_LIST_XBULL:
func = GuiGetXBullData;
- AddXBullCoins();
+ AddCoinsFromArray(g_xbullCoinArray, NUMBER_OF_ARRAYS(g_xbullCoinArray), false, 0);
break;
case WALLET_LIST_TYPHON:
func = GuiGetADAData;
@@ -1388,24 +1115,24 @@ void GuiConnectWalletSetQrdata(WALLET_LIST_INDEX_ENUM index)
break;
case WALLET_LIST_PETRA:
func = GuiGetPetraData;
- AddPetraCoins();
+ AddCoinsFromArray(g_petraCoinArray, NUMBER_OF_ARRAYS(g_petraCoinArray), false, 0);
break;
case WALLET_LIST_XRP_TOOLKIT:
func = GuiGetXrpToolkitData;
AddChainAddress();
break;
case WALLET_LIST_THORWALLET:
- func = GuiGetThorWalletBtcData;
- AddThorWalletCoins();
+ func = GuiGetThorWalletData;
+ AddCoinsFromArray(g_ThorWalletCoinArray, NUMBER_OF_ARRAYS(g_ThorWalletCoinArray), false, 0);
break;
case WALLET_LIST_TONKEEPER:
func = GuiGetTonData;
- AddTonCoins();
+ AddCoinsFromArray(g_tonKeeperCoinArray, NUMBER_OF_ARRAYS(g_tonKeeperCoinArray), false, 0);
break;
case WALLET_LIST_KEYSTONE:
// todo add keystone ur logic
func = GuiGetKeystoneConnectWalletData;
- AddKeystoneWalletCoins();
+ AddCoinsFromArray(g_keystoneWalletCoinArray, NUMBER_OF_ARRAYS(g_keystoneWalletCoinArray), false, 0);
break;
default:
return;
diff --git a/test/test_cmd.c b/test/test_cmd.c
index 343b6bf..230132e 100644
--- a/test/test_cmd.c
+++ b/test/test_cmd.c
@@ -133,7 +133,6 @@ static void RustTestSignLTCKeystone(int argc, char *argv[]);
static void RustTestSignDASHKeystone(int argc, char *argv[]);
static void RustTestSignBCHKeystone(int argc, char *argv[]);
static void RustTestDecodeUr(int argc, char *argv[]);
-static void RustGetConnectBlueWalletUR(int argc, char *argv[]);
static void RustTestKeyDerivation(int argc, char *argv[]);
static void RustGetMasterFingerprint(int argc, char *argv[]);
static void RustTestParseCryptoPSBT(int argc, char *argv[]);
@@ -153,7 +152,6 @@ static void RustTestDecodeMultiCryptoPSBT(int argc, char *argv[]);
static void RustGetConnectKeplrUR(int argc, char *argv[]);
static void RustGetConnectXrpToolKitUR(int argc, char *argv[]);
static void RustTestMemory(int argc, char *argv[]);
-static void RustGetSyncCompanionAppUR(int argc, char *argv[]);
static void RustGetConnectMetaMaskUR(int argc, char *argv[]);
static void RustTestGetAddressLTCSucceed(int argc, char *argv[]);
static void RustTestGetAddressTronSucceed(int argc, char *argv[]);
@@ -175,8 +173,6 @@ static void testXRPSignTx(int argc, char *argv[]);
static void RustTestCosmosCheckTx(int argc, char *argv[]);
static void RustTestCosmosSignTx(int argc, char *argv[]);
static void RustTestCosmosParseTx(int argc, char *argv[]);
-static void RustGetConnectSolanaWalletUR(int argc, char *argv[]);
-static void RustGetConnectAptosWalletUR(int argc, char *argv[]);
static void RustSolanaMessage(int argc, char *argv[]);
static void RustTestCosmosEvmSignTx(int argc, char *argv[]);
static void RustTestK1SignMeessageByKey(int argc, char *argv[]);
@@ -198,7 +194,6 @@ static void RustTestDecodeCryptoPSBT(int argc, char *argv[]);
static void RustTestDecodeKeystoneBTCSignResult(int argc, char *argv[]);
static void RustTestDecodeMultiCryptoPSBT(int argc, char *argv[]);
static void RustTestMemory(int argc, char *argv[]);
-static void RustGetSyncCompanionAppUR(int argc, char *argv[]);
static void RustTestGetAddressLTCSucceed(int argc, char *argv[]);
static void RustTestGetAddressTronSucceed(int argc, char *argv[]);
static void RustTestGetAddressSolanaSucceed(int argc, char *argv[]);
@@ -288,7 +283,6 @@ const static UartTestCmdItem_t g_uartTestCmdTable[] = {
{"rust test sign dash:", RustTestSignDASHKeystone},
{"rust test sign bch:", RustTestSignBCHKeystone},
{"rust test decode ur", RustTestDecodeUr},
- {"rust test get connect blue wallet ur", RustGetConnectBlueWalletUR},
{"rust get mfp:", RustGetMasterFingerprint},
{"rust test get connect keplr wallet ur", RustGetConnectKeplrUR},
{"rust test get connect xrp toolkit ur", RustGetConnectXrpToolKitUR},
@@ -306,8 +300,6 @@ const static UartTestCmdItem_t g_uartTestCmdTable[] = {
{"rust test cosmos check:", RustTestCosmosCheckTx},
{"rust test cosmos sign:", RustTestCosmosSignTx},
{"rust test cosmos parse:", RustTestCosmosParseTx},
- {"rust test solana sync", RustGetConnectSolanaWalletUR},
- {"rust test aptos sync", RustGetConnectAptosWalletUR},
{"rust test solana sign message:", RustSolanaMessage},
{"rust test cosmos evm sign:", RustTestCosmosEvmSignTx},
{"rust test sign message by private key:", RustTestK1SignMeessageByKey},
@@ -330,7 +322,6 @@ const static UartTestCmdItem_t g_uartTestCmdTable[] = {
{"rust test decode multi psbt", RustTestDecodeMultiCryptoPSBT},
{"rust test derivation:", RustTestKeyDerivation},
{"rust test memory", RustTestMemory},
- {"rust test get connect companion app ur", RustGetSyncCompanionAppUR},
{"rust test get ltc address succeed", RustTestGetAddressLTCSucceed},
{"rust test get tron address succeed", RustTestGetAddressTronSucceed},
{"rust test get solana address succeed:", RustTestGetAddressSolanaSucceed},
@@ -1238,17 +1229,6 @@ static void RustTestDecodeUr(int argc, char *argv[])
printf("FreeHeapSize = %d\n", xPortGetFreeHeapSize());
}
-static void RustGetConnectBlueWalletUR(int argc, char *argv[])
-{
- printf("RustGetConnectBlueWalletUR\r\n");
- UREncodeResult *ur = test_connect_blue_wallet();
- printf("encode ur\r\n");
- printf("is_multi_part is %d\r\n", ur->is_multi_part);
- printf("data is %s\r\n", ur->data);
- printf("error_code is %d\r\n", ur->error_code);
- printf("error_message is %s\r\n", ur->error_message);
-}
-
static void RustGetMasterFingerprint(int argc, char *argv[])
{
printf("RustGetMasterFingerprint\r\n");
@@ -1598,84 +1578,6 @@ static void RustTestCosmosParseTx(int argc, char *argv[])
printf("FreeHeapSize = %d\n", xPortGetFreeHeapSize());
}
-static void RustGetConnectSolanaWalletUR(int argc, char *argv[])
-{
- printf("RustGetConnectSolanaWalletUR\r\n");
- uint8_t mfp[4] = {0x52, 0x74, 0x47, 0x03};
-
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[7];
- public_keys->data = keys;
- public_keys->size = 7;
- keys[0].path = "m/44'/501'/0'/0'";
- keys[0].xpub = "e671e524ef43ccc5ef0006876f9a2fd66681d5abc5871136b343a3e4b073efde";
-
- keys[1].path = "m/44'/501'/1'/0'";
- keys[1].xpub = "dccf89e7b4992967e6b8ac31a03be3f8228d916048571d62d5db7eac6e83f728";
-
- keys[2].path = "m/44'/501'/2'/0'";
- keys[2].xpub = "81659cdd1f832de09b65d64d1fc36d62fe5094a35bfdf892c0447f477e75a6eb";
-
- keys[3].path = "m/44'/501'/7'";
- keys[3].xpub = "22816e1251a79cdce1ac4c787302df95510bffc3c22a92474a9c1b20d81d9c77";
-
- keys[4].path = "m/44'/501'/8'";
- keys[4].xpub = "90232ade711630651ba71f89aac472a26c8ceeb64c493a1e24a7bec1ead89511";
-
- keys[5].path = "m/44'/501'/9'";
- keys[5].xpub = "f65e650a5d24cc0fbd1df3d76b4d643a2aab9b169ead90560c8e764a5f11b7ba";
-
- keys[6].path = "m/44'/501'";
- keys[6].xpub = "f85c46dbd5652a4143b651dc162ac9a37a03ac015e749b4bae8f0c38bee54c48";
-
- UREncodeResult *ur = get_connect_solana_wallet_ur(mfp, sizeof(mfp), public_keys);
- printf("encode ur\r\n");
- if (ur->error_code == 0) {
- printf("solana is_multi_part is %d\r\n", ur->is_multi_part);
- printf("solana data is %s\r\n", ur->data);
- } else {
- printf("solana error_code is %s\r\n", ur->error_code);
- printf("solana error_message is %s\r\n", ur->error_message);
- }
- free_ur_encode_result(ur);
- SRAM_FREE(public_keys);
- PrintRustMemoryStatus();
- printf("FreeHeapSize = %d\n", xPortGetFreeHeapSize());
-}
-
-static void RustGetConnectAptosWalletUR(int argc, char *argv[])
-{
- printf("RustGetConnectAptosWalletUR\r\n");
- uint8_t mfp[4] = {0x52, 0x74, 0x47, 0x03};
-
- PtrT_CSliceFFI_ExtendedPublicKey public_keys = SRAM_MALLOC(sizeof(CSliceFFI_ExtendedPublicKey));
- ExtendedPublicKey keys[3];
- public_keys->data = keys;
- public_keys->size = 3;
- keys[0].path = "m/44'/637'/0'/0'/0'";
- keys[0].xpub = "7ed1e1d5656675c2424d2cf9a7d5142d85e0afed3780c5f9c684f69b8f875775";
-
- keys[1].path = "m/44'/637'/1'/0'/0'";
- keys[1].xpub = "a40ec03893fd955692221f5512f872e4cfd171a5c0d9822a64d4303779fa62be";
-
- keys[2].path = "m/44'/637'/2'/0'/0'";
- keys[2].xpub = "e72182e5e8e9f329d7febd8f17e3bb808ab085c408dcb2a7cd15638bb12821cb";
-
- UREncodeResult *ur = get_connect_aptos_wallet_ur(mfp, sizeof(mfp), public_keys);
- printf("encode ur\r\n");
- if (ur->error_code == 0) {
- printf("aptos is_multi_part is %d\r\n", ur->is_multi_part);
- printf("aptos data is %s\r\n", ur->data);
- } else {
- printf("aptos error_code is %s\r\n", ur->error_code);
- printf("aptos error_message is %s\r\n", ur->error_message);
- }
- free_ur_encode_result(ur);
- SRAM_FREE(public_keys);
- PrintRustMemoryStatus();
- printf("FreeHeapSize = %d\n", xPortGetFreeHeapSize());
-}
-
static void RustSolanaMessage(int argc, char *argv[])
{
@@ -2092,48 +1994,6 @@ static void RustTestKeyDerivation(int argc, char *argv[])
printf("FreeHeapSize = %d\n", xPortGetFreeHeapSize());
}
-static void RustGetSyncCompanionAppUR(int argc, char *argv[])
-{
- printf("RustGetSyncCompanionAppUR\r\n");
-
- uint8_t mfp[4] = {0x70, 0x7e, 0xed, 0x6c};
-
- AccountConfig account;
- account.hd_path = "M/49'/0'/0'";
- account.x_pub = "xpub6C6nQwHaWbSrzs5tZ1q7m5R9cPK9eYpNMFesiXsYrgc1P8bvLLAet9JfHjYXKjToD8cBRswJXXbbFpXgwsswVPAZzKMa1jUp2kVkGVUaJa7";
- account.address_length = 20;
- account.is_multi_sign = false;
-
- CoinConfig coin;
- coin.is_active = true;
- coin.coin_code = "BTC";
- coin.accounts = &account;
- coin.accounts_length = 1;
-
- AccountConfig account1;
- account1.hd_path = "M/44'/0'/0'";
- account1.x_pub = "xpub6BosfCnifzxcFwrSzQiqu2DBVTshkCXacvNsWGYJVVhhawA7d4R5WSWGFNbi8Aw6ZRc1brxMyWMzG3DSSSSoekkudhUd9yLb6qx39T9nMdj";
- account1.address_length = 20;
- account1.is_multi_sign = false;
-
- CoinConfig coin1;
- coin1.is_active = true;
- coin1.coin_code = "BTC_LEGACY";
- coin1.accounts = &account1;
- coin1.accounts_length = 1;
- CoinConfig coins[2] = {coin, coin1};
-
- UREncodeResult *result = get_connect_companion_app_ur(mfp, sizeof(mfp), SOFTWARE_VERSION, coins, 2);
- printf("is_multi_part is %d\r\n", result->is_multi_part);
- printf("data is %s\r\n", result->data);
- printf("error_code is %d\r\n", result->error_code);
- printf("error_message is %s\r\n", result->error_message);
-
- free_ur_encode_result(result);
-
- PrintRustMemoryStatus();
- printf("FreeHeapSize = %d\n", xPortGetFreeHeapSize());
-}
static void testEthTx(int argc, char *argv[])
{
Why this scored 27/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.