mirror of
https://github.com/aljazceru/cdk.git
synced 2026-02-03 20:26:13 +01:00
refactor: consolidate to one CDK crate
Having the two crates adds complexity without benefit since features can be used instead
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
[workspace]
|
||||
members = [
|
||||
"crates/cashu",
|
||||
"crates/cdk",
|
||||
]
|
||||
resolver = "2"
|
||||
@@ -21,15 +20,7 @@ license-file = "LICENSE"
|
||||
keywords = ["bitcoin", "e-cash", "cashu"]
|
||||
|
||||
[workspace.dependencies]
|
||||
serde = { version = "1.0.160", features = ["derive"]}
|
||||
serde_json = "1.0.96"
|
||||
url = "2.3.1"
|
||||
tokio = { version = "1.32", default-features = false }
|
||||
tracing = { version = "0.1", default-features = false }
|
||||
tracing-subscriber = "0.3"
|
||||
uniffi = "0.24"
|
||||
thiserror = "1.0.50"
|
||||
getrandom = { version = "0.2", features = ["js"] }
|
||||
|
||||
[profile]
|
||||
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
[package]
|
||||
name = "cashu"
|
||||
version = "0.4.1-ALPHA"
|
||||
edition = "2021"
|
||||
authors = ["thesimplekid"]
|
||||
readme = "README.md"
|
||||
homepage.workspace = true
|
||||
repository.workspace = true
|
||||
license.workspace = true
|
||||
rust-version.workspace = true # MSRV
|
||||
description = "Cashu rust wallet and mint library"
|
||||
|
||||
|
||||
[features]
|
||||
default = ["mint", "wallet", "all-nuts"]
|
||||
mint = []
|
||||
wallet = []
|
||||
all-nuts = ["nut13"]
|
||||
nut13 = ["dep:bip39"]
|
||||
|
||||
[dependencies]
|
||||
base64 = "0.21" # bitcoin uses v0.21 (optional dep)
|
||||
bip39 = { version = "2.0", optional = true }
|
||||
bitcoin = { version = "0.30", features = ["serde", "rand", "rand-std"] } # lightning-invoice uses v0.30
|
||||
lightning-invoice = { version = "0.29", features = ["serde"] }
|
||||
once_cell = "1.19"
|
||||
serde.workspace = true
|
||||
serde_json.workspace = true
|
||||
serde_with = "3.4"
|
||||
url.workspace = true
|
||||
thiserror.workspace = true
|
||||
tracing.workspace = true
|
||||
uuid = { version = "1.6", features = ["v4"] }
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
getrandom.workspace = true
|
||||
instant = { version = "0.1", features = [ "wasm-bindgen", "inaccurate" ] }
|
||||
@@ -1,184 +0,0 @@
|
||||
use std::string::FromUtf8Error;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::util::hex;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum Error {
|
||||
/// Parse Url Error
|
||||
#[error("`{0}`")]
|
||||
UrlParseError(#[from] url::ParseError),
|
||||
/// Utf8 parse error
|
||||
#[error("`{0}`")]
|
||||
Utf8ParseError(#[from] FromUtf8Error),
|
||||
/// Serde Json error
|
||||
#[error("`{0}`")]
|
||||
SerdeJsonError(#[from] serde_json::Error),
|
||||
/// Base64 error
|
||||
#[error("`{0}`")]
|
||||
Base64Error(#[from] base64::DecodeError),
|
||||
/// From hex error
|
||||
#[error("`{0}`")]
|
||||
HexError(#[from] hex::Error),
|
||||
/// Secp256k1 error
|
||||
#[error("`{0}`")]
|
||||
Secp256k1(#[from] bitcoin::secp256k1::Error),
|
||||
#[error("No Key for Amoun")]
|
||||
AmountKey,
|
||||
#[error("Amount miss match")]
|
||||
Amount,
|
||||
#[error("Token already spent")]
|
||||
TokenSpent,
|
||||
#[error("Token not verified")]
|
||||
TokenNotVerifed,
|
||||
#[error("Invoice Amount undefined")]
|
||||
InvoiceAmountUndefined,
|
||||
#[error("Proof missing required field")]
|
||||
MissingProofField,
|
||||
#[error("No valid point found")]
|
||||
NoValidPoint,
|
||||
#[error("Kind not found")]
|
||||
KindNotFound,
|
||||
#[error("Unknown Tag")]
|
||||
UnknownTag,
|
||||
#[error("Incorrect Secret Kind")]
|
||||
IncorrectSecretKind,
|
||||
#[error("Spending conditions not met")]
|
||||
SpendConditionsNotMet,
|
||||
#[error("Could not convert key")]
|
||||
Key,
|
||||
#[error("Invalid signature")]
|
||||
InvalidSignature,
|
||||
#[error("Locktime in past")]
|
||||
LocktimeInPast,
|
||||
#[error("`{0}`")]
|
||||
Secret(#[from] super::secret::Error),
|
||||
#[error("`{0}`")]
|
||||
NUT01(#[from] crate::nuts::nut01::Error),
|
||||
#[error("`{0}`")]
|
||||
NUT02(#[from] crate::nuts::nut02::Error),
|
||||
#[cfg(feature = "nut13")]
|
||||
#[error("`{0}`")]
|
||||
Bip32(#[from] bitcoin::bip32::Error),
|
||||
#[error("`{0}`")]
|
||||
ParseInt(#[from] std::num::ParseIntError),
|
||||
/// Custom error
|
||||
#[error("`{0}`")]
|
||||
CustomError(String),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct ErrorResponse {
|
||||
pub code: u32,
|
||||
pub error: Option<String>,
|
||||
pub detail: Option<String>,
|
||||
}
|
||||
|
||||
impl ErrorResponse {
|
||||
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
|
||||
if let Ok(res) = serde_json::from_str::<ErrorResponse>(json) {
|
||||
Ok(res)
|
||||
} else {
|
||||
Ok(Self {
|
||||
code: 999,
|
||||
error: Some(json.to_string()),
|
||||
detail: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub mod wallet {
|
||||
use std::string::FromUtf8Error;
|
||||
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::nuts::nut01;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum Error {
|
||||
/// Serde Json error
|
||||
#[error("`{0}`")]
|
||||
SerdeJsonError(#[from] serde_json::Error),
|
||||
/// Secp256k1 error
|
||||
#[error("`{0}`")]
|
||||
Secp256k1(#[from] bitcoin::secp256k1::Error),
|
||||
/// NUT01 error
|
||||
#[error("`{0}`")]
|
||||
NUT01(#[from] nut01::Error),
|
||||
/// Insufficient Funds
|
||||
#[error("Insufficient funds")]
|
||||
InsufficientFunds,
|
||||
/// Utf8 parse error
|
||||
#[error("`{0}`")]
|
||||
Utf8ParseError(#[from] FromUtf8Error),
|
||||
/// Base64 error
|
||||
#[error("`{0}`")]
|
||||
Base64Error(#[from] base64::DecodeError),
|
||||
/// Unsupported Token
|
||||
#[error("Token unsupported")]
|
||||
UnsupportedToken,
|
||||
/// Token Requires proofs
|
||||
#[error("Proofs Required")]
|
||||
ProofsRequired,
|
||||
/// Url Parse error
|
||||
#[error("Url Parse")]
|
||||
UrlParse,
|
||||
#[error("`{0}`")]
|
||||
Secret(#[from] crate::secret::Error),
|
||||
#[error("`{0}`")]
|
||||
Cashu(#[from] super::Error),
|
||||
/// Custom Error message
|
||||
#[error("`{0}`")]
|
||||
CustomError(String),
|
||||
}
|
||||
|
||||
impl From<crate::url::Error> for Error {
|
||||
fn from(_err: crate::url::Error) -> Error {
|
||||
Error::UrlParse
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub mod mint {
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::nuts::nut01;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum Error {
|
||||
#[error("No key for amount")]
|
||||
AmountKey,
|
||||
#[error("Amount miss match")]
|
||||
Amount,
|
||||
#[error("Token Already Spent")]
|
||||
TokenSpent,
|
||||
/// Secp256k1 error
|
||||
#[error("`{0}`")]
|
||||
Secp256k1(#[from] bitcoin::secp256k1::Error),
|
||||
/// NUT01 error
|
||||
#[error("`{0}`")]
|
||||
NUT01(#[from] nut01::Error),
|
||||
#[error("`Token not verified`")]
|
||||
TokenNotVerifed,
|
||||
#[error("Invoice amount undefined")]
|
||||
InvoiceAmountUndefined,
|
||||
/// Duplicate Proofs sent in request
|
||||
#[error("Duplicate proofs")]
|
||||
DuplicateProofs,
|
||||
/// Keyset id not active
|
||||
#[error("Keyset id is not active")]
|
||||
InactiveKeyset,
|
||||
/// Keyset is not known
|
||||
#[error("Unknown Keyset")]
|
||||
UnknownKeySet,
|
||||
#[error("`{0}`")]
|
||||
Secret(#[from] crate::secret::Error),
|
||||
#[error("`{0}`")]
|
||||
Cashu(#[from] super::Error),
|
||||
#[error("`{0}`")]
|
||||
CustomError(String),
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
extern crate core;
|
||||
|
||||
pub use bitcoin::hashes::sha256::Hash as Sha256;
|
||||
pub use bitcoin::secp256k1;
|
||||
pub use lightning_invoice::{self, Bolt11Invoice};
|
||||
|
||||
pub mod amount;
|
||||
pub mod dhke;
|
||||
pub mod error;
|
||||
pub mod nuts;
|
||||
pub mod secret;
|
||||
pub mod serde_utils;
|
||||
pub mod types;
|
||||
pub mod url;
|
||||
pub mod util;
|
||||
|
||||
pub use self::amount::Amount;
|
||||
pub use self::util::SECP256K1;
|
||||
|
||||
pub type Result<T, E = Box<dyn std::error::Error>> = std::result::Result<T, E>;
|
||||
@@ -11,25 +11,30 @@ license.workspace = true
|
||||
|
||||
[features]
|
||||
default = ["mint", "wallet", "all-nuts", "redb"]
|
||||
mint = ["cashu/mint"]
|
||||
wallet = ["cashu/wallet", "dep:minreq"]
|
||||
mint = []
|
||||
wallet = ["dep:minreq"]
|
||||
gloo = ["dep:gloo"]
|
||||
all-nuts = ["nut13"]
|
||||
nut13 = ["cashu/nut13"]
|
||||
nut13 = ["dep:bip39"]
|
||||
redb = ["dep:redb"]
|
||||
|
||||
|
||||
[dependencies]
|
||||
bip39 = "2.0.0"
|
||||
cashu = { path = "../cashu" }
|
||||
serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
url = { workspace = true }
|
||||
tracing = { workspace = true }
|
||||
thiserror = { workspace = true }
|
||||
base64 = "0.21" # bitcoin uses v0.21 (optional dep)
|
||||
bip39 = { version = "2.0", optional = true }
|
||||
bitcoin = { version = "0.30", features = ["serde", "rand", "rand-std"] } # lightning-invoice uses v0.30
|
||||
lightning-invoice = { version = "0.29", features = ["serde"] }
|
||||
once_cell = "1.19"
|
||||
serde = { version = "1.0.160", default-features = false, features = ["derive"]}
|
||||
serde_json = { version = "1.0.96", default-features = false }
|
||||
serde_with = "3.4"
|
||||
url = "2.3.1"
|
||||
tracing = { version = "0.1", default-features = false }
|
||||
thiserror = "1.0.50"
|
||||
async-trait = "0.1.74"
|
||||
gloo = { version = "0.11.0", optional = true, features = ["net"] }
|
||||
http = "1.0.0"
|
||||
uuid = { version = "1.6", features = ["v4"] }
|
||||
|
||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||
tokio = { workspace = true, features = ["rt-multi-thread", "time", "macros", "sync"] }
|
||||
@@ -38,6 +43,7 @@ redb = { version = "2.0.0", optional = true }
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
tokio = { workspace = true, features = ["rt", "macros", "sync", "time"] }
|
||||
getrandom = { workspace = true }
|
||||
getrandom = { version = "0.2.14" }
|
||||
instant = { version = "0.1", features = [ "wasm-bindgen", "inaccurate" ] }
|
||||
|
||||
|
||||
|
||||
@@ -1 +1,184 @@
|
||||
use std::string::FromUtf8Error;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::util::hex;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum Error {
|
||||
/// Parse Url Error
|
||||
#[error("`{0}`")]
|
||||
UrlParseError(#[from] url::ParseError),
|
||||
/// Utf8 parse error
|
||||
#[error("`{0}`")]
|
||||
Utf8ParseError(#[from] FromUtf8Error),
|
||||
/// Serde Json error
|
||||
#[error("`{0}`")]
|
||||
SerdeJsonError(#[from] serde_json::Error),
|
||||
/// Base64 error
|
||||
#[error("`{0}`")]
|
||||
Base64Error(#[from] base64::DecodeError),
|
||||
/// From hex error
|
||||
#[error("`{0}`")]
|
||||
HexError(#[from] hex::Error),
|
||||
/// Secp256k1 error
|
||||
#[error("`{0}`")]
|
||||
Secp256k1(#[from] bitcoin::secp256k1::Error),
|
||||
#[error("No Key for Amoun")]
|
||||
AmountKey,
|
||||
#[error("Amount miss match")]
|
||||
Amount,
|
||||
#[error("Token already spent")]
|
||||
TokenSpent,
|
||||
#[error("Token not verified")]
|
||||
TokenNotVerifed,
|
||||
#[error("Invoice Amount undefined")]
|
||||
InvoiceAmountUndefined,
|
||||
#[error("Proof missing required field")]
|
||||
MissingProofField,
|
||||
#[error("No valid point found")]
|
||||
NoValidPoint,
|
||||
#[error("Kind not found")]
|
||||
KindNotFound,
|
||||
#[error("Unknown Tag")]
|
||||
UnknownTag,
|
||||
#[error("Incorrect Secret Kind")]
|
||||
IncorrectSecretKind,
|
||||
#[error("Spending conditions not met")]
|
||||
SpendConditionsNotMet,
|
||||
#[error("Could not convert key")]
|
||||
Key,
|
||||
#[error("Invalid signature")]
|
||||
InvalidSignature,
|
||||
#[error("Locktime in past")]
|
||||
LocktimeInPast,
|
||||
#[error("`{0}`")]
|
||||
Secret(#[from] super::secret::Error),
|
||||
#[error("`{0}`")]
|
||||
NUT01(#[from] crate::nuts::nut01::Error),
|
||||
#[error("`{0}`")]
|
||||
NUT02(#[from] crate::nuts::nut02::Error),
|
||||
#[cfg(feature = "nut13")]
|
||||
#[error("`{0}`")]
|
||||
Bip32(#[from] bitcoin::bip32::Error),
|
||||
#[error("`{0}`")]
|
||||
ParseInt(#[from] std::num::ParseIntError),
|
||||
/// Custom error
|
||||
#[error("`{0}`")]
|
||||
CustomError(String),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct ErrorResponse {
|
||||
pub code: u32,
|
||||
pub error: Option<String>,
|
||||
pub detail: Option<String>,
|
||||
}
|
||||
|
||||
impl ErrorResponse {
|
||||
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
|
||||
if let Ok(res) = serde_json::from_str::<ErrorResponse>(json) {
|
||||
Ok(res)
|
||||
} else {
|
||||
Ok(Self {
|
||||
code: 999,
|
||||
error: Some(json.to_string()),
|
||||
detail: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub mod wallet {
|
||||
use std::string::FromUtf8Error;
|
||||
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::nuts::nut01;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum Error {
|
||||
/// Serde Json error
|
||||
#[error("`{0}`")]
|
||||
SerdeJsonError(#[from] serde_json::Error),
|
||||
/// Secp256k1 error
|
||||
#[error("`{0}`")]
|
||||
Secp256k1(#[from] bitcoin::secp256k1::Error),
|
||||
/// NUT01 error
|
||||
#[error("`{0}`")]
|
||||
NUT01(#[from] nut01::Error),
|
||||
/// Insufficient Funds
|
||||
#[error("Insufficient funds")]
|
||||
InsufficientFunds,
|
||||
/// Utf8 parse error
|
||||
#[error("`{0}`")]
|
||||
Utf8ParseError(#[from] FromUtf8Error),
|
||||
/// Base64 error
|
||||
#[error("`{0}`")]
|
||||
Base64Error(#[from] base64::DecodeError),
|
||||
/// Unsupported Token
|
||||
#[error("Token unsupported")]
|
||||
UnsupportedToken,
|
||||
/// Token Requires proofs
|
||||
#[error("Proofs Required")]
|
||||
ProofsRequired,
|
||||
/// Url Parse error
|
||||
#[error("Url Parse")]
|
||||
UrlParse,
|
||||
#[error("`{0}`")]
|
||||
Secret(#[from] crate::secret::Error),
|
||||
#[error("`{0}`")]
|
||||
Cashu(#[from] super::Error),
|
||||
/// Custom Error message
|
||||
#[error("`{0}`")]
|
||||
CustomError(String),
|
||||
}
|
||||
|
||||
impl From<crate::url::Error> for Error {
|
||||
fn from(_err: crate::url::Error) -> Error {
|
||||
Error::UrlParse
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub mod mint {
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::nuts::nut01;
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum Error {
|
||||
#[error("No key for amount")]
|
||||
AmountKey,
|
||||
#[error("Amount miss match")]
|
||||
Amount,
|
||||
#[error("Token Already Spent")]
|
||||
TokenSpent,
|
||||
/// Secp256k1 error
|
||||
#[error("`{0}`")]
|
||||
Secp256k1(#[from] bitcoin::secp256k1::Error),
|
||||
/// NUT01 error
|
||||
#[error("`{0}`")]
|
||||
NUT01(#[from] nut01::Error),
|
||||
#[error("`Token not verified`")]
|
||||
TokenNotVerifed,
|
||||
#[error("Invoice amount undefined")]
|
||||
InvoiceAmountUndefined,
|
||||
/// Duplicate Proofs sent in request
|
||||
#[error("Duplicate proofs")]
|
||||
DuplicateProofs,
|
||||
/// Keyset id not active
|
||||
#[error("Keyset id is not active")]
|
||||
InactiveKeyset,
|
||||
/// Keyset is not known
|
||||
#[error("Unknown Keyset")]
|
||||
UnknownKeySet,
|
||||
#[error("`{0}`")]
|
||||
Secret(#[from] crate::secret::Error),
|
||||
#[error("`{0}`")]
|
||||
Cashu(#[from] super::Error),
|
||||
#[error("`{0}`")]
|
||||
CustomError(String),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
pub use bip39::Mnemonic;
|
||||
pub use cashu::{self, *};
|
||||
extern crate core;
|
||||
|
||||
#[cfg(feature = "wallet")]
|
||||
pub mod client;
|
||||
#[cfg(feature = "mint")]
|
||||
pub mod mint;
|
||||
#[cfg(feature = "wallet")]
|
||||
pub mod wallet;
|
||||
pub use bitcoin::hashes::sha256::Hash as Sha256;
|
||||
pub use bitcoin::secp256k1;
|
||||
pub use lightning_invoice::{self, Bolt11Invoice};
|
||||
|
||||
pub mod amount;
|
||||
pub mod dhke;
|
||||
pub mod error;
|
||||
pub mod nuts;
|
||||
pub mod secret;
|
||||
pub mod serde_utils;
|
||||
pub mod types;
|
||||
pub mod url;
|
||||
pub mod util;
|
||||
|
||||
pub use self::amount::Amount;
|
||||
pub use self::util::SECP256K1;
|
||||
|
||||
pub type Result<T, E = Box<dyn std::error::Error>> = std::result::Result<T, E>;
|
||||
|
||||
Reference in New Issue
Block a user