app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 7f6ee5116fe5dafa5d1f990fcf6bfeaa5e235734
parent c7473373f3f93fc8cd13a6b4563e33d989943512
Author: triesap <tyson@radroots.org>
Date:   Thu, 18 Jun 2026 12:56:45 -0700

app: align sdk local runtime dependency

- enable the SDK local-runtime feature
- move SDK protocol imports to public protocol modules
- refresh Cargo.lock for SDK runtime dependencies
- verify app metadata and package check

Diffstat:
MCargo.lock | 225+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MCargo.toml | 2+-
Mcrates/desktop/src/runtime.rs | 136+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Mcrates/sync/src/publish.rs | 4++--
4 files changed, 302 insertions(+), 65 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -481,6 +481,15 @@ dependencies = [ ] [[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] name = "atomic" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1360,6 +1369,21 @@ dependencies = [ ] [[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] name = "crc32fast" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1619,6 +1643,12 @@ dependencies = [ ] [[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] name = "downcast-rs" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1692,6 +1722,9 @@ name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] [[package]] name = "embed-resource" @@ -2177,6 +2210,17 @@ dependencies = [ ] [[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] name = "futures-io" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2778,6 +2822,8 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", ] @@ -2806,6 +2852,15 @@ dependencies = [ ] [[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -5190,6 +5245,7 @@ name = "radroots_authority" version = "0.1.0-alpha.2" dependencies = [ "radroots_events", + "radroots_nostr", ] [[package]] @@ -5202,6 +5258,18 @@ dependencies = [ ] [[package]] +name = "radroots_event_store" +version = "0.1.0-alpha.2" +dependencies = [ + "radroots_events", + "radroots_nostr", + "serde", + "serde_json", + "sqlx", + "thiserror 1.0.69", +] + +[[package]] name = "radroots_events" version = "0.1.0-alpha.2" dependencies = [ @@ -5266,6 +5334,8 @@ version = "0.1.0-alpha.2" dependencies = [ "nostr", "nostr-sdk", + "radroots_events", + "radroots_events_codec", "radroots_identity", "serde", "serde_json", @@ -5317,6 +5387,20 @@ dependencies = [ ] [[package]] +name = "radroots_outbox" +version = "0.1.0-alpha.2" +dependencies = [ + "hex", + "radroots_event_store", + "radroots_events", + "serde", + "serde_json", + "sha2", + "sqlx", + "thiserror 1.0.69", +] + +[[package]] name = "radroots_protected_store" version = "0.1.0-alpha.2" dependencies = [ @@ -5329,6 +5413,22 @@ dependencies = [ ] [[package]] +name = "radroots_relay_transport" +version = "0.1.0-alpha.2" +dependencies = [ + "futures", + "nostr", + "radroots_event_store", + "radroots_events", + "radroots_nostr", + "radroots_outbox", + "serde", + "serde_json", + "thiserror 1.0.69", + "url", +] + +[[package]] name = "radroots_runtime" version = "0.1.0-alpha.2" dependencies = [ @@ -5362,13 +5462,21 @@ dependencies = [ name = "radroots_sdk" version = "0.1.0" dependencies = [ + "hex", + "radroots_authority", + "radroots_event_store", "radroots_events", "radroots_events_codec", "radroots_identity", "radroots_nostr", + "radroots_outbox", + "radroots_relay_transport", "radroots_trade", "serde", "serde_json", + "sha2", + "sqlx", + "uuid", ] [[package]] @@ -5394,6 +5502,7 @@ dependencies = [ "hex", "radroots_authority", "radroots_core", + "radroots_event_store", "radroots_events", "radroots_events_codec", "serde", @@ -6488,6 +6597,110 @@ dependencies = [ ] [[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64 0.22.1", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener 5.4.1", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink 0.10.0", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "sha2", + "smallvec", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.117", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-sqlite", + "syn 2.0.117", + "tokio", + "url", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.18", + "tracing", + "url", +] + +[[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -7093,6 +7306,17 @@ dependencies = [ ] [[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] name = "tokio-tungstenite" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -7255,6 +7479,7 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", diff --git a/Cargo.toml b/Cargo.toml @@ -41,7 +41,7 @@ radroots_nostr_connect = { path = "../lib/crates/nostr_connect" } radroots_protected_store = { path = "../lib/crates/protected_store" } radroots_runtime_paths = { path = "../lib/crates/runtime_paths" } radroots_secret_vault = { path = "../lib/crates/secret_vault", default-features = false, features = ["std"] } -radroots_sdk = { path = "../sdk/crates/sdk", features = ["relay-client", "signing"] } +radroots_sdk = { path = "../sdk/crates/sdk", features = ["local-runtime"] } radroots_sql_core = { path = "../lib/crates/sql_core", features = ["native"] } radroots_trade = { path = "../lib/crates/trade", default-features = false, features = ["std", "serde", "serde_json"] } radroots_app_core = { path = "crates/runtime", version = "0.1.0" } diff --git a/crates/desktop/src/runtime.rs b/crates/desktop/src/runtime.rs @@ -95,13 +95,16 @@ use radroots_nostr::prelude::{ RadrootsNostrTimestamp, radroots_nostr_kind, radroots_nostr_parse_pubkey, }; use radroots_nostr_accounts::prelude::RadrootsNostrAccountsManager; -use radroots_sdk::farm::{RadrootsFarm, RadrootsFarmRef}; -use radroots_sdk::listing::{ +use radroots_sdk::protocol::events::{ + RadrootsNostrEvent as SdkRadrootsNostrEvent, RadrootsNostrEventPtr, +}; +use radroots_sdk::protocol::farm::{RadrootsFarm, RadrootsFarmRef}; +use radroots_sdk::protocol::listing::{ RadrootsListing, RadrootsListingAvailability, RadrootsListingBin, RadrootsListingDeliveryMethod, RadrootsListingLocation, RadrootsListingProduct, RadrootsListingStatus, }; -use radroots_sdk::order::{ +use radroots_sdk::protocol::order::{ RadrootsOrderCancellation, RadrootsOrderDecision, RadrootsOrderDecisionOutcome, RadrootsOrderEconomics, RadrootsOrderFulfillmentState, RadrootsOrderFulfillmentUpdate, RadrootsOrderInventoryCommitment, RadrootsOrderItem, RadrootsOrderReceipt, @@ -109,8 +112,8 @@ use radroots_sdk::order::{ RadrootsOrderRevisionProposal, }; use radroots_sdk::{ - RadrootsNostrEventPtr, RadrootsSdkClient, RadrootsSdkConfig, RelayConfig, SdkEnvironment, - SdkPublishReceipt, SdkTransportMode, SdkTransportReceipt, SignerConfig, + RadrootsSdkClient, RadrootsSdkConfig, RelayConfig, SdkEnvironment, SdkPublishReceipt, + SdkTransportMode, SdkTransportReceipt, SignerConfig, }; use radroots_sql_core::SqliteExecutor; use radroots_trade::listing::parse_public_listing_address; @@ -5341,7 +5344,8 @@ impl DesktopAppRuntimeState { if record.family != LocalRecordFamily::SignedEvent || record.event_kind != Some(i64::from( - radroots_sdk::order::RadrootsOrderEventType::OrderRequested.kind(), + radroots_sdk::protocol::order::RadrootsOrderEventType::OrderRequested + .kind(), )) || !signed_order_request_evidence_record_is_usable(&record) { @@ -5350,7 +5354,8 @@ impl DesktopAppRuntimeState { let Some(event) = signed_event_from_local_record(&record)? else { continue; }; - let Ok(envelope) = radroots_sdk::order::parse_order_request(&event) else { + let Ok(envelope) = radroots_sdk::protocol::order::parse_order_request(&event) + else { continue; }; insert_seller_order_request_evidence( @@ -5378,11 +5383,11 @@ impl DesktopAppRuntimeState { return Ok(()); }; let events = sqlite_store.load_local_interop_signed_events_by_kind(i64::from( - radroots_sdk::order::RadrootsOrderEventType::OrderRequested.kind(), + radroots_sdk::protocol::order::RadrootsOrderEventType::OrderRequested.kind(), ))?; for event in events { - let Ok(envelope) = radroots_sdk::order::parse_order_request(&event) else { + let Ok(envelope) = radroots_sdk::protocol::order::parse_order_request(&event) else { continue; }; insert_seller_order_request_evidence( @@ -5429,11 +5434,9 @@ impl DesktopAppRuntimeState { let author_pubkey = active_order_pubkey(event.author.as_str(), "author_pubkey")?; match event.kind { KIND_ORDER_DECISION => { - let envelope = - radroots_sdk::order::parse_order_decision(&event).map_err(|_| { - AppSqliteError::InvalidProjection { - reason: "order lifecycle evidence is invalid", - } + let envelope = radroots_sdk::protocol::order::parse_order_decision(&event) + .map_err(|_| AppSqliteError::InvalidProjection { + reason: "order lifecycle evidence is invalid", })?; let context = active_order_event_record_context(&event, envelope.message_type)?; buckets.decisions.push(RadrootsOrderDecisionRecord { @@ -5446,7 +5449,8 @@ impl DesktopAppRuntimeState { }); } KIND_ORDER_REVISION_PROPOSAL => { - let Ok(envelope) = radroots_sdk::order::parse_order_revision_proposal(&event) + let Ok(envelope) = + radroots_sdk::protocol::order::parse_order_revision_proposal(&event) else { return Err(AppSqliteError::InvalidProjection { reason: "order lifecycle evidence is invalid", @@ -5465,7 +5469,8 @@ impl DesktopAppRuntimeState { }); } KIND_ORDER_REVISION_DECISION => { - let Ok(envelope) = radroots_sdk::order::parse_order_revision_decision(&event) + let Ok(envelope) = + radroots_sdk::protocol::order::parse_order_revision_decision(&event) else { return Err(AppSqliteError::InvalidProjection { reason: "order lifecycle evidence is invalid", @@ -5484,7 +5489,9 @@ impl DesktopAppRuntimeState { }); } KIND_ORDER_CANCELLATION => { - let Ok(envelope) = radroots_sdk::order::parse_order_cancellation(&event) else { + let Ok(envelope) = + radroots_sdk::protocol::order::parse_order_cancellation(&event) + else { return Err(AppSqliteError::InvalidProjection { reason: "order lifecycle evidence is invalid", }); @@ -5500,7 +5507,9 @@ impl DesktopAppRuntimeState { }); } KIND_ORDER_FULFILLMENT_UPDATE => { - let Ok(envelope) = radroots_sdk::order::parse_fulfillment_update(&event) else { + let Ok(envelope) = + radroots_sdk::protocol::order::parse_fulfillment_update(&event) + else { return Err(AppSqliteError::InvalidProjection { reason: "order lifecycle evidence is invalid", }); @@ -5516,7 +5525,8 @@ impl DesktopAppRuntimeState { }); } KIND_ORDER_RECEIPT => { - let Ok(envelope) = radroots_sdk::order::parse_buyer_receipt(&event) else { + let Ok(envelope) = radroots_sdk::protocol::order::parse_buyer_receipt(&event) + else { return Err(AppSqliteError::InvalidProjection { reason: "order lifecycle evidence is invalid", }); @@ -5665,7 +5675,7 @@ impl DesktopAppRuntimeState { fn collect_order_lifecycle_signed_events( &self, - ) -> Result<Vec<radroots_sdk::RadrootsNostrEvent>, AppSqliteError> { + ) -> Result<Vec<SdkRadrootsNostrEvent>, AppSqliteError> { let mut events = Vec::new(); let mut seen_event_ids = BTreeSet::new(); let kinds = [ @@ -9345,7 +9355,7 @@ fn current_utc_timestamp() -> String { fn signed_event_from_local_record( record: &LocalEventRecord, -) -> Result<Option<radroots_sdk::RadrootsNostrEvent>, AppSqliteError> { +) -> Result<Option<SdkRadrootsNostrEvent>, AppSqliteError> { let Some(id) = record.event_id.as_deref().map(str::trim) else { return Ok(None); }; @@ -9369,7 +9379,7 @@ fn signed_event_from_local_record( reason: "signed local event kind must fit u32", })?; - Ok(Some(radroots_sdk::RadrootsNostrEvent { + Ok(Some(SdkRadrootsNostrEvent { id: id.to_owned(), author: author.to_owned(), created_at, @@ -9414,7 +9424,7 @@ fn event_tags_from_value( .collect() } -fn trade_chain_tag_value(event: &radroots_sdk::RadrootsNostrEvent, key: &str) -> Option<String> { +fn trade_chain_tag_value(event: &SdkRadrootsNostrEvent, key: &str) -> Option<String> { event.tags.iter().find_map(|tag| { if tag.first().map(String::as_str) == Some(key) { tag.get(1) @@ -9449,8 +9459,8 @@ fn active_order_pubkey( } fn active_order_event_record_context( - event: &radroots_sdk::RadrootsNostrEvent, - message_type: radroots_sdk::order::RadrootsOrderEventType, + event: &SdkRadrootsNostrEvent, + message_type: radroots_sdk::protocol::order::RadrootsOrderEventType, ) -> Result<(RadrootsPublicKey, RadrootsEventId, RadrootsEventId), AppSqliteError> { let context = order_event_context_from_tags(message_type, &event.tags).map_err(|_| { AppSqliteError::InvalidProjection { @@ -9534,7 +9544,7 @@ fn active_order_pending_revision_proposal( fn insert_seller_order_request_evidence( order_id: &OrderId, - event: &radroots_sdk::RadrootsNostrEvent, + event: &SdkRadrootsNostrEvent, payload: RadrootsOrderRequest, matched_requests: &mut BTreeMap<String, ResolvedAppSellerOrderRequest>, ) { @@ -9873,8 +9883,8 @@ mod tests { RadrootsNostrMemoryAccountStore, RadrootsNostrSecretVaultMemory, RadrootsSecretVault, account_secret_slot, }; - use radroots_sdk::RadrootsNostrEventPtr; - use radroots_sdk::order::{ + use radroots_sdk::protocol::events::RadrootsNostrEventPtr; + use radroots_sdk::protocol::order::{ RadrootsOrderCancellation, RadrootsOrderDecision, RadrootsOrderDecisionOutcome, RadrootsOrderEconomicItem, RadrootsOrderEconomics, RadrootsOrderFulfillmentState, RadrootsOrderFulfillmentUpdate, RadrootsOrderInventoryCommitment, RadrootsOrderItem, @@ -10673,14 +10683,16 @@ mod tests { let event = published_receipt_event(receipt); match receipt.event_kind { 3424 => { - let envelope = radroots_sdk::order::parse_order_revision_proposal(&event) - .expect("order revision proposal should parse"); + let envelope = + radroots_sdk::protocol::order::parse_order_revision_proposal(&event) + .expect("order revision proposal should parse"); assert_eq!(envelope.payload.reason, "harvest count updated"); assert_eq!(envelope.payload.items[0].bin_count, 3); } 3425 => { - let envelope = radroots_sdk::order::parse_order_revision_decision(&event) - .expect("order revision decision should parse"); + let envelope = + radroots_sdk::protocol::order::parse_order_revision_decision(&event) + .expect("order revision decision should parse"); assert_eq!(envelope.payload.revision_id, "revision-1"); assert_eq!( envelope.payload.decision, @@ -10688,12 +10700,12 @@ mod tests { ); } 3432 => { - let envelope = radroots_sdk::order::parse_order_cancellation(&event) + let envelope = radroots_sdk::protocol::order::parse_order_cancellation(&event) .expect("order cancellation should parse"); assert_eq!(envelope.payload.reason, "buyer cancelled order"); } 3433 => { - let envelope = radroots_sdk::order::parse_fulfillment_update(&event) + let envelope = radroots_sdk::protocol::order::parse_fulfillment_update(&event) .expect("fulfillment update should parse"); assert_eq!( envelope.payload.status, @@ -10701,7 +10713,7 @@ mod tests { ); } 3434 => { - let envelope = radroots_sdk::order::parse_buyer_receipt(&event) + let envelope = radroots_sdk::protocol::order::parse_buyer_receipt(&event) .expect("buyer receipt should parse"); assert!(envelope.payload.received); } @@ -15127,7 +15139,7 @@ mod tests { && record.event_pubkey.as_deref() == Some(seller_pubkey.as_str()) })); let decision_event = shared_seller_order_decision_event(&paths, seller_pubkey.as_str()); - let envelope = radroots_sdk::order::parse_order_decision(&decision_event) + let envelope = radroots_sdk::protocol::order::parse_order_decision(&decision_event) .expect("app seller order accept should parse as canonical order decision"); assert_eq!(envelope.payload.order_id, "seller-order-decision-1"); assert!(matches!( @@ -15170,7 +15182,7 @@ mod tests { && record.event_pubkey.as_deref() == Some(seller_pubkey.as_str()) })); let decision_event = shared_seller_order_decision_event(&paths, seller_pubkey.as_str()); - let envelope = radroots_sdk::order::parse_order_decision(&decision_event) + let envelope = radroots_sdk::protocol::order::parse_order_decision(&decision_event) .expect("app seller order decline should parse as canonical order decision"); let RadrootsOrderDecisionOutcome::Declined { reason } = envelope.payload.decision else { panic!("expected declined decision"); @@ -15254,8 +15266,9 @@ mod tests { shared_order_events_by_kind(&paths, 3433, seller_pubkey.as_str()); assert_eq!(fulfillment_events.len(), 1); let fulfillment_event = fulfillment_events.first().expect("fulfillment event"); - let envelope = radroots_sdk::order::parse_fulfillment_update(fulfillment_event) - .expect("fulfillment should parse"); + let envelope = + radroots_sdk::protocol::order::parse_fulfillment_update(fulfillment_event) + .expect("fulfillment should parse"); assert_eq!(envelope.payload.status, expected_status); let request_event_id = signed_order_request_event_id("seller-order-decision-1"); assert!(event_has_tag( @@ -15399,7 +15412,7 @@ mod tests { let delivered_event = fulfillment_events .iter() .find(|event| { - radroots_sdk::order::parse_fulfillment_update(event) + radroots_sdk::protocol::order::parse_fulfillment_update(event) .map(|envelope| { envelope.payload.status == RadrootsOrderFulfillmentState::Delivered }) @@ -15470,7 +15483,7 @@ mod tests { let delivered_event = fulfillment_events .iter() .find(|event| { - radroots_sdk::order::parse_fulfillment_update(event) + radroots_sdk::protocol::order::parse_fulfillment_update(event) .map(|envelope| { envelope.payload.status == RadrootsOrderFulfillmentState::Delivered }) @@ -16487,8 +16500,9 @@ mod tests { let cancellation_event = cancellation_events .first() .expect("linked buyer cancellation event"); - let cancellation = radroots_sdk::order::parse_order_cancellation(cancellation_event) - .expect("linked buyer cancellation should parse"); + let cancellation = + radroots_sdk::protocol::order::parse_order_cancellation(cancellation_event) + .expect("linked buyer cancellation should parse"); assert_eq!(cancellation.payload.order_id, fixture.trade_order_id); assert_eq!(cancellation.payload.buyer_pubkey, fixture.buyer_pubkey); assert_eq!(cancellation.payload.seller_pubkey, fixture.seller_pubkey); @@ -16925,7 +16939,7 @@ mod tests { shared_order_events_by_kind(&fixture.paths, 3434, fixture.buyer_pubkey.as_str()); assert_eq!(receipt_events.len(), 1); let receipt_event = receipt_events.first().expect("linked buyer receipt event"); - let receipt = radroots_sdk::order::parse_buyer_receipt(receipt_event) + let receipt = radroots_sdk::protocol::order::parse_buyer_receipt(receipt_event) .expect("linked buyer receipt should parse"); assert_eq!(receipt.payload.order_id, fixture.trade_order_id); assert_eq!(receipt.payload.buyer_pubkey, fixture.buyer_pubkey); @@ -16987,7 +17001,7 @@ mod tests { shared_order_events_by_kind(&fixture.paths, 3434, fixture.buyer_pubkey.as_str()); assert_eq!(receipt_events.len(), 1); let receipt_event = receipt_events.first().expect("linked buyer receipt event"); - let receipt = radroots_sdk::order::parse_buyer_receipt(receipt_event) + let receipt = radroots_sdk::protocol::order::parse_buyer_receipt(receipt_event) .expect("linked buyer delivered receipt should parse"); assert!(receipt.payload.received); assert!(event_has_tag( @@ -17037,7 +17051,7 @@ mod tests { let receipt_event = receipt_events .first() .expect("linked buyer issue receipt event"); - let receipt = radroots_sdk::order::parse_buyer_receipt(receipt_event) + let receipt = radroots_sdk::protocol::order::parse_buyer_receipt(receipt_event) .expect("linked buyer issue receipt should parse"); assert!(!receipt.payload.received); assert_eq!(receipt.payload.issue.as_deref(), Some("items need review")); @@ -17202,7 +17216,7 @@ mod tests { .first() .expect("linked buyer revision decision event"); let revision_decision = - radroots_sdk::order::parse_order_revision_decision(revision_decision_event) + radroots_sdk::protocol::order::parse_order_revision_decision(revision_decision_event) .expect("linked buyer revision decision should parse"); assert_eq!( revision_decision.payload.decision, @@ -20945,7 +20959,7 @@ mod tests { }], economics: signed_order_request_economics(trade_order_id, order_quantity), }; - let parts = radroots_sdk::order::build_order_request_draft( + let parts = radroots_sdk::protocol::order::build_order_request_draft( &RadrootsNostrEventPtr { id: test_event_id_seed(listing_event_id), relays: Some("wss://relay.example".to_owned()), @@ -21053,7 +21067,7 @@ mod tests { }, }; let request_event_id = test_event_id(request_event_id); - let parts = radroots_sdk::order::build_order_decision_draft( + let parts = radroots_sdk::protocol::order::build_order_decision_draft( &request_event_id, &request_event_id, &payload, @@ -21382,7 +21396,7 @@ mod tests { seller_pubkey: test_pubkey(seller_pubkey), status, }; - let parts = radroots_sdk::order::build_fulfillment_update_draft( + let parts = radroots_sdk::protocol::order::build_fulfillment_update_draft( &request_event_id, &prev_event_id, &payload, @@ -21423,7 +21437,7 @@ mod tests { seller_pubkey: test_pubkey(seller_pubkey), reason: "buyer cancelled order".to_owned(), }; - let parts = radroots_sdk::order::build_order_cancellation_draft( + let parts = radroots_sdk::protocol::order::build_order_cancellation_draft( &request_event_id, &prev_event_id, &payload, @@ -21467,7 +21481,7 @@ mod tests { issue: (!received).then(|| "items need review".to_owned()), received_at: 1_774_000_030, }; - let parts = radroots_sdk::order::build_buyer_receipt_draft( + let parts = radroots_sdk::protocol::order::build_buyer_receipt_draft( &request_event_id, &prev_event_id, &payload, @@ -21513,7 +21527,7 @@ mod tests { economics: revision_test_order_economics(), reason: "harvest count updated".to_owned(), }; - let parts = radroots_sdk::order::build_order_revision_proposal_draft( + let parts = radroots_sdk::protocol::order::build_order_revision_proposal_draft( &request_event_id, &prev_event_id, &payload, @@ -21559,7 +21573,7 @@ mod tests { prev_event_id: proposal_event_id.clone(), decision, }; - let parts = radroots_sdk::order::build_order_revision_decision_draft( + let parts = radroots_sdk::protocol::order::build_order_revision_decision_draft( &request_event_id, &proposal_event_id, &payload, @@ -21893,10 +21907,8 @@ mod tests { } } - fn published_receipt_event( - receipt: &AppPublishedOperationReceipt, - ) -> radroots_sdk::RadrootsNostrEvent { - radroots_sdk::RadrootsNostrEvent { + fn published_receipt_event(receipt: &AppPublishedOperationReceipt) -> SdkRadrootsNostrEvent { + SdkRadrootsNostrEvent { id: receipt.event_id.clone(), author: receipt.event_pubkey.clone(), created_at: receipt.event_created_at, @@ -21923,7 +21935,7 @@ mod tests { fn shared_seller_order_decision_event( paths: &AppDesktopRuntimePaths, seller_pubkey: &str, - ) -> radroots_sdk::RadrootsNostrEvent { + ) -> SdkRadrootsNostrEvent { let record = shared_local_event_records(paths) .into_iter() .find(|record| { @@ -21941,7 +21953,7 @@ mod tests { paths: &AppDesktopRuntimePaths, kind: i64, pubkey: &str, - ) -> Vec<radroots_sdk::RadrootsNostrEvent> { + ) -> Vec<SdkRadrootsNostrEvent> { shared_local_event_records(paths) .into_iter() .filter(|record| { @@ -21956,14 +21968,14 @@ mod tests { .collect() } - fn event_has_tag(event: &radroots_sdk::RadrootsNostrEvent, key: &str, value: &str) -> bool { + fn event_has_tag(event: &SdkRadrootsNostrEvent, key: &str, value: &str) -> bool { event.tags.iter().any(|tag| { tag.first().map(String::as_str) == Some(key) && tag.get(1).map(String::as_str) == Some(value) }) } - fn event_has_nonempty_value_tag(event: &radroots_sdk::RadrootsNostrEvent, key: &str) -> bool { + fn event_has_nonempty_value_tag(event: &SdkRadrootsNostrEvent, key: &str) -> bool { event.tags.iter().any(|tag| { tag.first().map(String::as_str) == Some(key) && tag.get(1).map(|value| !value.is_empty()).unwrap_or(false) diff --git a/crates/sync/src/publish.rs b/crates/sync/src/publish.rs @@ -2,7 +2,7 @@ use radroots_app_view::{ FarmId, FarmReadiness, FulfillmentWindowId, OrderId, ProductId, ProductStatus, }; use radroots_sdk::SdkTransportMode; -use radroots_sdk::order::{ +use radroots_sdk::protocol::order::{ RadrootsOrderEconomics, RadrootsOrderFulfillmentState, RadrootsOrderItem, RadrootsOrderRevisionOutcome, }; @@ -795,7 +795,7 @@ mod tests { PendingSyncOperation, PendingSyncOperationState, SyncAggregateRef, SyncOperationKind, }; use radroots_app_view::{FarmId, FarmReadiness, OrderId, ProductId, ProductStatus}; - use radroots_sdk::order::{ + use radroots_sdk::protocol::order::{ RadrootsOrderEconomics, RadrootsOrderFulfillmentState, RadrootsOrderItem, RadrootsOrderRevisionOutcome, };