lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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 }