Security (Desktop Wallet): - Implement BIP39 mnemonic generation with cryptographic RNG - Add Argon2id password-based key derivation (64MB, 3 iterations) - Add ChaCha20-Poly1305 authenticated encryption for seed storage - Add mnemonic auto-clear (60s timeout) and clipboard auto-clear (30s) - Add sanitized error logging to prevent credential leaks - Strengthen CSP with object-src, base-uri, form-action, frame-ancestors - Clear sensitive state on component unmount Explorer (Gas Estimator): - Add Gas Estimation page with from/to/amount/data inputs - Add bech32 address validation (synor1/tsynor1 prefix) - Add BigInt-based amount parsing to avoid floating point errors - Add production guard for mock mode (cannot enable in prod builds) Monitoring (30-day Testnet): - Add Prometheus config with 30-day retention - Add comprehensive alert rules for node health, consensus, network, mempool - Add Alertmanager with severity-based routing and inhibition rules - Add Grafana with auto-provisioned datasource and dashboard - Add Synor testnet dashboard with uptime SLA tracking Docker: - Update docker-compose.testnet.yml with monitoring profile - Fix node-exporter for macOS Docker Desktop compatibility - Change Grafana port to 3001 to avoid conflict
67 lines
2.1 KiB
Rust
67 lines
2.1 KiB
Rust
//! Synor Desktop Wallet - Tauri Backend
|
|
//!
|
|
//! Provides native functionality for the desktop wallet:
|
|
//! - Secure key storage using OS keychain
|
|
//! - Direct RPC communication with Synor nodes
|
|
//! - Transaction signing with Dilithium3 post-quantum signatures
|
|
//! - File system access for wallet backups
|
|
|
|
mod commands;
|
|
mod crypto;
|
|
mod error;
|
|
mod wallet;
|
|
|
|
use tauri::Manager;
|
|
|
|
pub use error::{Error, Result};
|
|
|
|
/// Initialize the Tauri application with all plugins and commands
|
|
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
|
pub fn run() {
|
|
tauri::Builder::default()
|
|
.plugin(tauri_plugin_fs::init())
|
|
.plugin(tauri_plugin_store::Builder::default().build())
|
|
.plugin(tauri_plugin_shell::init())
|
|
.plugin(tauri_plugin_dialog::init())
|
|
.plugin(tauri_plugin_clipboard_manager::init())
|
|
.setup(|app| {
|
|
// Initialize wallet state
|
|
let wallet_state = wallet::WalletState::new();
|
|
app.manage(wallet_state);
|
|
|
|
#[cfg(debug_assertions)]
|
|
{
|
|
// Open devtools in development
|
|
if let Some(window) = app.get_webview_window("main") {
|
|
window.open_devtools();
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
})
|
|
.invoke_handler(tauri::generate_handler![
|
|
// Wallet management
|
|
commands::create_wallet,
|
|
commands::import_wallet,
|
|
commands::unlock_wallet,
|
|
commands::lock_wallet,
|
|
commands::get_wallet_info,
|
|
commands::export_mnemonic,
|
|
// Addresses & UTXOs
|
|
commands::get_addresses,
|
|
commands::generate_address,
|
|
commands::get_balance,
|
|
commands::get_utxos,
|
|
// Transactions
|
|
commands::create_transaction,
|
|
commands::sign_transaction,
|
|
commands::broadcast_transaction,
|
|
commands::get_transaction_history,
|
|
// Network
|
|
commands::connect_node,
|
|
commands::disconnect_node,
|
|
commands::get_network_status,
|
|
])
|
|
.run(tauri::generate_context!())
|
|
.expect("error while running tauri application");
|
|
}
|