Skip to content

Commit e2d4985

Browse files
committed
Update tests
1 parent be60732 commit e2d4985

File tree

5 files changed

+203
-191
lines changed

5 files changed

+203
-191
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ cdk-payment-processor = { path = "./crates/cdk-payment-processor", default-featu
5555
cdk-mint-rpc = { path = "./crates/cdk-mint-rpc", version = "=0.9.1" }
5656
cdk-redb = { path = "./crates/cdk-redb", default-features = true, version = "=0.9.1" }
5757
cdk-sqlite = { path = "./crates/cdk-sqlite", default-features = true, version = "=0.9.1" }
58-
cdk-signatory = { path = "./crates/cdk-signatory", version = "=0.9.1" }
58+
cdk-signatory = { path = "./crates/cdk-signatory", default-features = false, version = "=0.9.1" }
5959
clap = { version = "4.5.31", features = ["derive"] }
6060
ciborium = { version = "0.2.2", default-features = false, features = ["std"] }
6161
cbor-diag = "0.1.12"

crates/cdk-signatory/Cargo.toml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,25 @@ bitcoin.workspace = true
1717
cdk-common = { workspace = true, default-features=false, features = [
1818
"mint", "auth",
1919
] }
20-
tokio = { workspace = true, features = ["full"] }
2120
tonic = { workspace = true, optional = true }
2221
prost = { workspace = true, optional = true }
22+
tracing.workspace = true
2323

24+
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
2425
# main.rs dependencies
2526
anyhow.workspace = true
2627
cdk-sqlite = { workspace = true, features = ["mint", "auth"] }
2728
cdk-redb = { workspace = true, features = ["mint", "auth"], optional = true }
2829
clap = { workspace = true }
2930
bip39.workspace = true
3031
home.workspace = true
31-
tracing.workspace = true
3232
thiserror.workspace = true
3333
tracing-subscriber.workspace = true
34+
tokio = { workspace = true, features = ["full"] }
35+
36+
[target.'cfg(target_arch = "wasm32")'.dependencies]
37+
tokio = { workspace = true, features = ["rt", "macros", "sync", "time"] }
38+
getrandom = { version = "0.2", features = ["js"] }
3439

3540
[build-dependencies]
3641
tonic-build = { workspace = true, features = ["prost"], optional = true }

crates/cdk-signatory/src/main.rs

Lines changed: 175 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -1,171 +1,187 @@
1-
use std::collections::HashMap;
2-
use std::fs;
3-
use std::net::SocketAddr;
4-
use std::path::PathBuf;
5-
use std::str::FromStr;
6-
use std::sync::Arc;
7-
8-
use anyhow::{bail, Result};
9-
use bip39::rand::{thread_rng, Rng};
10-
use bip39::Mnemonic;
11-
use cashu::CurrencyUnit;
12-
use cdk_common::database::{MintAuthDatabase, MintKeysDatabase};
13-
#[cfg(feature = "redb")]
14-
use cdk_redb::MintRedbDatabase;
15-
use cdk_signatory::{db_signatory, grpc_server};
16-
use cdk_sqlite::mint::MintSqliteAuthDatabase;
17-
use cdk_sqlite::MintSqliteDatabase;
18-
use clap::Parser;
19-
use tracing::Level;
20-
use tracing_subscriber::EnvFilter;
21-
22-
const DEFAULT_WORK_DIR: &str = ".cdk-signatory";
23-
24-
/// Simple CLI application to interact with cashu
25-
#[derive(Parser)]
26-
#[command(name = "cashu-signatory")]
27-
#[command(author = "thesimplekid <tsk@thesimplekid.com>")]
28-
#[command(version = "0.1.0")]
29-
#[command(author, version, about, long_about = None)]
30-
struct Cli {
31-
/// Database engine to use (sqlite/redb)
32-
#[arg(short, long, default_value = "sqlite")]
33-
engine: String,
34-
/// Database password for sqlcipher
35-
#[arg(long)]
36-
password: Option<String>,
37-
/// Path to working dir
38-
#[arg(short, long)]
39-
work_dir: Option<PathBuf>,
40-
/// Logging level
41-
#[arg(short, long, default_value = "error")]
42-
log_level: Level,
43-
#[arg(long, default_value = "127.0.0.1")]
44-
listen_addr: String,
45-
#[arg(long, default_value = "15060")]
46-
listen_port: u32,
47-
#[arg(long, short)]
48-
certs: Option<String>,
49-
#[arg(long, short, default_value = "sat,0,32")]
50-
units: Vec<String>,
51-
}
52-
53-
#[tokio::main]
54-
async fn main() -> Result<()> {
55-
let args: Cli = Cli::parse();
56-
let default_filter = args.log_level;
57-
let supported_units = args
58-
.units
59-
.into_iter()
60-
.map(|unit| {
61-
let mut parts = unit.split(",").collect::<Vec<_>>();
62-
parts.reverse();
63-
let unit: CurrencyUnit = parts.pop().unwrap_or_default().parse()?;
64-
let fee = parts
65-
.pop()
66-
.map(|x| x.parse())
67-
.transpose()?
68-
.unwrap_or_default();
69-
let max_order = parts.pop().map(|x| x.parse()).transpose()?.unwrap_or(32);
70-
Ok::<(_, (_, _)), anyhow::Error>((unit, (fee, max_order)))
71-
})
72-
.collect::<Result<HashMap<_, _>, _>>()?;
73-
74-
let sqlx_filter = "sqlx=warn,hyper_util=warn,reqwest=warn";
75-
76-
let env_filter = EnvFilter::new(format!("{},{}", default_filter, sqlx_filter));
77-
78-
// Parse input
79-
tracing_subscriber::fmt().with_env_filter(env_filter).init();
80-
81-
let work_dir = match &args.work_dir {
82-
Some(work_dir) => work_dir.clone(),
83-
None => {
84-
let home_dir = home::home_dir().unwrap();
85-
home_dir.join(DEFAULT_WORK_DIR)
86-
}
87-
};
88-
89-
let certs = Some(
90-
args.certs
91-
.map(|x| x.into())
92-
.unwrap_or_else(|| work_dir.clone()),
93-
);
94-
95-
fs::create_dir_all(&work_dir)?;
96-
97-
let (localstore, auth_localstore): (
98-
Arc<dyn MintKeysDatabase<Err = cdk_common::database::Error> + Send + Sync>,
99-
Arc<dyn MintAuthDatabase<Err = cdk_common::database::Error> + Send + Sync>,
100-
) = match args.engine.as_str() {
101-
"sqlite" => {
102-
let sql_path = work_dir.join("cdk-cli.sqlite");
103-
#[cfg(not(feature = "sqlcipher"))]
104-
let db = (
105-
MintSqliteDatabase::new(&sql_path).await?,
106-
MintSqliteAuthDatabase::new(&sql_path).await?,
107-
);
108-
#[cfg(feature = "sqlcipher")]
109-
let db = {
110-
match args.password {
111-
Some(pass) => (
112-
MintSqliteDatabase::new(&sql_path, pass).await?,
113-
MintSqliteAuthDatabase::new(&sql_path).await?,
114-
),
115-
None => bail!("Missing database password"),
116-
}
117-
};
118-
119-
(Arc::new(db.0), Arc::new(db.1))
120-
}
121-
"redb" => {
122-
#[cfg(feature = "redb")]
123-
{
124-
let redb_path = work_dir.join("cdk-cli.redb");
125-
let db = Arc::new(MintRedbDatabase::new(&redb_path)?);
126-
(db.clone(), db)
1+
#[cfg(not(target_arch = "wasm32"))]
2+
mod cli {
3+
use std::collections::HashMap;
4+
use std::fs;
5+
use std::net::SocketAddr;
6+
use std::path::PathBuf;
7+
use std::str::FromStr;
8+
use std::sync::Arc;
9+
10+
use anyhow::{bail, Result};
11+
use bip39::rand::{thread_rng, Rng};
12+
use bip39::Mnemonic;
13+
use cashu::CurrencyUnit;
14+
use cdk_common::database::{MintAuthDatabase, MintKeysDatabase};
15+
#[cfg(feature = "redb")]
16+
use cdk_redb::MintRedbDatabase;
17+
use cdk_signatory::{db_signatory, grpc_server};
18+
use cdk_sqlite::mint::MintSqliteAuthDatabase;
19+
use cdk_sqlite::MintSqliteDatabase;
20+
use clap::Parser;
21+
use tracing::Level;
22+
use tracing_subscriber::EnvFilter;
23+
24+
const DEFAULT_WORK_DIR: &str = ".cdk-signatory";
25+
26+
/// Simple CLI application to interact with cashu
27+
#[derive(Parser)]
28+
#[command(name = "cashu-signatory")]
29+
#[command(author = "thesimplekid <tsk@thesimplekid.com>")]
30+
#[command(version = "0.1.0")]
31+
#[command(author, version, about, long_about = None)]
32+
struct Cli {
33+
/// Database engine to use (sqlite/redb)
34+
#[arg(short, long, default_value = "sqlite")]
35+
engine: String,
36+
/// Database password for sqlcipher
37+
#[arg(long)]
38+
password: Option<String>,
39+
/// Path to working dir
40+
#[arg(short, long)]
41+
work_dir: Option<PathBuf>,
42+
/// Logging level
43+
#[arg(short, long, default_value = "error")]
44+
log_level: Level,
45+
#[arg(long, default_value = "127.0.0.1")]
46+
listen_addr: String,
47+
#[arg(long, default_value = "15060")]
48+
listen_port: u32,
49+
#[arg(long, short)]
50+
certs: Option<String>,
51+
#[arg(long, short, default_value = "sat,0,32")]
52+
units: Vec<String>,
53+
}
54+
55+
pub async fn main() -> Result<()> {
56+
let args: Cli = Cli::parse();
57+
let default_filter = args.log_level;
58+
let supported_units = args
59+
.units
60+
.into_iter()
61+
.map(|unit| {
62+
let mut parts = unit.split(",").collect::<Vec<_>>();
63+
parts.reverse();
64+
let unit: CurrencyUnit = parts.pop().unwrap_or_default().parse()?;
65+
let fee = parts
66+
.pop()
67+
.map(|x| x.parse())
68+
.transpose()?
69+
.unwrap_or_default();
70+
let max_order = parts.pop().map(|x| x.parse()).transpose()?.unwrap_or(32);
71+
Ok::<(_, (_, _)), anyhow::Error>((unit, (fee, max_order)))
72+
})
73+
.collect::<Result<HashMap<_, _>, _>>()?;
74+
75+
let sqlx_filter = "sqlx=warn,hyper_util=warn,reqwest=warn";
76+
77+
let env_filter = EnvFilter::new(format!("{},{}", default_filter, sqlx_filter));
78+
79+
// Parse input
80+
tracing_subscriber::fmt().with_env_filter(env_filter).init();
81+
82+
let work_dir = match &args.work_dir {
83+
Some(work_dir) => work_dir.clone(),
84+
None => {
85+
let home_dir = home::home_dir().unwrap();
86+
home_dir.join(DEFAULT_WORK_DIR)
12787
}
128-
#[cfg(not(feature = "redb"))]
129-
{
130-
bail!("redb feature not enabled");
88+
};
89+
90+
let certs = Some(
91+
args.certs
92+
.map(|x| x.into())
93+
.unwrap_or_else(|| work_dir.clone()),
94+
);
95+
96+
fs::create_dir_all(&work_dir)?;
97+
98+
let (localstore, auth_localstore): (
99+
Arc<dyn MintKeysDatabase<Err = cdk_common::database::Error> + Send + Sync>,
100+
Arc<dyn MintAuthDatabase<Err = cdk_common::database::Error> + Send + Sync>,
101+
) = match args.engine.as_str() {
102+
"sqlite" => {
103+
let sql_path = work_dir.join("cdk-cli.sqlite");
104+
#[cfg(not(feature = "sqlcipher"))]
105+
let db = (
106+
MintSqliteDatabase::new(&sql_path).await?,
107+
MintSqliteAuthDatabase::new(&sql_path).await?,
108+
);
109+
#[cfg(feature = "sqlcipher")]
110+
let db = {
111+
match args.password {
112+
Some(pass) => (
113+
MintSqliteDatabase::new(&sql_path, pass).await?,
114+
MintSqliteAuthDatabase::new(&sql_path).await?,
115+
),
116+
None => bail!("Missing database password"),
117+
}
118+
};
119+
120+
(Arc::new(db.0), Arc::new(db.1))
121+
}
122+
"redb" => {
123+
#[cfg(feature = "redb")]
124+
{
125+
let redb_path = work_dir.join("cdk-cli.redb");
126+
let db = Arc::new(MintRedbDatabase::new(&redb_path)?);
127+
(db.clone(), db)
128+
}
129+
#[cfg(not(feature = "redb"))]
130+
{
131+
bail!("redb feature not enabled");
132+
}
131133
}
132-
}
133-
_ => bail!("Unknown DB engine"),
134-
};
134+
_ => bail!("Unknown DB engine"),
135+
};
135136

136-
let seed_path = work_dir.join("seed");
137+
let seed_path = work_dir.join("seed");
137138

138-
let mnemonic = match fs::metadata(seed_path.clone()) {
139-
Ok(_) => {
140-
let contents = fs::read_to_string(seed_path.clone())?;
141-
Mnemonic::from_str(&contents)?
142-
}
143-
Err(_e) => {
144-
let mut rng = thread_rng();
145-
let random_bytes: [u8; 32] = rng.gen();
139+
let mnemonic = match fs::metadata(seed_path.clone()) {
140+
Ok(_) => {
141+
let contents = fs::read_to_string(seed_path.clone())?;
142+
Mnemonic::from_str(&contents)?
143+
}
144+
Err(_e) => {
145+
let mut rng = thread_rng();
146+
let random_bytes: [u8; 32] = rng.gen();
146147

147-
let mnemonic = Mnemonic::from_entropy(&random_bytes)?;
148-
tracing::info!("Creating new seed");
148+
let mnemonic = Mnemonic::from_entropy(&random_bytes)?;
149+
tracing::info!("Creating new seed");
149150

150-
fs::write(seed_path, mnemonic.to_string())?;
151+
fs::write(seed_path, mnemonic.to_string())?;
151152

152-
mnemonic
153-
}
154-
};
155-
let seed = mnemonic.to_seed_normalized("");
153+
mnemonic
154+
}
155+
};
156+
let seed = mnemonic.to_seed_normalized("");
156157

157-
let signatory = db_signatory::DbSignatory::new(
158-
localstore,
159-
Some(auth_localstore),
160-
&seed,
161-
supported_units,
162-
Default::default(),
163-
)
164-
.await?;
158+
let signatory = db_signatory::DbSignatory::new(
159+
localstore,
160+
Some(auth_localstore),
161+
&seed,
162+
supported_units,
163+
Default::default(),
164+
)
165+
.await?;
165166

166-
let socket_addr = SocketAddr::from_str(&format!("{}:{}", args.listen_addr, args.listen_port))?;
167+
let socket_addr =
168+
SocketAddr::from_str(&format!("{}:{}", args.listen_addr, args.listen_port))?;
167169

168-
grpc_server(signatory, socket_addr, certs).await?;
170+
grpc_server(signatory, socket_addr, certs).await?;
171+
172+
Ok(())
173+
}
174+
}
169175

170-
Ok(())
176+
fn main() {
177+
#[cfg(target_arch = "wasm32")]
178+
println!("Not supported in wasm32");
179+
#[cfg(not(target_arch = "wasm32"))]
180+
{
181+
use tokio::runtime::Runtime;
182+
let rt = Runtime::new().unwrap();
183+
rt.block_on(async {
184+
cli::main().await.unwrap();
185+
});
186+
}
171187
}

crates/cdk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ tokio-tungstenite = { workspace = true, features = [
6464

6565
[target.'cfg(target_arch = "wasm32")'.dependencies]
6666
tokio = { workspace = true, features = ["rt", "macros", "sync", "time"] }
67-
cdk-signatory = { workspace = true, features = [] }
67+
cdk-signatory = { workspace = true, default-features = false }
6868
getrandom = { version = "0.2", features = ["js"] }
6969

7070
[[example]]

0 commit comments

Comments
 (0)