Skip to content

Commit

Permalink
feat: adding tos to mint (#604)
Browse files Browse the repository at this point in the history
* feat: adding tos(terms of service) to mint and update cdk-sqlite migration
  • Loading branch information
nodlAndHodl authored Mar 7, 2025
1 parent 5a7362c commit fcf2e9d
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 57 deletions.
123 changes: 71 additions & 52 deletions crates/cashu/src/nuts/nut06.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ impl<'de> Deserialize<'de> for MintVersion {
}
}

/// Mint Info [NIP-06]
/// Mint Info [NUT-06]
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))]
pub struct MintInfo {
Expand Down Expand Up @@ -95,6 +95,9 @@ pub struct MintInfo {
/// server unix timestamp
#[serde(skip_serializing_if = "Option::is_none")]
pub time: Option<u64>,
/// terms of url service of the mint
#[serde(skip_serializing_if = "Option::is_none")]
pub tos_url: Option<String>,
}

impl MintInfo {
Expand Down Expand Up @@ -197,6 +200,17 @@ impl MintInfo {
..self
}
}

/// Set tos_url
pub fn tos_url<S>(self, tos_url: S) -> Self
where
S: Into<String>,
{
Self {
tos_url: Some(tos_url.into()),
..self
}
}
}

/// Supported nuts and settings
Expand Down Expand Up @@ -405,12 +419,12 @@ mod tests {
#[test]
fn test_des_mint_into() {
let mint_info_str = r#"{
"name": "Cashu mint",
"pubkey": "0296d0aa13b6a31cf0cd974249f28c7b7176d7274712c95a41c7d8066d3f29d679",
"version": "Nutshell/0.15.3",
"contact": [
["", ""],
["", ""]
"name": "Cashu mint",
"pubkey": "0296d0aa13b6a31cf0cd974249f28c7b7176d7274712c95a41c7d8066d3f29d679",
"version": "Nutshell/0.15.3",
"contact": [
["", ""],
["", ""]
],
"nuts": {
"4": {
Expand All @@ -432,7 +446,8 @@ mod tests {
"9": {"supported": true},
"10": {"supported": true},
"11": {"supported": true}
}
},
"tos_url": "https://cashu.mint/tos"
}"#;

let _mint_info: MintInfo = serde_json::from_str(mint_info_str).unwrap();
Expand All @@ -455,7 +470,8 @@ mod tests {
println!("{}", mint_info);
*/
let mint_info_str = r#"{
let mint_info_str = r#"
{
"name": "Bob's Cashu mint",
"pubkey": "0283bf290884eed3a7ca2663fc0260de2e2064d6b355ea13f98dec004b7a7ead99",
"version": "Nutshell/0.15.0",
Expand Down Expand Up @@ -502,51 +518,54 @@ mod tests {
"9": {"supported": true},
"10": {"supported": true},
"12": {"supported": true}
}
},
"tos_url": "https://cashu.mint/tos"
}"#;
let info: MintInfo = serde_json::from_str(mint_info_str).unwrap();
let mint_info_str = r#"{
"name": "Bob's Cashu mint",
"pubkey": "0283bf290884eed3a7ca2663fc0260de2e2064d6b355ea13f98dec004b7a7ead99",
"version": "Nutshell/0.15.0",
"description": "The short mint description",
"description_long": "A description that can be a long piece of text.",
"contact": [
["nostr", "xxxxx"],
["email", "[email protected]"]
],
"motd": "Message to display to users.",
"icon_url": "https://this-is-a-mint-icon-url.com/icon.png",
"nuts": {
"4": {
"methods": [
{
"method": "bolt11",
"unit": "sat",
"min_amount": 0,
"max_amount": 10000,
"description": true
}
],
"disabled": false
},
"5": {
"methods": [
{
"method": "bolt11",
"unit": "sat",
"min_amount": 0,
"max_amount": 10000
}
],
"disabled": false
},
"7": {"supported": true},
"8": {"supported": true},
"9": {"supported": true},
"10": {"supported": true},
"12": {"supported": true}
}
let mint_info_str = r#"
{
"name": "Bob's Cashu mint",
"pubkey": "0283bf290884eed3a7ca2663fc0260de2e2064d6b355ea13f98dec004b7a7ead99",
"version": "Nutshell/0.15.0",
"description": "The short mint description",
"description_long": "A description that can be a long piece of text.",
"contact": [
["nostr", "xxxxx"],
["email", "[email protected]"]
],
"motd": "Message to display to users.",
"icon_url": "https://this-is-a-mint-icon-url.com/icon.png",
"nuts": {
"4": {
"methods": [
{
"method": "bolt11",
"unit": "sat",
"min_amount": 0,
"max_amount": 10000,
"description": true
}
],
"disabled": false
},
"5": {
"methods": [
{
"method": "bolt11",
"unit": "sat",
"min_amount": 0,
"max_amount": 10000
}
],
"disabled": false
},
"7": {"supported": true},
"8": {"supported": true},
"9": {"supported": true},
"10": {"supported": true},
"12": {"supported": true}
},
"tos_url": "https://cashu.mint/tos"
}"#;
let mint_info: MintInfo = serde_json::from_str(mint_info_str).unwrap();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE mint ADD tos_url TEXT;
16 changes: 11 additions & 5 deletions crates/cdk-sqlite/src/wallet/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ impl WalletDatabase for WalletSqliteDatabase {
urls,
motd,
time,
tos_url,
) = match mint_info {
Some(mint_info) => {
let MintInfo {
Expand All @@ -101,6 +102,7 @@ impl WalletDatabase for WalletSqliteDatabase {
urls,
motd,
time,
tos_url,
} = mint_info;

(
Expand All @@ -115,18 +117,19 @@ impl WalletDatabase for WalletSqliteDatabase {
urls.map(|c| serde_json::to_string(&c).ok()),
motd,
time,
tos_url,
)
}
None => (
None, None, None, None, None, None, None, None, None, None, None,
None, None, None, None, None, None, None, None, None, None, None, None,
),
};

sqlx::query(
r#"
INSERT INTO mint
(mint_url, name, pubkey, version, description, description_long, contact, nuts, icon_url, urls, motd, mint_time)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
(mint_url, name, pubkey, version, description, description_long, contact, nuts, icon_url, urls, motd, mint_time, tos_url)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(mint_url) DO UPDATE SET
name = excluded.name,
pubkey = excluded.pubkey,
Expand All @@ -138,7 +141,8 @@ ON CONFLICT(mint_url) DO UPDATE SET
icon_url = excluded.icon_url,
urls = excluded.urls,
motd = excluded.motd,
mint_time = excluded.mint_time
mint_time = excluded.mint_time,
tos_url = excluded.tos_url
;
"#,
)
Expand All @@ -154,6 +158,7 @@ ON CONFLICT(mint_url) DO UPDATE SET
.bind(urls)
.bind(motd)
.bind(time.map(|v| v as i64))
.bind(tos_url)
.execute(&self.pool)
.await
.map_err(Error::from)?;
Expand Down Expand Up @@ -833,7 +838,7 @@ fn sqlite_row_to_mint_info(row: &SqliteRow) -> Result<MintInfo, Error> {
let motd: Option<String> = row.try_get("motd").map_err(Error::from)?;
let row_urls: Option<String> = row.try_get("urls").map_err(Error::from)?;
let time: Option<i64> = row.try_get("mint_time").map_err(Error::from)?;

let tos_url: Option<String> = row.try_get("tos_url").map_err(Error::from)?;
Ok(MintInfo {
name,
pubkey: row_pubkey.and_then(|p| PublicKey::from_slice(&p).ok()),
Expand All @@ -848,6 +853,7 @@ fn sqlite_row_to_mint_info(row: &SqliteRow) -> Result<MintInfo, Error> {
urls: row_urls.and_then(|c| serde_json::from_str(&c).ok()),
motd,
time: time.map(|t| t as u64),
tos_url,
})
}

Expand Down

0 comments on commit fcf2e9d

Please sign in to comment.