@@ -7,6 +7,7 @@ use core::fmt;
7
7
use core:: num:: ParseIntError ;
8
8
use core:: str:: FromStr ;
9
9
10
+ use bitcoin_hashes:: sha256:: Hash ;
10
11
use secp256k1:: schnorr:: Signature ;
11
12
use secp256k1:: XOnlyPublicKey ;
12
13
use serde:: de:: Error as DeserializerError ;
@@ -242,6 +243,8 @@ pub enum TagKind {
242
243
Lnurl ,
243
244
/// Name tag
244
245
Name ,
246
+ /// Merkle mountain range
247
+ Mmr ,
245
248
/// Custom tag kind
246
249
Custom ( String ) ,
247
250
}
@@ -275,6 +278,7 @@ impl fmt::Display for TagKind {
275
278
Self :: Amount => write ! ( f, "amount" ) ,
276
279
Self :: Lnurl => write ! ( f, "lnurl" ) ,
277
280
Self :: Name => write ! ( f, "name" ) ,
281
+ Self :: Mmr => write ! ( f, "mmr" ) ,
278
282
Self :: Custom ( tag) => write ! ( f, "{tag}" ) ,
279
283
}
280
284
}
@@ -313,6 +317,7 @@ where
313
317
"amount" => Self :: Amount ,
314
318
"lnurl" => Self :: Lnurl ,
315
319
"name" => Self :: Name ,
320
+ "mmr" => Self :: Mmr ,
316
321
tag => Self :: Custom ( tag. to_string ( ) ) ,
317
322
}
318
323
}
@@ -370,6 +375,11 @@ pub enum Tag {
370
375
Lnurl ( String ) ,
371
376
Name ( String ) ,
372
377
PublishedAt ( Timestamp ) ,
378
+ Mmr {
379
+ prev_event_id : Hash ,
380
+ prev_mmr_root : Hash ,
381
+ prev_event_pos : i64 ,
382
+ } ,
373
383
}
374
384
375
385
impl Tag {
@@ -420,6 +430,7 @@ impl Tag {
420
430
Tag :: Amount ( ..) => TagKind :: Amount ,
421
431
Tag :: Name ( ..) => TagKind :: Name ,
422
432
Tag :: Lnurl ( ..) => TagKind :: Lnurl ,
433
+ Tag :: Mmr { .. } => TagKind :: Mmr ,
423
434
}
424
435
}
425
436
}
@@ -581,6 +592,11 @@ where
581
592
conditions : Conditions :: from_str ( & tag[ 2 ] ) ?,
582
593
sig : Signature :: from_str ( & tag[ 3 ] ) ?,
583
594
} ) ,
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
+ } ) ,
584
600
_ => Ok ( Self :: Generic ( tag_kind, tag[ 1 ..] . to_vec ( ) ) ) ,
585
601
}
586
602
} else {
@@ -726,6 +742,18 @@ impl From<Tag> for Vec<String> {
726
742
Tag :: Lnurl ( lnurl) => {
727
743
vec ! [ TagKind :: Lnurl . to_string( ) , lnurl]
728
744
}
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
+ }
729
757
}
730
758
}
731
759
}
0 commit comments