contract.rs (84927B)
1 #![forbid(unsafe_code)] 2 3 #[cfg(not(feature = "std"))] 4 use alloc::{string::String, vec::Vec}; 5 6 use crate::kinds::*; 7 8 pub const RADROOTS_EVENT_CONTRACT_REGISTRY_VERSION: u32 = 1; 9 10 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 11 pub enum RadrootsEventClass { 12 Regular, 13 Replaceable, 14 Addressable, 15 Ephemeral, 16 } 17 18 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 19 pub enum RadrootsNostrStandard { 20 Nip01, 21 Nip09, 22 Nip17, 23 Nip18, 24 Nip22, 25 Nip23, 26 Nip25, 27 Nip28, 28 Nip29, 29 Nip42, 30 Nip51, 31 Nip52, 32 Nip53, 33 Nip56, 34 Nip57, 35 Nip78, 36 Nip90, 37 Nip94, 38 Nip98, 39 Radroots, 40 } 41 42 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 43 pub enum RadrootsEventPrivacy { 44 Public, 45 Encrypted, 46 LocalOnly, 47 Secret, 48 } 49 50 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 51 pub enum RadrootsEventStability { 52 Stable, 53 Experimental, 54 } 55 56 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] 57 pub enum RadrootsActorRole { 58 Any, 59 Application, 60 Buyer, 61 Farmer, 62 Member, 63 Moderator, 64 Relay, 65 Seller, 66 Service, 67 } 68 69 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 70 pub enum RadrootsReducer { 71 CalendarProjection, 72 FarmOpsProjection, 73 GroupProjection, 74 ListingInventoryAccounting, 75 ListingProjection, 76 MarketProjection, 77 OrderProjection, 78 ProfileProjection, 79 RelayPolicyProjection, 80 SocialProjection, 81 TradeValidation, 82 } 83 84 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 85 pub enum RadrootsContentSchema { 86 Empty, 87 JsonObject, 88 PlainText, 89 Markdown, 90 Encrypted, 91 BinaryReference, 92 } 93 94 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 95 pub enum RadrootsTagCardinality { 96 RequiredOne, 97 OptionalOne, 98 OptionalMany, 99 RequiredMany, 100 } 101 102 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 103 pub enum RadrootsTagSemantic { 104 AddressableCoordinate, 105 Category, 106 Counterparty, 107 EventPointer, 108 GroupId, 109 Identifier, 110 Image, 111 Kind, 112 ListingAddress, 113 ListingSnapshot, 114 Location, 115 PreviousEvent, 116 Price, 117 PublishedAt, 118 Relay, 119 RootEvent, 120 ServiceInput, 121 ServiceOutput, 122 Status, 123 Summary, 124 Title, 125 Url, 126 } 127 128 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 129 pub enum RadrootsTagValueType { 130 AddressableCoordinate, 131 DTag, 132 EventId, 133 EventPointer, 134 Kind, 135 PublicKey, 136 RelayUrl, 137 Text, 138 UnixTimestamp, 139 Url, 140 } 141 142 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 143 pub struct RadrootsTagContract { 144 pub name: &'static str, 145 pub cardinality: RadrootsTagCardinality, 146 pub semantic: RadrootsTagSemantic, 147 pub value_type: RadrootsTagValueType, 148 pub relay_indexed: bool, 149 } 150 151 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 152 pub enum RadrootsEventDiscriminator { 153 KindOnly, 154 DTagExact(&'static str), 155 DTagPrefix(&'static str), 156 DTagSuffix(&'static str), 157 TagEquals { 158 name: &'static str, 159 value: &'static str, 160 }, 161 ContentJsonFieldEquals { 162 field: &'static str, 163 value: &'static str, 164 }, 165 EnvelopeType(&'static str), 166 Composite(&'static [RadrootsEventDiscriminator]), 167 } 168 169 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 170 pub enum RadrootsContractMatchError { 171 UnsupportedKind(u32), 172 UnsupportedShape(u32), 173 AmbiguousShape(u32), 174 } 175 176 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 177 pub struct RadrootsKindContract { 178 pub kind: u32, 179 pub canonical_constant: &'static str, 180 pub name: &'static str, 181 pub class: RadrootsEventClass, 182 pub standard: RadrootsNostrStandard, 183 pub accepted_event_contracts: &'static [&'static str], 184 } 185 186 #[derive(Clone, Copy, Debug, PartialEq, Eq)] 187 pub struct RadrootsEventContract { 188 pub id: &'static str, 189 pub kind: u32, 190 pub name: &'static str, 191 pub payload_type: &'static str, 192 pub class: RadrootsEventClass, 193 pub stability: RadrootsEventStability, 194 pub privacy: RadrootsEventPrivacy, 195 pub author_role: RadrootsActorRole, 196 pub content_schema: RadrootsContentSchema, 197 pub discriminator: RadrootsEventDiscriminator, 198 pub tags: &'static [RadrootsTagContract], 199 pub reducers: &'static [RadrootsReducer], 200 } 201 202 const fn tag( 203 name: &'static str, 204 cardinality: RadrootsTagCardinality, 205 semantic: RadrootsTagSemantic, 206 value_type: RadrootsTagValueType, 207 relay_indexed: bool, 208 ) -> RadrootsTagContract { 209 RadrootsTagContract { 210 name, 211 cardinality, 212 semantic, 213 value_type, 214 relay_indexed, 215 } 216 } 217 218 const TAG_D: RadrootsTagContract = tag( 219 "d", 220 RadrootsTagCardinality::RequiredOne, 221 RadrootsTagSemantic::Identifier, 222 RadrootsTagValueType::DTag, 223 true, 224 ); 225 const TAG_P_REQUIRED: RadrootsTagContract = tag( 226 "p", 227 RadrootsTagCardinality::RequiredOne, 228 RadrootsTagSemantic::Counterparty, 229 RadrootsTagValueType::PublicKey, 230 true, 231 ); 232 const TAG_P_MANY: RadrootsTagContract = tag( 233 "p", 234 RadrootsTagCardinality::OptionalMany, 235 RadrootsTagSemantic::Counterparty, 236 RadrootsTagValueType::PublicKey, 237 true, 238 ); 239 const TAG_A_REQUIRED: RadrootsTagContract = tag( 240 "a", 241 RadrootsTagCardinality::RequiredOne, 242 RadrootsTagSemantic::ListingAddress, 243 RadrootsTagValueType::AddressableCoordinate, 244 true, 245 ); 246 const TAG_A_OPTIONAL: RadrootsTagContract = tag( 247 "a", 248 RadrootsTagCardinality::OptionalOne, 249 RadrootsTagSemantic::AddressableCoordinate, 250 RadrootsTagValueType::AddressableCoordinate, 251 true, 252 ); 253 const TAG_E_ROOT: RadrootsTagContract = tag( 254 "e", 255 RadrootsTagCardinality::RequiredOne, 256 RadrootsTagSemantic::RootEvent, 257 RadrootsTagValueType::EventId, 258 true, 259 ); 260 const TAG_E_PREVIOUS: RadrootsTagContract = tag( 261 "e", 262 RadrootsTagCardinality::RequiredOne, 263 RadrootsTagSemantic::PreviousEvent, 264 RadrootsTagValueType::EventId, 265 true, 266 ); 267 const TAG_E_MANY: RadrootsTagContract = tag( 268 "e", 269 RadrootsTagCardinality::OptionalMany, 270 RadrootsTagSemantic::EventPointer, 271 RadrootsTagValueType::EventId, 272 true, 273 ); 274 const TAG_KIND: RadrootsTagContract = tag( 275 "k", 276 RadrootsTagCardinality::OptionalOne, 277 RadrootsTagSemantic::Kind, 278 RadrootsTagValueType::Kind, 279 true, 280 ); 281 const TAG_RELAY: RadrootsTagContract = tag( 282 "relay", 283 RadrootsTagCardinality::OptionalMany, 284 RadrootsTagSemantic::Relay, 285 RadrootsTagValueType::RelayUrl, 286 false, 287 ); 288 const TAG_GROUP: RadrootsTagContract = tag( 289 "h", 290 RadrootsTagCardinality::RequiredOne, 291 RadrootsTagSemantic::GroupId, 292 RadrootsTagValueType::DTag, 293 true, 294 ); 295 const TAG_TITLE: RadrootsTagContract = tag( 296 "title", 297 RadrootsTagCardinality::OptionalOne, 298 RadrootsTagSemantic::Title, 299 RadrootsTagValueType::Text, 300 false, 301 ); 302 const TAG_SUMMARY: RadrootsTagContract = tag( 303 "summary", 304 RadrootsTagCardinality::OptionalOne, 305 RadrootsTagSemantic::Summary, 306 RadrootsTagValueType::Text, 307 false, 308 ); 309 const TAG_PUBLISHED_AT: RadrootsTagContract = tag( 310 "published_at", 311 RadrootsTagCardinality::OptionalOne, 312 RadrootsTagSemantic::PublishedAt, 313 RadrootsTagValueType::UnixTimestamp, 314 false, 315 ); 316 const TAG_LOCATION: RadrootsTagContract = tag( 317 "location", 318 RadrootsTagCardinality::OptionalMany, 319 RadrootsTagSemantic::Location, 320 RadrootsTagValueType::Text, 321 false, 322 ); 323 const TAG_PRICE: RadrootsTagContract = tag( 324 "price", 325 RadrootsTagCardinality::OptionalMany, 326 RadrootsTagSemantic::Price, 327 RadrootsTagValueType::Text, 328 false, 329 ); 330 const TAG_STATUS: RadrootsTagContract = tag( 331 "status", 332 RadrootsTagCardinality::OptionalOne, 333 RadrootsTagSemantic::Status, 334 RadrootsTagValueType::Text, 335 false, 336 ); 337 const TAG_CATEGORY: RadrootsTagContract = tag( 338 "category", 339 RadrootsTagCardinality::OptionalMany, 340 RadrootsTagSemantic::Category, 341 RadrootsTagValueType::Text, 342 false, 343 ); 344 const TAG_IMAGE: RadrootsTagContract = tag( 345 "image", 346 RadrootsTagCardinality::OptionalMany, 347 RadrootsTagSemantic::Image, 348 RadrootsTagValueType::Url, 349 false, 350 ); 351 const TAG_LISTING_EVENT: RadrootsTagContract = tag( 352 "listing_event", 353 RadrootsTagCardinality::RequiredOne, 354 RadrootsTagSemantic::ListingSnapshot, 355 RadrootsTagValueType::EventPointer, 356 false, 357 ); 358 const TAG_SERVICE_INPUT: RadrootsTagContract = tag( 359 "i", 360 RadrootsTagCardinality::RequiredOne, 361 RadrootsTagSemantic::ServiceInput, 362 RadrootsTagValueType::Text, 363 true, 364 ); 365 const TAG_SERVICE_REQUEST: RadrootsTagContract = tag( 366 "request", 367 RadrootsTagCardinality::RequiredOne, 368 RadrootsTagSemantic::ServiceInput, 369 RadrootsTagValueType::EventId, 370 false, 371 ); 372 const TAG_SERVICE_OUTPUT: RadrootsTagContract = tag( 373 "output", 374 RadrootsTagCardinality::RequiredOne, 375 RadrootsTagSemantic::ServiceOutput, 376 RadrootsTagValueType::Text, 377 false, 378 ); 379 const TAG_URL: RadrootsTagContract = tag( 380 "url", 381 RadrootsTagCardinality::OptionalOne, 382 RadrootsTagSemantic::Url, 383 RadrootsTagValueType::Url, 384 false, 385 ); 386 387 const NO_TAGS: &[RadrootsTagContract] = &[]; 388 const D_TAGS: &[RadrootsTagContract] = &[TAG_D]; 389 const P_TAGS: &[RadrootsTagContract] = &[TAG_P_MANY]; 390 const EVENT_POINTER_TAGS: &[RadrootsTagContract] = &[TAG_E_MANY, TAG_P_MANY, TAG_KIND]; 391 const LIST_TAGS: &[RadrootsTagContract] = &[TAG_E_MANY, TAG_A_OPTIONAL, TAG_P_MANY, TAG_RELAY]; 392 const LIST_SET_TAGS: &[RadrootsTagContract] = &[TAG_D, TAG_E_MANY, TAG_A_OPTIONAL, TAG_P_MANY]; 393 const PROFILE_TAGS: &[RadrootsTagContract] = &[TAG_P_MANY]; 394 const GROUP_ACTION_TAGS: &[RadrootsTagContract] = &[TAG_GROUP, TAG_P_MANY, TAG_E_MANY]; 395 const GROUP_STATE_TAGS: &[RadrootsTagContract] = &[TAG_D, TAG_P_MANY, TAG_E_MANY]; 396 const FILE_METADATA_TAGS: &[RadrootsTagContract] = &[TAG_URL, TAG_IMAGE]; 397 const ARTICLE_TAGS: &[RadrootsTagContract] = &[TAG_D, TAG_TITLE, TAG_SUMMARY, TAG_PUBLISHED_AT]; 398 const CALENDAR_EVENT_TAGS: &[RadrootsTagContract] = 399 &[TAG_D, TAG_TITLE, TAG_LOCATION, TAG_PUBLISHED_AT]; 400 const FARM_TAGS: &[RadrootsTagContract] = &[TAG_D, TAG_TITLE, TAG_LOCATION, TAG_IMAGE]; 401 const LISTING_TAGS: &[RadrootsTagContract] = &[ 402 TAG_D, 403 TAG_TITLE, 404 TAG_SUMMARY, 405 TAG_PUBLISHED_AT, 406 TAG_LOCATION, 407 TAG_PRICE, 408 TAG_STATUS, 409 TAG_CATEGORY, 410 TAG_IMAGE, 411 ]; 412 const ORDER_REQUEST_TAGS: &[RadrootsTagContract] = 413 &[TAG_D, TAG_P_REQUIRED, TAG_A_REQUIRED, TAG_LISTING_EVENT]; 414 const CHAINED_ORDER_TAGS: &[RadrootsTagContract] = &[ 415 TAG_D, 416 TAG_P_REQUIRED, 417 TAG_A_REQUIRED, 418 TAG_E_ROOT, 419 TAG_E_PREVIOUS, 420 ]; 421 const TRADE_VALIDATION_REQUEST_TAGS: &[RadrootsTagContract] = &[TAG_SERVICE_INPUT, TAG_A_REQUIRED]; 422 const TRADE_VALIDATION_RESULT_TAGS: &[RadrootsTagContract] = 423 &[TAG_SERVICE_REQUEST, TAG_SERVICE_OUTPUT]; 424 const TRADE_VALIDATION_RECEIPT_TAGS: &[RadrootsTagContract] = 425 &[TAG_E_ROOT, TAG_A_OPTIONAL, TAG_SERVICE_OUTPUT]; 426 427 const SOCIAL_REDUCERS: &[RadrootsReducer] = &[RadrootsReducer::SocialProjection]; 428 const PROFILE_REDUCERS: &[RadrootsReducer] = &[RadrootsReducer::ProfileProjection]; 429 const FARM_OPS_REDUCERS: &[RadrootsReducer] = &[RadrootsReducer::FarmOpsProjection]; 430 const GROUP_REDUCERS: &[RadrootsReducer] = &[RadrootsReducer::GroupProjection]; 431 const CALENDAR_REDUCERS: &[RadrootsReducer] = &[RadrootsReducer::CalendarProjection]; 432 const LISTING_REDUCERS: &[RadrootsReducer] = &[ 433 RadrootsReducer::ListingProjection, 434 RadrootsReducer::MarketProjection, 435 RadrootsReducer::ListingInventoryAccounting, 436 ]; 437 const ORDER_REDUCERS: &[RadrootsReducer] = &[ 438 RadrootsReducer::OrderProjection, 439 RadrootsReducer::ListingInventoryAccounting, 440 ]; 441 const TRADE_VALIDATION_REDUCERS: &[RadrootsReducer] = &[RadrootsReducer::TradeValidation]; 442 const RELAY_REDUCERS: &[RadrootsReducer] = &[RadrootsReducer::RelayPolicyProjection]; 443 444 const FARM_MEMBERS_LIST_DISCRIMINATOR: &[RadrootsEventDiscriminator] = &[ 445 RadrootsEventDiscriminator::DTagPrefix("farm:"), 446 RadrootsEventDiscriminator::DTagSuffix(":members"), 447 ]; 448 const FARM_OWNERS_LIST_DISCRIMINATOR: &[RadrootsEventDiscriminator] = &[ 449 RadrootsEventDiscriminator::DTagPrefix("farm:"), 450 RadrootsEventDiscriminator::DTagSuffix(":members.owners"), 451 ]; 452 const FARM_WORKERS_LIST_DISCRIMINATOR: &[RadrootsEventDiscriminator] = &[ 453 RadrootsEventDiscriminator::DTagPrefix("farm:"), 454 RadrootsEventDiscriminator::DTagSuffix(":members.workers"), 455 ]; 456 const FARM_PLOTS_LIST_DISCRIMINATOR: &[RadrootsEventDiscriminator] = &[ 457 RadrootsEventDiscriminator::DTagPrefix("farm:"), 458 RadrootsEventDiscriminator::DTagSuffix(":plots"), 459 ]; 460 const FARM_LISTINGS_LIST_DISCRIMINATOR: &[RadrootsEventDiscriminator] = &[ 461 RadrootsEventDiscriminator::DTagPrefix("farm:"), 462 RadrootsEventDiscriminator::DTagSuffix(":listings"), 463 ]; 464 465 macro_rules! kind_contract { 466 ($kind:expr, $constant:literal, $name:literal, $class:expr, $standard:expr, [$($contract:literal),+ $(,)?]) => { 467 RadrootsKindContract { 468 kind: $kind, 469 canonical_constant: $constant, 470 name: $name, 471 class: $class, 472 standard: $standard, 473 accepted_event_contracts: &[$($contract),+], 474 } 475 }; 476 } 477 478 macro_rules! event_contract { 479 ( 480 $id:literal, 481 $kind:expr, 482 $name:literal, 483 $payload_type:literal, 484 $class:expr, 485 $standard_privacy:expr, 486 $author_role:expr, 487 $content_schema:expr, 488 $discriminator:expr, 489 $tags:expr, 490 $reducers:expr $(,)? 491 ) => { 492 RadrootsEventContract { 493 id: $id, 494 kind: $kind, 495 name: $name, 496 payload_type: $payload_type, 497 class: $class, 498 stability: RadrootsEventStability::Stable, 499 privacy: $standard_privacy, 500 author_role: $author_role, 501 content_schema: $content_schema, 502 discriminator: $discriminator, 503 tags: $tags, 504 reducers: $reducers, 505 } 506 }; 507 } 508 509 static LIST_SET_GENERIC_EVENT_CONTRACTS: &[RadrootsEventContract] = &[ 510 event_contract!( 511 "radroots.list_set.farm.members.v1", 512 KIND_LIST_SET_GENERIC, 513 "Farm Members List Set", 514 "RadrootsListSet", 515 RadrootsEventClass::Addressable, 516 RadrootsEventPrivacy::Public, 517 RadrootsActorRole::Farmer, 518 RadrootsContentSchema::JsonObject, 519 RadrootsEventDiscriminator::Composite(FARM_MEMBERS_LIST_DISCRIMINATOR), 520 LIST_SET_TAGS, 521 FARM_OPS_REDUCERS, 522 ), 523 event_contract!( 524 "radroots.list_set.farm.members.owners.v1", 525 KIND_LIST_SET_GENERIC, 526 "Farm Owners List Set", 527 "RadrootsListSet", 528 RadrootsEventClass::Addressable, 529 RadrootsEventPrivacy::Public, 530 RadrootsActorRole::Farmer, 531 RadrootsContentSchema::JsonObject, 532 RadrootsEventDiscriminator::Composite(FARM_OWNERS_LIST_DISCRIMINATOR), 533 LIST_SET_TAGS, 534 FARM_OPS_REDUCERS, 535 ), 536 event_contract!( 537 "radroots.list_set.farm.members.workers.v1", 538 KIND_LIST_SET_GENERIC, 539 "Farm Workers List Set", 540 "RadrootsListSet", 541 RadrootsEventClass::Addressable, 542 RadrootsEventPrivacy::Public, 543 RadrootsActorRole::Farmer, 544 RadrootsContentSchema::JsonObject, 545 RadrootsEventDiscriminator::Composite(FARM_WORKERS_LIST_DISCRIMINATOR), 546 LIST_SET_TAGS, 547 FARM_OPS_REDUCERS, 548 ), 549 event_contract!( 550 "radroots.list_set.farm.plots.v1", 551 KIND_LIST_SET_GENERIC, 552 "Farm Plots List Set", 553 "RadrootsListSet", 554 RadrootsEventClass::Addressable, 555 RadrootsEventPrivacy::Public, 556 RadrootsActorRole::Farmer, 557 RadrootsContentSchema::JsonObject, 558 RadrootsEventDiscriminator::Composite(FARM_PLOTS_LIST_DISCRIMINATOR), 559 LIST_SET_TAGS, 560 FARM_OPS_REDUCERS, 561 ), 562 event_contract!( 563 "radroots.list_set.farm.listings.v1", 564 KIND_LIST_SET_GENERIC, 565 "Farm Listings List Set", 566 "RadrootsListSet", 567 RadrootsEventClass::Addressable, 568 RadrootsEventPrivacy::Public, 569 RadrootsActorRole::Farmer, 570 RadrootsContentSchema::JsonObject, 571 RadrootsEventDiscriminator::Composite(FARM_LISTINGS_LIST_DISCRIMINATOR), 572 LIST_SET_TAGS, 573 FARM_OPS_REDUCERS, 574 ), 575 event_contract!( 576 "radroots.list_set.member_of.farms.v1", 577 KIND_LIST_SET_GENERIC, 578 "Member Of Farms List Set", 579 "RadrootsListSet", 580 RadrootsEventClass::Addressable, 581 RadrootsEventPrivacy::Public, 582 RadrootsActorRole::Member, 583 RadrootsContentSchema::JsonObject, 584 RadrootsEventDiscriminator::DTagExact("member_of.farms"), 585 LIST_SET_TAGS, 586 FARM_OPS_REDUCERS, 587 ), 588 ]; 589 590 static ALL_KIND_CONTRACTS: &[RadrootsKindContract] = &[ 591 kind_contract!( 592 KIND_PROFILE, 593 "KIND_PROFILE", 594 "Profile Metadata", 595 RadrootsEventClass::Replaceable, 596 RadrootsNostrStandard::Nip01, 597 ["radroots.profile.metadata.v1"] 598 ), 599 kind_contract!( 600 KIND_POST, 601 "KIND_POST", 602 "Short Text Note", 603 RadrootsEventClass::Regular, 604 RadrootsNostrStandard::Nip01, 605 ["radroots.social.post.v1"] 606 ), 607 kind_contract!( 608 KIND_FOLLOW, 609 "KIND_FOLLOW", 610 "Contact List", 611 RadrootsEventClass::Replaceable, 612 RadrootsNostrStandard::Nip01, 613 ["radroots.social.follow_list.v1"] 614 ), 615 kind_contract!( 616 KIND_REPOST, 617 "KIND_REPOST", 618 "Repost", 619 RadrootsEventClass::Regular, 620 RadrootsNostrStandard::Nip18, 621 ["radroots.social.repost.v1"] 622 ), 623 kind_contract!( 624 KIND_REACTION, 625 "KIND_REACTION", 626 "Reaction", 627 RadrootsEventClass::Regular, 628 RadrootsNostrStandard::Nip25, 629 ["radroots.social.reaction.v1"] 630 ), 631 kind_contract!( 632 KIND_SEAL, 633 "KIND_SEAL", 634 "Seal", 635 RadrootsEventClass::Regular, 636 RadrootsNostrStandard::Nip17, 637 ["radroots.message.seal.v1"] 638 ), 639 kind_contract!( 640 KIND_MESSAGE, 641 "KIND_MESSAGE", 642 "Direct Message", 643 RadrootsEventClass::Regular, 644 RadrootsNostrStandard::Nip17, 645 ["radroots.message.private.v1"] 646 ), 647 kind_contract!( 648 KIND_MESSAGE_FILE, 649 "KIND_MESSAGE_FILE", 650 "Direct Message File", 651 RadrootsEventClass::Regular, 652 RadrootsNostrStandard::Nip17, 653 ["radroots.message.file.v1"] 654 ), 655 kind_contract!( 656 KIND_GENERIC_REPOST, 657 "KIND_GENERIC_REPOST", 658 "Generic Repost", 659 RadrootsEventClass::Regular, 660 RadrootsNostrStandard::Nip18, 661 ["radroots.social.generic_repost.v1"] 662 ), 663 kind_contract!( 664 KIND_FARM_CRDT_CHANGE, 665 "KIND_FARM_CRDT_CHANGE", 666 "Farm CRDT Change", 667 RadrootsEventClass::Regular, 668 RadrootsNostrStandard::Radroots, 669 ["radroots.farm.crdt_change.v1"] 670 ), 671 kind_contract!( 672 KIND_GIFT_WRAP, 673 "KIND_GIFT_WRAP", 674 "Gift Wrap", 675 RadrootsEventClass::Regular, 676 RadrootsNostrStandard::Nip17, 677 ["radroots.message.gift_wrap.v1"] 678 ), 679 kind_contract!( 680 KIND_FILE_METADATA, 681 "KIND_FILE_METADATA", 682 "File Metadata", 683 RadrootsEventClass::Regular, 684 RadrootsNostrStandard::Nip94, 685 ["radroots.file.metadata.v1"] 686 ), 687 kind_contract!( 688 KIND_COMMENT, 689 "KIND_COMMENT", 690 "Comment", 691 RadrootsEventClass::Regular, 692 RadrootsNostrStandard::Nip22, 693 ["radroots.social.comment.v1"] 694 ), 695 kind_contract!( 696 KIND_REPORT, 697 "KIND_REPORT", 698 "Report", 699 RadrootsEventClass::Regular, 700 RadrootsNostrStandard::Nip56, 701 ["radroots.social.report.v1"] 702 ), 703 kind_contract!( 704 KIND_GROUP_PUT_USER, 705 "KIND_GROUP_PUT_USER", 706 "Group Put User", 707 RadrootsEventClass::Regular, 708 RadrootsNostrStandard::Nip29, 709 ["radroots.group.put_user.v1"] 710 ), 711 kind_contract!( 712 KIND_GROUP_REMOVE_USER, 713 "KIND_GROUP_REMOVE_USER", 714 "Group Remove User", 715 RadrootsEventClass::Regular, 716 RadrootsNostrStandard::Nip29, 717 ["radroots.group.remove_user.v1"] 718 ), 719 kind_contract!( 720 KIND_GROUP_EDIT_METADATA, 721 "KIND_GROUP_EDIT_METADATA", 722 "Group Edit Metadata", 723 RadrootsEventClass::Regular, 724 RadrootsNostrStandard::Nip29, 725 ["radroots.group.edit_metadata.v1"] 726 ), 727 kind_contract!( 728 KIND_GROUP_DELETE_EVENT, 729 "KIND_GROUP_DELETE_EVENT", 730 "Group Delete Event", 731 RadrootsEventClass::Regular, 732 RadrootsNostrStandard::Nip29, 733 ["radroots.group.delete_event.v1"] 734 ), 735 kind_contract!( 736 KIND_GROUP_CREATE_GROUP, 737 "KIND_GROUP_CREATE_GROUP", 738 "Group Create Group", 739 RadrootsEventClass::Regular, 740 RadrootsNostrStandard::Nip29, 741 ["radroots.group.create_group.v1"] 742 ), 743 kind_contract!( 744 KIND_GROUP_DELETE_GROUP, 745 "KIND_GROUP_DELETE_GROUP", 746 "Group Delete Group", 747 RadrootsEventClass::Regular, 748 RadrootsNostrStandard::Nip29, 749 ["radroots.group.delete_group.v1"] 750 ), 751 kind_contract!( 752 KIND_GROUP_CREATE_INVITE, 753 "KIND_GROUP_CREATE_INVITE", 754 "Group Create Invite", 755 RadrootsEventClass::Regular, 756 RadrootsNostrStandard::Nip29, 757 ["radroots.group.create_invite.v1"] 758 ), 759 kind_contract!( 760 KIND_GROUP_JOIN_REQUEST, 761 "KIND_GROUP_JOIN_REQUEST", 762 "Group Join Request", 763 RadrootsEventClass::Regular, 764 RadrootsNostrStandard::Nip29, 765 ["radroots.group.join_request.v1"] 766 ), 767 kind_contract!( 768 KIND_GROUP_LEAVE_REQUEST, 769 "KIND_GROUP_LEAVE_REQUEST", 770 "Group Leave Request", 771 RadrootsEventClass::Regular, 772 RadrootsNostrStandard::Nip29, 773 ["radroots.group.leave_request.v1"] 774 ), 775 kind_contract!( 776 KIND_GEOCHAT, 777 "KIND_GEOCHAT", 778 "Geochat", 779 RadrootsEventClass::Ephemeral, 780 RadrootsNostrStandard::Nip28, 781 ["radroots.social.geochat.v1"] 782 ), 783 kind_contract!( 784 KIND_RELAY_AUTH, 785 "KIND_RELAY_AUTH", 786 "Relay Auth", 787 RadrootsEventClass::Ephemeral, 788 RadrootsNostrStandard::Nip42, 789 ["radroots.relay.auth.v1"] 790 ), 791 kind_contract!( 792 KIND_HTTP_AUTH, 793 "KIND_HTTP_AUTH", 794 "HTTP Auth", 795 RadrootsEventClass::Ephemeral, 796 RadrootsNostrStandard::Nip98, 797 ["radroots.http.auth.v1"] 798 ), 799 kind_contract!( 800 KIND_LIST_MUTE, 801 "KIND_LIST_MUTE", 802 "Mute List", 803 RadrootsEventClass::Replaceable, 804 RadrootsNostrStandard::Nip51, 805 ["radroots.list.mute.v1"] 806 ), 807 kind_contract!( 808 KIND_LIST_PINNED_NOTES, 809 "KIND_LIST_PINNED_NOTES", 810 "Pinned Notes List", 811 RadrootsEventClass::Replaceable, 812 RadrootsNostrStandard::Nip51, 813 ["radroots.list.pinned_notes.v1"] 814 ), 815 kind_contract!( 816 KIND_LIST_READ_WRITE_RELAYS, 817 "KIND_LIST_READ_WRITE_RELAYS", 818 "Read Write Relays List", 819 RadrootsEventClass::Replaceable, 820 RadrootsNostrStandard::Nip51, 821 ["radroots.list.read_write_relays.v1"] 822 ), 823 kind_contract!( 824 KIND_LIST_BOOKMARKS, 825 "KIND_LIST_BOOKMARKS", 826 "Bookmarks List", 827 RadrootsEventClass::Replaceable, 828 RadrootsNostrStandard::Nip51, 829 ["radroots.list.bookmarks.v1"] 830 ), 831 kind_contract!( 832 KIND_LIST_COMMUNITIES, 833 "KIND_LIST_COMMUNITIES", 834 "Communities List", 835 RadrootsEventClass::Replaceable, 836 RadrootsNostrStandard::Nip51, 837 ["radroots.list.communities.v1"] 838 ), 839 kind_contract!( 840 KIND_LIST_PUBLIC_CHATS, 841 "KIND_LIST_PUBLIC_CHATS", 842 "Public Chats List", 843 RadrootsEventClass::Replaceable, 844 RadrootsNostrStandard::Nip51, 845 ["radroots.list.public_chats.v1"] 846 ), 847 kind_contract!( 848 KIND_LIST_BLOCKED_RELAYS, 849 "KIND_LIST_BLOCKED_RELAYS", 850 "Blocked Relays List", 851 RadrootsEventClass::Replaceable, 852 RadrootsNostrStandard::Nip51, 853 ["radroots.list.blocked_relays.v1"] 854 ), 855 kind_contract!( 856 KIND_LIST_SEARCH_RELAYS, 857 "KIND_LIST_SEARCH_RELAYS", 858 "Search Relays List", 859 RadrootsEventClass::Replaceable, 860 RadrootsNostrStandard::Nip51, 861 ["radroots.list.search_relays.v1"] 862 ), 863 kind_contract!( 864 KIND_LIST_SIMPLE_GROUPS, 865 "KIND_LIST_SIMPLE_GROUPS", 866 "Simple Groups List", 867 RadrootsEventClass::Replaceable, 868 RadrootsNostrStandard::Nip51, 869 ["radroots.list.simple_groups.v1"] 870 ), 871 kind_contract!( 872 KIND_LIST_RELAY_FEEDS, 873 "KIND_LIST_RELAY_FEEDS", 874 "Relay Feeds List", 875 RadrootsEventClass::Replaceable, 876 RadrootsNostrStandard::Nip51, 877 ["radroots.list.relay_feeds.v1"] 878 ), 879 kind_contract!( 880 KIND_LIST_INTERESTS, 881 "KIND_LIST_INTERESTS", 882 "Interests List", 883 RadrootsEventClass::Replaceable, 884 RadrootsNostrStandard::Nip51, 885 ["radroots.list.interests.v1"] 886 ), 887 kind_contract!( 888 KIND_LIST_MEDIA_FOLLOWS, 889 "KIND_LIST_MEDIA_FOLLOWS", 890 "Media Follows List", 891 RadrootsEventClass::Replaceable, 892 RadrootsNostrStandard::Nip51, 893 ["radroots.list.media_follows.v1"] 894 ), 895 kind_contract!( 896 KIND_LIST_EMOJIS, 897 "KIND_LIST_EMOJIS", 898 "Emojis List", 899 RadrootsEventClass::Replaceable, 900 RadrootsNostrStandard::Nip51, 901 ["radroots.list.emojis.v1"] 902 ), 903 kind_contract!( 904 KIND_LIST_DM_RELAYS, 905 "KIND_LIST_DM_RELAYS", 906 "DM Relays List", 907 RadrootsEventClass::Replaceable, 908 RadrootsNostrStandard::Nip51, 909 ["radroots.list.dm_relays.v1"] 910 ), 911 kind_contract!( 912 KIND_LIST_GOOD_WIKI_AUTHORS, 913 "KIND_LIST_GOOD_WIKI_AUTHORS", 914 "Good Wiki Authors List", 915 RadrootsEventClass::Replaceable, 916 RadrootsNostrStandard::Nip51, 917 ["radroots.list.good_wiki_authors.v1"] 918 ), 919 kind_contract!( 920 KIND_LIST_GOOD_WIKI_RELAYS, 921 "KIND_LIST_GOOD_WIKI_RELAYS", 922 "Good Wiki Relays List", 923 RadrootsEventClass::Replaceable, 924 RadrootsNostrStandard::Nip51, 925 ["radroots.list.good_wiki_relays.v1"] 926 ), 927 kind_contract!( 928 KIND_LIST_SET_FOLLOW, 929 "KIND_LIST_SET_FOLLOW", 930 "Follow Set", 931 RadrootsEventClass::Addressable, 932 RadrootsNostrStandard::Nip51, 933 ["radroots.list_set.follow.v1"] 934 ), 935 kind_contract!( 936 KIND_LIST_SET_GENERIC, 937 "KIND_LIST_SET_GENERIC", 938 "Generic List Set", 939 RadrootsEventClass::Addressable, 940 RadrootsNostrStandard::Nip51, 941 [ 942 "radroots.list_set.farm.members.v1", 943 "radroots.list_set.farm.members.owners.v1", 944 "radroots.list_set.farm.members.workers.v1", 945 "radroots.list_set.farm.plots.v1", 946 "radroots.list_set.farm.listings.v1", 947 "radroots.list_set.member_of.farms.v1" 948 ] 949 ), 950 kind_contract!( 951 KIND_LIST_SET_RELAY, 952 "KIND_LIST_SET_RELAY", 953 "Relay Set", 954 RadrootsEventClass::Addressable, 955 RadrootsNostrStandard::Nip51, 956 ["radroots.list_set.relay.v1"] 957 ), 958 kind_contract!( 959 KIND_LIST_SET_BOOKMARK, 960 "KIND_LIST_SET_BOOKMARK", 961 "Bookmark Set", 962 RadrootsEventClass::Addressable, 963 RadrootsNostrStandard::Nip51, 964 ["radroots.list_set.bookmark.v1"] 965 ), 966 kind_contract!( 967 KIND_LIST_SET_CURATION, 968 "KIND_LIST_SET_CURATION", 969 "Curation Set", 970 RadrootsEventClass::Addressable, 971 RadrootsNostrStandard::Nip51, 972 ["radroots.list_set.curation.v1"] 973 ), 974 kind_contract!( 975 KIND_LIST_SET_VIDEO, 976 "KIND_LIST_SET_VIDEO", 977 "Video Set", 978 RadrootsEventClass::Addressable, 979 RadrootsNostrStandard::Nip51, 980 ["radroots.list_set.video.v1"] 981 ), 982 kind_contract!( 983 KIND_LIST_SET_PICTURE, 984 "KIND_LIST_SET_PICTURE", 985 "Picture Set", 986 RadrootsEventClass::Addressable, 987 RadrootsNostrStandard::Nip51, 988 ["radroots.list_set.picture.v1"] 989 ), 990 kind_contract!( 991 KIND_LIST_SET_KIND_MUTE, 992 "KIND_LIST_SET_KIND_MUTE", 993 "Kind Mute Set", 994 RadrootsEventClass::Addressable, 995 RadrootsNostrStandard::Nip51, 996 ["radroots.list_set.kind_mute.v1"] 997 ), 998 kind_contract!( 999 KIND_LIST_SET_INTEREST, 1000 "KIND_LIST_SET_INTEREST", 1001 "Interest Set", 1002 RadrootsEventClass::Addressable, 1003 RadrootsNostrStandard::Nip51, 1004 ["radroots.list_set.interest.v1"] 1005 ), 1006 kind_contract!( 1007 KIND_LIST_SET_EMOJI, 1008 "KIND_LIST_SET_EMOJI", 1009 "Emoji Set", 1010 RadrootsEventClass::Addressable, 1011 RadrootsNostrStandard::Nip51, 1012 ["radroots.list_set.emoji.v1"] 1013 ), 1014 kind_contract!( 1015 KIND_LIST_SET_RELEASE_ARTIFACT, 1016 "KIND_LIST_SET_RELEASE_ARTIFACT", 1017 "Release Artifact Set", 1018 RadrootsEventClass::Addressable, 1019 RadrootsNostrStandard::Nip51, 1020 ["radroots.list_set.release_artifact.v1"] 1021 ), 1022 kind_contract!( 1023 KIND_LIST_SET_APP_CURATION, 1024 "KIND_LIST_SET_APP_CURATION", 1025 "App Curation Set", 1026 RadrootsEventClass::Addressable, 1027 RadrootsNostrStandard::Nip51, 1028 ["radroots.list_set.app_curation.v1"] 1029 ), 1030 kind_contract!( 1031 KIND_ARTICLE, 1032 "KIND_ARTICLE", 1033 "Long Form Article", 1034 RadrootsEventClass::Addressable, 1035 RadrootsNostrStandard::Nip23, 1036 ["radroots.social.article.v1"] 1037 ), 1038 kind_contract!( 1039 KIND_CALENDAR_DATE_EVENT, 1040 "KIND_CALENDAR_DATE_EVENT", 1041 "Calendar Date Event", 1042 RadrootsEventClass::Addressable, 1043 RadrootsNostrStandard::Nip52, 1044 ["radroots.calendar.date_event.v1"] 1045 ), 1046 kind_contract!( 1047 KIND_CALENDAR_TIME_EVENT, 1048 "KIND_CALENDAR_TIME_EVENT", 1049 "Calendar Time Event", 1050 RadrootsEventClass::Addressable, 1051 RadrootsNostrStandard::Nip52, 1052 ["radroots.calendar.time_event.v1"] 1053 ), 1054 kind_contract!( 1055 KIND_CALENDAR, 1056 "KIND_CALENDAR", 1057 "Calendar Collection", 1058 RadrootsEventClass::Addressable, 1059 RadrootsNostrStandard::Nip52, 1060 ["radroots.calendar.collection.v1"] 1061 ), 1062 kind_contract!( 1063 KIND_CALENDAR_EVENT_RSVP, 1064 "KIND_CALENDAR_EVENT_RSVP", 1065 "Calendar RSVP", 1066 RadrootsEventClass::Addressable, 1067 RadrootsNostrStandard::Nip52, 1068 ["radroots.calendar.rsvp.v1"] 1069 ), 1070 kind_contract!( 1071 KIND_LIST_SET_STARTER_PACK, 1072 "KIND_LIST_SET_STARTER_PACK", 1073 "Starter Pack Set", 1074 RadrootsEventClass::Addressable, 1075 RadrootsNostrStandard::Nip51, 1076 ["radroots.list_set.starter_pack.v1"] 1077 ), 1078 kind_contract!( 1079 KIND_LIST_SET_MEDIA_STARTER_PACK, 1080 "KIND_LIST_SET_MEDIA_STARTER_PACK", 1081 "Media Starter Pack Set", 1082 RadrootsEventClass::Addressable, 1083 RadrootsNostrStandard::Nip51, 1084 ["radroots.list_set.media_starter_pack.v1"] 1085 ), 1086 kind_contract!( 1087 KIND_FARM, 1088 "KIND_FARM", 1089 "Farm", 1090 RadrootsEventClass::Addressable, 1091 RadrootsNostrStandard::Radroots, 1092 ["radroots.farm.profile.v1"] 1093 ), 1094 kind_contract!( 1095 KIND_PLOT, 1096 "KIND_PLOT", 1097 "Plot", 1098 RadrootsEventClass::Addressable, 1099 RadrootsNostrStandard::Radroots, 1100 ["radroots.farm.plot.v1"] 1101 ), 1102 kind_contract!( 1103 KIND_COOP, 1104 "KIND_COOP", 1105 "Coop", 1106 RadrootsEventClass::Addressable, 1107 RadrootsNostrStandard::Radroots, 1108 ["radroots.farm.coop.v1"] 1109 ), 1110 kind_contract!( 1111 KIND_DOCUMENT, 1112 "KIND_DOCUMENT", 1113 "Document", 1114 RadrootsEventClass::Addressable, 1115 RadrootsNostrStandard::Radroots, 1116 ["radroots.farm.document.v1"] 1117 ), 1118 kind_contract!( 1119 KIND_RESOURCE_AREA, 1120 "KIND_RESOURCE_AREA", 1121 "Resource Area", 1122 RadrootsEventClass::Addressable, 1123 RadrootsNostrStandard::Radroots, 1124 ["radroots.farm.resource_area.v1"] 1125 ), 1126 kind_contract!( 1127 KIND_RESOURCE_HARVEST_CAP, 1128 "KIND_RESOURCE_HARVEST_CAP", 1129 "Resource Harvest Capacity", 1130 RadrootsEventClass::Addressable, 1131 RadrootsNostrStandard::Radroots, 1132 ["radroots.farm.resource_harvest_cap.v1"] 1133 ), 1134 kind_contract!( 1135 KIND_ACCOUNT_CLAIM, 1136 "KIND_ACCOUNT_CLAIM", 1137 "Account Claim", 1138 RadrootsEventClass::Addressable, 1139 RadrootsNostrStandard::Radroots, 1140 ["radroots.account.claim.v1"] 1141 ), 1142 kind_contract!( 1143 KIND_FARM_WORKSPACE_MANIFEST, 1144 "KIND_FARM_WORKSPACE_MANIFEST", 1145 "Farm Workspace Manifest", 1146 RadrootsEventClass::Addressable, 1147 RadrootsNostrStandard::Nip78, 1148 ["radroots.farm.workspace_manifest.v1"] 1149 ), 1150 kind_contract!( 1151 KIND_LISTING, 1152 "KIND_LISTING", 1153 "Listing", 1154 RadrootsEventClass::Addressable, 1155 RadrootsNostrStandard::Radroots, 1156 ["radroots.listing.published.v1"] 1157 ), 1158 kind_contract!( 1159 KIND_LISTING_DRAFT, 1160 "KIND_LISTING_DRAFT", 1161 "Listing Draft", 1162 RadrootsEventClass::Addressable, 1163 RadrootsNostrStandard::Radroots, 1164 ["radroots.listing.draft.v1"] 1165 ), 1166 kind_contract!( 1167 KIND_APPLICATION_HANDLER, 1168 "KIND_APPLICATION_HANDLER", 1169 "Application Handler", 1170 RadrootsEventClass::Addressable, 1171 RadrootsNostrStandard::Radroots, 1172 ["radroots.application.handler.v1"] 1173 ), 1174 kind_contract!( 1175 KIND_GROUP_METADATA, 1176 "KIND_GROUP_METADATA", 1177 "Group Metadata", 1178 RadrootsEventClass::Addressable, 1179 RadrootsNostrStandard::Nip29, 1180 ["radroots.group.metadata.v1"] 1181 ), 1182 kind_contract!( 1183 KIND_GROUP_ADMINS, 1184 "KIND_GROUP_ADMINS", 1185 "Group Admins", 1186 RadrootsEventClass::Addressable, 1187 RadrootsNostrStandard::Nip29, 1188 ["radroots.group.admins.v1"] 1189 ), 1190 kind_contract!( 1191 KIND_GROUP_MEMBERS, 1192 "KIND_GROUP_MEMBERS", 1193 "Group Members", 1194 RadrootsEventClass::Addressable, 1195 RadrootsNostrStandard::Nip29, 1196 ["radroots.group.members.v1"] 1197 ), 1198 kind_contract!( 1199 KIND_GROUP_ROLES, 1200 "KIND_GROUP_ROLES", 1201 "Group Roles", 1202 RadrootsEventClass::Addressable, 1203 RadrootsNostrStandard::Nip29, 1204 ["radroots.group.roles.v1"] 1205 ), 1206 kind_contract!( 1207 KIND_TRADE_LISTING_VALIDATION_REQUEST, 1208 "KIND_TRADE_LISTING_VALIDATION_REQUEST", 1209 "Trade Listing Validation Request", 1210 RadrootsEventClass::Regular, 1211 RadrootsNostrStandard::Nip90, 1212 ["radroots.trade.listing_validation.request.v1"] 1213 ), 1214 kind_contract!( 1215 KIND_TRADE_LISTING_VALIDATION_RESULT, 1216 "KIND_TRADE_LISTING_VALIDATION_RESULT", 1217 "Trade Listing Validation Result", 1218 RadrootsEventClass::Regular, 1219 RadrootsNostrStandard::Nip90, 1220 ["radroots.trade.listing_validation.result.v1"] 1221 ), 1222 kind_contract!( 1223 KIND_TRADE_TRANSITION_PROOF_REQUEST, 1224 "KIND_TRADE_TRANSITION_PROOF_REQUEST", 1225 "Trade Transition Proof Request", 1226 RadrootsEventClass::Regular, 1227 RadrootsNostrStandard::Nip90, 1228 ["radroots.trade.transition_proof.request.v1"] 1229 ), 1230 kind_contract!( 1231 KIND_TRADE_TRANSITION_PROOF_RESULT, 1232 "KIND_TRADE_TRANSITION_PROOF_RESULT", 1233 "Trade Transition Proof Result", 1234 RadrootsEventClass::Regular, 1235 RadrootsNostrStandard::Nip90, 1236 ["radroots.trade.transition_proof.result.v1"] 1237 ), 1238 kind_contract!( 1239 KIND_ORDER_REQUEST, 1240 "KIND_ORDER_REQUEST", 1241 "Order Request", 1242 RadrootsEventClass::Regular, 1243 RadrootsNostrStandard::Radroots, 1244 ["radroots.order.request.v1"] 1245 ), 1246 kind_contract!( 1247 KIND_ORDER_DECISION, 1248 "KIND_ORDER_DECISION", 1249 "Order Decision", 1250 RadrootsEventClass::Regular, 1251 RadrootsNostrStandard::Radroots, 1252 ["radroots.order.decision.v1"] 1253 ), 1254 kind_contract!( 1255 KIND_ORDER_REVISION_PROPOSAL, 1256 "KIND_ORDER_REVISION_PROPOSAL", 1257 "Order Revision Proposal", 1258 RadrootsEventClass::Regular, 1259 RadrootsNostrStandard::Radroots, 1260 ["radroots.order.revision_proposal.v1"] 1261 ), 1262 kind_contract!( 1263 KIND_ORDER_REVISION_DECISION, 1264 "KIND_ORDER_REVISION_DECISION", 1265 "Order Revision Decision", 1266 RadrootsEventClass::Regular, 1267 RadrootsNostrStandard::Radroots, 1268 ["radroots.order.revision_decision.v1"] 1269 ), 1270 kind_contract!( 1271 KIND_ORDER_CANCELLATION, 1272 "KIND_ORDER_CANCELLATION", 1273 "Order Cancellation", 1274 RadrootsEventClass::Regular, 1275 RadrootsNostrStandard::Radroots, 1276 ["radroots.order.cancellation.v1"] 1277 ), 1278 kind_contract!( 1279 KIND_TRADE_VALIDATION_RECEIPT, 1280 "KIND_TRADE_VALIDATION_RECEIPT", 1281 "Trade Validation Receipt", 1282 RadrootsEventClass::Regular, 1283 RadrootsNostrStandard::Radroots, 1284 ["radroots.trade.validation_receipt.v1"] 1285 ), 1286 ]; 1287 1288 static ALL_EVENT_CONTRACTS: &[RadrootsEventContract] = &[ 1289 event_contract!( 1290 "radroots.profile.metadata.v1", 1291 KIND_PROFILE, 1292 "Profile Metadata", 1293 "RadrootsProfile", 1294 RadrootsEventClass::Replaceable, 1295 RadrootsEventPrivacy::Public, 1296 RadrootsActorRole::Any, 1297 RadrootsContentSchema::JsonObject, 1298 RadrootsEventDiscriminator::KindOnly, 1299 PROFILE_TAGS, 1300 PROFILE_REDUCERS 1301 ), 1302 event_contract!( 1303 "radroots.social.post.v1", 1304 KIND_POST, 1305 "Short Text Note", 1306 "RadrootsPost", 1307 RadrootsEventClass::Regular, 1308 RadrootsEventPrivacy::Public, 1309 RadrootsActorRole::Any, 1310 RadrootsContentSchema::PlainText, 1311 RadrootsEventDiscriminator::KindOnly, 1312 NO_TAGS, 1313 SOCIAL_REDUCERS 1314 ), 1315 event_contract!( 1316 "radroots.social.follow_list.v1", 1317 KIND_FOLLOW, 1318 "Contact List", 1319 "RadrootsFollowList", 1320 RadrootsEventClass::Replaceable, 1321 RadrootsEventPrivacy::Public, 1322 RadrootsActorRole::Any, 1323 RadrootsContentSchema::JsonObject, 1324 RadrootsEventDiscriminator::KindOnly, 1325 P_TAGS, 1326 PROFILE_REDUCERS 1327 ), 1328 event_contract!( 1329 "radroots.social.repost.v1", 1330 KIND_REPOST, 1331 "Repost", 1332 "RadrootsRepost", 1333 RadrootsEventClass::Regular, 1334 RadrootsEventPrivacy::Public, 1335 RadrootsActorRole::Any, 1336 RadrootsContentSchema::JsonObject, 1337 RadrootsEventDiscriminator::KindOnly, 1338 EVENT_POINTER_TAGS, 1339 SOCIAL_REDUCERS 1340 ), 1341 event_contract!( 1342 "radroots.social.reaction.v1", 1343 KIND_REACTION, 1344 "Reaction", 1345 "RadrootsReaction", 1346 RadrootsEventClass::Regular, 1347 RadrootsEventPrivacy::Public, 1348 RadrootsActorRole::Any, 1349 RadrootsContentSchema::PlainText, 1350 RadrootsEventDiscriminator::KindOnly, 1351 EVENT_POINTER_TAGS, 1352 SOCIAL_REDUCERS 1353 ), 1354 event_contract!( 1355 "radroots.message.seal.v1", 1356 KIND_SEAL, 1357 "Seal", 1358 "RadrootsSeal", 1359 RadrootsEventClass::Regular, 1360 RadrootsEventPrivacy::Encrypted, 1361 RadrootsActorRole::Any, 1362 RadrootsContentSchema::Encrypted, 1363 RadrootsEventDiscriminator::KindOnly, 1364 NO_TAGS, 1365 SOCIAL_REDUCERS 1366 ), 1367 event_contract!( 1368 "radroots.message.private.v1", 1369 KIND_MESSAGE, 1370 "Direct Message", 1371 "RadrootsMessage", 1372 RadrootsEventClass::Regular, 1373 RadrootsEventPrivacy::Encrypted, 1374 RadrootsActorRole::Any, 1375 RadrootsContentSchema::Encrypted, 1376 RadrootsEventDiscriminator::KindOnly, 1377 P_TAGS, 1378 SOCIAL_REDUCERS 1379 ), 1380 event_contract!( 1381 "radroots.message.file.v1", 1382 KIND_MESSAGE_FILE, 1383 "Direct Message File", 1384 "RadrootsMessageFile", 1385 RadrootsEventClass::Regular, 1386 RadrootsEventPrivacy::Encrypted, 1387 RadrootsActorRole::Any, 1388 RadrootsContentSchema::Encrypted, 1389 RadrootsEventDiscriminator::KindOnly, 1390 P_TAGS, 1391 SOCIAL_REDUCERS 1392 ), 1393 event_contract!( 1394 "radroots.social.generic_repost.v1", 1395 KIND_GENERIC_REPOST, 1396 "Generic Repost", 1397 "RadrootsGenericRepost", 1398 RadrootsEventClass::Regular, 1399 RadrootsEventPrivacy::Public, 1400 RadrootsActorRole::Any, 1401 RadrootsContentSchema::JsonObject, 1402 RadrootsEventDiscriminator::KindOnly, 1403 EVENT_POINTER_TAGS, 1404 SOCIAL_REDUCERS 1405 ), 1406 event_contract!( 1407 "radroots.farm.crdt_change.v1", 1408 KIND_FARM_CRDT_CHANGE, 1409 "Farm CRDT Change", 1410 "RadrootsFarmCrdtChange", 1411 RadrootsEventClass::Regular, 1412 RadrootsEventPrivacy::Encrypted, 1413 RadrootsActorRole::Farmer, 1414 RadrootsContentSchema::JsonObject, 1415 RadrootsEventDiscriminator::KindOnly, 1416 NO_TAGS, 1417 FARM_OPS_REDUCERS 1418 ), 1419 event_contract!( 1420 "radroots.message.gift_wrap.v1", 1421 KIND_GIFT_WRAP, 1422 "Gift Wrap", 1423 "RadrootsGiftWrap", 1424 RadrootsEventClass::Regular, 1425 RadrootsEventPrivacy::Encrypted, 1426 RadrootsActorRole::Any, 1427 RadrootsContentSchema::Encrypted, 1428 RadrootsEventDiscriminator::KindOnly, 1429 P_TAGS, 1430 SOCIAL_REDUCERS 1431 ), 1432 event_contract!( 1433 "radroots.file.metadata.v1", 1434 KIND_FILE_METADATA, 1435 "File Metadata", 1436 "RadrootsFileMetadata", 1437 RadrootsEventClass::Regular, 1438 RadrootsEventPrivacy::Public, 1439 RadrootsActorRole::Any, 1440 RadrootsContentSchema::JsonObject, 1441 RadrootsEventDiscriminator::KindOnly, 1442 FILE_METADATA_TAGS, 1443 SOCIAL_REDUCERS 1444 ), 1445 event_contract!( 1446 "radroots.social.comment.v1", 1447 KIND_COMMENT, 1448 "Comment", 1449 "RadrootsComment", 1450 RadrootsEventClass::Regular, 1451 RadrootsEventPrivacy::Public, 1452 RadrootsActorRole::Any, 1453 RadrootsContentSchema::PlainText, 1454 RadrootsEventDiscriminator::KindOnly, 1455 EVENT_POINTER_TAGS, 1456 SOCIAL_REDUCERS 1457 ), 1458 event_contract!( 1459 "radroots.social.report.v1", 1460 KIND_REPORT, 1461 "Report", 1462 "RadrootsReport", 1463 RadrootsEventClass::Regular, 1464 RadrootsEventPrivacy::Public, 1465 RadrootsActorRole::Moderator, 1466 RadrootsContentSchema::PlainText, 1467 RadrootsEventDiscriminator::KindOnly, 1468 EVENT_POINTER_TAGS, 1469 SOCIAL_REDUCERS 1470 ), 1471 event_contract!( 1472 "radroots.group.put_user.v1", 1473 KIND_GROUP_PUT_USER, 1474 "Group Put User", 1475 "RadrootsGroupPutUser", 1476 RadrootsEventClass::Regular, 1477 RadrootsEventPrivacy::Public, 1478 RadrootsActorRole::Moderator, 1479 RadrootsContentSchema::JsonObject, 1480 RadrootsEventDiscriminator::KindOnly, 1481 GROUP_ACTION_TAGS, 1482 GROUP_REDUCERS 1483 ), 1484 event_contract!( 1485 "radroots.group.remove_user.v1", 1486 KIND_GROUP_REMOVE_USER, 1487 "Group Remove User", 1488 "RadrootsGroupRemoveUser", 1489 RadrootsEventClass::Regular, 1490 RadrootsEventPrivacy::Public, 1491 RadrootsActorRole::Moderator, 1492 RadrootsContentSchema::JsonObject, 1493 RadrootsEventDiscriminator::KindOnly, 1494 GROUP_ACTION_TAGS, 1495 GROUP_REDUCERS 1496 ), 1497 event_contract!( 1498 "radroots.group.edit_metadata.v1", 1499 KIND_GROUP_EDIT_METADATA, 1500 "Group Edit Metadata", 1501 "RadrootsGroupEditMetadata", 1502 RadrootsEventClass::Regular, 1503 RadrootsEventPrivacy::Public, 1504 RadrootsActorRole::Moderator, 1505 RadrootsContentSchema::JsonObject, 1506 RadrootsEventDiscriminator::KindOnly, 1507 GROUP_ACTION_TAGS, 1508 GROUP_REDUCERS 1509 ), 1510 event_contract!( 1511 "radroots.group.delete_event.v1", 1512 KIND_GROUP_DELETE_EVENT, 1513 "Group Delete Event", 1514 "RadrootsGroupDeleteEvent", 1515 RadrootsEventClass::Regular, 1516 RadrootsEventPrivacy::Public, 1517 RadrootsActorRole::Moderator, 1518 RadrootsContentSchema::JsonObject, 1519 RadrootsEventDiscriminator::KindOnly, 1520 GROUP_ACTION_TAGS, 1521 GROUP_REDUCERS 1522 ), 1523 event_contract!( 1524 "radroots.group.create_group.v1", 1525 KIND_GROUP_CREATE_GROUP, 1526 "Group Create Group", 1527 "RadrootsGroupCreateGroup", 1528 RadrootsEventClass::Regular, 1529 RadrootsEventPrivacy::Public, 1530 RadrootsActorRole::Moderator, 1531 RadrootsContentSchema::JsonObject, 1532 RadrootsEventDiscriminator::KindOnly, 1533 GROUP_ACTION_TAGS, 1534 GROUP_REDUCERS 1535 ), 1536 event_contract!( 1537 "radroots.group.delete_group.v1", 1538 KIND_GROUP_DELETE_GROUP, 1539 "Group Delete Group", 1540 "RadrootsGroupDeleteGroup", 1541 RadrootsEventClass::Regular, 1542 RadrootsEventPrivacy::Public, 1543 RadrootsActorRole::Moderator, 1544 RadrootsContentSchema::JsonObject, 1545 RadrootsEventDiscriminator::KindOnly, 1546 GROUP_ACTION_TAGS, 1547 GROUP_REDUCERS 1548 ), 1549 event_contract!( 1550 "radroots.group.create_invite.v1", 1551 KIND_GROUP_CREATE_INVITE, 1552 "Group Create Invite", 1553 "RadrootsGroupCreateInvite", 1554 RadrootsEventClass::Regular, 1555 RadrootsEventPrivacy::Public, 1556 RadrootsActorRole::Moderator, 1557 RadrootsContentSchema::JsonObject, 1558 RadrootsEventDiscriminator::KindOnly, 1559 GROUP_ACTION_TAGS, 1560 GROUP_REDUCERS 1561 ), 1562 event_contract!( 1563 "radroots.group.join_request.v1", 1564 KIND_GROUP_JOIN_REQUEST, 1565 "Group Join Request", 1566 "RadrootsGroupJoinRequest", 1567 RadrootsEventClass::Regular, 1568 RadrootsEventPrivacy::Public, 1569 RadrootsActorRole::Member, 1570 RadrootsContentSchema::JsonObject, 1571 RadrootsEventDiscriminator::KindOnly, 1572 GROUP_ACTION_TAGS, 1573 GROUP_REDUCERS 1574 ), 1575 event_contract!( 1576 "radroots.group.leave_request.v1", 1577 KIND_GROUP_LEAVE_REQUEST, 1578 "Group Leave Request", 1579 "RadrootsGroupLeaveRequest", 1580 RadrootsEventClass::Regular, 1581 RadrootsEventPrivacy::Public, 1582 RadrootsActorRole::Member, 1583 RadrootsContentSchema::JsonObject, 1584 RadrootsEventDiscriminator::KindOnly, 1585 GROUP_ACTION_TAGS, 1586 GROUP_REDUCERS 1587 ), 1588 event_contract!( 1589 "radroots.social.geochat.v1", 1590 KIND_GEOCHAT, 1591 "Geochat", 1592 "RadrootsGeochat", 1593 RadrootsEventClass::Ephemeral, 1594 RadrootsEventPrivacy::Public, 1595 RadrootsActorRole::Any, 1596 RadrootsContentSchema::PlainText, 1597 RadrootsEventDiscriminator::KindOnly, 1598 NO_TAGS, 1599 SOCIAL_REDUCERS 1600 ), 1601 event_contract!( 1602 "radroots.relay.auth.v1", 1603 KIND_RELAY_AUTH, 1604 "Relay Auth", 1605 "RadrootsRelayAuth", 1606 RadrootsEventClass::Ephemeral, 1607 RadrootsEventPrivacy::Public, 1608 RadrootsActorRole::Relay, 1609 RadrootsContentSchema::JsonObject, 1610 RadrootsEventDiscriminator::KindOnly, 1611 NO_TAGS, 1612 RELAY_REDUCERS 1613 ), 1614 event_contract!( 1615 "radroots.http.auth.v1", 1616 KIND_HTTP_AUTH, 1617 "HTTP Auth", 1618 "RadrootsHttpAuth", 1619 RadrootsEventClass::Ephemeral, 1620 RadrootsEventPrivacy::Public, 1621 RadrootsActorRole::Application, 1622 RadrootsContentSchema::JsonObject, 1623 RadrootsEventDiscriminator::KindOnly, 1624 NO_TAGS, 1625 RELAY_REDUCERS 1626 ), 1627 event_contract!( 1628 "radroots.list.mute.v1", 1629 KIND_LIST_MUTE, 1630 "Mute List", 1631 "RadrootsList", 1632 RadrootsEventClass::Replaceable, 1633 RadrootsEventPrivacy::Public, 1634 RadrootsActorRole::Any, 1635 RadrootsContentSchema::JsonObject, 1636 RadrootsEventDiscriminator::KindOnly, 1637 LIST_TAGS, 1638 SOCIAL_REDUCERS 1639 ), 1640 event_contract!( 1641 "radroots.list.pinned_notes.v1", 1642 KIND_LIST_PINNED_NOTES, 1643 "Pinned Notes List", 1644 "RadrootsList", 1645 RadrootsEventClass::Replaceable, 1646 RadrootsEventPrivacy::Public, 1647 RadrootsActorRole::Any, 1648 RadrootsContentSchema::JsonObject, 1649 RadrootsEventDiscriminator::KindOnly, 1650 LIST_TAGS, 1651 SOCIAL_REDUCERS 1652 ), 1653 event_contract!( 1654 "radroots.list.read_write_relays.v1", 1655 KIND_LIST_READ_WRITE_RELAYS, 1656 "Read Write Relays List", 1657 "RadrootsList", 1658 RadrootsEventClass::Replaceable, 1659 RadrootsEventPrivacy::Public, 1660 RadrootsActorRole::Any, 1661 RadrootsContentSchema::JsonObject, 1662 RadrootsEventDiscriminator::KindOnly, 1663 LIST_TAGS, 1664 SOCIAL_REDUCERS 1665 ), 1666 event_contract!( 1667 "radroots.list.bookmarks.v1", 1668 KIND_LIST_BOOKMARKS, 1669 "Bookmarks List", 1670 "RadrootsList", 1671 RadrootsEventClass::Replaceable, 1672 RadrootsEventPrivacy::Public, 1673 RadrootsActorRole::Any, 1674 RadrootsContentSchema::JsonObject, 1675 RadrootsEventDiscriminator::KindOnly, 1676 LIST_TAGS, 1677 SOCIAL_REDUCERS 1678 ), 1679 event_contract!( 1680 "radroots.list.communities.v1", 1681 KIND_LIST_COMMUNITIES, 1682 "Communities List", 1683 "RadrootsList", 1684 RadrootsEventClass::Replaceable, 1685 RadrootsEventPrivacy::Public, 1686 RadrootsActorRole::Any, 1687 RadrootsContentSchema::JsonObject, 1688 RadrootsEventDiscriminator::KindOnly, 1689 LIST_TAGS, 1690 SOCIAL_REDUCERS 1691 ), 1692 event_contract!( 1693 "radroots.list.public_chats.v1", 1694 KIND_LIST_PUBLIC_CHATS, 1695 "Public Chats List", 1696 "RadrootsList", 1697 RadrootsEventClass::Replaceable, 1698 RadrootsEventPrivacy::Public, 1699 RadrootsActorRole::Any, 1700 RadrootsContentSchema::JsonObject, 1701 RadrootsEventDiscriminator::KindOnly, 1702 LIST_TAGS, 1703 SOCIAL_REDUCERS 1704 ), 1705 event_contract!( 1706 "radroots.list.blocked_relays.v1", 1707 KIND_LIST_BLOCKED_RELAYS, 1708 "Blocked Relays List", 1709 "RadrootsList", 1710 RadrootsEventClass::Replaceable, 1711 RadrootsEventPrivacy::Public, 1712 RadrootsActorRole::Any, 1713 RadrootsContentSchema::JsonObject, 1714 RadrootsEventDiscriminator::KindOnly, 1715 LIST_TAGS, 1716 SOCIAL_REDUCERS 1717 ), 1718 event_contract!( 1719 "radroots.list.search_relays.v1", 1720 KIND_LIST_SEARCH_RELAYS, 1721 "Search Relays List", 1722 "RadrootsList", 1723 RadrootsEventClass::Replaceable, 1724 RadrootsEventPrivacy::Public, 1725 RadrootsActorRole::Any, 1726 RadrootsContentSchema::JsonObject, 1727 RadrootsEventDiscriminator::KindOnly, 1728 LIST_TAGS, 1729 SOCIAL_REDUCERS 1730 ), 1731 event_contract!( 1732 "radroots.list.simple_groups.v1", 1733 KIND_LIST_SIMPLE_GROUPS, 1734 "Simple Groups List", 1735 "RadrootsList", 1736 RadrootsEventClass::Replaceable, 1737 RadrootsEventPrivacy::Public, 1738 RadrootsActorRole::Any, 1739 RadrootsContentSchema::JsonObject, 1740 RadrootsEventDiscriminator::KindOnly, 1741 LIST_TAGS, 1742 SOCIAL_REDUCERS 1743 ), 1744 event_contract!( 1745 "radroots.list.relay_feeds.v1", 1746 KIND_LIST_RELAY_FEEDS, 1747 "Relay Feeds List", 1748 "RadrootsList", 1749 RadrootsEventClass::Replaceable, 1750 RadrootsEventPrivacy::Public, 1751 RadrootsActorRole::Any, 1752 RadrootsContentSchema::JsonObject, 1753 RadrootsEventDiscriminator::KindOnly, 1754 LIST_TAGS, 1755 SOCIAL_REDUCERS 1756 ), 1757 event_contract!( 1758 "radroots.list.interests.v1", 1759 KIND_LIST_INTERESTS, 1760 "Interests List", 1761 "RadrootsList", 1762 RadrootsEventClass::Replaceable, 1763 RadrootsEventPrivacy::Public, 1764 RadrootsActorRole::Any, 1765 RadrootsContentSchema::JsonObject, 1766 RadrootsEventDiscriminator::KindOnly, 1767 LIST_TAGS, 1768 SOCIAL_REDUCERS 1769 ), 1770 event_contract!( 1771 "radroots.list.media_follows.v1", 1772 KIND_LIST_MEDIA_FOLLOWS, 1773 "Media Follows List", 1774 "RadrootsList", 1775 RadrootsEventClass::Replaceable, 1776 RadrootsEventPrivacy::Public, 1777 RadrootsActorRole::Any, 1778 RadrootsContentSchema::JsonObject, 1779 RadrootsEventDiscriminator::KindOnly, 1780 LIST_TAGS, 1781 SOCIAL_REDUCERS 1782 ), 1783 event_contract!( 1784 "radroots.list.emojis.v1", 1785 KIND_LIST_EMOJIS, 1786 "Emojis List", 1787 "RadrootsList", 1788 RadrootsEventClass::Replaceable, 1789 RadrootsEventPrivacy::Public, 1790 RadrootsActorRole::Any, 1791 RadrootsContentSchema::JsonObject, 1792 RadrootsEventDiscriminator::KindOnly, 1793 LIST_TAGS, 1794 SOCIAL_REDUCERS 1795 ), 1796 event_contract!( 1797 "radroots.list.dm_relays.v1", 1798 KIND_LIST_DM_RELAYS, 1799 "DM Relays List", 1800 "RadrootsList", 1801 RadrootsEventClass::Replaceable, 1802 RadrootsEventPrivacy::Public, 1803 RadrootsActorRole::Any, 1804 RadrootsContentSchema::JsonObject, 1805 RadrootsEventDiscriminator::KindOnly, 1806 LIST_TAGS, 1807 SOCIAL_REDUCERS 1808 ), 1809 event_contract!( 1810 "radroots.list.good_wiki_authors.v1", 1811 KIND_LIST_GOOD_WIKI_AUTHORS, 1812 "Good Wiki Authors List", 1813 "RadrootsList", 1814 RadrootsEventClass::Replaceable, 1815 RadrootsEventPrivacy::Public, 1816 RadrootsActorRole::Any, 1817 RadrootsContentSchema::JsonObject, 1818 RadrootsEventDiscriminator::KindOnly, 1819 LIST_TAGS, 1820 SOCIAL_REDUCERS 1821 ), 1822 event_contract!( 1823 "radroots.list.good_wiki_relays.v1", 1824 KIND_LIST_GOOD_WIKI_RELAYS, 1825 "Good Wiki Relays List", 1826 "RadrootsList", 1827 RadrootsEventClass::Replaceable, 1828 RadrootsEventPrivacy::Public, 1829 RadrootsActorRole::Any, 1830 RadrootsContentSchema::JsonObject, 1831 RadrootsEventDiscriminator::KindOnly, 1832 LIST_TAGS, 1833 SOCIAL_REDUCERS 1834 ), 1835 event_contract!( 1836 "radroots.list_set.follow.v1", 1837 KIND_LIST_SET_FOLLOW, 1838 "Follow Set", 1839 "RadrootsListSet", 1840 RadrootsEventClass::Addressable, 1841 RadrootsEventPrivacy::Public, 1842 RadrootsActorRole::Any, 1843 RadrootsContentSchema::JsonObject, 1844 RadrootsEventDiscriminator::KindOnly, 1845 LIST_SET_TAGS, 1846 SOCIAL_REDUCERS 1847 ), 1848 event_contract!( 1849 "radroots.list_set.relay.v1", 1850 KIND_LIST_SET_RELAY, 1851 "Relay Set", 1852 "RadrootsListSet", 1853 RadrootsEventClass::Addressable, 1854 RadrootsEventPrivacy::Public, 1855 RadrootsActorRole::Any, 1856 RadrootsContentSchema::JsonObject, 1857 RadrootsEventDiscriminator::KindOnly, 1858 LIST_SET_TAGS, 1859 RELAY_REDUCERS 1860 ), 1861 event_contract!( 1862 "radroots.list_set.bookmark.v1", 1863 KIND_LIST_SET_BOOKMARK, 1864 "Bookmark Set", 1865 "RadrootsListSet", 1866 RadrootsEventClass::Addressable, 1867 RadrootsEventPrivacy::Public, 1868 RadrootsActorRole::Any, 1869 RadrootsContentSchema::JsonObject, 1870 RadrootsEventDiscriminator::KindOnly, 1871 LIST_SET_TAGS, 1872 SOCIAL_REDUCERS 1873 ), 1874 event_contract!( 1875 "radroots.list_set.curation.v1", 1876 KIND_LIST_SET_CURATION, 1877 "Curation Set", 1878 "RadrootsListSet", 1879 RadrootsEventClass::Addressable, 1880 RadrootsEventPrivacy::Public, 1881 RadrootsActorRole::Any, 1882 RadrootsContentSchema::JsonObject, 1883 RadrootsEventDiscriminator::KindOnly, 1884 LIST_SET_TAGS, 1885 SOCIAL_REDUCERS 1886 ), 1887 event_contract!( 1888 "radroots.list_set.video.v1", 1889 KIND_LIST_SET_VIDEO, 1890 "Video Set", 1891 "RadrootsListSet", 1892 RadrootsEventClass::Addressable, 1893 RadrootsEventPrivacy::Public, 1894 RadrootsActorRole::Any, 1895 RadrootsContentSchema::JsonObject, 1896 RadrootsEventDiscriminator::KindOnly, 1897 LIST_SET_TAGS, 1898 SOCIAL_REDUCERS 1899 ), 1900 event_contract!( 1901 "radroots.list_set.picture.v1", 1902 KIND_LIST_SET_PICTURE, 1903 "Picture Set", 1904 "RadrootsListSet", 1905 RadrootsEventClass::Addressable, 1906 RadrootsEventPrivacy::Public, 1907 RadrootsActorRole::Any, 1908 RadrootsContentSchema::JsonObject, 1909 RadrootsEventDiscriminator::KindOnly, 1910 LIST_SET_TAGS, 1911 SOCIAL_REDUCERS 1912 ), 1913 event_contract!( 1914 "radroots.list_set.kind_mute.v1", 1915 KIND_LIST_SET_KIND_MUTE, 1916 "Kind Mute Set", 1917 "RadrootsListSet", 1918 RadrootsEventClass::Addressable, 1919 RadrootsEventPrivacy::Public, 1920 RadrootsActorRole::Any, 1921 RadrootsContentSchema::JsonObject, 1922 RadrootsEventDiscriminator::KindOnly, 1923 LIST_SET_TAGS, 1924 SOCIAL_REDUCERS 1925 ), 1926 event_contract!( 1927 "radroots.list_set.interest.v1", 1928 KIND_LIST_SET_INTEREST, 1929 "Interest Set", 1930 "RadrootsListSet", 1931 RadrootsEventClass::Addressable, 1932 RadrootsEventPrivacy::Public, 1933 RadrootsActorRole::Any, 1934 RadrootsContentSchema::JsonObject, 1935 RadrootsEventDiscriminator::KindOnly, 1936 LIST_SET_TAGS, 1937 SOCIAL_REDUCERS 1938 ), 1939 event_contract!( 1940 "radroots.list_set.emoji.v1", 1941 KIND_LIST_SET_EMOJI, 1942 "Emoji Set", 1943 "RadrootsListSet", 1944 RadrootsEventClass::Addressable, 1945 RadrootsEventPrivacy::Public, 1946 RadrootsActorRole::Any, 1947 RadrootsContentSchema::JsonObject, 1948 RadrootsEventDiscriminator::KindOnly, 1949 LIST_SET_TAGS, 1950 SOCIAL_REDUCERS 1951 ), 1952 event_contract!( 1953 "radroots.list_set.release_artifact.v1", 1954 KIND_LIST_SET_RELEASE_ARTIFACT, 1955 "Release Artifact Set", 1956 "RadrootsListSet", 1957 RadrootsEventClass::Addressable, 1958 RadrootsEventPrivacy::Public, 1959 RadrootsActorRole::Any, 1960 RadrootsContentSchema::JsonObject, 1961 RadrootsEventDiscriminator::KindOnly, 1962 LIST_SET_TAGS, 1963 SOCIAL_REDUCERS 1964 ), 1965 event_contract!( 1966 "radroots.list_set.app_curation.v1", 1967 KIND_LIST_SET_APP_CURATION, 1968 "App Curation Set", 1969 "RadrootsListSet", 1970 RadrootsEventClass::Addressable, 1971 RadrootsEventPrivacy::Public, 1972 RadrootsActorRole::Any, 1973 RadrootsContentSchema::JsonObject, 1974 RadrootsEventDiscriminator::KindOnly, 1975 LIST_SET_TAGS, 1976 SOCIAL_REDUCERS 1977 ), 1978 event_contract!( 1979 "radroots.social.article.v1", 1980 KIND_ARTICLE, 1981 "Long Form Article", 1982 "RadrootsArticle", 1983 RadrootsEventClass::Addressable, 1984 RadrootsEventPrivacy::Public, 1985 RadrootsActorRole::Any, 1986 RadrootsContentSchema::Markdown, 1987 RadrootsEventDiscriminator::KindOnly, 1988 ARTICLE_TAGS, 1989 SOCIAL_REDUCERS 1990 ), 1991 event_contract!( 1992 "radroots.calendar.date_event.v1", 1993 KIND_CALENDAR_DATE_EVENT, 1994 "Calendar Date Event", 1995 "RadrootsCalendarDateEvent", 1996 RadrootsEventClass::Addressable, 1997 RadrootsEventPrivacy::Public, 1998 RadrootsActorRole::Any, 1999 RadrootsContentSchema::JsonObject, 2000 RadrootsEventDiscriminator::KindOnly, 2001 CALENDAR_EVENT_TAGS, 2002 CALENDAR_REDUCERS 2003 ), 2004 event_contract!( 2005 "radroots.calendar.time_event.v1", 2006 KIND_CALENDAR_TIME_EVENT, 2007 "Calendar Time Event", 2008 "RadrootsCalendarTimeEvent", 2009 RadrootsEventClass::Addressable, 2010 RadrootsEventPrivacy::Public, 2011 RadrootsActorRole::Any, 2012 RadrootsContentSchema::JsonObject, 2013 RadrootsEventDiscriminator::KindOnly, 2014 CALENDAR_EVENT_TAGS, 2015 CALENDAR_REDUCERS 2016 ), 2017 event_contract!( 2018 "radroots.calendar.collection.v1", 2019 KIND_CALENDAR, 2020 "Calendar Collection", 2021 "RadrootsCalendar", 2022 RadrootsEventClass::Addressable, 2023 RadrootsEventPrivacy::Public, 2024 RadrootsActorRole::Any, 2025 RadrootsContentSchema::JsonObject, 2026 RadrootsEventDiscriminator::KindOnly, 2027 LIST_SET_TAGS, 2028 CALENDAR_REDUCERS 2029 ), 2030 event_contract!( 2031 "radroots.calendar.rsvp.v1", 2032 KIND_CALENDAR_EVENT_RSVP, 2033 "Calendar RSVP", 2034 "RadrootsCalendarRsvp", 2035 RadrootsEventClass::Addressable, 2036 RadrootsEventPrivacy::Public, 2037 RadrootsActorRole::Any, 2038 RadrootsContentSchema::JsonObject, 2039 RadrootsEventDiscriminator::KindOnly, 2040 CALENDAR_EVENT_TAGS, 2041 CALENDAR_REDUCERS 2042 ), 2043 event_contract!( 2044 "radroots.list_set.starter_pack.v1", 2045 KIND_LIST_SET_STARTER_PACK, 2046 "Starter Pack Set", 2047 "RadrootsListSet", 2048 RadrootsEventClass::Addressable, 2049 RadrootsEventPrivacy::Public, 2050 RadrootsActorRole::Any, 2051 RadrootsContentSchema::JsonObject, 2052 RadrootsEventDiscriminator::KindOnly, 2053 LIST_SET_TAGS, 2054 SOCIAL_REDUCERS 2055 ), 2056 event_contract!( 2057 "radroots.list_set.media_starter_pack.v1", 2058 KIND_LIST_SET_MEDIA_STARTER_PACK, 2059 "Media Starter Pack Set", 2060 "RadrootsListSet", 2061 RadrootsEventClass::Addressable, 2062 RadrootsEventPrivacy::Public, 2063 RadrootsActorRole::Any, 2064 RadrootsContentSchema::JsonObject, 2065 RadrootsEventDiscriminator::KindOnly, 2066 LIST_SET_TAGS, 2067 SOCIAL_REDUCERS 2068 ), 2069 event_contract!( 2070 "radroots.farm.profile.v1", 2071 KIND_FARM, 2072 "Farm", 2073 "RadrootsFarm", 2074 RadrootsEventClass::Addressable, 2075 RadrootsEventPrivacy::Public, 2076 RadrootsActorRole::Farmer, 2077 RadrootsContentSchema::JsonObject, 2078 RadrootsEventDiscriminator::KindOnly, 2079 FARM_TAGS, 2080 FARM_OPS_REDUCERS 2081 ), 2082 event_contract!( 2083 "radroots.farm.plot.v1", 2084 KIND_PLOT, 2085 "Plot", 2086 "RadrootsPlot", 2087 RadrootsEventClass::Addressable, 2088 RadrootsEventPrivacy::Public, 2089 RadrootsActorRole::Farmer, 2090 RadrootsContentSchema::JsonObject, 2091 RadrootsEventDiscriminator::KindOnly, 2092 FARM_TAGS, 2093 FARM_OPS_REDUCERS 2094 ), 2095 event_contract!( 2096 "radroots.farm.coop.v1", 2097 KIND_COOP, 2098 "Coop", 2099 "RadrootsCoop", 2100 RadrootsEventClass::Addressable, 2101 RadrootsEventPrivacy::Public, 2102 RadrootsActorRole::Farmer, 2103 RadrootsContentSchema::JsonObject, 2104 RadrootsEventDiscriminator::KindOnly, 2105 FARM_TAGS, 2106 FARM_OPS_REDUCERS 2107 ), 2108 event_contract!( 2109 "radroots.farm.document.v1", 2110 KIND_DOCUMENT, 2111 "Document", 2112 "RadrootsDocument", 2113 RadrootsEventClass::Addressable, 2114 RadrootsEventPrivacy::Public, 2115 RadrootsActorRole::Farmer, 2116 RadrootsContentSchema::JsonObject, 2117 RadrootsEventDiscriminator::KindOnly, 2118 D_TAGS, 2119 FARM_OPS_REDUCERS 2120 ), 2121 event_contract!( 2122 "radroots.farm.resource_area.v1", 2123 KIND_RESOURCE_AREA, 2124 "Resource Area", 2125 "RadrootsResourceArea", 2126 RadrootsEventClass::Addressable, 2127 RadrootsEventPrivacy::Public, 2128 RadrootsActorRole::Farmer, 2129 RadrootsContentSchema::JsonObject, 2130 RadrootsEventDiscriminator::KindOnly, 2131 FARM_TAGS, 2132 FARM_OPS_REDUCERS 2133 ), 2134 event_contract!( 2135 "radroots.farm.resource_harvest_cap.v1", 2136 KIND_RESOURCE_HARVEST_CAP, 2137 "Resource Harvest Capacity", 2138 "RadrootsResourceHarvestCap", 2139 RadrootsEventClass::Addressable, 2140 RadrootsEventPrivacy::Public, 2141 RadrootsActorRole::Farmer, 2142 RadrootsContentSchema::JsonObject, 2143 RadrootsEventDiscriminator::KindOnly, 2144 FARM_TAGS, 2145 FARM_OPS_REDUCERS 2146 ), 2147 event_contract!( 2148 "radroots.account.claim.v1", 2149 KIND_ACCOUNT_CLAIM, 2150 "Account Claim", 2151 "RadrootsAccountClaim", 2152 RadrootsEventClass::Addressable, 2153 RadrootsEventPrivacy::Public, 2154 RadrootsActorRole::Any, 2155 RadrootsContentSchema::JsonObject, 2156 RadrootsEventDiscriminator::KindOnly, 2157 D_TAGS, 2158 PROFILE_REDUCERS 2159 ), 2160 event_contract!( 2161 "radroots.farm.workspace_manifest.v1", 2162 KIND_FARM_WORKSPACE_MANIFEST, 2163 "Farm Workspace Manifest", 2164 "RadrootsFarmWorkspaceManifest", 2165 RadrootsEventClass::Addressable, 2166 RadrootsEventPrivacy::Encrypted, 2167 RadrootsActorRole::Farmer, 2168 RadrootsContentSchema::JsonObject, 2169 RadrootsEventDiscriminator::KindOnly, 2170 D_TAGS, 2171 FARM_OPS_REDUCERS 2172 ), 2173 event_contract!( 2174 "radroots.listing.published.v1", 2175 KIND_LISTING, 2176 "Listing", 2177 "RadrootsListing", 2178 RadrootsEventClass::Addressable, 2179 RadrootsEventPrivacy::Public, 2180 RadrootsActorRole::Seller, 2181 RadrootsContentSchema::JsonObject, 2182 RadrootsEventDiscriminator::KindOnly, 2183 LISTING_TAGS, 2184 LISTING_REDUCERS 2185 ), 2186 event_contract!( 2187 "radroots.listing.draft.v1", 2188 KIND_LISTING_DRAFT, 2189 "Listing Draft", 2190 "RadrootsListing", 2191 RadrootsEventClass::Addressable, 2192 RadrootsEventPrivacy::Secret, 2193 RadrootsActorRole::Seller, 2194 RadrootsContentSchema::JsonObject, 2195 RadrootsEventDiscriminator::KindOnly, 2196 LISTING_TAGS, 2197 LISTING_REDUCERS 2198 ), 2199 event_contract!( 2200 "radroots.application.handler.v1", 2201 KIND_APPLICATION_HANDLER, 2202 "Application Handler", 2203 "RadrootsApplicationHandler", 2204 RadrootsEventClass::Addressable, 2205 RadrootsEventPrivacy::Public, 2206 RadrootsActorRole::Application, 2207 RadrootsContentSchema::JsonObject, 2208 RadrootsEventDiscriminator::KindOnly, 2209 D_TAGS, 2210 SOCIAL_REDUCERS 2211 ), 2212 event_contract!( 2213 "radroots.group.metadata.v1", 2214 KIND_GROUP_METADATA, 2215 "Group Metadata", 2216 "RadrootsGroupMetadata", 2217 RadrootsEventClass::Addressable, 2218 RadrootsEventPrivacy::Public, 2219 RadrootsActorRole::Moderator, 2220 RadrootsContentSchema::JsonObject, 2221 RadrootsEventDiscriminator::KindOnly, 2222 GROUP_STATE_TAGS, 2223 GROUP_REDUCERS 2224 ), 2225 event_contract!( 2226 "radroots.group.admins.v1", 2227 KIND_GROUP_ADMINS, 2228 "Group Admins", 2229 "RadrootsGroupAdmins", 2230 RadrootsEventClass::Addressable, 2231 RadrootsEventPrivacy::Public, 2232 RadrootsActorRole::Moderator, 2233 RadrootsContentSchema::JsonObject, 2234 RadrootsEventDiscriminator::KindOnly, 2235 GROUP_STATE_TAGS, 2236 GROUP_REDUCERS 2237 ), 2238 event_contract!( 2239 "radroots.group.members.v1", 2240 KIND_GROUP_MEMBERS, 2241 "Group Members", 2242 "RadrootsGroupMembers", 2243 RadrootsEventClass::Addressable, 2244 RadrootsEventPrivacy::Public, 2245 RadrootsActorRole::Moderator, 2246 RadrootsContentSchema::JsonObject, 2247 RadrootsEventDiscriminator::KindOnly, 2248 GROUP_STATE_TAGS, 2249 GROUP_REDUCERS 2250 ), 2251 event_contract!( 2252 "radroots.group.roles.v1", 2253 KIND_GROUP_ROLES, 2254 "Group Roles", 2255 "RadrootsGroupRoles", 2256 RadrootsEventClass::Addressable, 2257 RadrootsEventPrivacy::Public, 2258 RadrootsActorRole::Moderator, 2259 RadrootsContentSchema::JsonObject, 2260 RadrootsEventDiscriminator::KindOnly, 2261 GROUP_STATE_TAGS, 2262 GROUP_REDUCERS 2263 ), 2264 event_contract!( 2265 "radroots.trade.listing_validation.request.v1", 2266 KIND_TRADE_LISTING_VALIDATION_REQUEST, 2267 "Trade Listing Validation Request", 2268 "RadrootsTradeValidationListingRequest", 2269 RadrootsEventClass::Regular, 2270 RadrootsEventPrivacy::Public, 2271 RadrootsActorRole::Service, 2272 RadrootsContentSchema::JsonObject, 2273 RadrootsEventDiscriminator::KindOnly, 2274 TRADE_VALIDATION_REQUEST_TAGS, 2275 TRADE_VALIDATION_REDUCERS 2276 ), 2277 event_contract!( 2278 "radroots.trade.listing_validation.result.v1", 2279 KIND_TRADE_LISTING_VALIDATION_RESULT, 2280 "Trade Listing Validation Result", 2281 "RadrootsTradeValidationListingResult", 2282 RadrootsEventClass::Regular, 2283 RadrootsEventPrivacy::Public, 2284 RadrootsActorRole::Service, 2285 RadrootsContentSchema::JsonObject, 2286 RadrootsEventDiscriminator::KindOnly, 2287 TRADE_VALIDATION_RESULT_TAGS, 2288 TRADE_VALIDATION_REDUCERS 2289 ), 2290 event_contract!( 2291 "radroots.trade.transition_proof.request.v1", 2292 KIND_TRADE_TRANSITION_PROOF_REQUEST, 2293 "Trade Transition Proof Request", 2294 "RadrootsTradeTransitionProofRequest", 2295 RadrootsEventClass::Regular, 2296 RadrootsEventPrivacy::Public, 2297 RadrootsActorRole::Service, 2298 RadrootsContentSchema::JsonObject, 2299 RadrootsEventDiscriminator::KindOnly, 2300 TRADE_VALIDATION_REQUEST_TAGS, 2301 TRADE_VALIDATION_REDUCERS 2302 ), 2303 event_contract!( 2304 "radroots.trade.transition_proof.result.v1", 2305 KIND_TRADE_TRANSITION_PROOF_RESULT, 2306 "Trade Transition Proof Result", 2307 "RadrootsTradeTransitionProofResult", 2308 RadrootsEventClass::Regular, 2309 RadrootsEventPrivacy::Public, 2310 RadrootsActorRole::Service, 2311 RadrootsContentSchema::JsonObject, 2312 RadrootsEventDiscriminator::KindOnly, 2313 TRADE_VALIDATION_RESULT_TAGS, 2314 TRADE_VALIDATION_REDUCERS 2315 ), 2316 event_contract!( 2317 "radroots.order.request.v1", 2318 KIND_ORDER_REQUEST, 2319 "Order Request", 2320 "RadrootsOrderRequest", 2321 RadrootsEventClass::Regular, 2322 RadrootsEventPrivacy::Public, 2323 RadrootsActorRole::Buyer, 2324 RadrootsContentSchema::JsonObject, 2325 RadrootsEventDiscriminator::KindOnly, 2326 ORDER_REQUEST_TAGS, 2327 ORDER_REDUCERS 2328 ), 2329 event_contract!( 2330 "radroots.order.decision.v1", 2331 KIND_ORDER_DECISION, 2332 "Order Decision", 2333 "RadrootsOrderDecision", 2334 RadrootsEventClass::Regular, 2335 RadrootsEventPrivacy::Public, 2336 RadrootsActorRole::Seller, 2337 RadrootsContentSchema::JsonObject, 2338 RadrootsEventDiscriminator::KindOnly, 2339 CHAINED_ORDER_TAGS, 2340 ORDER_REDUCERS 2341 ), 2342 event_contract!( 2343 "radroots.order.revision_proposal.v1", 2344 KIND_ORDER_REVISION_PROPOSAL, 2345 "Order Revision Proposal", 2346 "RadrootsOrderRevisionProposal", 2347 RadrootsEventClass::Regular, 2348 RadrootsEventPrivacy::Public, 2349 RadrootsActorRole::Seller, 2350 RadrootsContentSchema::JsonObject, 2351 RadrootsEventDiscriminator::KindOnly, 2352 CHAINED_ORDER_TAGS, 2353 ORDER_REDUCERS 2354 ), 2355 event_contract!( 2356 "radroots.order.revision_decision.v1", 2357 KIND_ORDER_REVISION_DECISION, 2358 "Order Revision Decision", 2359 "RadrootsOrderRevisionDecision", 2360 RadrootsEventClass::Regular, 2361 RadrootsEventPrivacy::Public, 2362 RadrootsActorRole::Buyer, 2363 RadrootsContentSchema::JsonObject, 2364 RadrootsEventDiscriminator::KindOnly, 2365 CHAINED_ORDER_TAGS, 2366 ORDER_REDUCERS 2367 ), 2368 event_contract!( 2369 "radroots.order.cancellation.v1", 2370 KIND_ORDER_CANCELLATION, 2371 "Order Cancellation", 2372 "RadrootsOrderCancellation", 2373 RadrootsEventClass::Regular, 2374 RadrootsEventPrivacy::Public, 2375 RadrootsActorRole::Buyer, 2376 RadrootsContentSchema::JsonObject, 2377 RadrootsEventDiscriminator::KindOnly, 2378 CHAINED_ORDER_TAGS, 2379 ORDER_REDUCERS 2380 ), 2381 event_contract!( 2382 "radroots.trade.validation_receipt.v1", 2383 KIND_TRADE_VALIDATION_RECEIPT, 2384 "Trade Validation Receipt", 2385 "RadrootsTradeValidationReceipt", 2386 RadrootsEventClass::Regular, 2387 RadrootsEventPrivacy::Public, 2388 RadrootsActorRole::Service, 2389 RadrootsContentSchema::JsonObject, 2390 RadrootsEventDiscriminator::KindOnly, 2391 TRADE_VALIDATION_RECEIPT_TAGS, 2392 TRADE_VALIDATION_REDUCERS 2393 ), 2394 ]; 2395 2396 pub fn all_kind_contracts() -> &'static [RadrootsKindContract] { 2397 ALL_KIND_CONTRACTS 2398 } 2399 2400 pub fn all_event_contracts() -> &'static [RadrootsEventContract] { 2401 ALL_EVENT_CONTRACTS 2402 } 2403 2404 pub fn kind_contract(kind: u32) -> Option<&'static RadrootsKindContract> { 2405 ALL_KIND_CONTRACTS 2406 .iter() 2407 .find(|contract| contract.kind == kind) 2408 } 2409 2410 pub fn event_contract(id: &str) -> Option<&'static RadrootsEventContract> { 2411 ALL_EVENT_CONTRACTS 2412 .iter() 2413 .find(|contract| contract.id == id) 2414 .or_else(|| { 2415 LIST_SET_GENERIC_EVENT_CONTRACTS 2416 .iter() 2417 .find(|contract| contract.id == id) 2418 }) 2419 } 2420 2421 pub fn event_contracts_for_kind(kind: u32) -> &'static [RadrootsEventContract] { 2422 if kind == KIND_LIST_SET_GENERIC { 2423 return LIST_SET_GENERIC_EVENT_CONTRACTS; 2424 } 2425 2426 match ALL_EVENT_CONTRACTS 2427 .iter() 2428 .find(|contract| contract.kind == kind) 2429 { 2430 Some(contract) => core::slice::from_ref(contract), 2431 None => &[], 2432 } 2433 } 2434 2435 pub fn identify_event_contract( 2436 kind: u32, 2437 tags: &[Vec<String>], 2438 content: &str, 2439 ) -> Result<&'static RadrootsEventContract, RadrootsContractMatchError> { 2440 if kind_contract(kind).is_none() { 2441 return Err(RadrootsContractMatchError::UnsupportedKind(kind)); 2442 } 2443 2444 identify_from_contracts(event_contracts_for_kind(kind), kind, tags, content) 2445 } 2446 2447 fn identify_from_contracts( 2448 contracts: &'static [RadrootsEventContract], 2449 kind: u32, 2450 tags: &[Vec<String>], 2451 content: &str, 2452 ) -> Result<&'static RadrootsEventContract, RadrootsContractMatchError> { 2453 let mut matched = None; 2454 let mut matched_count = 0; 2455 2456 for contract in contracts { 2457 if discriminator_matches(&contract.discriminator, tags, content) { 2458 matched = Some(contract); 2459 matched_count += 1; 2460 } 2461 } 2462 2463 match (matched, matched_count) { 2464 (Some(contract), 1) => Ok(contract), 2465 (None, _) => Err(RadrootsContractMatchError::UnsupportedShape(kind)), 2466 (Some(_), _) => Err(RadrootsContractMatchError::AmbiguousShape(kind)), 2467 } 2468 } 2469 2470 fn discriminator_matches( 2471 discriminator: &RadrootsEventDiscriminator, 2472 tags: &[Vec<String>], 2473 content: &str, 2474 ) -> bool { 2475 match discriminator { 2476 RadrootsEventDiscriminator::KindOnly => true, 2477 RadrootsEventDiscriminator::DTagExact(expected) => tag_value(tags, "d") == Some(*expected), 2478 RadrootsEventDiscriminator::DTagPrefix(prefix) => tag_value(tags, "d") 2479 .map(|value| value.starts_with(prefix)) 2480 .unwrap_or(false), 2481 RadrootsEventDiscriminator::DTagSuffix(suffix) => tag_value(tags, "d") 2482 .map(|value| value.ends_with(suffix)) 2483 .unwrap_or(false), 2484 RadrootsEventDiscriminator::TagEquals { name, value } => { 2485 tag_value(tags, name) == Some(*value) 2486 } 2487 RadrootsEventDiscriminator::ContentJsonFieldEquals { field, value } => { 2488 content_json_string_field_equals(content, field, value) 2489 } 2490 RadrootsEventDiscriminator::EnvelopeType(expected) => { 2491 content_json_string_field_equals(content, "type", expected) 2492 } 2493 RadrootsEventDiscriminator::Composite(parts) => parts 2494 .iter() 2495 .all(|part| discriminator_matches(part, tags, content)), 2496 } 2497 } 2498 2499 fn tag_value<'a>(tags: &'a [Vec<String>], name: &str) -> Option<&'a str> { 2500 tags.iter().find_map(|tag| { 2501 if tag.first().map(|value| value.as_str()) == Some(name) { 2502 tag.get(1).map(|value| value.as_str()) 2503 } else { 2504 None 2505 } 2506 }) 2507 } 2508 2509 fn content_json_string_field_equals(content: &str, field: &str, value: &str) -> bool { 2510 serde_json::from_str::<serde_json::Value>(content) 2511 .ok() 2512 .and_then(|json| { 2513 json.get(field) 2514 .and_then(|field| field.as_str()) 2515 .map(|field| field == value) 2516 }) 2517 .unwrap_or(false) 2518 } 2519 2520 #[cfg(test)] 2521 mod tests { 2522 use super::*; 2523 use std::collections::BTreeSet; 2524 2525 static AMBIGUOUS_TEST_CONTRACTS: &[RadrootsEventContract] = &[ 2526 event_contract!( 2527 "radroots.test.one.v1", 2528 KIND_POST, 2529 "Test One", 2530 "Test", 2531 RadrootsEventClass::Regular, 2532 RadrootsEventPrivacy::Public, 2533 RadrootsActorRole::Any, 2534 RadrootsContentSchema::PlainText, 2535 RadrootsEventDiscriminator::KindOnly, 2536 NO_TAGS, 2537 SOCIAL_REDUCERS, 2538 ), 2539 event_contract!( 2540 "radroots.test.two.v1", 2541 KIND_POST, 2542 "Test Two", 2543 "Test", 2544 RadrootsEventClass::Regular, 2545 RadrootsEventPrivacy::Public, 2546 RadrootsActorRole::Any, 2547 RadrootsContentSchema::PlainText, 2548 RadrootsEventDiscriminator::KindOnly, 2549 NO_TAGS, 2550 SOCIAL_REDUCERS, 2551 ), 2552 ]; 2553 2554 #[test] 2555 fn exposes_one_kind_contract_per_supported_kind() { 2556 let mut kinds = BTreeSet::new(); 2557 for contract in all_kind_contracts() { 2558 assert!( 2559 kinds.insert(contract.kind), 2560 "duplicate kind {}", 2561 contract.kind 2562 ); 2563 assert!(!contract.accepted_event_contracts.is_empty()); 2564 } 2565 } 2566 2567 #[test] 2568 fn exposes_unique_event_contract_ids() { 2569 let mut ids = BTreeSet::new(); 2570 for contract in all_event_contracts() 2571 .iter() 2572 .chain(LIST_SET_GENERIC_EVENT_CONTRACTS.iter()) 2573 { 2574 assert!( 2575 ids.insert(contract.id), 2576 "duplicate event contract {}", 2577 contract.id 2578 ); 2579 assert!(kind_contract(contract.kind).is_some()); 2580 } 2581 } 2582 2583 #[test] 2584 fn every_kind_references_known_matching_event_contracts() { 2585 for kind in all_kind_contracts() { 2586 for id in kind.accepted_event_contracts { 2587 let event = event_contract(id).expect("accepted event contract"); 2588 assert_eq!(event.kind, kind.kind, "{}", id); 2589 } 2590 } 2591 } 2592 2593 #[test] 2594 fn event_contract_classes_match_kind_contracts() { 2595 for contract in all_event_contracts() 2596 .iter() 2597 .chain(LIST_SET_GENERIC_EVENT_CONTRACTS.iter()) 2598 { 2599 let kind = kind_contract(contract.kind).expect("event kind contract"); 2600 assert_eq!(contract.class, kind.class, "{}", contract.id); 2601 } 2602 } 2603 2604 #[test] 2605 fn every_event_contract_is_listed_by_its_kind_contract() { 2606 for contract in all_event_contracts() 2607 .iter() 2608 .chain(LIST_SET_GENERIC_EVENT_CONTRACTS.iter()) 2609 { 2610 let kind = kind_contract(contract.kind).expect("event kind contract"); 2611 assert!( 2612 kind.accepted_event_contracts.contains(&contract.id), 2613 "{}", 2614 contract.id 2615 ); 2616 } 2617 } 2618 2619 #[test] 2620 fn order_request_listing_event_contract_is_event_pointer() { 2621 let contract = event_contract("radroots.order.request.v1").expect("order request"); 2622 let tag = contract 2623 .tags 2624 .iter() 2625 .find(|tag| tag.name == "listing_event") 2626 .expect("listing event tag"); 2627 2628 assert_eq!(tag.semantic, RadrootsTagSemantic::ListingSnapshot); 2629 assert_eq!(tag.value_type, RadrootsTagValueType::EventPointer); 2630 assert!(!tag.relay_indexed); 2631 } 2632 2633 #[test] 2634 fn covers_public_kind_arrays() { 2635 for kind in COMMERCIAL_EVENT_KINDS 2636 .iter() 2637 .chain(PUBLIC_SOCIAL_KINDS.iter()) 2638 .chain(PRIVATE_FARM_OPS_KINDS.iter()) 2639 .chain(NIP29_GROUP_KINDS.iter()) 2640 { 2641 assert!(kind_contract(*kind).is_some(), "missing kind {kind}"); 2642 } 2643 } 2644 2645 #[test] 2646 fn event_contract_lookup_supports_many_contracts_per_kind() { 2647 let contracts = event_contracts_for_kind(KIND_LIST_SET_GENERIC); 2648 assert_eq!(contracts.len(), 6); 2649 assert!( 2650 contracts 2651 .iter() 2652 .any(|contract| contract.id == "radroots.list_set.farm.members.v1") 2653 ); 2654 assert_eq!( 2655 event_contract("radroots.list_set.member_of.farms.v1").map(|contract| contract.kind), 2656 Some(KIND_LIST_SET_GENERIC) 2657 ); 2658 assert!(event_contracts_for_kind(999_999).is_empty()); 2659 } 2660 2661 #[test] 2662 fn identifies_exact_list_set_shape() { 2663 let tags = vec![vec!["d".to_owned(), "member_of.farms".to_owned()]]; 2664 let contract = identify_event_contract(KIND_LIST_SET_GENERIC, &tags, "{}") 2665 .expect("member_of farms contract"); 2666 assert_eq!(contract.id, "radroots.list_set.member_of.farms.v1"); 2667 } 2668 2669 #[test] 2670 fn identifies_composite_list_set_shape() { 2671 let tags = vec![vec![ 2672 "d".to_owned(), 2673 "farm:farm_01:members.workers".to_owned(), 2674 ]]; 2675 let contract = identify_event_contract(KIND_LIST_SET_GENERIC, &tags, "{}") 2676 .expect("farm workers contract"); 2677 assert_eq!(contract.id, "radroots.list_set.farm.members.workers.v1"); 2678 } 2679 2680 #[test] 2681 fn rejects_unknown_or_unsupported_shapes() { 2682 assert_eq!( 2683 identify_event_contract(999_999, &[], "{}"), 2684 Err(RadrootsContractMatchError::UnsupportedKind(999_999)) 2685 ); 2686 2687 let tags = vec![vec!["d".to_owned(), "unknown".to_owned()]]; 2688 assert_eq!( 2689 identify_event_contract(KIND_LIST_SET_GENERIC, &tags, "{}"), 2690 Err(RadrootsContractMatchError::UnsupportedShape( 2691 KIND_LIST_SET_GENERIC 2692 )) 2693 ); 2694 } 2695 2696 #[test] 2697 fn rejects_ambiguous_shapes() { 2698 assert_eq!( 2699 identify_from_contracts(AMBIGUOUS_TEST_CONTRACTS, KIND_POST, &[], ""), 2700 Err(RadrootsContractMatchError::AmbiguousShape(KIND_POST)) 2701 ); 2702 } 2703 2704 #[test] 2705 fn supports_content_field_discriminators() { 2706 assert!(discriminator_matches( 2707 &RadrootsEventDiscriminator::EnvelopeType("order_request"), 2708 &[], 2709 r#"{"domain":"radroots.order","type":"order_request"}"# 2710 )); 2711 assert!(discriminator_matches( 2712 &RadrootsEventDiscriminator::ContentJsonFieldEquals { 2713 field: "domain", 2714 value: "radroots.order" 2715 }, 2716 &[], 2717 r#"{"domain": "radroots.order", "type": "order_request"}"# 2718 )); 2719 } 2720 2721 #[test] 2722 fn supports_tag_equals_discriminators() { 2723 let tags = vec![vec!["status".to_owned(), "accepted".to_owned()]]; 2724 2725 assert!(discriminator_matches( 2726 &RadrootsEventDiscriminator::TagEquals { 2727 name: "status", 2728 value: "accepted", 2729 }, 2730 &tags, 2731 "{}" 2732 )); 2733 assert!(!discriminator_matches( 2734 &RadrootsEventDiscriminator::TagEquals { 2735 name: "status", 2736 value: "declined", 2737 }, 2738 &tags, 2739 "{}" 2740 )); 2741 } 2742 2743 #[test] 2744 fn tag_helpers_cover_missing_names_and_cardinality_mismatches() { 2745 let tags = vec![ 2746 vec!["p".to_owned(), "counterparty".to_owned()], 2747 vec!["d".to_owned()], 2748 ]; 2749 2750 assert_eq!(tag_value(&tags, "d"), None); 2751 assert_eq!(tag_value(&tags, "p"), Some("counterparty")); 2752 2753 let malformed = [ 2754 tag( 2755 "d", 2756 RadrootsTagCardinality::OptionalOne, 2757 RadrootsTagSemantic::Identifier, 2758 RadrootsTagValueType::DTag, 2759 true, 2760 ), 2761 tag( 2762 "p", 2763 RadrootsTagCardinality::RequiredOne, 2764 RadrootsTagSemantic::Counterparty, 2765 RadrootsTagValueType::PublicKey, 2766 true, 2767 ), 2768 ]; 2769 2770 assert!( 2771 !malformed.iter().any( 2772 |tag| tag.name == "d" && tag.cardinality == RadrootsTagCardinality::RequiredOne 2773 ) 2774 ); 2775 } 2776 2777 #[test] 2778 fn relay_indexed_tags_are_single_letter() { 2779 for contract in all_event_contracts() 2780 .iter() 2781 .chain(LIST_SET_GENERIC_EVENT_CONTRACTS.iter()) 2782 { 2783 for tag in contract.tags { 2784 if tag.relay_indexed { 2785 assert_eq!(tag.name.len(), 1, "{}:{}", contract.id, tag.name); 2786 } 2787 } 2788 } 2789 } 2790 2791 #[test] 2792 fn addressable_event_contracts_require_d_tags() { 2793 for contract in all_event_contracts() 2794 .iter() 2795 .chain(LIST_SET_GENERIC_EVENT_CONTRACTS.iter()) 2796 { 2797 if contract.class == RadrootsEventClass::Addressable { 2798 let d_tag_cardinality = contract 2799 .tags 2800 .iter() 2801 .find(|tag| tag.name == "d") 2802 .map(|tag| tag.cardinality); 2803 assert_eq!( 2804 d_tag_cardinality, 2805 Some(RadrootsTagCardinality::RequiredOne), 2806 "{}", 2807 contract.id 2808 ); 2809 } 2810 } 2811 } 2812 }