commit a5518058061e5d4d7d04467df1fae4211f817dfe
parent 873a2daee1a1895ffa8e7c60bb3d9fd4b0dfb25a
Author: triesap <tyson@radroots.org>
Date: Mon, 15 Jun 2026 14:29:08 -0700
sdk: demote protocol facade
Move low-level facade, config, wire, direct relay, and radrootsd surfaces under sdk::protocol while keeping the SDK v1 product runtime at the crate root. Add a local runtime example and update tests/docs for the new public surface.
Diffstat:
11 files changed, 304 insertions(+), 83 deletions(-)
diff --git a/crates/sdk/README b/crates/sdk/README
@@ -1,18 +1,22 @@
# radroots_sdk
-Curated Rad Roots Rust SDK for the public marketplace event contract.
+Curated Rad Roots Rust SDK for local-first Rad Roots product workflows.
-This crate provides the recommended Rust entrypoint for building, parsing, and
-validating Rad Roots profile, farm, listing, and trade events. It is a thin
-facade over the underlying `rr-rs` substrate crates and does not duplicate the
-core event or trade implementations.
+The SDK v1 product runtime is centered on `RadrootsSdk::builder()`,
+`sdk.listings()`, `sdk.sync()`, and `sdk.orders()`. Product callers use the
+runtime clients to prepare listing publishes, enqueue signed local mutations,
+push the signed outbox through an explicit relay transport adapter, and read
+local order status projections.
-The deterministic event contract lives at the crate root:
+Low-level event-contract and transport helpers are intentionally scoped under
+`protocol`:
-- `profile`
-- `farm`
-- `listing`
-- `trade`
+- `protocol::profile`
+- `protocol::farm`
+- `protocol::listing`
+- `protocol::order`
+- `protocol::client`
+- `protocol::config`
Optional advanced substrate is explicitly feature-scoped:
diff --git a/crates/sdk/examples/runtime_local.rs b/crates/sdk/examples/runtime_local.rs
@@ -0,0 +1,158 @@
+use radroots_authority::{
+ RadrootsActorContext, RadrootsEventSigner, RadrootsSignerError, RadrootsSignerIdentity,
+};
+use radroots_core::{
+ RadrootsCoreCurrency, RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCoreQuantity,
+ RadrootsCoreQuantityPrice, RadrootsCoreUnit,
+};
+use radroots_events::contract::RadrootsActorRole;
+use radroots_events::draft::{
+ RadrootsFrozenEventDraft, RadrootsSignedNostrEvent, RadrootsSignedNostrEventParts,
+};
+use radroots_events::ids::{RadrootsDTag, RadrootsInventoryBinId};
+use radroots_relay_transport::RadrootsMockRelayPublishAdapter;
+use radroots_sdk::protocol::farm::RadrootsFarmRef;
+use radroots_sdk::protocol::listing::{
+ RadrootsListing, RadrootsListingBin, RadrootsListingProduct,
+};
+use radroots_sdk::{
+ ListingPublishRequest, OrderStatusRequest, PushOutboxRequest, RadrootsSdk, RadrootsSdkTimestamp,
+};
+
+const SELLER: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+const RELAY: &str = "wss://relay.example.com";
+
+#[derive(Clone)]
+struct FixtureSigner {
+ identity: RadrootsSignerIdentity,
+}
+
+impl FixtureSigner {
+ fn new(pubkey: &str) -> Self {
+ Self {
+ identity: RadrootsSignerIdentity::new(pubkey).expect("identity"),
+ }
+ }
+}
+
+impl RadrootsEventSigner for FixtureSigner {
+ fn pubkey(&self) -> &radroots_events::ids::RadrootsPublicKey {
+ self.identity.pubkey()
+ }
+
+ fn sign_frozen_draft(
+ &self,
+ draft: &RadrootsFrozenEventDraft,
+ ) -> Result<RadrootsSignedNostrEvent, RadrootsSignerError> {
+ let sig = "f".repeat(128);
+ let raw_json = serde_json::json!({
+ "id": draft.expected_event_id,
+ "pubkey": self.pubkey().as_str(),
+ "created_at": draft.created_at,
+ "kind": draft.kind,
+ "tags": draft.tags,
+ "content": draft.content,
+ "sig": sig,
+ })
+ .to_string();
+ RadrootsSignedNostrEvent::new(RadrootsSignedNostrEventParts {
+ id: draft.expected_event_id.clone(),
+ pubkey: self.pubkey().as_str().to_owned(),
+ created_at: draft.created_at,
+ kind: draft.kind,
+ tags: draft.tags.clone(),
+ content: draft.content.clone(),
+ sig,
+ raw_json,
+ })
+ .map_err(|error| RadrootsSignerError::SigningFailed {
+ message: error.to_string(),
+ })
+ }
+}
+
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error>> {
+ let sdk = RadrootsSdk::builder()
+ .fixed_clock(RadrootsSdkTimestamp::from_unix_seconds(1_700_000_000))
+ .relay_url(RELAY)
+ .build()
+ .await?;
+ let actor = RadrootsActorContext::test(SELLER, [RadrootsActorRole::Seller])?;
+ let request = ListingPublishRequest::new(sample_listing()).with_idempotency_key("example-1");
+
+ let prepared = sdk.listings().prepare_publish(&actor, request.clone())?;
+ let enqueue = sdk
+ .listings()
+ .enqueue_publish(&actor, &FixtureSigner::new(SELLER), request)
+ .await?;
+ let push = sdk
+ .sync()
+ .push_outbox(
+ &RadrootsMockRelayPublishAdapter::new(),
+ PushOutboxRequest::new().with_limit(1),
+ )
+ .await?;
+ let order_status = sdk
+ .orders()
+ .status(OrderStatusRequest::new("example-order-1"))
+ .await?;
+
+ assert_eq!(prepared.listing_address, enqueue.listing_address);
+ assert_eq!(push.attempted_events, 1);
+ assert!(!order_status.found);
+ Ok(())
+}
+
+fn sample_listing() -> RadrootsListing {
+ RadrootsListing {
+ d_tag: RadrootsDTag::parse("AAAAAAAAAAAAAAAAAAAAAQ").expect("d tag"),
+ published_at: None,
+ farm: RadrootsFarmRef {
+ pubkey: SELLER.to_owned(),
+ d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_owned(),
+ },
+ product: RadrootsListingProduct {
+ key: "coffee".to_owned(),
+ title: "Coffee".to_owned(),
+ category: "coffee".to_owned(),
+ summary: Some("Single origin coffee".to_owned()),
+ process: None,
+ lot: None,
+ location: None,
+ profile: None,
+ year: None,
+ },
+ primary_bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"),
+ bins: vec![RadrootsListingBin {
+ bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"),
+ quantity: RadrootsCoreQuantity::new(
+ RadrootsCoreDecimal::from(1000u32),
+ RadrootsCoreUnit::MassG,
+ ),
+ price_per_canonical_unit: RadrootsCoreQuantityPrice {
+ amount: RadrootsCoreMoney::new(
+ RadrootsCoreDecimal::from(20u32),
+ RadrootsCoreCurrency::USD,
+ ),
+ quantity: RadrootsCoreQuantity::new(
+ RadrootsCoreDecimal::from(1u32),
+ RadrootsCoreUnit::MassG,
+ ),
+ },
+ display_amount: None,
+ display_unit: None,
+ display_label: None,
+ display_price: None,
+ display_price_unit: None,
+ }],
+ resource_area: None,
+ plot: None,
+ discounts: None,
+ inventory_available: None,
+ availability: None,
+ delivery_method: None,
+ location: None,
+ images: None,
+ }
+}
diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs
@@ -9,29 +9,37 @@ use alloc::{string::String, vec::Vec};
#[cfg(feature = "std")]
use std::{string::String, vec::Vec};
+pub(crate) use radroots_events::{
+ RadrootsNostrEvent, RadrootsNostrEventPtr,
+ profile::{RadrootsProfile, RadrootsProfileType},
+};
+pub(crate) use radroots_events_codec::wire::WireEventParts;
+pub(crate) use radroots_trade::listing::validation::RadrootsTradeListing as TradeListingValidateResult;
+
#[cfg(any(
feature = "radrootsd-client",
feature = "signing",
feature = "relay-client",
feature = "signer-adapters"
))]
-pub mod adapters;
-pub mod client;
-pub mod config;
+mod adapters;
+mod client;
+mod config;
#[cfg(feature = "runtime")]
mod error;
-pub mod farm;
+mod farm;
#[cfg(feature = "identity-models")]
-pub mod identity;
-pub mod listing;
+mod identity;
+mod listing;
#[cfg(feature = "runtime")]
mod listings_runtime;
-pub mod order;
+mod order;
#[cfg(feature = "runtime")]
mod orders_runtime;
#[cfg(feature = "runtime")]
mod product_clients;
-pub mod profile;
+mod profile;
+pub mod protocol;
#[cfg(feature = "runtime")]
mod receipt;
#[cfg(feature = "runtime")]
@@ -39,36 +47,6 @@ mod runtime;
#[cfg(feature = "runtime")]
mod sync_runtime;
-#[cfg(feature = "radrootsd-client")]
-pub use crate::adapters::radrootsd::{
- SdkRadrootsdBridgeDeliveryPolicy, SdkRadrootsdBridgeJobStatus,
- SdkRadrootsdBridgeRelayPublishResult, SdkRadrootsdSignerAuthority,
- SdkRadrootsdSignerSessionConnectRequest, SdkRadrootsdSignerSessionMode,
- SdkRadrootsdSignerSessionRole,
-};
-pub use crate::client::{
- FarmClient, ListingClient, ProfileClient, RadrootsSdkClient, SdkPublishError,
- SdkPublishReceipt, SdkRadrootsdPublishReceipt, SdkRelayFailure, SdkRelayPublishReceipt,
- SdkResolvedTransportTarget, SdkTransportReceipt, TradeClient,
-};
-#[cfg(feature = "radrootsd-client")]
-pub use crate::client::{
- RadrootsdBridgeClient, RadrootsdClient, RadrootsdSignerSessionClient, SdkRadrootsdBridgeError,
- SdkRadrootsdBridgeJobRef, SdkRadrootsdBridgeJobView, SdkRadrootsdBridgeStatus,
- SdkRadrootsdFarmPublishOptions, SdkRadrootsdListingPublishOptions,
- SdkRadrootsdOrderRequestPublishOptions, SdkRadrootsdProfilePublishOptions,
- SdkRadrootsdSessionError, SdkRadrootsdSignerSessionAuthorizeResult,
- SdkRadrootsdSignerSessionCloseResult, SdkRadrootsdSignerSessionHandle,
- SdkRadrootsdSignerSessionPublicKeyResult, SdkRadrootsdSignerSessionRef,
- SdkRadrootsdSignerSessionRequireAuthResult, SdkRadrootsdSignerSessionView,
-};
-pub use crate::config::{
- NetworkConfig, RADROOTS_SDK_LOCAL_RADROOTSD_ENDPOINT, RADROOTS_SDK_LOCAL_RELAY_URL,
- RADROOTS_SDK_PRODUCTION_RADROOTSD_ENDPOINT, RADROOTS_SDK_PRODUCTION_RELAY_URL,
- RADROOTS_SDK_STAGING_RADROOTSD_ENDPOINT, RADROOTS_SDK_STAGING_RELAY_URL, RadrootsSdkConfig,
- RadrootsdAuth, RadrootsdConfig, RelayConfig, SdkConfigError, SdkEnvironment, SdkTransportMode,
- SignerConfig,
-};
#[cfg(feature = "runtime")]
pub use crate::error::{
RadrootsSdkError, RadrootsSdkPartialLocalMutationError, RadrootsSdkRecoveryAction,
@@ -97,17 +75,5 @@ pub use crate::sync_runtime::{
PUSH_OUTBOX_DEFAULT_LIMIT, PUSH_OUTBOX_MAX_LIMIT, PushOutboxEventReceipt, PushOutboxEventState,
PushOutboxReceipt, PushOutboxRelayOutcomeKind, PushOutboxRelayReceipt, PushOutboxRequest,
};
-pub use radroots_events::{
- RadrootsNostrEvent, RadrootsNostrEventPtr, RadrootsNostrEventRef,
- draft::{RadrootsFrozenEventDraft, RadrootsSignedNostrEvent},
- farm::RadrootsFarm,
- ids::{RadrootsIdParseError, RadrootsListingAddress},
- listing::RadrootsListing,
- profile::{RadrootsProfile, RadrootsProfileType},
-};
-#[cfg(feature = "serde_json")]
-pub use radroots_events_codec::order::RadrootsOrderEnvelopeParseError;
-pub use radroots_events_codec::wire::WireEventParts;
-pub use radroots_trade::listing::validation::RadrootsTradeListing as TradeListingValidateResult;
-pub type NostrTags = Vec<Vec<String>>;
+pub(crate) type NostrTags = Vec<Vec<String>>;
diff --git a/crates/sdk/src/protocol.rs b/crates/sdk/src/protocol.rs
@@ -0,0 +1,90 @@
+#![forbid(unsafe_code)]
+
+#[cfg(not(feature = "std"))]
+use alloc::{string::String, vec::Vec};
+#[cfg(feature = "std")]
+use std::{string::String, vec::Vec};
+
+#[cfg(any(
+ feature = "radrootsd-client",
+ feature = "signing",
+ feature = "relay-client",
+ feature = "signer-adapters"
+))]
+pub mod adapters {
+ pub use crate::adapters::*;
+}
+
+pub mod client {
+ pub use crate::client::*;
+}
+
+pub mod config {
+ pub use crate::config::*;
+}
+
+pub mod farm {
+ pub use crate::farm::*;
+}
+
+#[cfg(feature = "identity-models")]
+pub mod identity {
+ pub use crate::identity::*;
+}
+
+pub mod listing {
+ pub use crate::listing::*;
+}
+
+pub mod order {
+ pub use crate::order::*;
+}
+
+pub mod profile {
+ pub use crate::profile::*;
+}
+
+#[cfg(feature = "radrootsd-client")]
+pub use crate::adapters::radrootsd::{
+ SdkRadrootsdBridgeDeliveryPolicy, SdkRadrootsdBridgeJobStatus,
+ SdkRadrootsdBridgeRelayPublishResult, SdkRadrootsdSignerAuthority,
+ SdkRadrootsdSignerSessionConnectRequest, SdkRadrootsdSignerSessionMode,
+ SdkRadrootsdSignerSessionRole,
+};
+pub use crate::client::{
+ FarmClient, ListingClient, ProfileClient, RadrootsSdkClient, SdkPublishError,
+ SdkPublishReceipt, SdkRadrootsdPublishReceipt, SdkRelayFailure, SdkRelayPublishReceipt,
+ SdkResolvedTransportTarget, SdkTransportReceipt, TradeClient,
+};
+#[cfg(feature = "radrootsd-client")]
+pub use crate::client::{
+ RadrootsdBridgeClient, RadrootsdClient, RadrootsdSignerSessionClient, SdkRadrootsdBridgeError,
+ SdkRadrootsdBridgeJobRef, SdkRadrootsdBridgeJobView, SdkRadrootsdBridgeStatus,
+ SdkRadrootsdFarmPublishOptions, SdkRadrootsdListingPublishOptions,
+ SdkRadrootsdOrderRequestPublishOptions, SdkRadrootsdProfilePublishOptions,
+ SdkRadrootsdSessionError, SdkRadrootsdSignerSessionAuthorizeResult,
+ SdkRadrootsdSignerSessionCloseResult, SdkRadrootsdSignerSessionHandle,
+ SdkRadrootsdSignerSessionPublicKeyResult, SdkRadrootsdSignerSessionRef,
+ SdkRadrootsdSignerSessionRequireAuthResult, SdkRadrootsdSignerSessionView,
+};
+pub use crate::config::{
+ NetworkConfig, RADROOTS_SDK_LOCAL_RADROOTSD_ENDPOINT, RADROOTS_SDK_LOCAL_RELAY_URL,
+ RADROOTS_SDK_PRODUCTION_RADROOTSD_ENDPOINT, RADROOTS_SDK_PRODUCTION_RELAY_URL,
+ RADROOTS_SDK_STAGING_RADROOTSD_ENDPOINT, RADROOTS_SDK_STAGING_RELAY_URL, RadrootsSdkConfig,
+ RadrootsdAuth, RadrootsdConfig, RelayConfig, SdkConfigError, SdkEnvironment, SdkTransportMode,
+ SignerConfig,
+};
+pub use radroots_events::{
+ RadrootsNostrEvent, RadrootsNostrEventPtr, RadrootsNostrEventRef,
+ draft::{RadrootsFrozenEventDraft, RadrootsSignedNostrEvent},
+ farm::RadrootsFarm,
+ ids::{RadrootsIdParseError, RadrootsListingAddress},
+ listing::RadrootsListing,
+ profile::{RadrootsProfile, RadrootsProfileType},
+};
+#[cfg(feature = "serde_json")]
+pub use radroots_events_codec::order::RadrootsOrderEnvelopeParseError;
+pub use radroots_events_codec::wire::WireEventParts;
+pub use radroots_trade::listing::validation::RadrootsTradeListing as TradeListingValidateResult;
+
+pub type NostrTags = Vec<Vec<String>>;
diff --git a/crates/sdk/tests/client.rs b/crates/sdk/tests/client.rs
@@ -22,7 +22,7 @@ use radroots_events::order::{
RadrootsOrderRevisionDecision, RadrootsOrderRevisionOutcome, RadrootsOrderRevisionProposal,
};
use radroots_events::profile::{RadrootsProfile, RadrootsProfileType};
-use radroots_sdk::{
+use radroots_sdk::protocol::{
RADROOTS_SDK_PRODUCTION_RELAY_URL, RadrootsNostrEvent, RadrootsNostrEventPtr,
RadrootsSdkClient, RadrootsSdkConfig, RelayConfig, SdkConfigError, SdkEnvironment,
SdkPublishError, SdkRadrootsdPublishReceipt, SdkRelayFailure, SdkResolvedTransportTarget,
diff --git a/crates/sdk/tests/config.rs b/crates/sdk/tests/config.rs
@@ -1,4 +1,4 @@
-use radroots_sdk::{
+use radroots_sdk::protocol::{
NetworkConfig, RADROOTS_SDK_LOCAL_RADROOTSD_ENDPOINT, RADROOTS_SDK_LOCAL_RELAY_URL,
RADROOTS_SDK_PRODUCTION_RADROOTSD_ENDPOINT, RADROOTS_SDK_PRODUCTION_RELAY_URL,
RADROOTS_SDK_STAGING_RADROOTSD_ENDPOINT, RADROOTS_SDK_STAGING_RELAY_URL, RadrootsSdkConfig,
diff --git a/crates/sdk/tests/facade.rs b/crates/sdk/tests/facade.rs
@@ -15,7 +15,9 @@ use radroots_events::order::{
RadrootsOrderPricingBasis, RadrootsOrderRequest,
};
use radroots_events::profile::{RadrootsProfile, RadrootsProfileType};
-use radroots_sdk::{RadrootsNostrEvent, RadrootsNostrEventPtr, farm, listing, order, profile};
+use radroots_sdk::protocol::{
+ RadrootsNostrEvent, RadrootsNostrEventPtr, farm, listing, order, profile,
+};
fn sample_profile() -> RadrootsProfile {
RadrootsProfile {
diff --git a/crates/sdk/tests/orders_runtime.rs b/crates/sdk/tests/orders_runtime.rs
@@ -13,8 +13,9 @@ use radroots_nostr::prelude::{
RadrootsNostrKeys, RadrootsNostrSecretKey, RadrootsNostrTimestamp, radroots_event_from_nostr,
radroots_nostr_build_event,
};
-use radroots_sdk::WireEventParts;
-use radroots_sdk::order::{
+use radroots_sdk::protocol::RadrootsNostrEventPtr;
+use radroots_sdk::protocol::WireEventParts;
+use radroots_sdk::protocol::order::{
RadrootsListingAddress, RadrootsOrderDecision, RadrootsOrderDecisionOutcome,
RadrootsOrderEconomicItem, RadrootsOrderEconomicLine, RadrootsOrderEconomics,
RadrootsOrderInventoryCommitment, RadrootsOrderItem, RadrootsOrderPricingBasis,
@@ -22,8 +23,8 @@ use radroots_sdk::order::{
};
use radroots_sdk::{
ORDER_STATUS_DEFAULT_LIMIT, ORDER_STATUS_MAX_LIMIT, OrderPaymentStateKind,
- OrderSettlementStateKind, OrderStatusKind, OrderStatusRequest, RadrootsNostrEventPtr,
- RadrootsSdk, RadrootsSdkError, RadrootsSdkTimestamp,
+ OrderSettlementStateKind, OrderStatusKind, OrderStatusRequest, RadrootsSdk, RadrootsSdkError,
+ RadrootsSdkTimestamp,
};
const BUYER_SECRET_KEY_HEX: &str =
@@ -163,7 +164,7 @@ fn signed_event(
}
fn signed_order_request_event(raw_order_id: &str, created_at: u32) -> RadrootsNostrEvent {
- let draft = radroots_sdk::order::build_order_request_draft(
+ let draft = radroots_sdk::protocol::order::build_order_request_draft(
&listing_event_ptr(),
&order_request(raw_order_id),
)
@@ -176,7 +177,7 @@ fn signed_order_decision_event(
root_event_id: &RadrootsEventId,
created_at: u32,
) -> RadrootsNostrEvent {
- let draft = radroots_sdk::order::build_order_decision_draft(
+ let draft = radroots_sdk::protocol::order::build_order_decision_draft(
root_event_id,
root_event_id,
&order_decision(raw_order_id),
diff --git a/crates/sdk/tests/radrootsd.rs b/crates/sdk/tests/radrootsd.rs
@@ -9,21 +9,21 @@ use radroots_events::ids::RadrootsPublicKey;
use radroots_events::kinds::{
KIND_FARM, KIND_LISTING, KIND_LISTING_DRAFT, KIND_ORDER_REQUEST, KIND_PROFILE,
};
-use radroots_sdk::adapters::radrootsd::{
+use radroots_sdk::protocol::adapters::radrootsd::{
SdkRadrootsdBridgeJob, SdkRadrootsdBridgePublishResponse, SdkRadrootsdListingPublishRequest,
SdkRadrootsdSignerAuthority, SdkRadrootsdSignerSessionConnectRequest,
SdkRadrootsdSignerSessionMode,
};
-use radroots_sdk::listing::{
+use radroots_sdk::protocol::listing::{
RadrootsListing, RadrootsListingAvailability, RadrootsListingBin,
RadrootsListingDeliveryMethod, RadrootsListingLocation, RadrootsListingParseError,
RadrootsListingProduct, RadrootsListingStatus,
};
-use radroots_sdk::order::{
+use radroots_sdk::protocol::order::{
RadrootsOrderEconomicItem, RadrootsOrderEconomicLine, RadrootsOrderEconomics,
RadrootsOrderItem, RadrootsOrderPricingBasis, RadrootsOrderRequest,
};
-use radroots_sdk::{
+use radroots_sdk::protocol::{
RadrootsNostrEvent, RadrootsNostrEventPtr, RadrootsProfile, RadrootsProfileType,
RadrootsSdkClient, RadrootsSdkConfig, RadrootsdAuth, RadrootsdConfig, SdkConfigError,
SdkEnvironment, SdkPublishError, SdkRadrootsdBridgeDeliveryPolicy, SdkRadrootsdBridgeError,
@@ -479,7 +479,7 @@ fn listing_event_ptr_with_relays(relays: Option<&str>) -> RadrootsNostrEventPtr
fn sdk_event(
author: &str,
created_at: u32,
- draft: radroots_sdk::listing::RadrootsListingDraft,
+ draft: radroots_sdk::protocol::listing::RadrootsListingDraft,
) -> RadrootsNostrEvent {
let parts = draft.into_wire_parts();
RadrootsNostrEvent {
@@ -1939,7 +1939,7 @@ async fn radrootsd_bridge_status_rejects_relay_transport_mode() -> TestResult<()
#[test]
fn radrootsd_listing_request_from_event_rejects_listing_draft_kind() -> TestResult<()> {
- let draft = radroots_sdk::listing::build_draft(&sample_listing())?;
+ let draft = radroots_sdk::protocol::listing::build_draft(&sample_listing())?;
let mut event = sdk_event("seller", 1_720_000_000, draft);
event.kind = KIND_LISTING_DRAFT;
diff --git a/crates/sdk/tests/relay_direct.rs b/crates/sdk/tests/relay_direct.rs
@@ -11,22 +11,22 @@ use radroots_core::{
RadrootsCoreQuantityPrice, RadrootsCoreUnit,
};
use radroots_events::ids::{RadrootsEventId, RadrootsPublicKey};
-use radroots_sdk::farm::{RadrootsFarm, RadrootsFarmLocation, RadrootsFarmRef};
-use radroots_sdk::identity::RadrootsIdentity;
-use radroots_sdk::listing::{
+use radroots_sdk::protocol::farm::{RadrootsFarm, RadrootsFarmLocation, RadrootsFarmRef};
+use radroots_sdk::protocol::identity::RadrootsIdentity;
+use radroots_sdk::protocol::listing::{
RadrootsListing, RadrootsListingAvailability, RadrootsListingBin,
RadrootsListingDeliveryMethod, RadrootsListingLocation, RadrootsListingProduct,
RadrootsListingStatus,
};
-use radroots_sdk::order::{
+use radroots_sdk::protocol::order::{
RadrootsOrderCancellation, RadrootsOrderDecision, RadrootsOrderDecisionOutcome,
RadrootsOrderEconomicItem, RadrootsOrderEconomics, RadrootsOrderFulfillmentState,
RadrootsOrderFulfillmentUpdate, RadrootsOrderInventoryCommitment, RadrootsOrderItem,
RadrootsOrderPricingBasis, RadrootsOrderReceipt, RadrootsOrderRequest,
RadrootsOrderRevisionDecision, RadrootsOrderRevisionOutcome, RadrootsOrderRevisionProposal,
};
-use radroots_sdk::profile::{RadrootsProfile, RadrootsProfileType};
-use radroots_sdk::{
+use radroots_sdk::protocol::profile::{RadrootsProfile, RadrootsProfileType};
+use radroots_sdk::protocol::{
RadrootsNostrEventPtr, RadrootsSdkClient, RadrootsSdkConfig, RelayConfig, SdkEnvironment,
SdkPublishError, SdkTransportMode, SdkTransportReceipt, SignerConfig,
};
diff --git a/crates/sdk/tests/replica_ingest.rs b/crates/sdk/tests/replica_ingest.rs
@@ -1,7 +1,7 @@
use radroots_replica_db::ReplicaSql;
use radroots_replica_db_schema::farm::IFarmFindMany;
use radroots_replica_sync::{RadrootsReplicaIngestOutcome, radroots_replica_ingest_event};
-use radroots_sdk::{RadrootsFarm, RadrootsNostrEvent, farm};
+use radroots_sdk::protocol::{RadrootsFarm, RadrootsNostrEvent, farm};
use radroots_sql_core::{SqlExecutor, SqliteExecutor};
use tempfile::{TempDir, tempdir};