@@ -7,6 +7,7 @@ use core::fmt;
77use core:: num:: ParseIntError ;
88use core:: str:: FromStr ;
99
10+ use bitcoin_hashes:: sha256:: Hash ;
1011use secp256k1:: schnorr:: Signature ;
1112use secp256k1:: XOnlyPublicKey ;
1213use serde:: de:: Error as DeserializerError ;
@@ -242,6 +243,8 @@ pub enum TagKind {
242243 Lnurl ,
243244 /// Name tag
244245 Name ,
246+ /// Merkle mountain range
247+ Mmr ,
245248 /// Custom tag kind
246249 Custom ( String ) ,
247250}
@@ -275,6 +278,7 @@ impl fmt::Display for TagKind {
275278 Self :: Amount => write ! ( f, "amount" ) ,
276279 Self :: Lnurl => write ! ( f, "lnurl" ) ,
277280 Self :: Name => write ! ( f, "name" ) ,
281+ Self :: Mmr => write ! ( f, "mmr" ) ,
278282 Self :: Custom ( tag) => write ! ( f, "{tag}" ) ,
279283 }
280284 }
@@ -313,6 +317,7 @@ where
313317 "amount" => Self :: Amount ,
314318 "lnurl" => Self :: Lnurl ,
315319 "name" => Self :: Name ,
320+ "mmr" => Self :: Mmr ,
316321 tag => Self :: Custom ( tag. to_string ( ) ) ,
317322 }
318323 }
@@ -370,6 +375,11 @@ pub enum Tag {
370375 Lnurl ( String ) ,
371376 Name ( String ) ,
372377 PublishedAt ( Timestamp ) ,
378+ Mmr {
379+ prev_event_id : Hash ,
380+ prev_mmr_root : Hash ,
381+ prev_event_pos : i64 ,
382+ } ,
373383}
374384
375385impl Tag {
@@ -420,6 +430,7 @@ impl Tag {
420430 Tag :: Amount ( ..) => TagKind :: Amount ,
421431 Tag :: Name ( ..) => TagKind :: Name ,
422432 Tag :: Lnurl ( ..) => TagKind :: Lnurl ,
433+ Tag :: Mmr { .. } => TagKind :: Mmr ,
423434 }
424435 }
425436}
@@ -581,6 +592,11 @@ where
581592 conditions : Conditions :: from_str ( & tag[ 2 ] ) ?,
582593 sig : Signature :: from_str ( & tag[ 3 ] ) ?,
583594 } ) ,
595+ TagKind :: Mmr => Ok ( Self :: Mmr {
596+ prev_event_id : Hash :: from_str ( tag[ 1 ] . as_str ( ) ) ?,
597+ prev_mmr_root : Hash :: from_str ( tag[ 2 ] . as_str ( ) ) ?,
598+ prev_event_pos : i64:: from_str ( tag[ 3 ] . as_str ( ) ) ?,
599+ } ) ,
584600 _ => Ok ( Self :: Generic ( tag_kind, tag[ 1 ..] . to_vec ( ) ) ) ,
585601 }
586602 } else {
@@ -726,6 +742,18 @@ impl From<Tag> for Vec<String> {
726742 Tag :: Lnurl ( lnurl) => {
727743 vec ! [ TagKind :: Lnurl . to_string( ) , lnurl]
728744 }
745+ Tag :: Mmr {
746+ prev_event_id,
747+ prev_mmr_root,
748+ prev_event_pos,
749+ } => {
750+ vec ! [
751+ TagKind :: Mmr . to_string( ) ,
752+ prev_event_id. to_string( ) ,
753+ prev_mmr_root. to_string( ) ,
754+ prev_event_pos. to_string( ) ,
755+ ]
756+ }
729757 }
730758 }
731759}
0 commit comments