From e13e1eab84a62e2d4c107b4312e4d581b907085d Mon Sep 17 00:00:00 2001 From: dorianvp Date: Sun, 16 Mar 2025 01:08:32 -0300 Subject: [PATCH 1/2] feat(zwl): remove data files in favor of fixtures, data types & add tests --- Cargo.toml | 1 + src/lib.rs | 5 +- src/main.rs | 2 +- src/zwl_cmd.rs | 42 ++++++ .../mainnet/zecwallet-light-wallet-test.dat | Bin 0 -> 15907 bytes .../zwl/mainnet/zecwallet-light-wallet.dat | Bin 0 -> 35226 bytes tests/fixtures/zwl/mainnet/zwl-encrypted.dat | Bin 0 -> 48006 bytes tests/fixtures/zwl/mainnet/zwl-real.dat | Bin 0 -> 273022 bytes tests/test_dump.rs | 131 ++++++++++++++---- tests/test_wallet_decryption.rs | 50 +++++++ tests/test_witness_data.rs | 29 ++-- 11 files changed, 216 insertions(+), 44 deletions(-) create mode 100644 src/zwl_cmd.rs create mode 100644 tests/fixtures/zwl/mainnet/zecwallet-light-wallet-test.dat create mode 100644 tests/fixtures/zwl/mainnet/zecwallet-light-wallet.dat create mode 100644 tests/fixtures/zwl/mainnet/zwl-encrypted.dat create mode 100644 tests/fixtures/zwl/mainnet/zwl-real.dat create mode 100644 tests/test_wallet_decryption.rs diff --git a/Cargo.toml b/Cargo.toml index f4d01ca..75b2c10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ path = "src/main.rs" zewif = { path = "../zewif" } zewif-zcashd = { path = "../zewif-zcashd" } zewif-zingo = { path = "../zewif-zingo" } +zewif-zwl = { path = "../zewif-zwl" } anyhow = "1.0.95" hex = "0.4.3" diff --git a/src/lib.rs b/src/lib.rs index 5f7d4ec..84ebf24 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ -pub mod zcashd_cmd; -pub mod zingo_cmd; pub mod exec; pub mod file_args; +pub mod zcashd_cmd; +pub mod zingo_cmd; +pub mod zwl_cmd; diff --git a/src/main.rs b/src/main.rs index eff2388..5e80477 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,3 @@ - mod styles; use clap::{Parser as ClapParser, Subcommand}; @@ -42,6 +41,7 @@ fn inner_main() -> anyhow::Result<()> { let output = match cli.command { MainCommands::Zcashd(args) => args.exec(), MainCommands::Zingo(args) => args.exec(), + MainCommands::Zwl(args) => args.exec(), }; let output = output?; if !output.is_empty() { diff --git a/src/zwl_cmd.rs b/src/zwl_cmd.rs new file mode 100644 index 0000000..b1e3450 --- /dev/null +++ b/src/zwl_cmd.rs @@ -0,0 +1,42 @@ +use std::path::{Path, PathBuf}; + +use anyhow::Result; +use clap::Args; +use zewif_zwl::ZwlParser; + +use crate::file_args::{FileArgs, FileArgsLike}; + +/// Process a zecwallet wallet file +#[derive(Debug, Args)] +#[group(skip)] +pub struct CommandArgs { + #[command(flatten)] + file_args: FileArgs, +} + +impl FileArgsLike for CommandArgs { + fn file(&self) -> &PathBuf { + &self.file_args.file + } +} + +impl crate::exec::Exec for CommandArgs { + fn exec(&self) -> Result { + let file = self.file(); + dump_wallet(file) + } +} + +pub fn dump_wallet(file: &Path) -> Result { + let file_data = std::fs::read(file)?.into(); + let mut parser = ZwlParser::new(&file_data); + let wallet = parser.parse()?; + let mut dump = format!("{:#?}", wallet); + let remaining = wallet.remaining(); + if remaining == 0 { + dump.push_str("\n---\nāœ… Success"); + } else { + dump.push_str(&format!("\n---\nšŸ›‘ Unparsed bytes: {}", remaining)) + } + Ok(dump) +} diff --git a/tests/fixtures/zwl/mainnet/zecwallet-light-wallet-test.dat b/tests/fixtures/zwl/mainnet/zecwallet-light-wallet-test.dat new file mode 100644 index 0000000000000000000000000000000000000000..0a93f5642911cc1afb799c05b2074090d1cbaf90 GIT binary patch literal 15907 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 bjok%n;>*L}-?V%n9RBm4FO~ll(a`)qW0*ol literal 0 HcmV?d00001 diff --git a/tests/fixtures/zwl/mainnet/zecwallet-light-wallet.dat b/tests/fixtures/zwl/mainnet/zecwallet-light-wallet.dat new file mode 100644 index 0000000000000000000000000000000000000000..3177c38a41ad49667aa4c58031fcb2ab974d1444 GIT binary patch literal 35226 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�Qsx?1#LI)aiFQZ|MR5O4?l~pfpKb@ zTXKG6<9(@gEfW-$P@-@f%NL+*(7n(odL)d=8uk#*+`ul z4^)FAoeIHCt_!7OF0c_IYc2mYLJi_#L=!}2fda)N>&su6Uf&zxVOp-xcR48l8r+JN zj$1oz{`P@4!C({Q1o6m}SMWs$JTeOu$O1mG7a7D2|8V~WVOiYvN?O$|zh+61ZZb^( z?*J$qJ3%0x1H>a!Ucnb4@W?DsAO`ZgKR_hma8bts`z>zOfUk>%tzmO{+Rn)2CB6%e zX9w}flvnTt2s|#^AaBq$FqTWWXdb} zd;}hu1qwvjnV9dC>l(cJ?x}&Y#C7w##)CVOOKkZ5(DBRBzv|*u6Ba9oN2a`j&qLsm zS)f2otjBTQb03|n1$ z5txTkx1Kj^QX}ePRymDcbUFO;&X8^B&NQNK$EPD{+TTmM~p(q*k75SQt2m1?uiqU#(qYy3GX?-5|sA}*B zFDcN~z2?8g_4Bl}isGrYGS(?4KXFv^ADAThS`*Ql?Jf}nc(bpmCGyRJwpQ!I@*V7@ z4?MGKe9{{+E*8E4`C82);ZWF0zCeywLCW0ZuQNY(^rO!NA5R(M@1YF=s7B4!zkm^7 z&cs@|k(`bw;4yjE&(-$6?)?!$zC;F%{QSVTX_Vm%6F23oh}Ya6AKuN2a`jPe}&^nEU`;Sjq?k5{_Jf|_MiBYK55v&h_@+0|a+7f(SvJ%~r9yn;_d;E`FNK=)DC zHG6$>`c3C|9>4{kLBdzX39oyo+!RLWfYcCv62jY<_|G}Smpc2191c1y01hXc{}cRzis10m8A3i!DgLw=Pe5g zT=UR$(YfrDmk5fT(pJOt_|qHLB#(OaPpNU_jUER5x)bny4z`O*KKzP`vcMxnlvCR{ zmU?~BTpjVpN_e9jj1m5HD*gFs08F8j62FLyXU!I z_6=GvOUSD8pDbw*ry_EM%mM{uS+8ICN9aGdx|8^L_J?z@i*LYwu^0*0uw(IMj`se5 zIf8(AWXgZ=XNqXVDTn}&nV>)gmebc}VRNlx7w)F6kl!0Mw*yOttDhde5U{-LBxA?$ zM)CsDNPv6PuX3BKz6Ub!{AAY*_?2SZPKq(oU=gI70&mot?SMm{k+;N@_5-QZm0y7&uWt;}x^nzH&a z9z?6aHRMWurZi?l+ibzyTeJx=a(sDZ=Y-sz2}y#cq*A(5Zhwysr8D%fgTKC<6t0?T zQNrhC?DQawGkfHlkcEm*mfz6sfS7lq6Y5>RYdK5s$w;jT-${OsQ>(tVV8apr@Ci40 zuz4;gDPVSy$4Qvgm{aDyoFdw0N7<0&;vsuPTHVADJN6^B13VrlNbFX65@RMs5L0^8 z(JIE91{Itk<AGST@*zlg0z{Klbl-W^K1}cuY>j>*1}xn)=9Xh z2(1lz73+sDJ8h_jH%#uB>#N=aPw#c#-!#bBO5H$1d-s)^lDs;&6vxv>>67@+BT)t2 zO^3DfJoRv`FO7d%3Fi6e>DdynLzO?!fDI2>3;CzvX%N3gG&^J#C{UEgneco9xpA_+^}yn|6p^g4rH%w@ZO4sUkUARd|WAN&~+CUG(%0Awa8@O3_t`SX!pdmJ?G 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 bY~l!ELYB&deaw#tN$gAkgaU$0SYZMH3rW?| literal 0 HcmV?d00001 diff --git a/tests/fixtures/zwl/mainnet/zwl-encrypted.dat b/tests/fixtures/zwl/mainnet/zwl-encrypted.dat new file mode 100644 index 0000000000000000000000000000000000000000..3b3c94e6935709e8c1d881ddb69e8f81ea96dc8a GIT binary patch literal 48006 zcmaf*Wmr_-7w-XSiIHZgVdzE}KvKFxy1S*MLqJ-P29fSmKw3bg1SF(Y5TvCWL`vcw zhTn7ldY|V$;|qP^`p##av)0=CoW0jR7@Ho8qgPUS

=!CF5T4M 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ξ`%0(pZkLj!AGfG~?xBalh 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/zwl/mainnet/zwl-real.dat b/tests/fixtures/zwl/mainnet/zwl-real.dat new file mode 100644 index 0000000000000000000000000000000000000000..738e8c395d80b75f05b9397cc248d8327cbad9aa GIT binary patch literal 273022 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 Result { zcashd_cmd::dump_wallet(&path) } else if path_elements[0] == "zingo" { zingo_cmd::dump_wallet(&path) + } else if path_elements[0] == "zwl" { + zwl_cmd::dump_wallet(&path) } else { bail!("Unknown command: {}", path_elements[0]); } @@ -44,12 +46,20 @@ fn test_migration_quality(path_elements: &[&str]) -> Result { // Check address preservation let zcashd_address_count = zcashd_section.matches("Address").count(); let zewif_address_count = zewif_section.matches("Address").count(); - writeln!(report, "- Addresses: {}/{} preserved", zewif_address_count, zcashd_address_count)?; + writeln!( + report, + "- Addresses: {}/{} preserved", + zewif_address_count, zcashd_address_count + )?; // Check transaction preservation let zcashd_tx_count = zcashd_section.matches("TxId").count(); let zewif_tx_count = zewif_section.matches("TxId").count(); - writeln!(report, "- Transactions: {}/{} preserved", zewif_tx_count, zcashd_tx_count)?; + writeln!( + report, + "- Transactions: {}/{} preserved", + zewif_tx_count, zcashd_tx_count + )?; // Check position information let zero_positions_count = zewif_section.matches("Position(0)").count(); @@ -58,8 +68,11 @@ fn test_migration_quality(path_elements: &[&str]) -> Result { if total_positions > 0 { let preservation_rate = (nonzero_positions_count as f64 / total_positions as f64) * 100.0; - writeln!(report, "- Positions: {}/{} preserved ({:.1}%)", - nonzero_positions_count, total_positions, preservation_rate)?; + writeln!( + report, + "- Positions: {}/{} preserved ({:.1}%)", + nonzero_positions_count, total_positions, preservation_rate + )?; } else { writeln!(report, "- Positions: No position data found")?; } @@ -91,12 +104,34 @@ fn test_migration_quality(path_elements: &[&str]) -> Result { // Check for account handling let zcashd_accounts = count_pattern(zcashd_section, r"Account\s*\{"); let zewif_accounts = count_pattern(zewif_section, r"Account\s*\{"); - writeln!(report, "- Accounts: {}/{} preserved", zewif_accounts, zcashd_accounts)?; + writeln!( + report, + "- Accounts: {}/{} preserved", + zewif_accounts, zcashd_accounts + )?; // Check specific ZCash features - check_feature_presence(&mut report, zcashd_section, zewif_section, "Unified", "Unified Address Support")?; - check_feature_presence(&mut report, zcashd_section, zewif_section, "SeedMaterial", "Seed Material")?; - check_feature_presence(&mut report, zcashd_section, zewif_section, "Network", "Network Information")?; + check_feature_presence( + &mut report, + zcashd_section, + zewif_section, + "Unified", + "Unified Address Support", + )?; + check_feature_presence( + &mut report, + zcashd_section, + zewif_section, + "SeedMaterial", + "Seed Material", + )?; + check_feature_presence( + &mut report, + zcashd_section, + zewif_section, + "Network", + "Network Information", + )?; Ok(report) } @@ -123,7 +158,13 @@ fn count_pattern(text: &str, pattern: &str) -> usize { re.find_iter(text).count() } -fn check_feature_presence(report: &mut String, source: &str, dest: &str, key_word: &str, feature_name: &str) -> Result<()> { +fn check_feature_presence( + report: &mut String, + source: &str, + dest: &str, + key_word: &str, + feature_name: &str, +) -> Result<()> { let in_source = source.contains(key_word); let in_dest = dest.contains(key_word); @@ -138,14 +179,22 @@ fn check_feature_presence(report: &mut String, source: &str, dest: &str, key_wor Ok(()) } -fn report_key_preservation(report: &mut String, source: &str, dest: &str, key_type: &str) -> Result<()> { +fn report_key_preservation( + report: &mut String, + source: &str, + dest: &str, + key_type: &str, +) -> Result<()> { let source_count = source.matches(key_type).count(); let dest_count = dest.matches(key_type).count(); if source_count > 0 { let preservation_rate = (dest_count as f64 / source_count as f64) * 100.0; - writeln!(report, " * {} keys: {}/{} preserved ({:.1}%)", - key_type, dest_count, source_count, preservation_rate)?; + writeln!( + report, + " * {} keys: {}/{} preserved ({:.1}%)", + key_type, dest_count, source_count, preservation_rate + )?; } else { writeln!(report, " * {} keys: None found in source", key_type)?; } @@ -160,17 +209,14 @@ fn test_zcashd() { vec!["zcashd", "golden-v5.6.0", "node1_wallet.dat"], vec!["zcashd", "golden-v5.6.0", "node2_wallet.dat"], vec!["zcashd", "golden-v5.6.0", "node3_wallet.dat"], - vec!["zcashd", "tarnished-v5.6.0", "node0_wallet.dat"], vec!["zcashd", "tarnished-v5.6.0", "node1_wallet.dat"], vec!["zcashd", "tarnished-v5.6.0", "node2_wallet.dat"], vec!["zcashd", "tarnished-v5.6.0", "node3_wallet.dat"], - vec!["zcashd", "sprout", "node0_wallet.dat"], vec!["zcashd", "sprout", "node1_wallet.dat"], vec!["zcashd", "sprout", "node2_wallet.dat"], vec!["zcashd", "sprout", "node3_wallet.dat"], - vec!["zcashd", "wallet0.dat"], vec!["zcashd", "wallet1.dat"], vec!["zcashd", "wallet2.dat"], @@ -192,13 +238,10 @@ fn test_migration_quality_report() { // Golden reference wallets (expected to be fully working) vec!["zcashd", "golden-v5.6.0", "node0_wallet.dat"], vec!["zcashd", "golden-v5.6.0", "node2_wallet.dat"], // May have more shielded data - // Tarnished wallets (may have issues) vec!["zcashd", "tarnished-v5.6.0", "node0_wallet.dat"], - // Sprout wallets (older format) vec!["zcashd", "sprout", "node0_wallet.dat"], - // Standard wallets vec!["zcashd", "wallet0.dat"], // Test standard wallet vec!["zcashd", "wallet5.dat"], // Test wallet likely with Orchard data @@ -207,8 +250,18 @@ fn test_migration_quality_report() { // Create a summary table of all wallet reports let mut summary = String::new(); writeln!(summary, "=== MIGRATION QUALITY SUMMARY ===").unwrap(); - writeln!(summary, "{:<40} | {:<15} | {:<15} | {:<15}", "Wallet", "Addresses", "Transactions", "Positions").unwrap(); - writeln!(summary, "{:-<40}-+-{:-<15}-+-{:-<15}-+-{:-<15}", "", "", "", "").unwrap(); + writeln!( + summary, + "{:<40} | {:<15} | {:<15} | {:<15}", + "Wallet", "Addresses", "Transactions", "Positions" + ) + .unwrap(); + writeln!( + summary, + "{:-<40}-+-{:-<15}-+-{:-<15}-+-{:-<15}", + "", "", "", "" + ) + .unwrap(); // Process each wallet and collect stats for path in &test_paths { @@ -233,8 +286,12 @@ fn test_migration_quality_report() { "N/A".to_string() }; - writeln!(summary, "{:<40} | {:<15} | {:<15} | {:<15}", - wallet_name, addr_stats, tx_stats, pos_stats).unwrap(); + writeln!( + summary, + "{:<40} | {:<15} | {:<15} | {:<15}", + wallet_name, addr_stats, tx_stats, pos_stats + ) + .unwrap(); } // Print the summary table @@ -254,15 +311,21 @@ fn extract_stat(report: &str, label: &str) -> String { #[test] fn test_zingo() { let paths = vec![ - vec!["zingo", "mainnet", "hhcclaltpcckcsslpcnetblr-gf0aaf9347.dat"], + vec![ + "zingo", + "mainnet", + "hhcclaltpcckcsslpcnetblr-gf0aaf9347.dat", + ], vec!["zingo", "mainnet", "hhcclaltpcckcsslpcnetblr-latest.dat"], // vec!["zingo", "mainnet", "vtfcorfbcbpctcfupmegmwbp-v28.dat"], // long - vec!["zingo", "regtest", "hmvasmuvwmssvichcarbpoct-v27.dat"], vec!["zingo", "regtest", "aadaalacaadaalacaadaalac-orch-only.dat"], - vec!["zingo", "regtest", "aadaalacaadaalacaadaalac-orch-and-sapling.dat"], + vec![ + "zingo", + "regtest", + "aadaalacaadaalacaadaalac-orch-and-sapling.dat", + ], vec!["zingo", "regtest", "aaaaaaaaaaaaaaaaaaaaaaaa-v26.dat"], - vec!["zingo", "testnet", "cbbhrwiilgbrababsshsmtpr-latest.dat"], vec!["zingo", "testnet", "G93738061a.dat"], vec!["zingo", "testnet", "Gab72a38b.dat"], @@ -276,3 +339,15 @@ fn test_zingo() { test_dump(path); } } + +#[test] +fn test_zwl() { + let paths = vec![ + vec!["zwl", "mainnet", "zecwallet-light-wallet-test.dat"], + vec!["zwl", "mainnet", "zecwallet-light-wallet.dat"], + vec!["zwl", "mainnet", "zwl-real.dat"], + ]; + for path in &paths { + test_dump(path); + } +} diff --git a/tests/test_wallet_decryption.rs b/tests/test_wallet_decryption.rs new file mode 100644 index 0000000..425c768 --- /dev/null +++ b/tests/test_wallet_decryption.rs @@ -0,0 +1,50 @@ +use std::path::Path; + +use anyhow::{Ok, Result}; +use zewif::Data; + +// Import shared test utilities +mod test_utils; +use test_utils::fixtures_path; +use zewif_zwl::ZwlParser; + +/// Attempts to decrypt a zecwallet wallet file with the given password, and compares the seed phrase +/// to the expected phrase. +fn test_parser_encryption(wallet_path: &[&str], expected_phrase: &str, password: &str) { + let file_path = fixtures_path(wallet_path); + + let file_data = Data::from_vec( + std::fs::read(Path::new(&file_path)) + .expect(&format!("Failed to read wallet file: {:?}", wallet_path)), + ); + let mut parser = ZwlParser::new(&file_data); + let wallet = parser.parse(); + + let mut real_wallet = wallet.unwrap(); + + let phrase = real_wallet + .keys + .get_phrase(String::from(password)) + .unwrap() + .into_phrase(); + + assert_eq!(phrase, expected_phrase, "Expected phrase does not match"); + + real_wallet + .keys + .unlock_wallet(password.to_string()) + .unwrap(); +} + +#[test] +fn test_zwl_decryption() -> Result<()> { + let paths = vec![vec!["zwl", "mainnet", "zwl-encrypted.dat"]]; + for path in &paths { + test_parser_encryption( + path, + "basket decorate ivory office buddy embark country office trophy speak cupboard mixture crazy agent lemon permit build situate omit spider bridge panda rather chuckle", + "hello world", + ); + } + Ok(()) +} diff --git a/tests/test_witness_data.rs b/tests/test_witness_data.rs index 5294675..6db26ff 100644 --- a/tests/test_witness_data.rs +++ b/tests/test_witness_data.rs @@ -1,6 +1,6 @@ use anyhow::Result; -use zmigrate::{zcashd_cmd, zingo_cmd}; use regex::Regex; +use zmigrate::{zcashd_cmd, zingo_cmd, zwl_cmd}; // Import shared test utilities mod test_utils; @@ -12,6 +12,8 @@ fn dump_wallet(path_elements: &[&str]) -> Result { zcashd_cmd::dump_wallet(&path) } else if path_elements[0] == "zingo" { zingo_cmd::dump_wallet(&path) + } else if path_elements[0] == "zwl" { + zwl_cmd::dump_wallet(&path) } else { Err(anyhow::anyhow!("Unknown command: {}", path_elements[0])) } @@ -25,19 +27,17 @@ fn test_witness_data_migration() { // Golden reference wallets (expected to be fully working) vec!["zcashd", "golden-v5.6.0", "node0_wallet.dat"], vec!["zcashd", "golden-v5.6.0", "node2_wallet.dat"], - // Tarnished wallets (may have issues) vec!["zcashd", "tarnished-v5.6.0", "node0_wallet.dat"], - - // Standard wallets + // Standard wallets vec!["zcashd", "wallet0.dat"], vec!["zcashd", "wallet5.dat"], ]; // Process each wallet and check witness data migration for path in &test_paths { - let output = dump_wallet(path) - .unwrap_or_else(|e| panic!("Error dumping wallet {:?}: {}", path, e)); + let output = + dump_wallet(path).unwrap_or_else(|e| panic!("Error dumping wallet {:?}: {}", path, e)); // Split the output into ZcashdWallet and ZewifTop sections let sections: Vec<&str> = output.split("---").collect(); @@ -55,21 +55,24 @@ fn test_witness_data_migration() { println!("\nWitness Data & Memo Migration for {:?}:", path); println!("- Source has witness data: {}", has_witness_in_source); println!("- Destination witness entries: {}", witness_count_in_dest); - + // Check for memo field entries in the output let memo_count_in_dest = count_memo_entries(zewif_section); println!("- Destination memo entries: {}", memo_count_in_dest); // Note: Transaction time is noted in the code but not yet stored // This will be implemented in the "Extract Transaction Metadata" subtask - + // We don't want to strictly assert witness data exists because some wallets // may legitimately not have any. Instead, we just log the information. - + // But we can check that memo field support is working by verifying that we have some memo entries // Only assert if we have sapling outputs, which should have memo fields if zewif_section.contains("SaplingOutputDescription") { - assert!(memo_count_in_dest > 0, "Memo fields should be present in Sapling outputs"); + assert!( + memo_count_in_dest > 0, + "Memo fields should be present in Sapling outputs" + ); } } } @@ -78,8 +81,8 @@ fn test_witness_data_migration() { fn has_witness_data(wallet_section: &str) -> bool { // Look for evidence of witness data in the wallet // This could be in either witnesses field or witness fields - wallet_section.contains("witnesses: [") || - (wallet_section.contains("witness:") && !wallet_section.contains("witness: None")) + wallet_section.contains("witnesses: [") + || (wallet_section.contains("witness:") && !wallet_section.contains("witness: None")) } /// Count witness entries in the destination ZeWIF format @@ -96,4 +99,4 @@ fn count_memo_entries(zewif_section: &str) -> usize { let memo_pattern = r"memo:\s*Some\("; let re = Regex::new(memo_pattern).unwrap(); re.find_iter(zewif_section).count() -} \ No newline at end of file +} From 22dff41a639569328b8a2a894eaa9938121e64b4 Mon Sep 17 00:00:00 2001 From: dorianvp Date: Mon, 31 Mar 2025 00:41:38 +0200 Subject: [PATCH 2/2] fix(zwl): add missing command --- src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 5e80477..35983c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ mod styles; use clap::{Parser as ClapParser, Subcommand}; -use zmigrate::{exec::Exec, zcashd_cmd, zingo_cmd}; +use zmigrate::{exec::Exec, zcashd_cmd, zingo_cmd, zwl_cmd}; /// A tool for migrating Zcash wallets #[derive(Debug, clap::Parser)] @@ -19,6 +19,7 @@ struct Cli { enum MainCommands { Zcashd(zcashd_cmd::CommandArgs), Zingo(zingo_cmd::CommandArgs), + Zwl(zwl_cmd::CommandArgs), } #[doc(hidden)]