diff --git a/Cargo.lock b/Cargo.lock index fdd9e3a..5fd17b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -98,10 +98,10 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "artimonist" -version = "1.8.4" +version = "2.0.0" dependencies = [ "anyhow", - "artimonist 1.9.0", + "artimonist 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "assert_cmd", "clap", "comfy-table", @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "artimonist" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cf30bf6016bf556215cd2cb0f3c4a17241424b92525d164a08992fd2eca096c" +checksum = "af2055299f126d7f41219a6c1256a9fa3f5c2e39efae472ca20e63ca563b2423" dependencies = [ "aes", "argon2", diff --git a/Cargo.toml b/Cargo.toml index 5b8445a..991066e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "artimonist" -version = "1.8.4" +version = "2.0.0" edition = "2024" description = "A tool for generating mnemonics and wallets." @@ -21,7 +21,7 @@ testnet = ["artimonist/testnet"] [dependencies] -artimonist = { version = "1.9" } +artimonist = "^2.0" clap = { version = "^4.5", features = ["derive"] } inquire = { version = "^0.7", default-features = false, features = ["crossterm"] } comfy-table = { version = "^7.1", default-features = false} diff --git a/src/diagram/arg.rs b/src/diagram/arg.rs index c4ec1ac..692de31 100644 --- a/src/diagram/arg.rs +++ b/src/diagram/arg.rs @@ -34,6 +34,10 @@ pub struct DiagramCommand { /// Mnemonic language #[clap(hide = true, long)] pub language: Option, + + /// Use generate engine of version 1 + #[clap(long = "v1")] + pub version_v1: bool, } #[derive(clap::Args, Debug)] @@ -46,21 +50,22 @@ pub struct GenerateTarget { pub mnemonic: Option, /// Generate wallet address and private key - #[clap(long, visible_alias = "wallet")] - pub wif: bool, + #[clap(long, visible_alias = "wif")] + pub wallet: bool, /// Generate master key for HD-Wallet - #[clap(long, visible_alias = "master")] - pub xprv: bool, + #[clap(long, visible_alias = "xprv")] + pub master: bool, - /// Generate password - #[clap(long)] - pub pwd: bool, + /// Generate passphrase + #[clap(long, visible_alias = "pwd")] + pub passphrase: bool, } impl DiagramCommand { #[inline(always)] pub fn has_mnemonic(&self) -> bool { - self.target.mnemonic.is_some() || !(self.target.wif || self.target.xprv || self.target.pwd) + self.target.mnemonic.is_some() + || !(self.target.wallet || self.target.master || self.target.passphrase) } } diff --git a/src/diagram/execute.rs b/src/diagram/execute.rs index 7525388..e7ac00f 100644 --- a/src/diagram/execute.rs +++ b/src/diagram/execute.rs @@ -24,18 +24,27 @@ impl crate::Execute for DiagramCommand { // inquire the encryption password as salt let password = match &self.password { - Some(v) => v.to_string(), - None => inquire_password(true)?, + Some(v) => v, + None => { + self.password = Some(inquire_password(true)?); + self.password.as_ref().unwrap() + } }; // output the diagram's result if type_name::().contains("SimpleDiagram") { let diagram = items.art_simple_diagram()?; - let master = diagram.bip32_master(password.as_bytes())?; + let master = match self.version_v1 { + true => diagram.to_master_v1(password.as_bytes())?, + false => diagram.to_master(password.as_bytes())?, + }; self.display(diagram.0, &master)?; } else if type_name::().contains("ComplexDiagram") { let diagram = items.art_complex_diagram()?; - let master = diagram.bip32_master(password.as_bytes())?; + let master = match self.version_v1 { + true => diagram.to_master_v1(password.as_bytes())?, + false => diagram.to_master(password.as_bytes())?, + }; self.display(diagram.0, &master)?; } else { return Err(anyhow::anyhow!("Unsupported diagram type")); @@ -155,15 +164,15 @@ impl DisplayTargets for DiagramCommand { writeln!(f)?; self.mnemonic(master, f)?; } - if self.target.wif { + if self.target.wallet { writeln!(f)?; self.wif(master, f)?; } - if self.target.xprv { + if self.target.master { writeln!(f)?; self.xpriv(master, f)?; } - if self.target.pwd { + if self.target.passphrase { writeln!(f)?; self.pwd(master, f)?; } diff --git a/src/main.rs b/src/main.rs index 33fd33e..ed881b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -100,14 +100,14 @@ mod diagram_test { let diagram = SimpleDiagram(mx); // simple diagram compatible with older results - let master = diagram.bip32_master(Default::default()).unwrap(); + let master = diagram.to_master_v1(Default::default()).unwrap(); let mnemonic = master.bip85_mnemonic(0, 24, Default::default()).unwrap(); assert_eq!(mnemonic, MNEMONIC); WIFS.into_iter().enumerate().for_each(|(i, s)| { let Wif { addr, pk } = master.bip85_wallet(i as u32).unwrap(); assert_eq!(format!("{addr}, {pk}"), s); }); - let salt_master = diagram.bip32_master("artimonist".as_bytes()).unwrap(); + let salt_master = diagram.to_master_v1("artimonist".as_bytes()).unwrap(); assert_eq!(salt_master.bip85_master(0).unwrap(), XPRIV); PWDS.into_iter().enumerate().for_each(|(i, s)| { let pwd = master diff --git a/tests/diagram.rs b/tests/diagram.rs index 63871f4..3ded42e 100644 --- a/tests/diagram.rs +++ b/tests/diagram.rs @@ -20,42 +20,53 @@ macro_rules! cli_execute { } #[test] -fn test_diagram_simple() { +fn test_diagram_v2() { + let result = + cli_execute!("simple -f simple.art -i 1024 -m 3 --mnemonic 12 --wallet --master --pwd"); + assert_eq!(result, include_str!("diagram/simple_v2")); + + let result = + cli_execute!("complex -f complex.art -i 2048 -m 5 --mnemonic 24 --wallet --master --pwd"); + assert_eq!(result, include_str!("diagram/complex_v2")); +} + +#[test] +fn test_diagram_simple_v1() { // mnemonic - let result = cli_execute!("simple -f simple.art -i 1000 -m 10"); + let result = cli_execute!("simple -f simple.art -i 1000 -m 10 --v1"); assert_eq!(result, include_str!("diagram/simple_default")); // wif - let result = cli_execute!("simple -f simple.art --wif -i 100 -m 10"); + let result = cli_execute!("simple -f simple.art --wif -i 100 -m 10 --v1"); assert_eq!(result, include_str!("diagram/simple_wif")); // xprv - let result = cli_execute!("simple -f simple.art --xprv -m 20"); + let result = cli_execute!("simple -f simple.art --xprv -m 20 --v1"); assert_eq!(result, include_str!("diagram/simple_xprv")); // pwd - let result = cli_execute!("simple -f simple.art --pwd -m 100"); + let result = cli_execute!("simple -f simple.art --pwd -m 100 --v1"); assert_eq!(result, include_str!("diagram/simple_pwd")); // unicode - let result = cli_execute!("simple -f simple_unicode.art --unicode -i 200"); + let result = cli_execute!("simple -f simple_unicode.art --unicode -i 200 --v1"); assert_eq!(result, include_str!("diagram/simple_unicode")); } #[test] -fn test_diagram_complex() { - let result = cli_execute!("complex -f complex.art -i 500 -m 20"); +fn test_diagram_complex_v1() { + let result = cli_execute!("complex -f complex.art -i 500 -m 20 --v1"); assert_eq!(result, include_str!("diagram/complex_default")); - let result = cli_execute!("complex -f complex.art --wif -i 1024 -m 10"); + let result = cli_execute!("complex -f complex.art --wif -i 1024 -m 10 --v1"); assert_eq!(result, include_str!("diagram/complex_wif")); - let result = cli_execute!("complex -f complex.art --xprv -i 2048 -m 5"); + let result = cli_execute!("complex -f complex.art --xprv -i 2048 -m 5 --v1"); assert_eq!(result, include_str!("diagram/complex_xprv")); - let result = cli_execute!("complex -f complex.art --pwd -i 8192 -m 50"); + let result = cli_execute!("complex -f complex.art --pwd -i 8192 -m 50 --v1"); assert_eq!(result, include_str!("diagram/complex_pwd")); - let result = cli_execute!("complex -f complex_unicode.art --unicode -m 3"); + let result = cli_execute!("complex -f complex_unicode.art --unicode -m 3 --v1"); assert_eq!(result, include_str!("diagram/complex_unicode")); } diff --git a/tests/diagram/complex_v2 b/tests/diagram/complex_v2 new file mode 100644 index 0000000..5153716 --- /dev/null +++ b/tests/diagram/complex_v2 @@ -0,0 +1,45 @@ + +Diagram: +╭────────┬──────────┬─────────────┬────────────┬──────────┬───────┬────╮ +│ │ │ │ BTC │ │ │ │ +├────────┼──────────┼─────────────┼────────────┼──────────┼───────┼────┤ +│ │ │ │ bitcoin │ │ │ │ +├────────┼──────────┼─────────────┼────────────┼──────────┼───────┼────┤ +│ │ │ Satoshi │ │ Nakamoto │ │ │ +├────────┼──────────┼─────────────┼────────────┼──────────┼───────┼────┤ +│ │ │ │ │ │ │ │ +├────────┼──────────┼─────────────┼────────────┼──────────┼───────┼────┤ +│ │ 18:15:05 │ UTC │ Jan │ 3 │ 2009 │ │ +├────────┼──────────┼─────────────┼────────────┼──────────┼───────┼────┤ +│ The │ Times │ 03/Jan/2009 │ Chancellor │ on │ brink │ of │ +├────────┼──────────┼─────────────┼────────────┼──────────┼───────┼────┤ +│ second │ bailout │ for │ banks │ │ │ │ +╰────────┴──────────┴─────────────┴────────────┴──────────┴───────┴────╯ + +Mnemonics: +(2048): crime mom assault under couple enough very fame apology choice legal length rabbit cable clever vacuum deputy news amount point crew negative island lift +(2049): boring hole over aunt arrow post escape wheat caution review monster plastic exit wheel village fuel unaware program section airport charge ladder you express +(2050): moon menu bachelor youth oak run salute night say sound bone alien tobacco slam home sunny recipe runway tumble receive harsh pottery modify vague +(2051): light jazz tip uncover clown flag logic noise virus diagram imitate shield slide plunge goat cram ring asthma name soda cross maid brave mandate +(2052): supreme crane clinic reflect sick tissue wage brave check slow cable squirrel dress answer primary extend build paper tackle old jeans address involve tell + +Wifs: +(2048): 37K3MHx6RQeNi85xUfdAwk79GmrK6cveEB, 6PYRyRXUWHHJkx8N9w1SZLpYoCXt43YBUbH7ofonAqt4hBNUQEXmHPn2tL +(2049): 3MTeBbUDHRdb5wioVDYxBLUoJAefyM2MGC, 6PYNquzGWBpDW7ipFGuL2YiEisy55XgK7a7hnTdt2LCjL4UUmGKTAfDiK1 +(2050): 326jZJQgv827NU4otaf2BKrEhwHcAn4HQo, 6PYPqfPaXbcdC4mNGKo9w1dXrNQoMDLUhxcEZRP5Zea2ELRGsp8ovMgPze +(2051): 38oVUAXLfqHNCHWj6KTb49BRrK4eky2EHB, 6PYSdXDK2wLG6EtKQQmRrkYPaLFt9AszkuLXJCixLxpSTg37M6uKaWSjnN +(2052): 3867cQGdSpwkeNJ2GvPX4m92PytEuG2P6x, 6PYM14QagTykodSyxhpdfsFPPLBkvugASstpsQ4mjLUbQV27wuoh2PAU6g + +Xprvs: +(2048): xprv9s21ZrQH143K2H5SsnH3TV6mhdDhpG6hUciid6GJfhoy1XnKH8H7G8rQoSDmrV58USHYbB23naoSbt4xqArmM4rwTL9grZ4xsHigA4hgvtA +(2049): xprv9s21ZrQH143K4FtNciQ1R3jpfpVs5KHvja6s8HBqapZH3GQvJ419KHgBUw3Rvc89mgJ2QW3H9TPAAukthnh5B5QuCvzMV8r1qB4rZUG6EbT +(2050): xprv9s21ZrQH143K49YG8BvSSmwoU8bLcKR5b4pffXSBJDknmrdLqs6eptitZDdimAiKoDBV9UxoBZvt8qDrPJsYXCFuorivCF9ScC5c2jWnr7Q +(2051): xprv9s21ZrQH143K3ifXFuUGmyAaE63EL2zxGPQzsR8cDdz4KN2gLJshR2MZythZxx9Pxfkh86bJEVRznrNaGBjzmEtu87Y47QAGi7pMgxXcXRH +(2052): xprv9s21ZrQH143K3aUn8k4WjzqgqJwsQy1nxNf6mmH33dPFH9ykRUMsisD8JDHitpZsUsY9RuN24hE3ZZ1711L1sytRrB4dsetaf8KWyoS9zWf + +Passwords: +(2048): vV2gS9D&@XYLgD*DQ3L$ +(2049): FSTQ7$hQmFkAnrb9mN@Z +(2050): L%nS&Kt6%zXiBdV*12Wx +(2051): S734*pUtjayB$44boxLA +(2052): MGFm$jQn58Lth#VqfmBv diff --git a/tests/diagram/simple_v2 b/tests/diagram/simple_v2 new file mode 100644 index 0000000..f841ec5 --- /dev/null +++ b/tests/diagram/simple_v2 @@ -0,0 +1,37 @@ + +Diagram: +╭───┬───┬───┬───┬───┬───┬───╮ +│ │ │ │ │ │ │ 0 │ +├───┼───┼───┼───┼───┼───┼───┤ +│ │ │ │ │ │ │ │ +├───┼───┼───┼───┼───┼───┼───┤ +│ │ │ │ │ │ │ │ +├───┼───┼───┼───┼───┼───┼───┤ +│ │ │ │ │ │ │ │ +├───┼───┼───┼───┼───┼───┼───┤ +│ │ │ │ │ │ │ │ +├───┼───┼───┼───┼───┼───┼───┤ +│ │ │ │ │ │ │ │ +├───┼───┼───┼───┼───┼───┼───┤ +│ │ │ │ │ │ │ │ +╰───┴───┴───┴───┴───┴───┴───╯ + +Mnemonics: +(1024): vocal void huge wear deny follow require quantum theme anchor sound chapter +(1025): clock worry tennis ankle vendor siege twice powder slot nothing make fence +(1026): wool country obtain deputy arm body suffer practice raw donate hand fortune + +Wifs: +(1024): 38D4hyUpbvgn4kqSMcH5ucAt7Rm5kXTSxr, 6PYPoh82P8bvg4wD4in2fB5xC369rHdCQJukjE8bZJKTaX8uTmer6yXwXM +(1025): 35jjH1fs6vRRMuARdiQJyzvcq8xKw36s86, 6PYWAAcm64qX2FkzBs3ADTrB6NFBDUrbzeZgRpvADEuoAfLWdeefMtqDWC +(1026): 3H2p42GcokgLXvSr6HCc5HtyKG43PfSxhF, 6PYMGXtGj2QuY4WvrvNkTS1NqNwr47Pbq2fkeMXhL9Ww9ctb3MGuDTWAGs + +Xprvs: +(1024): xprv9s21ZrQH143K3amEXr2YusQszinij37FwBvLU9n58p7YKwi1UX9TLLSdGqtZQJZiZi46nCMJ9zMfJjGoVfQmyDqVJEGKdhHiaWvnVrv5FAF +(1025): xprv9s21ZrQH143K37buxVdPYKkFKzsQCMaYZa7oxsVmaTEdKasFQa6EnjSr88Be2YdETv8K2oR1qfouJuYBAY9DKZwe85gTzwNHYvyJWwFpiRi +(1026): xprv9s21ZrQH143K3RasjRA8MgSB9LmDqiz29Mo9QkzzbwDEbkKxJUA6Kwj1iwWKtg9NGANSRaGZzvQmNXdDVqxiNXJR9natZbMZbcY4YJZN7M1 + +Passwords: +(1024): Y6dykrHvj6CUHrQv3czn +(1025): ksn*gYh3cwAV9es3CeJ% +(1026): Tc3dk%hk9ZHGndCi9jKi