diff --git a/Cargo.lock b/Cargo.lock index 26a542e65c..a882400b7a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -906,9 +906,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.36" +version = "1.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" +checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" dependencies = [ "find-msvc-tools", "jobserver", @@ -1531,7 +1531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357422a457ccb850dc8f1c1680e0670079560feaad6c2e247e3f345c4fab8a3f" dependencies = [ "heck", - "indexmap 2.11.1", + "indexmap 2.11.3", "itertools 0.14.0", "proc-macro-crate", "proc-macro2", @@ -1549,7 +1549,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b48e8e38a4aa565da767322b5ca55fb0f8347983c5bc7f7647db069405420479" dependencies = [ "heck", - "indexmap 2.11.1", + "indexmap 2.11.3", "itertools 0.14.0", "proc-macro-crate", "proc-macro2", @@ -2350,7 +2350,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.5+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -2408,7 +2408,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.1", + "indexmap 2.11.3", "slab", "tokio", "tokio-util", @@ -2727,9 +2727,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64", "bytes", @@ -2753,9 +2753,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2936,13 +2936,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.1" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" +checksum = "92119844f513ffa41556430369ab02c295a3578af21cf945caa3e9e0c2481ac3" dependencies = [ "equivalent", "hashbrown 0.15.5", "serde", + "serde_core", ] [[package]] @@ -3279,9 +3280,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.9.4", "libc", @@ -4139,7 +4140,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", - "indexmap 2.11.1", + "indexmap 2.11.3", ] [[package]] @@ -4340,13 +4341,12 @@ dependencies = [ [[package]] name = "priority-queue" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5676d703dda103cbb035b653a9f11448c0a7216c7926bd35fcb5865475d0c970" +checksum = "3e7f4ffd8645efad783fc2844ac842367aa2e912d484950192564d57dc039a3a" dependencies = [ - "autocfg", "equivalent", - "indexmap 2.11.1", + "indexmap 2.11.3", ] [[package]] @@ -5111,9 +5111,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.37.2" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" +checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" dependencies = [ "arrayvec", "borsh", @@ -5216,7 +5216,7 @@ dependencies = [ "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.5", + "rustls-webpki 0.103.6", "subtle", "zeroize", ] @@ -5264,9 +5264,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.5" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "aws-lc-rs", "ring 0.17.14", @@ -5520,16 +5520,17 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "6aaeb1e94f53b16384af593c71e20b095e958dab1d26939c1b70645c5cfbcc0b" dependencies = [ + "serde_core", "serde_derive", ] @@ -5552,11 +5553,20 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.224" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f39390fa6346e24defbcdd3d9544ba8a19985d0af74df8501fbfe9a64341ab" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "87ff78ab5e8561c9a675bfc1785cb07ae721f0ee53329a595cefd8c04c2ac4e0" dependencies = [ "proc-macro2", "quote", @@ -5565,23 +5575,25 @@ dependencies = [ [[package]] name = "serde_ignored" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b516445dac1e3535b6d658a7b528d771153dfb272ed4180ca4617a20550365ff" +checksum = "115dffd5f3853e06e746965a20dcbae6ee747ae30b543d91b0e089668bb07798" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -5615,7 +5627,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.1", + "indexmap 2.11.3", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -5643,7 +5655,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.3", "itoa", "ryu", "serde", @@ -6309,7 +6321,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.11.3", "serde", "serde_spanned", "toml_datetime", @@ -7305,7 +7317,7 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "indexmap 2.11.1", + "indexmap 2.11.3", "pin-project-lite", "slab", "sync_wrapper", @@ -7786,18 +7798,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.5+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ "wasip2", ] [[package]] name = "wasip2" -version = "1.0.0+wasi-0.2.4" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] @@ -7989,15 +8001,15 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", ] [[package]] @@ -8041,8 +8053,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -8054,6 +8066,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -8063,6 +8084,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -8311,9 +8341,9 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" [[package]] name = "wit-bindgen" -version = "0.45.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -8908,7 +8938,7 @@ dependencies = [ "futures", "hex", "humantime-serde", - "indexmap 2.11.1", + "indexmap 2.11.3", "itertools 0.14.0", "lazy_static", "metrics", @@ -8961,7 +8991,7 @@ dependencies = [ "hex", "http-body-util", "hyper", - "indexmap 2.11.1", + "indexmap 2.11.3", "jsonrpsee", "jsonrpsee-proc-macros", "jsonrpsee-types", @@ -9020,7 +9050,7 @@ dependencies = [ "hex-literal", "human_bytes", "humantime-serde", - "indexmap 2.11.1", + "indexmap 2.11.3", "itertools 0.14.0", "lazy_static", "metrics", @@ -9292,6 +9322,7 @@ dependencies = [ "shardtree", "tempfile", "thiserror 2.0.16", + "time", "tokio", "tokio-rustls", "tonic 0.13.1", diff --git a/Cargo.toml b/Cargo.toml index e9f93cf6d4..ef1bf32ba6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,6 +99,7 @@ tonic-build = "0.13" tower = { version = "0.5" } tracing = "0.1" tracing-subscriber = "0.3" +time = "0.3" # Parallel processing crossbeam-channel = "0.5" diff --git a/zingolib/Cargo.toml b/zingolib/Cargo.toml index ce29d9360e..780acfeec4 100644 --- a/zingolib/Cargo.toml +++ b/zingolib/Cargo.toml @@ -87,6 +87,7 @@ tracing-subscriber = { workspace = true } bech32 = { workspace = true } rust-embed = { workspace = true, features = ["debug-embed"] } tracing.workspace = true +time.workspace = true [dev-dependencies] portpicker = { workspace = true } diff --git a/zingolib/src/lightclient.rs b/zingolib/src/lightclient.rs index f62424d105..6df63e6476 100644 --- a/zingolib/src/lightclient.rs +++ b/zingolib/src/lightclient.rs @@ -87,6 +87,10 @@ impl LightClient { ) } + pub fn new_with_timestamp(_config: ZingoConfig, _timestamp: time::OffsetDateTime) { + // Check if is online + } + /// Creates a LightClient from a `wallet` and `config`. /// Will fail if a wallet file already exists in the given data directory unless `overwrite` is `true`. #[allow(clippy::result_large_err)] @@ -144,6 +148,10 @@ impl LightClient { &self.config } + pub async fn wallet_birthday(&self) -> BlockHeight { + self.wallet.read().await.birthday + } + /// Returns tor client. pub fn tor_client(&self) -> Option<&tor::Client> { self.tor_client.as_ref() @@ -313,13 +321,14 @@ impl std::fmt::Debug for LightClient { #[cfg(test)] mod tests { use crate::{ - config::{ChainType, ZingoConfig}, + config::{ChainType, ZingoConfig, ZingoConfigBuilder}, lightclient::error::LightClientError, wallet::{LightWallet, network::ZingolibLocalNetwork}, }; use bip0039::Mnemonic; use tempfile::TempDir; use testvectors::seeds::CHIMNEY_BETTER_SEED; + use zcash_protocol::consensus::BlockHeight; use crate::{lightclient::LightClient, wallet::WalletBase}; @@ -380,4 +389,20 @@ mod tests { lc.unified_addresses_json().await[0]["encoded_address"] ); } + + #[tokio::test] + async fn new_lc_offline() { + let zc = ZingoConfigBuilder::default().create(); + + // TODO: This test should not rely on a given birthday + // I should be able to do something like: LightClient::new(zc, None, false); + // OR: LightClient::new_with_timestamp(zc, Timestamp::now(), false); + let lc = LightClient::new(zc, BlockHeight::from_u32(0), false); + assert!(lc.is_ok()); + + assert_eq!( + lc.unwrap().wallet.read().await.birthday, + BlockHeight::from_u32(0) + ); + } } diff --git a/zingolib/src/wallet.rs b/zingolib/src/wallet.rs index 55f23a519a..38aa37a550 100644 --- a/zingolib/src/wallet.rs +++ b/zingolib/src/wallet.rs @@ -490,8 +490,16 @@ impl LightWallet { #[cfg(test)] mod tests { + use std::num::{NonZero, NonZeroU32}; + use incrementalmerkletree::frontier::CommitmentTree; use orchard::tree::MerkleHashOrchard; + use zcash_protocol::consensus::BlockHeight; + + use crate::{ + config::ChainType, + wallet::{LightWallet, WalletSettings, network::ZingolibLocalNetwork}, + }; // TODO: move to relevant mod #[test] @@ -543,4 +551,27 @@ mod tests { let anchor = orchard::Anchor::from(MerkleHashOrchard::from_bytes(&anchor).unwrap()); assert_eq!(orchard::Anchor::from(orchard_tree.root()), anchor); } + + #[tokio::test] + async fn new_offline() { + let chain_type = ChainType::Regtest(ZingolibLocalNetwork::default()); + let settings = WalletSettings { + min_confirmations: NonZeroU32::try_from(1).unwrap(), + sync_config: pepper_sync::config::SyncConfig { + ..Default::default() + }, + }; + + let lw = LightWallet::new( + chain_type, + crate::wallet::WalletBase::FreshEntropy { + no_of_accounts: NonZero::new(1).unwrap(), + }, + BlockHeight::from_u32(0), + settings, + ); + + assert!(lw.is_ok()); + assert_eq!(lw.unwrap().network, chain_type); + } }