Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -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."
Expand All @@ -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}
Expand Down
21 changes: 13 additions & 8 deletions src/diagram/arg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ pub struct DiagramCommand<T: GenericDiagram> {
/// Mnemonic language
#[clap(hide = true, long)]
pub language: Option<Language>,

/// Use generate engine of version 1
#[clap(long = "v1")]
pub version_v1: bool,
}

#[derive(clap::Args, Debug)]
Expand All @@ -46,21 +50,22 @@ pub struct GenerateTarget {
pub mnemonic: Option<u8>,

/// 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<T: GenericDiagram> DiagramCommand<T> {
#[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)
}
}
23 changes: 16 additions & 7 deletions src/diagram/execute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,27 @@ impl<T: GenericDiagram> crate::Execute for DiagramCommand<T> {

// 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::<T>().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::<T>().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"));
Expand Down Expand Up @@ -155,15 +164,15 @@ impl<D: GenericDiagram> DisplayTargets for DiagramCommand<D> {
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)?;
}
Expand Down
4 changes: 2 additions & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
35 changes: 23 additions & 12 deletions tests/diagram.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
}
45 changes: 45 additions & 0 deletions tests/diagram/complex_v2
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions tests/diagram/simple_v2
Original file line number Diff line number Diff line change
@@ -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