diff --git a/Cargo.toml b/Cargo.toml index 066444a..086f9cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,21 +74,37 @@ egui-notify = "=0.11.0" # kaspa-wrpc-server = { path = "../rusty-kaspa/rpc/wrpc/server" } # kaspad = { path = "../rusty-kaspa/kaspad" } -kaspa-addresses = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-alloc = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-bip32 = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-cli = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-consensus-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-metrics-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-notify = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-rpc-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-rpc-service = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-utils = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspa-wallet-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master", features=["no-unsafe-eval"] } -kaspa-wrpc-client = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master", features=["no-unsafe-eval"] } -kaspa-wrpc-server = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } -kaspad = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-addresses = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-alloc = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-bip32 = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-cli = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-consensus-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-metrics-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-notify = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-rpc-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-rpc-service = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-utils = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspa-wallet-core = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master", features=["no-unsafe-eval"] } +# kaspa-wrpc-client = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master", features=["no-unsafe-eval"] } +# kaspa-wrpc-server = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } +# kaspad = { git = "https://github.com/kaspanet/rusty-kaspa.git", branch = "master" } + +kaspa-addresses = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-alloc = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-bip32 = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-cli = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-consensus-core = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-core = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-metrics-core = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-notify = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-rpc-core = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-rpc-service = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-utils = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspa-wallet-core = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev", features=["no-unsafe-eval"] } +kaspa-wrpc-client = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev", features=["no-unsafe-eval"] } +kaspa-wrpc-server = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } +kaspad = { git = "https://github.com/aspectron/rusty-kaspa.git", branch = "dev" } # _________________________________________________________ # _ _ _ ____ ____ _ _ ____ _ ____ _ _ _ ____ ____ diff --git a/core/src/core.rs b/core/src/core.rs index 5ea40c1..636aa94 100644 --- a/core/src/core.rs +++ b/core/src/core.rs @@ -285,6 +285,10 @@ impl Core { .unwrap(); } + pub fn network(&self) -> Network { + self.settings.node.network + } + pub fn wallet(&self) -> &Arc { &self.wallet } @@ -626,7 +630,13 @@ impl Core { _ctx: &egui::Context, _frame: &mut eframe::Frame, ) -> Result<()> { + // println!("event: {:?}", event); match event { + Events::NetworkChange(network) => { + self.modules.clone().values().for_each(|module| { + module.network_change(self, network); + }); + } Events::UpdateStorage(_options) => { #[cfg(not(target_arch = "wasm32"))] self.storage @@ -692,6 +702,18 @@ impl Core { self.wallet_list = (*wallet_list).clone(); self.wallet_list.sort(); } + Events::WalletUpdate => { + if let Some(account_collection) = self.account_collection.as_ref() { + let mut account_manager = self + .modules + .get(&TypeId::of::()) + .unwrap() + .clone(); + account_manager + .get_mut::() + .update(account_collection); + } + } Events::Notify { user_notification: notification, } => { @@ -710,6 +732,7 @@ impl Core { self.prv_key_data_map = Some(prv_key_data_info_map); } Events::Wallet { event } => { + // println!("event: {:?}", event); match *event { CoreWallet::Error { message } => { // runtime().notify(UserNotification::error(message.as_str())); @@ -717,6 +740,14 @@ impl Core { } CoreWallet::UtxoProcStart => { self.state.error = None; + + if self.state().is_open() { + let wallet = self.wallet().clone(); + spawn(async move { + wallet.wallet_reload(false).await?; + Ok(()) + }); + } } CoreWallet::UtxoProcStop => {} CoreWallet::UtxoProcError { message } => { @@ -733,7 +764,9 @@ impl Core { self.state.url = url; self.state.network_id = Some(network_id); - self.module.clone().connect(self); + self.modules.clone().values().for_each(|module| { + module.connect(self, Network::from(network_id)); + }); } #[allow(unused_variables)] CoreWallet::Disconnect { @@ -751,7 +784,9 @@ impl Core { self.metrics = None; self.network_pressure.clear(); - self.module.clone().disconnect(self); + self.modules.clone().values().for_each(|module| { + module.disconnect(self); + }); } CoreWallet::UtxoIndexNotEnabled { url } => { self.exception = Some(Exception::UtxoIndexNotEnabled { url }); @@ -774,20 +809,26 @@ impl Core { self.hint = hint; self.discard_hint = false; } - // TODO remove reloading notification - CoreWallet::WalletReload { .. } => {} + CoreWallet::WalletReload { + wallet_descriptor, + account_descriptors, + } => { + self.wallet_descriptor = wallet_descriptor; + let network_id = self + .state + .network_id + .unwrap_or(self.settings.node.network.into()); + let account_descriptors = + account_descriptors.ok_or(Error::WalletOpenAccountDescriptors)?; + self.load_accounts(network_id, account_descriptors)?; + } CoreWallet::WalletOpen { wallet_descriptor, account_descriptors, - // } - // | CoreWallet::WalletReload { - // wallet_descriptor, - // account_descriptors, } => { self.state.is_open = true; self.wallet_descriptor = wallet_descriptor; - // let network_id = self.state.network_id.ok_or(Error::WalletOpenNetworkId)?; let network_id = self .state .network_id @@ -795,7 +836,6 @@ impl Core { let account_descriptors = account_descriptors.ok_or(Error::WalletOpenAccountDescriptors)?; self.load_accounts(network_id, account_descriptors)?; - // self.update_account_list(); } CoreWallet::WalletCreate { wallet_descriptor, @@ -821,23 +861,7 @@ impl Core { CoreWallet::AccountActivation { ids: _ } => {} CoreWallet::AccountCreate { account_descriptor: _, - } => { - // let account = Account::from(account_descriptor); - // self.account_collection - // .as_mut() - // .expect("account collection") - // .push_unchecked(account.clone()); - // let device = self.device().clone(); - // self.get_mut::() - // .select(Some(account.clone()), device); - // // self.select::(); - - // let wallet = self.wallet().clone(); - // spawn(async move { - // wallet.accounts_activate(Some(vec![account.id()])).await?; - // Ok(()) - // }); - } + } => {} CoreWallet::AccountUpdate { account_descriptor } => { let account_id = account_descriptor.account_id(); if let Some(account_collection) = self.account_collection.as_ref() { @@ -976,11 +1000,16 @@ impl Core { network_id: NetworkId, account_descriptors: Vec, ) -> Result<()> { + let network = Network::from(network_id); + if self.network() != network { + return Err(Error::InvalidNetwork(network.to_string())); + } + let application_events_sender = self.application_events_channel.sender.clone(); let account_list = account_descriptors .into_iter() - .map(Account::from) + .map(|account_descriptor| Account::from(network, account_descriptor)) .collect::>(); self.account_collection = Some(account_list.clone().into()); @@ -1019,7 +1048,7 @@ impl Core { .map(|account_id| { runtime .wallet() - .transactions_data_get_range(account_id, network_id, 0..4096) + .transactions_data_get_range(account_id, network_id, 0..8192) }) .collect::>(); @@ -1048,6 +1077,8 @@ impl Core { runtime.wallet().accounts_activate(None).await?; + application_events_sender.send(Events::WalletUpdate).await?; + Ok(()) }); @@ -1058,28 +1089,29 @@ impl Core { &mut self, account_descriptors: Vec, ) -> Vec { + let network = self.network(); + let accounts = account_descriptors .into_iter() - .map(Account::from) - .collect::>(); //(account_descriptor); + .map(|account_descriptor| Account::from(network, account_descriptor)) + .collect::>(); + self.account_collection .as_mut() .expect("account collection") .extend_unchecked(accounts.clone()); - // .push_unchecked(account.clone()); + if let Some(first) = accounts.first() { let device = self.device().clone(); self.get_mut::() .select(Some(first.clone()), device); } - // self.get_mut::() - // .select(Some(account.clone()), device); - // self.select::(); + let account_ids = accounts .iter() .map(|account| account.id()) .collect::>(); - // let account_id = account.id(); + let wallet = self.wallet().clone(); spawn(async move { wallet.accounts_activate(Some(account_ids)).await?; diff --git a/core/src/events.rs b/core/src/events.rs index c73639a..bb9e6b7 100644 --- a/core/src/events.rs +++ b/core/src/events.rs @@ -9,6 +9,7 @@ pub type ApplicationEventsChannel = crate::runtime::channel::Channel; #[derive(Clone, Debug)] pub enum Events { + NetworkChange(Network), UpdateStorage(StorageUpdateOptions), VisibilityChange(VisibilityState), VersionUpdate(Release), @@ -29,6 +30,7 @@ pub enum Events { Wallet { event: Box, }, + WalletUpdate, PrvKeyDataInfo { prv_key_data_info_map: HashMap>, }, diff --git a/core/src/modules/account_create.rs b/core/src/modules/account_create.rs index e54ec5f..79ed3e8 100644 --- a/core/src/modules/account_create.rs +++ b/core/src/modules/account_create.rs @@ -87,7 +87,9 @@ impl AccountCreate { } impl ModuleT for AccountCreate { + fn modal(&self) -> bool { true } + fn style(&self) -> ModuleStyle { ModuleStyle::Mobile } diff --git a/core/src/modules/account_manager/mod.rs b/core/src/modules/account_manager/mod.rs index c173d7d..076b0e0 100644 --- a/core/src/modules/account_manager/mod.rs +++ b/core/src/modules/account_manager/mod.rs @@ -127,6 +127,7 @@ pub struct ManagerContext { focus : FocusManager, wallet_secret : String, payment_secret : String, + loading : bool, } impl ManagerContext { @@ -218,12 +219,11 @@ impl ModuleT for AccountManager { true } - // fn reload(&mut self, core : &mut Core) { - // if let AccountManagerState::Overview { account } = self.state.clone() { - // let account_id = account.id(); - // core.account_collection().get() - // } - // } + fn network_change(&mut self, _core: &mut Core, _network : Network) { + if let AccountManagerState::Overview { .. } = self.state.clone() { + self.context.loading = true; + } + } fn render( &mut self, @@ -258,8 +258,21 @@ impl AccountManager { } } else { self.state = AccountManagerState::Select; + self.context.loading = false; + } + + } + + pub fn update(&mut self, account_collection : &AccountCollection) { + if let AccountManagerState::Overview { account } = self.state.clone() { + if let Some(updated_account) = account_collection.get(&account.id()) { + self.state = AccountManagerState::Overview { account : updated_account.clone() }; + } else { + self.state = AccountManagerState::Select; + } } + self.context.loading = false; } pub fn section(&mut self, section : AccountManagerSection) { @@ -343,6 +356,18 @@ impl AccountManager { } AccountManagerState::Overview { account } => { + + if self.context.loading { + Panel::new(self) + .with_caption(i18n("Updating...")) + .with_body(|_this, ui| { + ui.add_space(64.); + ui.add(egui::Spinner::new().size(92.)); + }).render(ui); + + return Ok(()); + } + let rc = RenderContext::new(&account, network_type, current_daa_score)?; if core.device().single_pane() { self.render_singular_layout(core,ui,&rc, self.section); diff --git a/core/src/modules/mod.rs b/core/src/modules/mod.rs index 16a3a1f..a8485d9 100644 --- a/core/src/modules/mod.rs +++ b/core/src/modules/mod.rs @@ -63,8 +63,9 @@ pub trait ModuleT: Downcast { fn activate(&mut self, _core: &mut Core) {} fn deactivate(&mut self, _core: &mut Core) {} fn reset(&mut self, _core: &mut Core) {} - fn connect(&mut self, _core: &mut Core) {} + fn connect(&mut self, _core: &mut Core, _network: Network) {} fn disconnect(&mut self, _core: &mut Core) {} + fn network_change(&mut self, _core: &mut Core, _network: Network) {} fn hide(&mut self, _core: &mut Core) {} fn show(&mut self, _core: &mut Core) {} @@ -112,14 +113,18 @@ impl Module { self.inner.module.borrow_mut().reset(core) } - pub fn connect(&self, core: &mut Core) { - self.inner.module.borrow_mut().connect(core) + pub fn connect(&self, core: &mut Core, network: Network) { + self.inner.module.borrow_mut().connect(core, network) } pub fn disconnect(&self, core: &mut Core) { self.inner.module.borrow_mut().disconnect(core) } + pub fn network_change(&self, core: &mut Core, network: Network) { + self.inner.module.borrow_mut().network_change(core, network) + } + pub fn hide(&self, core: &mut Core) { self.inner.module.borrow_mut().hide(core) } diff --git a/core/src/modules/private_key_create.rs b/core/src/modules/private_key_create.rs index 57b3d36..fdaa2bb 100644 --- a/core/src/modules/private_key_create.rs +++ b/core/src/modules/private_key_create.rs @@ -104,6 +104,9 @@ impl PrivateKeyCreate { } impl ModuleT for PrivateKeyCreate { + + fn modal(&self) -> bool { true } + fn render( &mut self, core: &mut Core, @@ -441,7 +444,7 @@ impl ModuleT for PrivateKeyCreate { // TODO - add account to wallet ^^^ let descriptor = account.descriptor().unwrap(); - let account = Account::from(descriptor); + let account = Account::from(core.network(), descriptor); core.account_collection.as_mut().unwrap().push_unchecked(account.clone()); core.select::(); diff --git a/core/src/network.rs b/core/src/network.rs index a06f05e..7f72528 100644 --- a/core/src/network.rs +++ b/core/src/network.rs @@ -79,6 +79,22 @@ impl From<&Network> for NetworkId { } } +impl From for Network { + fn from(value: NetworkId) -> Self { + match value.network_type { + NetworkType::Mainnet => Network::Mainnet, + NetworkType::Testnet => match value.suffix { + Some(10) => Network::Testnet10, + Some(11) => Network::Testnet11, + Some(x) => unreachable!("Testnet suffix {} is not supported", x), + None => panic!("Testnet suffix not provided"), + }, + NetworkType::Devnet => unreachable!("Devnet is not supported"), + NetworkType::Simnet => unreachable!("Simnet is not supported"), + } + } +} + impl From for Params { fn from(network: Network) -> Self { NetworkId::from(network).into() diff --git a/core/src/primitives/account.rs b/core/src/primitives/account.rs index e24eb27..5534818 100644 --- a/core/src/primitives/account.rs +++ b/core/src/primitives/account.rs @@ -48,10 +48,11 @@ struct Inner { transactions: Mutex, total_transaction_count: AtomicU64, is_loading: AtomicBool, + network: Mutex, } impl Inner { - fn new(descriptor: AccountDescriptor) -> Self { + fn new(network: Network, descriptor: AccountDescriptor) -> Self { let context = AccountContext::new(&descriptor); Self { id: *descriptor.account_id(), @@ -62,6 +63,7 @@ impl Inner { transactions: Mutex::new(TransactionCollection::default()), total_transaction_count: AtomicU64::new(0), is_loading: AtomicBool::new(true), + network: Mutex::new(network), } } } @@ -71,15 +73,21 @@ pub struct Account { inner: Arc, } -impl From for Account { - fn from(descriptor: AccountDescriptor) -> Self { +// impl From for Account { +// fn from(descriptor: AccountDescriptor) -> Self { +// Self { +// inner: Arc::new(Inner::new(network, descriptor)), +// } +// } +// } + +impl Account { + pub fn from(network: Network, descriptor: AccountDescriptor) -> Self { Self { - inner: Arc::new(Inner::new(descriptor)), + inner: Arc::new(Inner::new(network, descriptor)), } } -} -impl Account { pub fn descriptor(&self) -> MutexGuard<'_, AccountDescriptor> { self.inner.descriptor.lock().unwrap() } @@ -140,6 +148,8 @@ impl Account { } pub fn update(&self, descriptor: AccountDescriptor) { + println!("$$$$$ UPDATING ACCOUNT: {:?}", descriptor); + *self.inner.context.lock().unwrap() = AccountContext::new(&descriptor); *self.inner.descriptor.lock().unwrap() = descriptor; } @@ -150,6 +160,10 @@ impl Account { Ok(()) } + pub fn update_network(&self, network: Network) { + *self.inner.network.lock().unwrap() = network; + } + pub fn set_loading(&self, is_loading: bool) { self.inner.is_loading.store(is_loading, Ordering::SeqCst); } @@ -170,15 +184,25 @@ impl Account { pub fn load_transactions( &self, - transactions: Vec>, + mut transactions: Vec>, total: u64, ) -> Result<()> { + // TODO - pagination + self.transactions().clear(); + + transactions.sort_by(|a, b| b.block_daa_score.cmp(&a.block_daa_score)); + self.set_transaction_count(total); self.transactions() .load(transactions.into_iter().map(|t| t.into())); Ok(()) } + + pub fn clear_transactions(&self) { + self.set_transaction_count(0); + self.transactions().clear(); + } } impl IdT for Account { diff --git a/core/src/runtime/services/kaspa/mod.rs b/core/src/runtime/services/kaspa/mod.rs index 0fb069d..592a8ab 100644 --- a/core/src/runtime/services/kaspa/mod.rs +++ b/core/src/runtime/services/kaspa/mod.rs @@ -311,6 +311,8 @@ impl KaspaService { .unwrap() .replace(Instant::now()); + *self.network.lock().unwrap() = network; + let rpc_api = rpc.rpc_api().clone(); self.wallet() @@ -346,6 +348,20 @@ impl KaspaService { } } + fn network(&self) -> Network { + *self.network.lock().unwrap() + } + + async fn handle_network_change(&self, network: Network) -> Result<()> { + if network != self.network() { + self.application_events + .send(Events::NetworkChange(network)) + .await?; + } + + Ok(()) + } + pub async fn connect_all_services(&self) -> Result<()> { for service in crate::runtime::runtime().services().into_iter() { service.connect_rpc().await?; @@ -428,9 +444,10 @@ impl Service for KaspaService { #[cfg(not(target_arch = "wasm32"))] KaspadServiceEvents::StartInternalInProc { config, network } => { - self.stop_all_services().await?; + self.handle_network_change(network).await?; + let kaspad = Arc::new(inproc::InProc::default()); self.retain(kaspad.clone()); // this.kaspad.lock().unwrap().replace(kaspad.clone()); @@ -450,6 +467,8 @@ impl Service for KaspaService { KaspadServiceEvents::StartInternalAsDaemon { config, network } => { self.stop_all_services().await?; + self.handle_network_change(network).await?; + let kaspad = Arc::new(daemon::Daemon::new(None, &self.service_events)); self.retain(kaspad.clone()); kaspad.clone().start(config).await.unwrap(); @@ -469,6 +488,8 @@ impl Service for KaspaService { KaspadServiceEvents::StartExternalAsDaemon { path, config, network } => { self.stop_all_services().await?; + self.handle_network_change(network).await?; + let kaspad = Arc::new(daemon::Daemon::new(Some(path), &self.service_events)); self.retain(kaspad.clone()); @@ -488,6 +509,8 @@ impl Service for KaspaService { KaspadServiceEvents::StartRemoteConnection { rpc_config, network } => { self.stop_all_services().await?; + self.handle_network_change(network).await?; + let rpc = Self::create_rpc_client(&rpc_config, network).expect("Kaspad Service - unable to create wRPC client"); self.start_all_services(rpc, network).await?; self.connect_rpc_client().await?; @@ -496,6 +519,8 @@ impl Service for KaspaService { KaspadServiceEvents::Disable { network } => { self.stop_all_services().await?; + self.handle_network_change(network).await?; + if self.wallet().is_open() { self.wallet().close().await.ok(); } diff --git a/resources/i18n/i18n.json b/resources/i18n/i18n.json index e3fa56c..bcc7bda 100644 --- a/resources/i18n/i18n.json +++ b/resources/i18n/i18n.json @@ -17,10 +17,10 @@ "lt": "Lithuanian", "pa": "Panjabi", "fa": "Farsi", - "sv": "Swedish", - "fi": "Finnish", "es": "EspaƱol", + "sv": "Swedish", "uk": "Ukrainian", + "fi": "Finnish", "af": "Afrikaans", "et": "Esti", "en": "English", @@ -59,20 +59,21 @@ "translations": { "pt": {}, "hi": {}, + "fi": {}, "nl": {}, "vi": {}, "fil": {}, "lt": {}, "pa": {}, "fa": {}, + "es": {}, "sv": {}, - "fi": {}, "uk": {}, - "es": {}, "af": {}, "et": {}, "en": { "Cache Memory Size:": "Cache Memory Size:", + "Select Account": "Select Account", "Market": "Market", "Local p2p Node Configuration": "Local p2p Node Configuration", "gRPC Network Interface & Port": "gRPC Network Interface & Port", @@ -119,6 +120,7 @@ "All": "All", "Connect to a local node (localhost)": "Connect to a local node (localhost)", "peers": "peers", + "Creating Account": "Creating Account", "Processed Headers": "Processed Headers", "Creating Wallet": "Creating Wallet", "Medium Wide": "Medium Wide", @@ -139,6 +141,7 @@ "Uptime:": "Uptime:", "Small (10 BPS)": "Small (10 BPS)", "Not connected": "Not connected", + "The node is currently syncing with the Kaspa p2p network. Account balances may be out of date.": "The node is currently syncing with the Kaspa p2p network. Account balances may be out of date.", "Your wallet has been created and is ready to use.": "Your wallet has been created and is ready to use.", "Please create a stronger password": "Please create a stronger password", "Disabled": "Disabled", @@ -146,12 +149,12 @@ "Secret is too weak": "Secret is too weak", "Please note, copying to clipboard carries a risk of exposing your mnemonic to malware.": "Please note, copying to clipboard carries a risk of exposing your mnemonic to malware.", "Resulting daemon arguments:": "Resulting daemon arguments:", - "Network": "Network", + "Delete Database & Logs": "Delete Database & Logs", "Time Offset:": "Time Offset:", "Market Monitor": "Market Monitor", "Unlock Wallet": "Unlock Wallet", "Wallet Encryption Password": "Wallet Encryption Password", - "Delete Database & Logs": "Delete Database & Logs", + "Network": "Network", "Please note that this is an alpha release. Until this message is removed, avoid using this software with mainnet funds.": "Please note that this is an alpha release. Until this message is removed, avoid using this software with mainnet funds.", "You are currently not connected to the Kaspa node.": "You are currently not connected to the Kaspa node.", "Dependencies": "Dependencies", @@ -166,6 +169,7 @@ "Testnet-10": "Testnet-10", "Clear": "Clear", "Metrics are not currently available": "Metrics are not currently available", + "Syncing UTXO entries...": "Syncing UTXO entries...", "p2p Tx/s": "p2p Tx/s", "wRPC Encoding:": "wRPC Encoding:", "License Information": "License Information", @@ -191,10 +195,12 @@ "Skip": "Skip", "1 BPS test network": "1 BPS test network", "No peers": "No peers", + "Enter account name (optional)": "Enter account name (optional)", "Total Tx": "Total Tx", "Peers": "Peers", "Processed Transactions": "Processed Transactions", "Borsh Connection Attempts": "Borsh Connection Attempts", + "Please enter the account name": "Please enter the account name", "Decrypting wallet, please wait...": "Decrypting wallet, please wait...", "wRPC Borsh Tx": "wRPC Borsh Tx", "Mempool": "Mempool", @@ -250,11 +256,13 @@ "Double click on the graph to re-center...": "Double click on the graph to re-center...", "Stor Read": "Stor Read", "Database Blocks": "Database Blocks", + "Not Connected": "Not Connected", "Use all available system memory": "Use all available system memory", - "Address:": "Address:", "Headers": "Headers", + "Address:": "Address:", "Custom": "Custom", "Mainnet (Main Kaspa network)": "Mainnet (Main Kaspa network)", + "Please enter the wallet secret": "Please enter the wallet secret", "Developer mode enables advanced and experimental features": "Developer mode enables advanced and experimental features", "Submitted Blocks": "Submitted Blocks", "Remote p2p Node Configuration": "Remote p2p Node Configuration", @@ -280,6 +288,7 @@ "Performance": "Performance", "Export Wallet Data": "Export Wallet Data", "Please select the private key to export": "Please select the private key to export", + "Enter your wallet secret": "Enter your wallet secret", "Reset Settings": "Reset Settings", "Copied to clipboard": "Copied to clipboard", "CONNECTED": "CONNECTED", @@ -336,6 +345,8 @@ "Balance: N/A": "Balance: N/A", "gRPC Tx": "gRPC Tx", "Language:": "Language:", + "Please select an account type": "Please select an account type", + "Wallet Secret": "Wallet Secret", "p2p Rx": "p2p Rx", "Other operations": "Other operations", "12 word mnemonic": "12 word mnemonic", @@ -396,6 +407,7 @@ "Network Difficulty": "Network Difficulty", "IBD:": "IBD:", "Testnet-11": "Testnet-11", + "Syncing Cryptographic Proof...": "Syncing Cryptographic Proof...", "Details": "Details", "Bandwidth": "Bandwidth", "Total Rx": "Total Rx",