|
@@ -1,13 +1,10 @@
|
|
|
//! Mint Information
|
|
|
// https://github.com/cashubtc/nuts/blob/main/09.md
|
|
|
|
|
|
-use std::collections::HashMap;
|
|
|
-
|
|
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
|
|
-use serde_json::{Map, Value};
|
|
|
|
|
|
use super::nut01::PublicKey;
|
|
|
-use super::{nut04, nut05};
|
|
|
+use super::{nut04, nut05, nut07, nut08};
|
|
|
|
|
|
/// Mint Version
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
@@ -65,70 +62,38 @@ pub struct MintInfo {
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
pub contact: Option<Vec<Vec<String>>>,
|
|
|
/// shows which NUTs the mint supports
|
|
|
- #[serde(deserialize_with = "deserialize_nuts")]
|
|
|
- pub nuts: HashMap<u8, NutSettings>,
|
|
|
+ pub nuts: Nuts,
|
|
|
/// message of the day that the wallet must display to the user
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
pub motd: Option<String>,
|
|
|
}
|
|
|
|
|
|
-#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
-#[serde(untagged)]
|
|
|
-pub enum NutSettings {
|
|
|
- Nut04(nut04::Settings),
|
|
|
- Nut05(nut05::Settings),
|
|
|
- Optional(OptionalSettings),
|
|
|
- UnknownNut(Value),
|
|
|
-}
|
|
|
-
|
|
|
-fn deserialize_nuts<'de, D>(deserializer: D) -> Result<HashMap<u8, NutSettings>, D::Error>
|
|
|
-where
|
|
|
- D: Deserializer<'de>,
|
|
|
-{
|
|
|
- let b: Map<_, _> = Deserialize::deserialize(deserializer).unwrap();
|
|
|
-
|
|
|
- let h: HashMap<u8, Value> = b
|
|
|
- .into_iter()
|
|
|
- .map(|(v, k)| (v.parse().unwrap(), k))
|
|
|
- .collect();
|
|
|
-
|
|
|
- let mut nuts: HashMap<u8, NutSettings> = HashMap::with_capacity(h.capacity());
|
|
|
-
|
|
|
- for (num, nut) in h {
|
|
|
- let nut_settings = match num {
|
|
|
- 4 => {
|
|
|
- let settings: nut04::Settings = serde_json::from_value(nut).unwrap();
|
|
|
-
|
|
|
- NutSettings::Nut04(settings)
|
|
|
- }
|
|
|
- 5 => {
|
|
|
- let settings: nut05::Settings = serde_json::from_value(nut).unwrap();
|
|
|
-
|
|
|
- NutSettings::Nut05(settings)
|
|
|
- }
|
|
|
- 7..=10 | 12 => {
|
|
|
- println!("{}", nut);
|
|
|
- let settings: OptionalSettings = serde_json::from_value(nut).unwrap();
|
|
|
-
|
|
|
- NutSettings::Optional(settings)
|
|
|
- }
|
|
|
- _ => {
|
|
|
- let settings: Value = serde_json::from_value(nut).unwrap();
|
|
|
-
|
|
|
- NutSettings::UnknownNut(settings)
|
|
|
- }
|
|
|
- };
|
|
|
- nuts.insert(num, nut_settings);
|
|
|
- }
|
|
|
-
|
|
|
- Ok(nuts)
|
|
|
-}
|
|
|
-
|
|
|
-/// Spendable Settings
|
|
|
-#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
-#[serde(transparent)]
|
|
|
-pub struct OptionalSettings {
|
|
|
- supported: bool,
|
|
|
+#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
+pub struct Nuts {
|
|
|
+ #[serde(default)]
|
|
|
+ #[serde(rename = "4")]
|
|
|
+ pub nut04: nut04::Settings,
|
|
|
+ #[serde(default)]
|
|
|
+ #[serde(rename = "5")]
|
|
|
+ pub nut05: nut05::Settings,
|
|
|
+ #[serde(default)]
|
|
|
+ #[serde(rename = "7")]
|
|
|
+ pub nut07: nut07::Settings,
|
|
|
+ #[serde(default)]
|
|
|
+ #[serde(rename = "8")]
|
|
|
+ pub nut08: nut08::Settings,
|
|
|
+ // TODO: Change to nut settings
|
|
|
+ #[serde(default)]
|
|
|
+ #[serde(rename = "9")]
|
|
|
+ pub nut09: nut07::Settings,
|
|
|
+ // TODO: Change to nut settings
|
|
|
+ #[serde(default)]
|
|
|
+ #[serde(rename = "10")]
|
|
|
+ pub nut10: nut07::Settings,
|
|
|
+ #[serde(default)]
|
|
|
+ // TODO: Change to nut settings
|
|
|
+ #[serde(rename = "12")]
|
|
|
+ pub nut12: nut07::Settings,
|
|
|
}
|
|
|
|
|
|
#[cfg(test)]
|
|
@@ -137,9 +102,53 @@ mod tests {
|
|
|
use super::*;
|
|
|
|
|
|
#[test]
|
|
|
- fn test_mint_info() {
|
|
|
- let mint_info = r#"{"name":"moksha-mint","pubkey":"02b3d8d8280b26f1223dc603a9b2a69618dc26821bef8ee22d419c44d710007cbc","version":"0.1.2","description":"mutiny signet mint v1 api","contact":[["[[email"],["ngutech21@pm.me]]"]],"nuts":{"4":{"methods":[["bolt11","sat"]],"disabled":false},"5":{"methods":[["bolt11","sat"]]},"6":{"supported":true},"7":{"supported":false},"8":{"supported":true},"9":{"supported":false},"10":{"supported":false},"11":{"supported":false},"12":{"supported":false}}}"#;
|
|
|
-
|
|
|
- let _info: MintInfo = serde_json::from_str(mint_info).unwrap();
|
|
|
+ fn test_ser_mint_info() {
|
|
|
+ /*
|
|
|
+ let mint_info = serde_json::to_string(&MintInfo {
|
|
|
+ name: Some("Cashu-crab".to_string()),
|
|
|
+ pubkey: None,
|
|
|
+ version: None,
|
|
|
+ description: Some("A mint".to_string()),
|
|
|
+ description_long: Some("Some longer test".to_string()),
|
|
|
+ contact: None,
|
|
|
+ nuts: Nuts::default(),
|
|
|
+ motd: None,
|
|
|
+ })
|
|
|
+ .unwrap();
|
|
|
+
|
|
|
+ println!("{}", mint_info);
|
|
|
+ */
|
|
|
+ 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": [
|
|
|
+ ["email", "contact@me.com"],
|
|
|
+ ["twitter", "@me"],
|
|
|
+ ["nostr" ,"npub..."]
|
|
|
+ ],
|
|
|
+ "motd": "Message to display to users.",
|
|
|
+ "nuts": {
|
|
|
+ "4": {
|
|
|
+ "methods": [
|
|
|
+ ["bolt11", "sat"]
|
|
|
+ ],
|
|
|
+ "disabled": false
|
|
|
+ },
|
|
|
+ "5": {
|
|
|
+ "methods": [
|
|
|
+ ["bolt11", "sat"]
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ "7": {"supported": true},
|
|
|
+ "8": {"supported": true},
|
|
|
+ "9": {"supported": true},
|
|
|
+ "10": {"supported": true},
|
|
|
+ "12": {"supported": true}
|
|
|
+ }
|
|
|
+}"#;
|
|
|
+ let _info: MintInfo = serde_json::from_str(mint_info_str).unwrap();
|
|
|
}
|
|
|
}
|