lib

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

commit 4d03e7cff98fe994dc698ed56fb23ec7250e8cea
parent f6d381330ac3c00ab42fd50a020b82f8891147d1
Author: triesap <tyson@radroots.org>
Date:   Wed, 29 Jul 2026 06:10:36 +0000

event: migrate SDK consumers to final surface

- move every SDK consumer to normalized event module paths and AuthorRole

- verify remote signatures through the codec-owned algorithm boundary

- retire public event and trade codegen edges from private SDK tooling

- authenticate frozen TypeScript predecessors until Steps 261-268

Diffstat:
Mcrates/event_bindings/src/lib.rs | 3++-
Mcrates/event_bindings/src/model.rs | 4+++-
Mcrates/event_codec_wasm/Cargo.toml | 2+-
Mcrates/event_codec_wasm/src/lib.rs | 122++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mcrates/replica_sync_wasm/src/lib.rs | 2+-
Mcrates/sdk/Cargo.toml | 3+--
Mcrates/sdk/examples/runtime_local.rs | 8++++----
Mcrates/sdk/examples/sdk_v1_knowledge_prepare.rs | 2+-
Mcrates/sdk/examples/sdk_v1_listing_prepare.rs | 8++++----
Mcrates/sdk/examples/sdk_v1_local_enqueue_and_mock_sync.rs | 8++++----
Mcrates/sdk/examples/sdk_v1_myc_nip46_signer_setup.rs | 2+-
Mcrates/sdk/src/actor_json.rs | 22+++++++++++-----------
Mcrates/sdk/src/error.rs | 2+-
Mcrates/sdk/src/farms_runtime.rs | 10+++++-----
Mcrates/sdk/src/idempotency.rs | 2+-
Mcrates/sdk/src/knowledge.rs | 5+++--
Mcrates/sdk/src/listings_runtime.rs | 6+++---
Mcrates/sdk/src/private_store.rs | 4++--
Mcrates/sdk/src/signer_provider.rs | 7+++----
Mcrates/sdk/src/sync_runtime.rs | 2+-
Mcrates/sdk/src/trade_runtime.rs | 4++--
Mcrates/sdk/src/workflow_runtime.rs | 11+++++++----
Mcrates/sdk/tests/farms_runtime.rs | 10+++++-----
Mcrates/sdk/tests/knowledge_public_api.rs | 2+-
Mcrates/sdk/tests/listings_runtime.rs | 12++++++------
Mcrates/sdk/tests/replica_ingest.rs | 5++++-
Mcrates/sdk/tests/source_boundary.rs | 2+-
Mcrates/sdk/tests/sync_runtime.rs | 8++++----
Mcrates/sdk/tests/unit/actor_json_tests.rs | 27++++++++++++---------------
Mcrates/sdk/tests/unit/error_tests.rs | 6+++---
Mcrates/sdk/tests/unit/farms_runtime_tests.rs | 16+++++++---------
Mcrates/sdk/tests/unit/idempotency_tests.rs | 2+-
Mcrates/sdk/tests/unit/listings_runtime_tests.rs | 15+++++++--------
Mcrates/sdk/tests/unit/private_store_tests.rs | 4++--
Mcrates/sdk/tests/unit/runtime_tests.rs | 6+++---
Mcrates/sdk/tests/unit/signer_provider_tests.rs | 14+++++++-------
Mcrates/sdk/tests/unit/sync_runtime_tests.rs | 13+++++--------
Mcrates/sdk/tests/unit/trade_runtime_tests.rs | 10+++++-----
Mcrates/sdk/tests/unit/workflow_runtime_tests.rs | 37+++++++++++++------------------------
Mcrates/trade_bindings/Cargo.toml | 5-----
Dcrates/trade_bindings/src/dto.rs | 357-------------------------------------------------------------------------------
Mcrates/trade_bindings/src/lib.rs | 26+++++++-------------------
Mtools/sdk_xtask_import/Cargo.toml | 3+--
Mtools/sdk_xtask_import/src/dto_roots.rs | 85++++++++-----------------------------------------------------------------------
Mtools/sdk_xtask_import/src/output.rs | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mtools/sdk_xtask_import/src/smoke.rs | 2+-
46 files changed, 326 insertions(+), 686 deletions(-)

diff --git a/crates/event_bindings/src/lib.rs b/crates/event_bindings/src/lib.rs @@ -7,7 +7,8 @@ pub use model::{constants_module, kinds_module}; #[cfg(test)] mod tests { use radroots_event::{ - kinds, operational_listing::RADROOTS_OPERATIONAL_LISTING_PRODUCT_TAG_KEYS, + envelope::kind as kinds, + listing::operational::RADROOTS_OPERATIONAL_LISTING_PRODUCT_TAG_KEYS, }; use super::{constants_module, kinds_module}; diff --git a/crates/event_bindings/src/model.rs b/crates/event_bindings/src/model.rs @@ -1,7 +1,9 @@ use dto_bindgen_backend_ts::{ TypeScriptDeclaration, TypeScriptImport, TypeScriptModule, TypeScriptType, TypeScriptValue, }; -use radroots_event::{kinds, operational_listing::RADROOTS_OPERATIONAL_LISTING_PRODUCT_TAG_KEYS}; +use radroots_event::{ + envelope::kind as kinds, listing::operational::RADROOTS_OPERATIONAL_LISTING_PRODUCT_TAG_KEYS, +}; pub fn constants_module() -> TypeScriptModule { TypeScriptModule::new("src/generated/constants.ts") diff --git a/crates/event_codec_wasm/Cargo.toml b/crates/event_codec_wasm/Cargo.toml @@ -21,7 +21,7 @@ radroots_blossom = { workspace = true, default-features = false, features = [ radroots_event = { workspace = true, default-features = false, features = [ "std", "serde", - "knowledge-nip54", + "knowledge", ] } radroots_event_codec = { workspace = true, default-features = false, features = [ "std", diff --git a/crates/event_codec_wasm/src/lib.rs b/crates/event_codec_wasm/src/lib.rs @@ -1,55 +1,55 @@ #![forbid(unsafe_code)] use radroots_blossom::{BlobDescriptor, BlobUrl, Error, MediaType, Sha256}; -use radroots_event::article::RadrootsArticle; -use radroots_event::comment::{ - RadrootsAuthoredNip22Comment, RadrootsNip22AddressRootReference, RadrootsNip22CommentError, - RadrootsNip22CommentParentReference, RadrootsNip22CommentRoot, RadrootsNip22EventRootReference, +use radroots_event::envelope::{ + RadrootsEventEnvelope, RadrootsEventEnvelopeError, RadrootsEventEnvelopeParts, }; -use radroots_event::coop::RadrootsCoop; -use radroots_event::document::RadrootsDocument; use radroots_event::farm::RadrootsFarm; -use radroots_event::farm_crdt::RadrootsFarmCrdtChange; -use radroots_event::farm_file::RadrootsFarmFileMetadata; -use radroots_event::farm_workspace::RadrootsFarmWorkspaceManifest; -use radroots_event::file_metadata::RadrootsFileMetadata; -use radroots_event::follow::RadrootsFollow; -use radroots_event::gift_wrap::RadrootsGiftWrap; -use radroots_event::group::{ - RadrootsGroupAdmins, RadrootsGroupCreateGroup, RadrootsGroupCreateInvite, - RadrootsGroupDeleteEvent, RadrootsGroupDeleteGroup, RadrootsGroupEditMetadata, - RadrootsGroupJoinRequest, RadrootsGroupLeaveRequest, RadrootsGroupMembers, - RadrootsGroupMetadata, RadrootsGroupPutUser, RadrootsGroupRemoveUser, RadrootsGroupRoles, -}; -use radroots_event::http_auth::RadrootsHttpAuth; -use radroots_event::job_feedback::RadrootsJobFeedback; -use radroots_event::job_request::RadrootsJobRequest; -use radroots_event::job_result::RadrootsJobResult; +use radroots_event::farm::coop::RadrootsCoop; +use radroots_event::farm::crdt::RadrootsFarmCrdtChange; +use radroots_event::farm::file::RadrootsFarmFileMetadata; +use radroots_event::farm::plot::RadrootsPlot; +use radroots_event::farm::workspace::RadrootsFarmWorkspaceManifest; use radroots_event::knowledge::{ RadrootsKnowledgeClaim, RadrootsKnowledgeFieldReport, RadrootsKnowledgeRelation, RadrootsKnowledgeReview, RadrootsKnowledgeSource, RadrootsWikiArticle, RadrootsWikiMergeRequest, RadrootsWikiRedirect, }; -use radroots_event::list::RadrootsList; -use radroots_event::list_set::RadrootsListSet; +use radroots_event::listing::operational::RadrootsOperationalListing; +use radroots_event::media::file_metadata::RadrootsFileMetadata; use radroots_event::media::{RadrootsAuthoredImage, RadrootsAuthoredImageError}; -use radroots_event::message::RadrootsMessage; -use radroots_event::message_file::RadrootsMessageFile; -use radroots_event::operational_listing::RadrootsOperationalListing; -use radroots_event::plot::RadrootsPlot; +use radroots_event::post::article::RadrootsArticle; +use radroots_event::post::comment::{ + RadrootsAuthoredNip22Comment, RadrootsNip22AddressRootReference, RadrootsNip22CommentError, + RadrootsNip22CommentParentReference, RadrootsNip22CommentRoot, RadrootsNip22EventRootReference, +}; +use radroots_event::post::document::RadrootsDocument; +use radroots_event::post::reaction::RadrootsReaction; +use radroots_event::post::report::RadrootsReport; +use radroots_event::post::repost::{RadrootsGenericRepost, RadrootsRepost}; use radroots_event::post::{ RadrootsAuthoredAsk, RadrootsAuthoredPhotoUpdate, RadrootsAuthoredPostError, RadrootsAuthoredPostImage, RadrootsAuthoredUpdate, RadrootsPostImageDimensions, }; -use radroots_event::reaction::RadrootsReaction; -use radroots_event::relay_auth::RadrootsRelayAuth; -use radroots_event::report::RadrootsReport; -use radroots_event::repost::{RadrootsGenericRepost, RadrootsRepost}; -use radroots_event::seal::RadrootsSeal; -use radroots_event::wire::RadrootsNip01EventWireParts; -use radroots_event::{ - RadrootsEventEnvelope, RadrootsEventEnvelopeError, RadrootsEventEnvelopeParts, +use radroots_event::social::follow::RadrootsFollow; +use radroots_event::social::gift_wrap::RadrootsGiftWrap; +use radroots_event::social::group::{ + RadrootsGroupAdmins, RadrootsGroupCreateGroup, RadrootsGroupCreateInvite, + RadrootsGroupDeleteEvent, RadrootsGroupDeleteGroup, RadrootsGroupEditMetadata, + RadrootsGroupJoinRequest, RadrootsGroupLeaveRequest, RadrootsGroupMembers, + RadrootsGroupMetadata, RadrootsGroupPutUser, RadrootsGroupRemoveUser, RadrootsGroupRoles, }; +use radroots_event::social::http_auth::RadrootsHttpAuth; +use radroots_event::social::job_feedback::RadrootsJobFeedback; +use radroots_event::social::job_request::RadrootsJobRequest; +use radroots_event::social::job_result::RadrootsJobResult; +use radroots_event::social::list::RadrootsList; +use radroots_event::social::list_set::RadrootsListSet; +use radroots_event::social::message::RadrootsMessage; +use radroots_event::social::message_file::RadrootsMessageFile; +use radroots_event::social::relay_auth::RadrootsRelayAuth; +use radroots_event::social::seal::RadrootsSeal; +use radroots_event::wire::RadrootsNip01EventWireParts; use radroots_event_codec::article::encode::article_build_tags; use radroots_event_codec::comment::authored::authored_nip22_comment_to_wire_parts; use radroots_event_codec::coop::encode::coop_build_tags; @@ -242,7 +242,7 @@ where { event_type: &'static str, contract_id: &'static str, - event: &'a radroots_event::RadrootsEventEnvelope, + event: &'a radroots_event::envelope::RadrootsEventEnvelope, payload: &'a T, } @@ -830,33 +830,26 @@ pub fn group_roles_tags(group_json: &str) -> Result<String, RadrootsJsValue> { mod tests { use super::*; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; + use radroots_event::envelope::kind::{ + KIND_FARM_FILE_METADATA, KIND_FILE_METADATA, KIND_KNOWLEDGE_CLAIM, KIND_KNOWLEDGE_SOURCE, + KIND_WIKI_ARTICLE, + }; + use radroots_event::envelope::{ + RadrootsEventEnvelope, RadrootsEventEnvelopeLimits, RadrootsEventEnvelopeParts, + }; use radroots_event::farm::RadrootsFarmRef; - use radroots_event::farm_crdt::{ + use radroots_event::farm::crdt::{ RADROOTS_FARM_CRDT_CHANGE_SCHEMA, RadrootsCrdtBackend, RadrootsFarmCrdtDocumentKind, RadrootsFarmSemanticKind, }; - use radroots_event::farm_file::{ + use radroots_event::farm::file::{ RadrootsFarmFileDimensions, RadrootsFarmFileMetadata, RadrootsFarmFileSource, }; - use radroots_event::farm_workspace::{ + use radroots_event::farm::workspace::{ RADROOTS_FARM_WORKSPACE_PROTOCOL_VERSION, RADROOTS_FARM_WORKSPACE_SCHEMA, RadrootsFarmWorkspaceManifest, RadrootsFarmWorkspaceMediaServer, RadrootsFarmWorkspaceRef, RadrootsFarmWorkspaceRelay, RadrootsFarmWorkspaceRelayMode, }; - use radroots_event::group::{ - RadrootsGroupAdmins, RadrootsGroupCreateGroup, RadrootsGroupCreateInvite, - RadrootsGroupDeleteEvent, RadrootsGroupDeleteGroup, RadrootsGroupEditMetadata, - RadrootsGroupEditableMetadata, RadrootsGroupJoinRequest, RadrootsGroupLeaveRequest, - RadrootsGroupMembers, RadrootsGroupMetadata, RadrootsGroupPutUser, RadrootsGroupRemoveUser, - RadrootsGroupRole, RadrootsGroupRoles, RadrootsGroupUserRef, - }; - use radroots_event::http_auth::RadrootsHttpAuth; - use radroots_event::job::JobInputType; - use radroots_event::job_request::{RadrootsJobInput, RadrootsJobParam}; - use radroots_event::kinds::{ - KIND_FARM_FILE_METADATA, KIND_FILE_METADATA, KIND_KNOWLEDGE_CLAIM, KIND_KNOWLEDGE_SOURCE, - KIND_WIKI_ARTICLE, - }; use radroots_event::knowledge::{ RADROOTS_KNOWLEDGE_CLAIM_SCHEMA, RADROOTS_KNOWLEDGE_FIELD_REPORT_SCHEMA, RADROOTS_KNOWLEDGE_RELATION_SCHEMA, RADROOTS_KNOWLEDGE_REVIEW_SCHEMA, @@ -867,17 +860,24 @@ mod tests { RadrootsKnowledgeReviewScope, RadrootsKnowledgeReviewScore, RadrootsKnowledgeReviewTarget, RadrootsWikiArticleVersionRef, }; - use radroots_event::operational_listing::{ + use radroots_event::listing::operational::{ RadrootsOperationalListingBin, RadrootsOperationalListingProduct, }; - use radroots_event::relay_auth::RadrootsRelayAuth; + use radroots_event::social::group::{ + RadrootsGroupAdmins, RadrootsGroupCreateGroup, RadrootsGroupCreateInvite, + RadrootsGroupDeleteEvent, RadrootsGroupDeleteGroup, RadrootsGroupEditMetadata, + RadrootsGroupEditableMetadata, RadrootsGroupJoinRequest, RadrootsGroupLeaveRequest, + RadrootsGroupMembers, RadrootsGroupMetadata, RadrootsGroupPutUser, RadrootsGroupRemoveUser, + RadrootsGroupRole, RadrootsGroupRoles, RadrootsGroupUserRef, + }; + use radroots_event::social::http_auth::RadrootsHttpAuth; + use radroots_event::social::job::JobInputType; + use radroots_event::social::job_request::{RadrootsJobInput, RadrootsJobParam}; + use radroots_event::social::relay_auth::RadrootsRelayAuth; use radroots_event::social::{ RadrootsReportFileTarget, RadrootsReportType, RadrootsSocialFarmAnchor, RadrootsSocialLocation, RadrootsSocialMediaDimensions, RadrootsSocialTarget, }; - use radroots_event::{ - RadrootsEventEnvelope, RadrootsEventEnvelopeLimits, RadrootsEventEnvelopeParts, - }; fn sample_listing() -> RadrootsOperationalListing { let quantity = @@ -966,8 +966,8 @@ mod tests { } } - fn knowledge_event_ref(seed: char, kind: u32) -> radroots_event::RadrootsEventRef { - radroots_event::RadrootsEventRef { + fn knowledge_event_ref(seed: char, kind: u32) -> radroots_event::tag::RadrootsEventRef { + radroots_event::tag::RadrootsEventRef { id: synthetic_event_id(seed), author: radroots_identity::PublicKey::from_hex(&synthetic_pubkey('a')) .expect("fixture public key"), diff --git a/crates/replica_sync_wasm/src/lib.rs b/crates/replica_sync_wasm/src/lib.rs @@ -4,7 +4,7 @@ use base64::Engine; #[cfg(target_arch = "wasm32")] use base64::engine::general_purpose::URL_SAFE_NO_PAD; -use radroots_event::{RadrootsEventEnvelope, RadrootsEventEnvelopeParts}; +use radroots_event::envelope::{RadrootsEventEnvelope, RadrootsEventEnvelopeParts}; #[cfg(any(target_arch = "wasm32", test))] use radroots_replica_sync::RadrootsReplicaIngestOutcome; use radroots_replica_sync::RadrootsReplicaSyncRequest; diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml @@ -37,7 +37,7 @@ nostr = ["radroots_event_codec/nostr"] knowledge = [ "serde", "serde_json", - "radroots_event/knowledge-nip54", + "radroots_event/knowledge", "radroots_event_codec/contract-manifest", "radroots_event_codec/knowledge-nip54", ] @@ -67,7 +67,6 @@ signer-adapters = [ "dep:radroots_nostr_connect", "dep:radroots_nostr_signer", "dep:tokio", - "radroots_event/signature", "radroots_nostr/events", ] runtime = [ diff --git a/crates/sdk/examples/runtime_local.rs b/crates/sdk/examples/runtime_local.rs @@ -1,9 +1,9 @@ use radroots_authority::{RadrootsActorContext, RadrootsLocalEventSigner}; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use radroots_event::farm::RadrootsFarmRef; -use radroots_event::ids::{RadrootsDTag, RadrootsInventoryBinId}; -use radroots_event::operational_listing::{ +use radroots_event::id::{RadrootsDTag, RadrootsInventoryBinId}; +use radroots_event::listing::operational::{ RadrootsOperationalListing, RadrootsOperationalListingAvailability, RadrootsOperationalListingBin, RadrootsOperationalListingDeliveryMethod, RadrootsOperationalListingProduct, RadrootsOperationalListingPublicLocation, @@ -29,7 +29,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> { .signer_provider(RadrootsSdkSignerProvider::LocalKey(signer)) .build() .await?; - let actor = RadrootsActorContext::test(seller.as_str(), [RadrootsActorRole::Seller])?; + let actor = RadrootsActorContext::test(seller.as_str(), [AuthorRole::Seller])?; let listing = sample_listing(seller.as_str()); let prepare_request = ListingPreparePublishRequest::new(actor.clone(), listing); let target_policy = TargetPolicy::try_nostr_relays([RELAY], NostrRelayUrlPolicy::Public)?; diff --git a/crates/sdk/examples/sdk_v1_knowledge_prepare.rs b/crates/sdk/examples/sdk_v1_knowledge_prepare.rs @@ -1,5 +1,5 @@ use nostr::{EventBuilder, Keys, Kind, Tag, Timestamp}; -use radroots_event::RadrootsEventEnvelopeParts; +use radroots_event::envelope::RadrootsEventEnvelopeParts; use radroots_identity::PublicKey; use radroots_sdk::knowledge::prelude::*; diff --git a/crates/sdk/examples/sdk_v1_listing_prepare.rs b/crates/sdk/examples/sdk_v1_listing_prepare.rs @@ -1,9 +1,9 @@ use radroots_authority::RadrootsActorContext; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use radroots_event::farm::RadrootsFarmRef; -use radroots_event::ids::{RadrootsDTag, RadrootsInventoryBinId}; -use radroots_event::operational_listing::{ +use radroots_event::id::{RadrootsDTag, RadrootsInventoryBinId}; +use radroots_event::listing::operational::{ RadrootsOperationalListing, RadrootsOperationalListingAvailability, RadrootsOperationalListingBin, RadrootsOperationalListingDeliveryMethod, RadrootsOperationalListingProduct, RadrootsOperationalListingPublicLocation, @@ -19,7 +19,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> { .fixed_clock(RadrootsSdkTimestamp::from_unix_seconds(1_700_000_000)) .build() .await?; - let actor = RadrootsActorContext::test(SELLER, [RadrootsActorRole::Seller])?; + let actor = RadrootsActorContext::test(SELLER, [AuthorRole::Seller])?; let request = ListingPreparePublishRequest::new(actor, sample_listing(SELLER)); let plan = sdk.listings().prepare_publish(request)?; diff --git a/crates/sdk/examples/sdk_v1_local_enqueue_and_mock_sync.rs b/crates/sdk/examples/sdk_v1_local_enqueue_and_mock_sync.rs @@ -1,9 +1,9 @@ use radroots_authority::{RadrootsActorContext, RadrootsLocalEventSigner}; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use radroots_event::farm::RadrootsFarmRef; -use radroots_event::ids::{RadrootsDTag, RadrootsInventoryBinId}; -use radroots_event::operational_listing::{ +use radroots_event::id::{RadrootsDTag, RadrootsInventoryBinId}; +use radroots_event::listing::operational::{ RadrootsOperationalListing, RadrootsOperationalListingAvailability, RadrootsOperationalListingBin, RadrootsOperationalListingDeliveryMethod, RadrootsOperationalListingProduct, RadrootsOperationalListingPublicLocation, @@ -30,7 +30,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> { .signer_provider(RadrootsSdkSignerProvider::LocalKey(signer)) .build() .await?; - let actor = RadrootsActorContext::test(seller.as_str(), [RadrootsActorRole::Seller])?; + let actor = RadrootsActorContext::test(seller.as_str(), [AuthorRole::Seller])?; let targets = TargetSet::nostr_relays([LOCAL_RELAY], NostrRelayUrlPolicy::Localhost)?; let target_policy = TargetPolicy::explicit(targets); diff --git a/crates/sdk/examples/sdk_v1_myc_nip46_signer_setup.rs b/crates/sdk/examples/sdk_v1_myc_nip46_signer_setup.rs @@ -1,4 +1,4 @@ -use radroots_event::kinds::KIND_TRADE_PROPOSAL; +use radroots_event::envelope::kind::KIND_TRADE_PROPOSAL; use radroots_nostr::prelude::{RadrootsNostrEvent, RadrootsNostrKeys}; use radroots_nostr_connect::prelude::{ RadrootsNostrConnectClientTarget, RadrootsNostrConnectError, diff --git a/crates/sdk/src/actor_json.rs b/crates/sdk/src/actor_json.rs @@ -1,5 +1,5 @@ use radroots_authority::{RadrootsActorContext, RadrootsActorSource}; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use serde::{Serialize, ser::SerializeStruct}; pub(crate) struct SdkActorContextJson<'a>(pub(crate) &'a RadrootsActorContext); @@ -36,17 +36,17 @@ impl serde::Serialize for SdkActorContextJson<'_> { } } -fn actor_role_code(role: &RadrootsActorRole) -> &'static str { +fn actor_role_code(role: &AuthorRole) -> &'static str { match role { - RadrootsActorRole::Any => "any", - RadrootsActorRole::Application => "application", - RadrootsActorRole::Buyer => "buyer", - RadrootsActorRole::Farmer => "farmer", - RadrootsActorRole::Member => "member", - RadrootsActorRole::Moderator => "moderator", - RadrootsActorRole::Relay => "relay", - RadrootsActorRole::Seller => "seller", - RadrootsActorRole::Service => "service", + AuthorRole::Any => "any", + AuthorRole::Application => "application", + AuthorRole::Buyer => "buyer", + AuthorRole::Farmer => "farmer", + AuthorRole::Member => "member", + AuthorRole::Moderator => "moderator", + AuthorRole::Relay => "relay", + AuthorRole::Seller => "seller", + AuthorRole::Service => "service", } } diff --git a/crates/sdk/src/error.rs b/crates/sdk/src/error.rs @@ -6,7 +6,7 @@ use crate::privacy::{PrivacyPreflightStatus, ProductSensitivityField}; #[cfg(feature = "runtime")] use crate::transport::ReticulumBehavior; #[cfg(feature = "runtime")] -use radroots_event::trade_validation::RadrootsOperationalListingValidationError; +use radroots_event::trade::validation::RadrootsOperationalListingValidationError; #[cfg(feature = "runtime")] use serde_json::{Value, json}; diff --git a/crates/sdk/src/farms_runtime.rs b/crates/sdk/src/farms_runtime.rs @@ -15,12 +15,12 @@ use crate::{ use radroots_authority::{RadrootsActorContext, RadrootsEventSigner}; #[cfg(feature = "runtime")] use radroots_event::{ - contract::RadrootsActorRole, + contract::AuthorRole, draft::RadrootsEventDraft, + envelope::kind::KIND_FARM, farm::{RadrootsFarm, RadrootsFarmPublicLocation}, - ids::{RadrootsAddressableCoordinate, RadrootsEventId}, - kinds::KIND_FARM, - operational_listing::RadrootsOperationalListingPublicLocation, + id::{RadrootsAddressableCoordinate, RadrootsEventId}, + listing::operational::RadrootsOperationalListingPublicLocation, }; #[cfg(feature = "runtime")] #[cfg(feature = "runtime")] @@ -840,7 +840,7 @@ fn require_farmer_actor( actor: &RadrootsActorContext, operation: &'static str, ) -> Result<(), RadrootsSdkError> { - if actor.satisfies(RadrootsActorRole::Farmer) { + if actor.satisfies(AuthorRole::Farmer) { Ok(()) } else { Err(RadrootsSdkError::UnauthorizedActor { diff --git a/crates/sdk/src/idempotency.rs b/crates/sdk/src/idempotency.rs @@ -1,6 +1,6 @@ use crate::RadrootsSdkError; use core::fmt; -use radroots_event::ids::RadrootsEventId; +use radroots_event::id::RadrootsEventId; use radroots_identity::PublicKey; use serde::ser::SerializeStruct; diff --git a/crates/sdk/src/knowledge.rs b/crates/sdk/src/knowledge.rs @@ -13,9 +13,9 @@ use core::fmt; pub use radroots_event::wire::RadrootsNip01EventWireParts; pub use radroots_event::{ - RadrootsEventEnvelope, RadrootsEventRef, draft::{RadrootsDraftError, RadrootsEventDraft}, - kinds::{ + envelope::RadrootsEventEnvelope, + envelope::kind::{ KIND_FILE_METADATA, KIND_KNOWLEDGE_CLAIM, KIND_KNOWLEDGE_FIELD_REPORT, KIND_KNOWLEDGE_RELATION, KIND_KNOWLEDGE_REVIEW, KIND_KNOWLEDGE_SOURCE, KIND_WIKI_ARTICLE, KIND_WIKI_MERGE_REQUEST, KIND_WIKI_REDIRECT, @@ -37,6 +37,7 @@ pub use radroots_event::{ RadrootsWikiMergeRequest, RadrootsWikiRedirect, normalize_wiki_d_tag, validate_knowledge_claim, validate_wiki_article, validate_wiki_d_tag, }, + tag::RadrootsEventRef, }; pub use radroots_event_codec::{ RADROOTS_KNOWLEDGE_CONTRACT_MANIFEST_SCHEMA_VERSION, diff --git a/crates/sdk/src/listings_runtime.rs b/crates/sdk/src/listings_runtime.rs @@ -11,9 +11,9 @@ use radroots_authority::{RadrootsActorContext, RadrootsEventSigner}; #[cfg(feature = "runtime")] use radroots_event::{ draft::RadrootsEventDraft, - ids::{RadrootsClassifiedListingAddress, RadrootsEventId}, - kinds::KIND_CLASSIFIED_LISTING, - operational_listing::RadrootsOperationalListing, + envelope::kind::KIND_CLASSIFIED_LISTING, + id::{RadrootsClassifiedListingAddress, RadrootsEventId}, + listing::operational::RadrootsOperationalListing, }; #[cfg(feature = "runtime")] use radroots_outbox::RadrootsOutboxEnqueueStatus; diff --git a/crates/sdk/src/private_store.rs b/crates/sdk/src/private_store.rs @@ -1,8 +1,8 @@ #![cfg(feature = "runtime")] use crate::RadrootsSdkError; -use radroots_event::ids::{RadrootsAddressableCoordinate, RadrootsAddressableCoordinateParts}; -use radroots_event::kinds::KIND_FARM; +use radroots_event::envelope::kind::KIND_FARM; +use radroots_event::id::{RadrootsAddressableCoordinate, RadrootsAddressableCoordinateParts}; use radroots_event::trade::RADROOTS_TRADE_MAX_PRIVATE_ARTIFACT_BYTES; use radroots_protected_store::{RadrootsProtectedFileKeySource, RadrootsProtectedStoreEnvelope}; use radroots_secret_vault::{RadrootsSecretKeyWrapping, RadrootsSecretVaultAccessError}; diff --git a/crates/sdk/src/signer_provider.rs b/crates/sdk/src/signer_provider.rs @@ -5,7 +5,7 @@ use radroots_authority::{ authorize_signer_for_draft, sign_authorized_draft, validate_signed_event_matches_draft, }; use radroots_event::draft::{RadrootsEventDraft, RadrootsSignedEvent}; -use radroots_event::kinds::{ +use radroots_event::envelope::kind::{ KIND_CLASSIFIED_LISTING, KIND_FARM, KIND_TRADE_CANCELLATION, KIND_TRADE_DECISION, KIND_TRADE_PROPOSAL, KIND_TRADE_REVISION_DECISION, KIND_TRADE_REVISION_PROPOSAL, }; @@ -628,9 +628,8 @@ fn signed_event_from_nip46_response( reason: format!("remote signed event is invalid: {error}"), } })?; - signed_event - .verify_signature() - .map(|verified| verified.into_signed_event()) + radroots_event_codec::verification::verify_nip01_event(signed_event.envelope().clone()) + .map(|_| signed_event) .map_err(|error| RadrootsSdkError::SignerProtocol { mode: RadrootsSdkSignerMode::MycNip46.as_str().to_owned(), reason: format!("remote signed event signature is invalid: {error}"), diff --git a/crates/sdk/src/sync_runtime.rs b/crates/sdk/src/sync_runtime.rs @@ -12,7 +12,7 @@ use crate::{ #[cfg(all(feature = "runtime", feature = "radrootsd-execution"))] use crate::{RadrootsdExecutionAuth, RadrootsdExecutionProfile}; #[cfg(feature = "runtime")] -use radroots_event::ids::RadrootsEventId; +use radroots_event::id::RadrootsEventId; #[cfg(feature = "runtime")] use radroots_event_store::{RADROOTS_EVENT_STORE_QUERY_LIMIT_MAX, RadrootsEventStoreStatusSummary}; #[cfg(all(feature = "runtime", feature = "transport-nostr-runtime"))] diff --git a/crates/sdk/src/trade_runtime.rs b/crates/sdk/src/trade_runtime.rs @@ -20,8 +20,8 @@ use radroots_authority::{RadrootsActorContext, RadrootsEventSigner}; #[cfg(feature = "runtime")] use radroots_event::{ draft::RadrootsEventDraft, - ids::{RadrootsEventId, RadrootsTradeCandidateId, RadrootsTradeId, RadrootsTradeMutationId}, - kinds::TRADE_MUTATION_EVENT_KINDS, + envelope::kind::TRADE_MUTATION_EVENT_KINDS, + id::{RadrootsEventId, RadrootsTradeCandidateId, RadrootsTradeId, RadrootsTradeMutationId}, trade::{ RADROOTS_TRADE_MAX_PRIVATE_ARTIFACT_BYTES, RADROOTS_TRADE_MUTATION_CONTRACT_IDS, RADROOTS_TRADE_SCHEMA_VERSION, RadrootsTradeDecisionV1, RadrootsTradeMutationBodyV1, diff --git a/crates/sdk/src/workflow_runtime.rs b/crates/sdk/src/workflow_runtime.rs @@ -7,9 +7,9 @@ use crate::{ }; use radroots_authority::{RadrootsActorContext, RadrootsEventSigner, sign_authorized_draft}; use radroots_event::{ - RadrootsEventKind, RadrootsEventKindClass, draft::{RadrootsEventDraft, RadrootsSignedEvent}, - ids::RadrootsEventId, + envelope::{RadrootsEventKind, RadrootsEventKindClass}, + id::RadrootsEventId, }; use radroots_event_store::{ RadrootsEventIngest, RadrootsEventPersistence, RadrootsEventStoreError, @@ -137,7 +137,8 @@ async fn enqueue_signed_workflow_event( signed_event: RadrootsSignedEvent, delivery_plan: SdkResolvedDeliveryPlan, ) -> Result<SdkWorkflowEnqueueReceipt, RadrootsSdkError> { - if radroots_event::kinds::TRADE_MUTATION_EVENT_KINDS.contains(&request.frozen_draft.kind_u32()) + if radroots_event::envelope::kind::TRADE_MUTATION_EVENT_KINDS + .contains(&request.frozen_draft.kind_u32()) { return enqueue_signed_trade_workflow_event(sdk, request, signed_event, delivery_plan) .await; @@ -978,7 +979,9 @@ fn frozen_draft_json(frozen_draft: &RadrootsEventDraft) -> Result<String, Radroo } fn mutation_id_from_draft(frozen_draft: &RadrootsEventDraft) -> Option<String> { - if !radroots_event::kinds::TRADE_MUTATION_EVENT_KINDS.contains(&frozen_draft.kind_u32()) { + if !radroots_event::envelope::kind::TRADE_MUTATION_EVENT_KINDS + .contains(&frozen_draft.kind_u32()) + { return None; } radroots_event::trade::trade_mutation_from_canonical_content(frozen_draft.content()) diff --git a/crates/sdk/tests/farms_runtime.rs b/crates/sdk/tests/farms_runtime.rs @@ -2,10 +2,10 @@ use radroots_authority::RadrootsActorContext; use radroots_event::{ - contract::RadrootsActorRole, + contract::AuthorRole, + envelope::kind::{KIND_FARM, KIND_PROFILE}, farm::RadrootsFarm, - ids::RadrootsAddressableCoordinate, - kinds::{KIND_FARM, KIND_PROFILE}, + id::RadrootsAddressableCoordinate, }; use radroots_event_store::RadrootsEventStore; use radroots_outbox::{ @@ -53,11 +53,11 @@ fn other_pubkey() -> &'static str { } fn farmer_actor() -> RadrootsActorContext { - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor") + RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor") } fn non_farmer_actor() -> RadrootsActorContext { - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Buyer]).expect("actor") + RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Buyer]).expect("actor") } fn farm(d_tag: &str, name: &str) -> RadrootsFarm { diff --git a/crates/sdk/tests/knowledge_public_api.rs b/crates/sdk/tests/knowledge_public_api.rs @@ -1,7 +1,7 @@ #![cfg(feature = "knowledge")] use nostr::{EventBuilder, Keys, Kind, Tag, Timestamp}; -use radroots_event::RadrootsEventEnvelopeParts; +use radroots_event::envelope::RadrootsEventEnvelopeParts; use radroots_identity::PublicKey; use radroots_sdk::knowledge::prelude::*; use std::sync::LazyLock; diff --git a/crates/sdk/tests/listings_runtime.rs b/crates/sdk/tests/listings_runtime.rs @@ -3,11 +3,11 @@ use radroots_authority::RadrootsActorContext; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; use radroots_event::{ - contract::RadrootsActorRole, + contract::AuthorRole, + envelope::kind::KIND_CLASSIFIED_LISTING, farm::RadrootsFarmRef, - ids::{RadrootsDTag, RadrootsInventoryBinId}, - kinds::KIND_CLASSIFIED_LISTING, - operational_listing::{ + id::{RadrootsDTag, RadrootsInventoryBinId}, + listing::operational::{ RadrootsOperationalListing, RadrootsOperationalListingAvailability, RadrootsOperationalListingBin, RadrootsOperationalListingDeliveryMethod, RadrootsOperationalListingProduct, RadrootsOperationalListingPublicLocation, @@ -62,11 +62,11 @@ fn other_pubkey() -> &'static str { } fn actor() -> RadrootsActorContext { - RadrootsActorContext::test(seller_pubkey(), [RadrootsActorRole::Seller]).expect("actor") + RadrootsActorContext::test(seller_pubkey(), [AuthorRole::Seller]).expect("actor") } fn non_seller_actor() -> RadrootsActorContext { - RadrootsActorContext::test(seller_pubkey(), [RadrootsActorRole::Buyer]).expect("actor") + RadrootsActorContext::test(seller_pubkey(), [AuthorRole::Buyer]).expect("actor") } fn listing(d_tag: &str, title: &str) -> RadrootsOperationalListing { diff --git a/crates/sdk/tests/replica_ingest.rs b/crates/sdk/tests/replica_ingest.rs @@ -1,4 +1,7 @@ -use radroots_event::{RadrootsEventEnvelope, RadrootsEventEnvelopeParts, farm::RadrootsFarm}; +use radroots_event::{ + envelope::{RadrootsEventEnvelope, RadrootsEventEnvelopeParts}, + farm::RadrootsFarm, +}; use radroots_replica_schema::farm::IFarmFindMany; use radroots_replica_store::ReplicaSql; use radroots_replica_sync::{RadrootsReplicaIngestOutcome, radroots_replica_ingest_event}; diff --git a/crates/sdk/tests/source_boundary.rs b/crates/sdk/tests/source_boundary.rs @@ -88,7 +88,7 @@ fn active_sources_do_not_import_retired_listing_contracts() { for path in active_source_files() { let source = read_source(&path); for forbidden in [ - "radroots_event::listing", + "radroots_event::operational_listing", "radroots_trade::listing", "RadrootsListingAddress", "KIND_LISTING", diff --git a/crates/sdk/tests/sync_runtime.rs b/crates/sdk/tests/sync_runtime.rs @@ -4,10 +4,10 @@ use futures::future::BoxFuture; use radroots_authority::{RadrootsActorContext, RadrootsEventSigner}; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; use radroots_event::{ - contract::RadrootsActorRole, + contract::AuthorRole, farm::RadrootsFarmRef, - ids::{RadrootsDTag, RadrootsEventId, RadrootsInventoryBinId}, - operational_listing::{ + id::{RadrootsDTag, RadrootsEventId, RadrootsInventoryBinId}, + listing::operational::{ RadrootsOperationalListing, RadrootsOperationalListingAvailability, RadrootsOperationalListingBin, RadrootsOperationalListingDeliveryMethod, RadrootsOperationalListingProduct, RadrootsOperationalListingPublicLocation, @@ -385,7 +385,7 @@ impl RadrootsRelayPublishAdapter for RecordingPublishAdapter { } fn actor() -> RadrootsActorContext { - RadrootsActorContext::test(seller_pubkey(), [RadrootsActorRole::Seller]).expect("actor") + RadrootsActorContext::test(seller_pubkey(), [AuthorRole::Seller]).expect("actor") } fn listing(d_tag: &str, title: &str) -> RadrootsOperationalListing { diff --git a/crates/sdk/tests/unit/actor_json_tests.rs b/crates/sdk/tests/unit/actor_json_tests.rs @@ -1,6 +1,6 @@ use super::{SdkActorContextJson, actor_role_code, actor_source_code}; use radroots_authority::{RadrootsActorContext, RadrootsActorSource}; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use crate::serializer_failure::assert_struct_serialize_error_paths; @@ -8,18 +8,15 @@ const PUBKEY: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa #[test] fn actor_role_and_source_codes_cover_public_actor_taxonomy() { - assert_eq!(actor_role_code(&RadrootsActorRole::Any), "any"); - assert_eq!( - actor_role_code(&RadrootsActorRole::Application), - "application" - ); - assert_eq!(actor_role_code(&RadrootsActorRole::Buyer), "buyer"); - assert_eq!(actor_role_code(&RadrootsActorRole::Farmer), "farmer"); - assert_eq!(actor_role_code(&RadrootsActorRole::Member), "member"); - assert_eq!(actor_role_code(&RadrootsActorRole::Moderator), "moderator"); - assert_eq!(actor_role_code(&RadrootsActorRole::Relay), "relay"); - assert_eq!(actor_role_code(&RadrootsActorRole::Seller), "seller"); - assert_eq!(actor_role_code(&RadrootsActorRole::Service), "service"); + assert_eq!(actor_role_code(&AuthorRole::Any), "any"); + assert_eq!(actor_role_code(&AuthorRole::Application), "application"); + assert_eq!(actor_role_code(&AuthorRole::Buyer), "buyer"); + assert_eq!(actor_role_code(&AuthorRole::Farmer), "farmer"); + assert_eq!(actor_role_code(&AuthorRole::Member), "member"); + assert_eq!(actor_role_code(&AuthorRole::Moderator), "moderator"); + assert_eq!(actor_role_code(&AuthorRole::Relay), "relay"); + assert_eq!(actor_role_code(&AuthorRole::Seller), "seller"); + assert_eq!(actor_role_code(&AuthorRole::Service), "service"); assert_eq!( actor_source_code(RadrootsActorSource::LocalAccount), @@ -42,7 +39,7 @@ fn actor_context_json_preserves_source_roles_and_account_id() { let actor = RadrootsActorContext::local_account( PUBKEY, "acct-1", - [RadrootsActorRole::Buyer, RadrootsActorRole::Seller], + [AuthorRole::Buyer, AuthorRole::Seller], ) .expect("actor"); @@ -64,7 +61,7 @@ fn actor_context_json_reports_serializer_failures() { let actor = RadrootsActorContext::local_account( PUBKEY, "acct-1", - [RadrootsActorRole::Buyer, RadrootsActorRole::Seller], + [AuthorRole::Buyer, AuthorRole::Seller], ) .expect("actor"); diff --git a/crates/sdk/tests/unit/error_tests.rs b/crates/sdk/tests/unit/error_tests.rs @@ -5,7 +5,7 @@ use super::{ use crate::privacy::{PrivacyPreflightStatus, ProductSensitivityField}; use crate::transport::ReticulumBehavior; use radroots_authority::RadrootsAuthorityError; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use radroots_geocoder::{GeoNamesAssetFetcher, GeoNamesBlockingHttpFetcher, GeocoderError}; use std::collections::BTreeSet; @@ -34,7 +34,7 @@ fn authority_error_conversion_redacts_pubkey_mismatches_and_falls_back() { fn listing_and_store_errors_convert_to_sdk_error_classes() { let draft = RadrootsSdkError::from( radroots_trade::operational_listing::RadrootsOperationalListingEditError::ActorRoleUnsatisfied { - required_role: RadrootsActorRole::Seller, + required_role: AuthorRole::Seller, }, ); assert!(matches!( @@ -56,7 +56,7 @@ fn listing_and_store_errors_convert_to_sdk_error_classes() { let invalid_model = RadrootsSdkError::from( radroots_trade::operational_listing::RadrootsOperationalListingEditError::InvalidModel( - radroots_event::trade_validation::RadrootsOperationalListingValidationError::MissingInventory, + radroots_event::trade::validation::RadrootsOperationalListingValidationError::MissingInventory, ), ); assert!(matches!( diff --git a/crates/sdk/tests/unit/farms_runtime_tests.rs b/crates/sdk/tests/unit/farms_runtime_tests.rs @@ -16,7 +16,7 @@ fn farmer_pubkey() -> &'static str { } fn farmer_actor() -> RadrootsActorContext { - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor") + RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor") } fn farm(d_tag: &str, name: &str) -> RadrootsFarm { @@ -119,7 +119,7 @@ async fn fixture_geocoder(tempdir: &tempfile::TempDir, feature_name: Option<&str fn farm_publish_plan_rejects_invalid_draft_tags() { let actor = RadrootsActorContext::test( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - [RadrootsActorRole::Farmer], + [AuthorRole::Farmer], ) .expect("actor"); let farm = RadrootsFarm { @@ -530,7 +530,7 @@ async fn farm_prepared_plan_rejects_forged_state_before_signing_or_mutation() { // safe representable substitution for both identity fields. let foreign_draft = RadrootsEventDraft::new( "radroots.social.geochat.v1", - radroots_event::kinds::KIND_GEOCHAT, + radroots_event::envelope::kind::KIND_GEOCHAT, plan.created_at().unix_seconds(), Vec::new(), "Foreign draft", @@ -756,8 +756,7 @@ async fn farm_configured_local_signer_enqueues_publish_without_explicit_signer() .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let receipt = sdk .farms() @@ -789,8 +788,7 @@ async fn farm_configured_enqueue_reports_prepare_and_signer_errors() { .build() .await .expect("configured sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); assert!(matches!( configured_sdk @@ -922,8 +920,8 @@ async fn farm_private_location_default_client_and_lookup_report_store_edges() { farm_addr(&actor, FARM_B_D_TAG).expect("farm b addr") ); - let non_farmer_actor = RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Buyer]) - .expect("buyer actor"); + let non_farmer_actor = + RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Buyer]).expect("buyer actor"); assert!(matches!( sdk.farms() .clear_private_location(FarmPrivateLocationClearRequest::new( diff --git a/crates/sdk/tests/unit/idempotency_tests.rs b/crates/sdk/tests/unit/idempotency_tests.rs @@ -1,6 +1,6 @@ use super::{SdkIdempotencyKey, SdkTradeIdempotencyRecord}; use crate::RadrootsSdkError; -use radroots_event::ids::RadrootsEventId; +use radroots_event::id::RadrootsEventId; use radroots_identity::PublicKey; use crate::serializer_failure::assert_struct_serialize_error_paths; diff --git a/crates/sdk/tests/unit/listings_runtime_tests.rs b/crates/sdk/tests/unit/listings_runtime_tests.rs @@ -2,15 +2,15 @@ use super::*; use crate::{RadrootsSdkLocalKeySigner, RadrootsSdkSignerProvider}; use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit}; use radroots_event::{ - contract::RadrootsActorRole, + contract::AuthorRole, farm::RadrootsFarmRef, - ids::{RadrootsDTag, RadrootsInventoryBinId}, - operational_listing::{ + farm::resource_area::RadrootsResourceAreaRef, + id::{RadrootsDTag, RadrootsInventoryBinId}, + listing::operational::{ RadrootsOperationalListingAvailability, RadrootsOperationalListingBin, RadrootsOperationalListingDeliveryMethod, RadrootsOperationalListingProduct, RadrootsOperationalListingPublicLocation, RadrootsOperationalListingStatus, }, - resource_area::RadrootsResourceAreaRef, }; use crate::fixture_signer::{FixtureSigner, fixture_alice_pubkey, fixture_bob_pubkey}; @@ -28,7 +28,7 @@ fn seller_pubkey() -> &'static str { } fn actor() -> RadrootsActorContext { - RadrootsActorContext::test(seller_pubkey(), [RadrootsActorRole::Seller]).expect("actor") + RadrootsActorContext::test(seller_pubkey(), [AuthorRole::Seller]).expect("actor") } fn listing(d_tag: &str, title: &str) -> RadrootsOperationalListing { @@ -238,7 +238,7 @@ async fn listing_prepared_plan_rejects_forged_state_before_signing_or_mutation() // safe representable substitution for both identity fields. let foreign_draft = RadrootsEventDraft::new( "radroots.social.geochat.v1", - radroots_event::kinds::KIND_GEOCHAT, + radroots_event::envelope::kind::KIND_GEOCHAT, plan.created_at().unix_seconds(), Vec::new(), "Foreign draft", @@ -518,8 +518,7 @@ async fn listing_configured_local_signer_enqueues_publish_without_explicit_signe .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(seller_pubkey(), [RadrootsActorRole::Seller]).expect("actor"); + let actor = RadrootsActorContext::test(seller_pubkey(), [AuthorRole::Seller]).expect("actor"); let receipt = sdk .listings() diff --git a/crates/sdk/tests/unit/private_store_tests.rs b/crates/sdk/tests/unit/private_store_tests.rs @@ -1,12 +1,12 @@ use super::*; -use radroots_event::ids::RadrootsAddressableCoordinate; +use radroots_event::id::RadrootsAddressableCoordinate; use sqlx::Row; use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}; fn farm_addr_for(d_tag: &str) -> RadrootsAddressableCoordinate { RadrootsAddressableCoordinate::parse(format!( "{}:{}:{}", - radroots_event::kinds::KIND_FARM, + radroots_event::envelope::kind::KIND_FARM, "a".repeat(64), d_tag )) diff --git a/crates/sdk/tests/unit/runtime_tests.rs b/crates/sdk/tests/unit/runtime_tests.rs @@ -213,9 +213,9 @@ fn manifest() -> SdkBackupManifest { fn private_farm_location_record() -> crate::private_store::SdkPrivateFarmLocationRecord { crate::private_store::SdkPrivateFarmLocationRecord { - farm_addr: radroots_event::ids::RadrootsAddressableCoordinate::parse(format!( + farm_addr: radroots_event::id::RadrootsAddressableCoordinate::parse(format!( "{}:{}:{}", - radroots_event::kinds::KIND_FARM, + radroots_event::envelope::kind::KIND_FARM, "a".repeat(64), "AAAAAAAAAAAAAAAAAAAAAA" )) @@ -1978,7 +1978,7 @@ async fn restore_archive_private_failures_cover_staging_and_verification_edges() let populated_event_keys = radroots_nostr::prelude::RadrootsNostrKeys::generate(); let populated_event_draft = radroots_event::draft::RadrootsEventDraft::new( "radroots.farm.profile.v1", - radroots_event::kinds::KIND_FARM, + radroots_event::envelope::kind::KIND_FARM, 1_700_000_002, vec![vec!["d".to_owned(), "backup-fixture".to_owned()]], "{}", diff --git a/crates/sdk/tests/unit/signer_provider_tests.rs b/crates/sdk/tests/unit/signer_provider_tests.rs @@ -2,9 +2,9 @@ use super::*; use nostr::nips::nip44::{self, Version}; use nostr::{EventBuilder, JsonUtil, Kind, Tag}; use radroots_authority::RadrootsLocalEventSigner; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use radroots_event::draft::RadrootsEventDraft; -use radroots_event::kinds::{ +use radroots_event::envelope::kind::{ KIND_CLASSIFIED_LISTING, KIND_COOP, KIND_FARM, TRADE_MUTATION_EVENT_KINDS, }; use radroots_nostr::prelude::RadrootsNostrEvent; @@ -47,7 +47,7 @@ fn client_keys() -> RadrootsNostrKeys { } fn actor() -> RadrootsActorContext { - RadrootsActorContext::test(user_pubkey(), [RadrootsActorRole::Farmer]).expect("actor") + RadrootsActorContext::test(user_pubkey(), [AuthorRole::Farmer]).expect("actor") } fn frozen_draft() -> RadrootsEventDraft { @@ -273,8 +273,8 @@ async fn local_key_provider_returns_progress_sink_errors_without_transport_state let signer = local_sdk_signer(user_keys()); let draft = frozen_draft(); let actor = actor(); - let wrong_actor = RadrootsActorContext::test("a".repeat(64), [RadrootsActorRole::Farmer]) - .expect("wrong actor"); + let wrong_actor = + RadrootsActorContext::test("a".repeat(64), [AuthorRole::Farmer]).expect("wrong actor"); assert!(matches!( signer @@ -645,8 +645,8 @@ async fn myc_nip46_provider_reports_preflight_and_progress_sink_edges() { )); assert!(transport.published().is_empty()); - let wrong_actor = RadrootsActorContext::test("a".repeat(64), [RadrootsActorRole::Farmer]) - .expect("wrong actor"); + let wrong_actor = + RadrootsActorContext::test("a".repeat(64), [AuthorRole::Farmer]).expect("wrong actor"); let actor_error = signer .sign(RadrootsSdkSignRequest::new( "farm.publish", diff --git a/crates/sdk/tests/unit/sync_runtime_tests.rs b/crates/sdk/tests/unit/sync_runtime_tests.rs @@ -22,12 +22,12 @@ use radroots_authority::{ RadrootsActorContext, RadrootsEventSigner, RadrootsSignerError, RadrootsSignerIdentity, }; #[cfg(feature = "radrootsd-execution")] -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; #[cfg(feature = "radrootsd-execution")] use radroots_event::draft::{RadrootsEventDraft, RadrootsSignedEvent}; -use radroots_event::ids::RadrootsEventId; #[cfg(feature = "radrootsd-execution")] -use radroots_event::kinds::KIND_FARM; +use radroots_event::envelope::kind::KIND_FARM; +use radroots_event::id::RadrootsEventId; use radroots_event_store::RadrootsEventStoreStatusSummary; #[cfg(feature = "radrootsd-execution")] use radroots_identity::PublicKey; @@ -134,11 +134,8 @@ impl RadrootsRelayPublishAdapter for UnusedPublishAdapter { #[cfg(feature = "radrootsd-execution")] fn radrootsd_actor() -> RadrootsActorContext { - RadrootsActorContext::test( - radrootsd_fixture_signer_pubkey(), - [RadrootsActorRole::Farmer], - ) - .expect("actor") + RadrootsActorContext::test(radrootsd_fixture_signer_pubkey(), [AuthorRole::Farmer]) + .expect("actor") } #[cfg(feature = "radrootsd-execution")] diff --git a/crates/sdk/tests/unit/trade_runtime_tests.rs b/crates/sdk/tests/unit/trade_runtime_tests.rs @@ -5,12 +5,12 @@ use crate::{ }; use radroots_authority::{RadrootsActorContext, RadrootsLocalEventSigner}; use radroots_event::{ - contract::RadrootsActorRole, - ids::{ + contract::AuthorRole, + envelope::kind::TRADE_MUTATION_EVENT_KINDS, + id::{ RadrootsClassifiedListingAddress, RadrootsDTag, RadrootsEventId, RadrootsInventoryBinId, RadrootsTradeId, }, - kinds::TRADE_MUTATION_EVENT_KINDS, trade::{ RADROOTS_TRADE_DECISION_CONTRACT_ID, RADROOTS_TRADE_MAX_PRIVATE_ARTIFACT_BYTES, RADROOTS_TRADE_MUTATION_CONTRACT_IDS, RADROOTS_TRADE_PROPOSAL_CONTRACT_ID, @@ -112,11 +112,11 @@ async fn trade_capabilities_report_canonical_release_product_surface() { } fn buyer_actor(buyer_pubkey: &str) -> RadrootsActorContext { - RadrootsActorContext::test(buyer_pubkey, [RadrootsActorRole::Buyer]).expect("buyer") + RadrootsActorContext::test(buyer_pubkey, [AuthorRole::Buyer]).expect("buyer") } fn seller_actor(seller_pubkey: &str) -> RadrootsActorContext { - RadrootsActorContext::test(seller_pubkey, [RadrootsActorRole::Seller]).expect("seller") + RadrootsActorContext::test(seller_pubkey, [AuthorRole::Seller]).expect("seller") } fn candidate(buyer_pubkey: &str, seller_pubkey: &str) -> RadrootsTradeCandidateTermsV1 { diff --git a/crates/sdk/tests/unit/workflow_runtime_tests.rs b/crates/sdk/tests/unit/workflow_runtime_tests.rs @@ -2,9 +2,9 @@ use super::*; #[cfg(feature = "signer-adapters")] use crate::{RadrootsSdkLocalKeySigner, RadrootsSdkSignerProvider}; use radroots_authority::{RadrootsSignerError, RadrootsSignerIdentity}; -use radroots_event::contract::RadrootsActorRole; +use radroots_event::contract::AuthorRole; use radroots_event::draft::{RadrootsEventDraft, RadrootsSignedEvent, RadrootsSignedEventParts}; -use radroots_event::kinds::{KIND_FARM, KIND_GEOCHAT}; +use radroots_event::envelope::kind::{KIND_FARM, KIND_GEOCHAT}; use radroots_identity::PublicKey; use radroots_nostr::prelude::{RadrootsNostrKeys, radroots_nostr_sign_frozen_draft}; use std::sync::LazyLock; @@ -281,8 +281,7 @@ async fn enqueue_signed_workflow_rejects_ephemeral_event_before_durable_commit() .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = ephemeral_draft_for(farmer_pubkey()); let error = enqueue_signed_workflow( &sdk, @@ -340,8 +339,7 @@ async fn enqueue_signed_workflow_rejects_invalid_signer_signature_without_storag .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = frozen_draft_for_d_tag(farmer_pubkey(), "workflow-invalid-signature"); let operation_kind = "workflow.invalid-signature.test.v1"; @@ -408,8 +406,7 @@ async fn workflow_idempotency_replays_original_receipt_and_conflicts_on_new_comm .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let signer = WorkflowSigner::new(); let draft = frozen_draft_for_d_tag(farmer_pubkey(), "workflow-target-policy"); let first_target_policy = TargetPolicy::try_nostr_relays( @@ -523,8 +520,7 @@ async fn enqueue_signed_workflow_maps_no_wait_directly_and_allows_local_only_pro .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let signer = WorkflowSigner::new(); let draft = frozen_draft_for_d_tag(farmer_pubkey(), "workflow-no-wait"); @@ -597,8 +593,7 @@ async fn enqueue_signed_workflow_rejects_missing_explicit_idempotency_key_withou .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = frozen_draft_for_d_tag(farmer_pubkey(), "workflow-missing-idempotency"); let error = match enqueue_signed_workflow( @@ -648,8 +643,7 @@ async fn enqueue_signed_workflow_stores_signed_event_and_reports_idempotency_con .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let signer = WorkflowSigner::new(); let first_draft = frozen_draft_for_d_tag(farmer_pubkey(), "workflow-success"); let idempotency_key = @@ -753,8 +747,7 @@ async fn enqueue_configured_signed_workflow_uses_sdk_signer_provider() { .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = frozen_draft_for_d_tag(farmer_pubkey(), "workflow-configured"); let receipt = enqueue_configured_signed_workflow( @@ -794,8 +787,7 @@ async fn enqueue_signed_workflow_reports_runtime_pool_failure_before_mutation() 0 ); sdk._outbox.pool().close().await; - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = frozen_draft_for(farmer_pubkey()); let request = SdkWorkflowEnqueueRequest { operation_kind: "workflow.test.v1", @@ -816,8 +808,7 @@ async fn enqueue_signed_workflow_reports_runtime_pool_failure_before_mutation() #[tokio::test] async fn enqueue_signed_workflow_reports_store_failures() { - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = frozen_draft_for(farmer_pubkey()); let closed_store_sdk = crate::RadrootsClient::builder() .transport_profile(nostr_profile("wss://relay.example.com")) @@ -852,8 +843,7 @@ async fn enqueue_signed_workflow_reports_clock_failures() { .build() .await .expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = frozen_draft_for(farmer_pubkey()); let request = SdkWorkflowEnqueueRequest { operation_kind: "workflow.test.v1", @@ -872,8 +862,7 @@ async fn enqueue_signed_workflow_reports_clock_failures() { #[tokio::test] async fn enqueue_signed_workflow_rejects_transport_profile_targets_without_radrootsd_execution() { let sdk = crate::RadrootsClient::builder().build().await.expect("sdk"); - let actor = - RadrootsActorContext::test(farmer_pubkey(), [RadrootsActorRole::Farmer]).expect("actor"); + let actor = RadrootsActorContext::test(farmer_pubkey(), [AuthorRole::Farmer]).expect("actor"); let draft = frozen_draft_for(farmer_pubkey()); let request = SdkWorkflowEnqueueRequest { operation_kind: "workflow.test.v1", diff --git a/crates/trade_bindings/Cargo.toml b/crates/trade_bindings/Cargo.toml @@ -8,8 +8,3 @@ license.workspace = true repository.workspace = true homepage.workspace = true publish = false - -[dependencies] -dto_bindgen = { workspace = true } -dto_bindgen_core = { workspace = true } -radroots_trade = { workspace = true, features = ["dto-bindgen"] } diff --git a/crates/trade_bindings/src/dto.rs b/crates/trade_bindings/src/dto.rs @@ -1,357 +0,0 @@ -use dto_bindgen_core::{ - BackendId, DescribeCtx, Dto, EnumDef, EnumRepr, FieldDef, IdentName, RootDescriptor, - RustTypeId, SourceSpan, TargetFieldNames, TargetOverride, TypeDef, TypeRef, VariantDef, - VariantShape, WireFieldNames, -}; -use radroots_trade::operational_listing::model::RadrootsOperationalListingTotal; - -pub fn dto_roots() -> Vec<RootDescriptor> { - let mut roots = radroots_trade::dto::dto_roots() - .into_iter() - .collect::<Vec<_>>(); - roots.extend([ - RootDescriptor::new::<RadrootsTradeFacetCount>(), - RootDescriptor::new::<RadrootsTradeListingBackofficeOverlay>(), - RootDescriptor::new::<RadrootsTradeListingBackofficeQuery>(), - RootDescriptor::new::<RadrootsTradeListingBackofficeView>(), - RootDescriptor::new::<RadrootsTradeListingBinProjection>(), - RootDescriptor::new::<RadrootsTradeListingFacets>(), - RootDescriptor::new::<RadrootsTradeListingMarketStatus>(), - RootDescriptor::new::<RadrootsTradeListingProjection>(), - RootDescriptor::new::<RadrootsTradeListingQuery>(), - RootDescriptor::new::<RadrootsTradeListingSort>(), - RootDescriptor::new::<RadrootsTradeListingSortField>(), - RootDescriptor::new::<RadrootsTradeMarketplaceListingSummary>(), - RootDescriptor::new::<RadrootsTradeModerationFlag>(), - RootDescriptor::new::<RadrootsTradeModerationSeverity>(), - RootDescriptor::new::<RadrootsTradeModerationStatus>(), - RootDescriptor::new::<RadrootsTradeReviewPriority>(), - RootDescriptor::new::<RadrootsTradeReviewQueueEntry>(), - RootDescriptor::new::<RadrootsTradeReviewStatus>(), - RootDescriptor::new::<RadrootsTradeSortDirection>(), - ]); - roots -} - -macro_rules! imported_ts_type { - ($ty:ident, $target:literal) => { - pub struct $ty; - - impl Dto for $ty { - fn describe(_ctx: &mut DescribeCtx) -> TypeRef { - TypeRef::Override(TargetOverride::new(BackendId::TypeScript, $target)) - } - } - }; -} - -imported_ts_type!(DecimalImport, "Decimal"); -imported_ts_type!(DiscountImport, "Discount"); -imported_ts_type!(MoneyImport, "Money"); -imported_ts_type!(QuantityImport, "Quantity"); -imported_ts_type!(QuantityPriceImport, "QuantityPrice"); -imported_ts_type!(UnitImport, "Unit"); -imported_ts_type!(RadrootsFarmRefImport, "RadrootsFarmRef"); -imported_ts_type!( - RadrootsOperationalListingAvailabilityImport, - "RadrootsOperationalListingAvailability" -); -imported_ts_type!( - RadrootsOperationalListingBinImport, - "RadrootsOperationalListingBin" -); -imported_ts_type!( - RadrootsOperationalListingDeliveryMethodImport, - "RadrootsOperationalListingDeliveryMethod" -); -imported_ts_type!( - RadrootsOperationalListingImageImport, - "RadrootsOperationalListingImage" -); -imported_ts_type!( - RadrootsOperationalListingPublicLocationImport, - "RadrootsOperationalListingPublicLocation" -); -imported_ts_type!( - RadrootsOperationalListingProductImport, - "RadrootsOperationalListingProduct" -); -imported_ts_type!(RadrootsPlotRefImport, "RadrootsPlotRef"); -imported_ts_type!(RadrootsResourceAreaRefImport, "RadrootsResourceAreaRef"); - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeFacetCount { - pub key: String, - pub count: u32, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingBackofficeOverlay { - pub listing_addr: String, - pub review_queue: Option<RadrootsTradeReviewQueueEntry>, - pub moderation_flags: Vec<RadrootsTradeModerationFlag>, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingBackofficeQuery { - pub listing: RadrootsTradeListingQuery, - pub requires_review: Option<bool>, - pub has_open_moderation_flags: Option<bool>, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingBackofficeView { - pub listing: RadrootsTradeListingProjection, - pub marketplace: Option<RadrootsTradeMarketplaceListingSummary>, - pub overlay: Option<RadrootsTradeListingBackofficeOverlay>, - pub requires_review: bool, - pub open_moderation_flag_count: u32, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingBinProjection { - pub bin: RadrootsOperationalListingBinImport, - pub one_bin_total: RadrootsOperationalListingTotal, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingFacets { - pub seller_pubkeys: Vec<RadrootsTradeFacetCount>, - pub farm_pubkeys: Vec<RadrootsTradeFacetCount>, - pub farm_ids: Vec<RadrootsTradeFacetCount>, - pub product_keys: Vec<RadrootsTradeFacetCount>, - pub product_categories: Vec<RadrootsTradeFacetCount>, - pub listing_statuses: Vec<RadrootsTradeFacetCount>, -} - -pub enum RadrootsTradeListingMarketStatus { - Unknown, - Window, - Active, - Sold, - Other { value: String }, -} - -impl Dto for RadrootsTradeListingMarketStatus { - fn describe(ctx: &mut DescribeCtx) -> TypeRef { - let def = EnumDef::new( - "RadrootsTradeListingMarketStatus", - "RadrootsTradeListingMarketStatus", - EnumRepr::External, - span("crates/trade_bindings/src/dto.rs", 140), - ) - .with_variant(unit_variant( - "Unknown", - "unknown", - "crates/trade_bindings/src/dto.rs", - 141, - )) - .with_variant(unit_variant( - "Window", - "window", - "crates/trade_bindings/src/dto.rs", - 142, - )) - .with_variant(unit_variant( - "Active", - "active", - "crates/trade_bindings/src/dto.rs", - 143, - )) - .with_variant(unit_variant( - "Sold", - "sold", - "crates/trade_bindings/src/dto.rs", - 144, - )) - .with_variant(VariantDef::new( - "Other", - "other", - VariantShape::Struct(vec![field( - "value", - "value", - String::describe(ctx), - "crates/trade_bindings/src/dto.rs", - 145, - )]), - span("crates/trade_bindings/src/dto.rs", 145), - )); - register(ctx, "RadrootsTradeListingMarketStatus", TypeDef::Enum(def)) - } -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingProjection { - pub listing_addr: String, - pub seller_pubkey: String, - pub listing_id: String, - pub farm: RadrootsFarmRefImport, - pub product: RadrootsOperationalListingProductImport, - pub primary_bin_id: String, - pub bins: Vec<RadrootsTradeListingBinProjection>, - pub resource_area: Option<RadrootsResourceAreaRefImport>, - pub plot: Option<RadrootsPlotRefImport>, - pub discounts: Option<Vec<DiscountImport>>, - pub inventory_available: Option<DecimalImport>, - pub availability: Option<RadrootsOperationalListingAvailabilityImport>, - pub delivery_method: Option<RadrootsOperationalListingDeliveryMethodImport>, - pub location: Option<RadrootsOperationalListingPublicLocationImport>, - pub images: Option<Vec<RadrootsOperationalListingImageImport>>, - pub trade_count: u32, - pub open_trade_count: u32, - pub terminal_trade_count: u32, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingQuery { - pub seller_pubkey: Option<String>, - pub farm_pubkey: Option<String>, - pub farm_id: Option<String>, - pub product_key: Option<String>, - pub product_category: Option<String>, - pub listing_status: Option<RadrootsTradeListingMarketStatus>, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeListingSort { - pub field: RadrootsTradeListingSortField, - pub direction: RadrootsTradeSortDirection, -} - -#[derive(dto_bindgen::Dto)] -pub enum RadrootsTradeListingSortField { - #[serde(rename = "listing_addr")] - ListingAddr, - #[serde(rename = "product_title")] - ProductTitle, - #[serde(rename = "product_category")] - ProductCategory, - #[serde(rename = "seller_pubkey")] - SellerPubkey, - #[serde(rename = "inventory_available")] - InventoryAvailable, - #[serde(rename = "open_trade_count")] - OpenTradeCount, - #[serde(rename = "total_trade_count")] - TotalTradeCount, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeMarketplaceListingSummary { - pub listing_addr: String, - pub seller_pubkey: String, - pub farm_pubkey: String, - pub farm_id: String, - pub product_key: String, - pub product_title: String, - pub product_category: String, - pub product_summary: Option<String>, - pub listing_status: RadrootsTradeListingMarketStatus, - pub location_primary: Option<String>, - pub inventory_available: Option<DecimalImport>, - pub primary_bin_id: String, - pub primary_bin_label: Option<String>, - pub primary_bin_total: RadrootsOperationalListingTotal, - pub trade_count: u32, - pub open_trade_count: u32, - pub terminal_trade_count: u32, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeModerationFlag { - pub code: String, - pub severity: RadrootsTradeModerationSeverity, - pub status: RadrootsTradeModerationStatus, - pub source: Option<String>, - pub reason: Option<String>, -} - -#[derive(dto_bindgen::Dto)] -pub enum RadrootsTradeModerationSeverity { - #[serde(rename = "notice")] - Notice, - #[serde(rename = "warning")] - Warning, - #[serde(rename = "block")] - Block, -} - -#[derive(dto_bindgen::Dto)] -pub enum RadrootsTradeModerationStatus { - #[serde(rename = "open")] - Open, - #[serde(rename = "snoozed")] - Snoozed, - #[serde(rename = "resolved")] - Resolved, -} - -#[derive(dto_bindgen::Dto)] -pub enum RadrootsTradeReviewPriority { - #[serde(rename = "low")] - Low, - #[serde(rename = "normal")] - Normal, - #[serde(rename = "high")] - High, - #[serde(rename = "critical")] - Critical, -} - -#[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeReviewQueueEntry { - pub queue: String, - pub priority: RadrootsTradeReviewPriority, - pub status: RadrootsTradeReviewStatus, - pub assigned_operator: Option<String>, - pub reason: Option<String>, -} - -#[derive(dto_bindgen::Dto)] -pub enum RadrootsTradeReviewStatus { - #[serde(rename = "queued")] - Queued, - #[serde(rename = "in_progress")] - InProgress, - #[serde(rename = "blocked")] - Blocked, - #[serde(rename = "resolved")] - Resolved, -} - -#[derive(dto_bindgen::Dto)] -pub enum RadrootsTradeSortDirection { - #[serde(rename = "asc")] - Asc, - #[serde(rename = "desc")] - Desc, -} - -fn register(ctx: &mut DescribeCtx, rust_ident: &str, type_def: TypeDef) -> TypeRef { - ctx.register_type( - RustTypeId::new( - "radroots_trade_bindings", - "radroots_trade_bindings", - rust_ident, - ), - type_def, - ) -} - -fn unit_variant(rust_name: &str, wire_name: &str, file: &str, line: u32) -> VariantDef { - VariantDef::new(rust_name, wire_name, VariantShape::Unit, span(file, line)) -} - -fn field(rust_name: &str, wire_name: &str, ty: TypeRef, file: &str, line: u32) -> FieldDef { - FieldDef::new( - IdentName::new(rust_name), - WireFieldNames::same(wire_name), - TargetFieldNames::new(wire_name, rust_name), - ty, - span(file, line), - ) -} - -fn span(file: &str, line: u32) -> SourceSpan { - SourceSpan::new(file, line, 1) -} diff --git a/crates/trade_bindings/src/lib.rs b/crates/trade_bindings/src/lib.rs @@ -1,8 +1,9 @@ -pub use radroots_trade as upstream; - -pub mod dto; - -pub use dto::dto_roots; +//! Private inventory for the quarantined predecessor trade bindings. +//! +//! The authenticated TypeScript snapshot remains owned by the SDK generator +//! until Steps 261-268 replace it from protocol and codec contracts. This +//! crate intentionally does not activate code generation in a public runtime +//! crate. #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum TradeTypeDisposition { @@ -123,20 +124,7 @@ const fn json_number_safe_count( #[cfg(test)] mod tests { - use super::{ - TRADE_LARGE_INTEGER_POLICIES, TRADE_TYPE_INVENTORY, TradeTypeDisposition, dto_roots, - }; - - #[test] - fn trade_dto_roots_build_registry() { - let registry = dto_bindgen_core::build_registry(dto_roots()); - - assert!( - !registry.has_errors(), - "trade binding registry has diagnostics: {:?}", - registry.diagnostics - ); - } + use super::{TRADE_LARGE_INTEGER_POLICIES, TRADE_TYPE_INVENTORY, TradeTypeDisposition}; #[test] fn trade_type_inventory_is_deterministic() { diff --git a/tools/sdk_xtask_import/Cargo.toml b/tools/sdk_xtask_import/Cargo.toml @@ -17,17 +17,16 @@ path = "src/main.rs" dto_bindgen_backend_ts = { workspace = true } dto_bindgen_core = { workspace = true } radroots_core_bindings = { path = "../../crates/core_bindings", version = "=0.1.0-alpha" } -radroots_event = { workspace = true, features = ["dto-bindgen"] } radroots_event_bindings = { path = "../../crates/event_bindings", version = "=0.1.0-alpha" } radroots_event_index = { workspace = true, features = ["dto-bindgen"] } radroots_identity = { workspace = true } radroots_identity_bindings = { path = "../../crates/identity_bindings", version = "=0.1.0-alpha" } radroots_replica_schema_bindings = { path = "../../crates/replica_schema_bindings", version = "=0.1.0-alpha" } radroots_runtime_contract_v1 = { path = "../../crates/runtime_contract_v1", version = "=0.1.0-alpha" } -radroots_trade_bindings = { path = "../../crates/trade_bindings", version = "=0.1.0-alpha" } flate2 = "1" serde_json = "1" serde = { workspace = true, features = ["derive"] } +sha2 = { workspace = true } syn = { version = "2", features = ["full", "visit"] } tar = "0.4" tempfile = { workspace = true } diff --git a/tools/sdk_xtask_import/src/dto_roots.rs b/tools/sdk_xtask_import/src/dto_roots.rs @@ -55,17 +55,9 @@ pub const DTO_PACKAGE_ROOTS: &[DtoPackageRootSet] = &[ roots: core_roots, }, DtoPackageRootSet { - package_key: "event", - roots: event_roots, - }, - DtoPackageRootSet { package_key: "event_index", roots: event_index_roots, }, - DtoPackageRootSet { - package_key: "trade", - roots: trade_roots, - }, ]; pub const MANUAL_DESCRIPTOR_FAMILIES: &[ManualDescriptorFamily] = &[ @@ -164,23 +156,8 @@ const TRADE_EXTERNAL_OVERRIDES: &[DtoExternalOverride] = &[ const TRADE_REQUIRED_EXTERNAL_PACKAGE_IMPORTS: &[&str] = &[CORE_BINDINGS_PACKAGE_NAME, EVENT_BINDINGS_PACKAGE_NAME]; -const RETIRED_ORDER_EVENT_DTO_ROOTS: &[&str] = &[ - "RadrootsOrderCancellation", - "RadrootsOrderDecision", - "RadrootsOrderDecisionOutcome", - "RadrootsOrderEconomicActor", - "RadrootsOrderEconomicEffect", - "RadrootsOrderEconomicItem", - "RadrootsOrderEconomicLine", - "RadrootsOrderEconomicLineKind", - "RadrootsOrderEconomicTotals", - "RadrootsOrderEconomics", - "RadrootsOrderEventType", - "RadrootsOrderInventoryCommitment", - "RadrootsOrderItem", - "RadrootsOrderPricingBasis", - "RadrootsOrderRequest", -]; +const EVENT_BINDINGS_TYPES_TS: &str = + include_str!("../../../packages/event-bindings/src/generated/types.ts"); pub fn package_root_set(package_key: &str) -> Option<&'static DtoPackageRootSet> { DTO_PACKAGE_ROOTS @@ -201,15 +178,6 @@ pub fn core_types_module() -> Result<DtoTypesModule, String> { )) } -pub fn event_types_module() -> Result<DtoTypesModule, String> { - let root_set = package_root_set("event").ok_or_else(|| "missing event DTO roots".to_owned())?; - let registry = root_set.registry(); - let options = core_import_options(DtoRegistryRenderOptions::default())?; - let rendered = render_registry_types(&registry, &options)?; - let rendered = with_additional_type_imports(rendered, CORE_BINDINGS_PACKAGE_NAME, ["Discount"]); - Ok(with_event_sdk_wrappers(rendered)) -} - pub fn event_index_types_module() -> Result<DtoTypesModule, String> { let root_set = package_root_set("event_index") .ok_or_else(|| "missing event-index DTO roots".to_owned())?; @@ -225,43 +193,14 @@ pub fn replica_schema_types_module() -> Result<DtoTypesModule, String> { ) } -pub fn trade_types_module() -> Result<DtoTypesModule, String> { - let root_set = package_root_set("trade").ok_or_else(|| "missing trade DTO roots".to_owned())?; - let registry = root_set.registry(); - let options = trade_import_options(&registry, DtoRegistryRenderOptions::default())?; - let rendered = render_registry_types(&registry, &options)?; - validate_external_override_usage(&rendered, TRADE_EXTERNAL_OVERRIDES)?; - Ok(rendered) -} - fn core_roots() -> Vec<RootDescriptor> { radroots_core_bindings::dto_roots() } -fn event_roots() -> Vec<RootDescriptor> { - radroots_event::dto::dto_roots() - .into_iter() - .filter(|root| !retired_order_event_dto_root(root)) - .collect() -} - fn event_index_roots() -> Vec<RootDescriptor> { radroots_event_index::dto::dto_roots().into_iter().collect() } -fn trade_roots() -> Vec<RootDescriptor> { - radroots_trade_bindings::dto_roots() -} - -fn retired_order_event_dto_root(root: &RootDescriptor) -> bool { - let type_name = root - .rust_type_name - .rsplit("::") - .next() - .unwrap_or(root.rust_type_name); - RETIRED_ORDER_EVENT_DTO_ROOTS.contains(&type_name) -} - fn core_import_options( mut options: DtoRegistryRenderOptions, ) -> Result<DtoRegistryRenderOptions, String> { @@ -313,7 +252,7 @@ fn generated_external_package_exports() -> Result<BTreeMap<&'static str, BTreeSe ), ( EVENT_BINDINGS_PACKAGE_KEY, - type_exports(event_types_module()?.body_ts()), + type_exports(EVENT_BINDINGS_TYPES_TS), ), ])) } @@ -569,11 +508,11 @@ mod tests { use super::{ CORE_BINDINGS_PACKAGE_KEY, CORE_BINDINGS_PACKAGE_NAME, DTO_PACKAGE_ROOTS, DtoExternalOverride, MANUAL_DESCRIPTOR_FAMILIES, SDK_LOCAL_WRAPPER_ALLOWANCES, - event_override, imported_type_inventory, package_root_set, trade_import_options, - type_exports, validate_external_override_target, validate_external_override_usage, + event_override, imported_type_inventory, package_root_set, type_exports, + validate_external_override_target, validate_external_override_usage, with_additional_type_imports, }; - use dto_bindgen_backend_ts::{DtoRegistryRenderOptions, DtoTypesModule}; + use dto_bindgen_backend_ts::DtoTypesModule; const CORE_BINDINGS_TYPES_TS: &str = include_str!("../../../packages/core-bindings/src/generated/types.ts"); @@ -781,9 +720,9 @@ mod tests { #[test] fn package_roots_are_explicit_not_discovered() { assert!(package_root_set("core").is_some()); - assert!(package_root_set("event").is_some()); assert!(package_root_set("event_index").is_some()); - assert!(package_root_set("trade").is_some()); + assert!(package_root_set("event").is_none()); + assert!(package_root_set("trade").is_none()); } #[test] @@ -806,14 +745,6 @@ mod tests { } #[test] - fn trade_external_override_targets_resolve_to_generated_exports() { - let registry = package_root_set("trade").expect("trade roots").registry(); - - trade_import_options(&registry, DtoRegistryRenderOptions::default()) - .expect("trade external overrides validate"); - } - - #[test] fn external_override_target_validation_rejects_missing_generated_export() { let package_exports = BTreeMap::from([( CORE_BINDINGS_PACKAGE_KEY, diff --git a/tools/sdk_xtask_import/src/output.rs b/tools/sdk_xtask_import/src/output.rs @@ -1,4 +1,5 @@ use dto_bindgen_backend_ts::{DtoTypesModule, TypeScriptImport, TypeScriptModule}; +use sha2::{Digest, Sha256}; use crate::{ dto_roots, @@ -24,24 +25,50 @@ pub struct GeneratedFile { pub enum TsSource { DtoRegistry(DtoTypesModule), Module(TypeScriptModule), + AuthenticatedSnapshot { contents: &'static str }, } impl TsSource { + fn authenticated_snapshot( + contents: &'static str, + sha256: &'static str, + replacement: &'static str, + ) -> Result<Self, String> { + let actual = format!("{:x}", Sha256::digest(contents.as_bytes())); + if actual != sha256 { + return Err(format!( + "authenticated predecessor snapshot drifted: expected {sha256}, found {actual}; replace it through {replacement} or explicitly review and update its digest" + )); + } + Ok(Self::AuthenticatedSnapshot { contents }) + } + fn render(&self) -> String { match self { Self::DtoRegistry(module) => module.body_ts().to_owned(), Self::Module(module) => module.render_source(), + Self::AuthenticatedSnapshot { contents, .. } => (*contents).to_owned(), } } fn imports(&self) -> Option<&str> { match self { Self::DtoRegistry(module) => module.imports_ts(), - Self::Module(_) => None, + Self::Module(_) | Self::AuthenticatedSnapshot { .. } => None, } } } +const EVENT_BINDINGS_TYPES_TS: &str = + include_str!("../../../packages/event-bindings/src/generated/types.ts"); +const EVENT_BINDINGS_TYPES_SHA256: &str = + "fe4496950852715c573ff2abc7df8edede7161de75d9c68c3f4d6836e67f829a"; +const TRADE_BINDINGS_TYPES_TS: &str = + include_str!("../../../packages/trade-bindings/src/generated/types.ts"); +const TRADE_BINDINGS_TYPES_SHA256: &str = + "49560c572206095bd7de5cfd377c234a7f136e4affc13d53516ae2c4b8998e87"; +const SNAPSHOT_REPLACEMENT: &str = "RCLD-RCRV1 Steps 261-268"; + impl PackageOutput { pub fn files(&self) -> Vec<GeneratedFile> { let mut files = Vec::new(); @@ -89,7 +116,11 @@ pub fn package_outputs() -> Result<Vec<PackageOutput>, String> { }, PackageOutput { spec: spec_by_key("event"), - types_ts: Some(TsSource::DtoRegistry(dto_roots::event_types_module()?)), + types_ts: Some(TsSource::authenticated_snapshot( + EVENT_BINDINGS_TYPES_TS, + EVENT_BINDINGS_TYPES_SHA256, + SNAPSHOT_REPLACEMENT, + )?), types_imports: Vec::new(), constants_ts: Some(TsSource::Module(radroots_event_bindings::constants_module())), kinds_ts: Some(TsSource::Module(radroots_event_bindings::kinds_module())), @@ -121,7 +152,11 @@ pub fn package_outputs() -> Result<Vec<PackageOutput>, String> { }, PackageOutput { spec: spec_by_key("trade"), - types_ts: Some(TsSource::DtoRegistry(dto_roots::trade_types_module()?)), + types_ts: Some(TsSource::authenticated_snapshot( + TRADE_BINDINGS_TYPES_TS, + TRADE_BINDINGS_TYPES_SHA256, + SNAPSHOT_REPLACEMENT, + )?), types_imports: Vec::new(), constants_ts: None, kinds_ts: None, @@ -138,6 +173,9 @@ fn spec_by_key(key: &str) -> PackageSpec { } fn render_ts(source: &TsSource, imports: Option<&str>) -> String { + if matches!(source, TsSource::AuthenticatedSnapshot { .. }) { + return source.render(); + } let body = source.render(); let imports = imports.unwrap_or(""); let mut rendered = format!("{}{}{}", generated_header(), imports, body.trim_start()); @@ -174,6 +212,17 @@ fn structured_imports_ts(imports: &[TypeScriptImport]) -> Option<String> { fn render_manifest(spec: PackageSpec) -> String { let mut value = package_manifest(spec); value["generated"] = serde_json::Value::Bool(true); + if matches!(spec.key, "event" | "trade") { + let (sha256, replacement) = match spec.key { + "event" => (EVENT_BINDINGS_TYPES_SHA256, SNAPSHOT_REPLACEMENT), + "trade" => (TRADE_BINDINGS_TYPES_SHA256, SNAPSHOT_REPLACEMENT), + _ => unreachable!(), + }; + value["types_source"] = + serde_json::Value::String("authenticated_predecessor_snapshot".to_owned()); + value["types_sha256"] = serde_json::Value::String(sha256.to_owned()); + value["types_replacement"] = serde_json::Value::String(replacement.to_owned()); + } format!( "{}\n", serde_json::to_string_pretty(&value).expect("manifest json serializes") @@ -225,6 +274,22 @@ mod tests { } #[test] + fn authenticated_snapshot_rejects_digest_drift() { + let error = match TsSource::authenticated_snapshot( + "drifted snapshot\n", + super::EVENT_BINDINGS_TYPES_SHA256, + super::SNAPSHOT_REPLACEMENT, + ) { + Ok(_) => panic!("digest drift must fail closed"), + Err(error) => error, + }; + + assert!(error.contains("authenticated predecessor snapshot drifted")); + assert!(error.contains(super::EVENT_BINDINGS_TYPES_SHA256)); + assert!(error.contains(super::SNAPSHOT_REPLACEMENT)); + } + + #[test] fn includes_core_and_schema_outputs() { let package_names = package_outputs() .expect("package outputs") @@ -292,14 +357,17 @@ mod tests { } #[test] - fn trade_output_uses_dto_registry_and_matches_checked_in_types() { + fn trade_output_uses_authenticated_snapshot_and_matches_checked_in_types() { let output = package_outputs() .expect("package outputs") .into_iter() .find(|output| output.spec.key == "trade") .expect("trade output"); - assert!(matches!(output.types_ts, Some(TsSource::DtoRegistry(_)))); + assert!(matches!( + output.types_ts, + Some(TsSource::AuthenticatedSnapshot { .. }) + )); assert!(output.types_imports.is_empty()); let types = output @@ -312,6 +380,34 @@ mod tests { } #[test] + fn event_output_uses_authenticated_snapshot_and_matches_checked_in_types() { + let output = package_outputs() + .expect("package outputs") + .into_iter() + .find(|output| output.spec.key == "event") + .expect("event output"); + + assert!(matches!( + output.types_ts, + Some(TsSource::AuthenticatedSnapshot { .. }) + )); + let types = output + .files() + .into_iter() + .find(|file| file.relative_path == "src/generated/types.ts") + .expect("types file"); + assert_eq!(types.contents, super::EVENT_BINDINGS_TYPES_TS); + + let manifest = output.provenance_file(); + assert!( + manifest + .contents + .contains("authenticated_predecessor_snapshot") + ); + assert!(manifest.contents.contains("RCLD-RCRV1 Steps 261-268")); + } + + #[test] fn replica_schema_output_uses_dto_registry_and_matches_checked_in_types() { let output = package_outputs() .expect("package outputs") diff --git a/tools/sdk_xtask_import/src/smoke.rs b/tools/sdk_xtask_import/src/smoke.rs @@ -120,7 +120,7 @@ fn is_exact_crates_version(version: &str) -> bool { } const CONSUMER_MAIN: &str = r#"use nostr::{EventBuilder, Keys, Kind, Tag, Timestamp}; -use radroots_event::RadrootsEventEnvelopeParts; +use radroots_event::envelope::RadrootsEventEnvelopeParts; use radroots_sdk::knowledge::prelude::*; const CREATED_AT: u32 = 1_800_000_000;