commit 3cae34b3248f448691e05585b2030133260f5591
parent 56efb90bc4b94143861ec543a9e85a4a656300df
Author: triesap <tyson@radroots.org>
Date: Fri, 26 Jun 2026 05:58:17 +0000
sdk: expose geonames runtime asset API
Diffstat:
15 files changed, 293 insertions(+), 179 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
@@ -1797,6 +1797,21 @@ dependencies = [
]
[[package]]
+name = "radroots_geocoder"
+version = "0.1.0-alpha.2"
+dependencies = [
+ "hex",
+ "radroots_runtime_paths",
+ "reqwest",
+ "rusqlite",
+ "serde",
+ "sha2",
+ "tempfile",
+ "thiserror 1.0.69",
+ "url",
+]
+
+[[package]]
name = "radroots_identity"
version = "0.1.0-alpha.2"
dependencies = [
@@ -2046,6 +2061,7 @@ dependencies = [
"radroots_event_store",
"radroots_events",
"radroots_events_codec",
+ "radroots_geocoder",
"radroots_identity",
"radroots_nostr",
"radroots_nostr_connect",
@@ -2056,6 +2072,7 @@ dependencies = [
"radroots_replica_db",
"radroots_replica_db_schema",
"radroots_replica_sync",
+ "radroots_runtime_paths",
"radroots_sql_core",
"radroots_trade",
"reqwest",
@@ -2250,7 +2267,9 @@ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
dependencies = [
"base64 0.22.1",
"bytes",
+ "futures-channel",
"futures-core",
+ "futures-util",
"http",
"http-body",
"http-body-util",
diff --git a/Cargo.toml b/Cargo.toml
@@ -34,6 +34,7 @@ radroots_event_store = { path = "../lib/crates/event_store", version = "0.1.0-al
radroots_events = { path = "../lib/crates/events", version = "0.1.0-alpha.2", default-features = false }
radroots_events_codec = { path = "../lib/crates/events_codec", version = "0.1.0-alpha.2", default-features = false }
radroots_events_indexed = { path = "../lib/crates/events_indexed", version = "0.1.0-alpha.2", default-features = false }
+radroots_geocoder = { path = "../lib/crates/geocoder", version = "0.1.0-alpha.2" }
radroots_identity = { path = "../lib/crates/identity", version = "0.1.0-alpha.2", default-features = false, features = [
"std",
] }
@@ -46,6 +47,7 @@ radroots_relay_transport = { path = "../lib/crates/relay_transport", version = "
radroots_replica_db = { path = "../lib/crates/replica_db", version = "0.1.0-alpha.2", default-features = false }
radroots_replica_db_schema = { path = "../lib/crates/replica_db_schema", version = "0.1.0-alpha.2", default-features = false }
radroots_replica_sync = { path = "../lib/crates/replica_sync", version = "0.1.0-alpha.2", default-features = false }
+radroots_runtime_paths = { path = "../lib/crates/runtime_paths", version = "0.1.0-alpha.2", default-features = false }
radroots_sdk_sql_wasm_runtime = { path = "crates/sql_wasm_runtime", version = "0.1.0-alpha.2" }
radroots_sql_core = { path = "../lib/crates/sql_core", version = "0.1.0-alpha.2", default-features = false }
radroots_trade = { path = "../lib/crates/trade", version = "0.1.0-alpha.2", default-features = false, features = [
diff --git a/crates/events_bindings/src/lib.rs b/crates/events_bindings/src/lib.rs
@@ -18,7 +18,7 @@ mod tests {
assert!(constants.contains(RADROOTS_LISTING_PRODUCT_TAG_KEYS[0]));
assert!(kinds_ts.contains("KIND_LISTING"));
assert!(kinds_ts.contains(&kinds::KIND_LISTING.to_string()));
- assert!(kinds_ts.contains("KIND_TRADE_LISTING_ORDER_REQ"));
- assert!(kinds_ts.contains(&kinds::KIND_TRADE_LISTING_ORDER_REQ.to_string()));
+ assert!(kinds_ts.contains("KIND_ORDER_REQUEST"));
+ assert!(kinds_ts.contains(&kinds::KIND_ORDER_REQUEST.to_string()));
}
}
diff --git a/crates/events_bindings/src/model.rs b/crates/events_bindings/src/model.rs
@@ -88,38 +88,32 @@ const EVENT_KIND_EXPORTS: &[(&str, u32)] = &[
("KIND_LISTING", kinds::KIND_LISTING),
("KIND_APPLICATION_HANDLER", kinds::KIND_APPLICATION_HANDLER),
(
- "KIND_TRADE_LISTING_VALIDATE_REQ",
- kinds::KIND_TRADE_LISTING_VALIDATE_REQ,
+ "KIND_TRADE_LISTING_VALIDATION_REQUEST",
+ kinds::KIND_TRADE_LISTING_VALIDATION_REQUEST,
),
(
- "KIND_TRADE_LISTING_VALIDATE_RES",
- kinds::KIND_TRADE_LISTING_VALIDATE_RES,
+ "KIND_TRADE_LISTING_VALIDATION_RESULT",
+ kinds::KIND_TRADE_LISTING_VALIDATION_RESULT,
),
(
- "KIND_WORKER_TRADE_TRANSITION_PROOF_REQ",
- kinds::KIND_WORKER_TRADE_TRANSITION_PROOF_REQ,
+ "KIND_TRADE_TRANSITION_PROOF_REQUEST",
+ kinds::KIND_TRADE_TRANSITION_PROOF_REQUEST,
),
(
- "KIND_WORKER_TRADE_TRANSITION_PROOF_RES",
- kinds::KIND_WORKER_TRADE_TRANSITION_PROOF_RES,
+ "KIND_TRADE_TRANSITION_PROOF_RESULT",
+ kinds::KIND_TRADE_TRANSITION_PROOF_RESULT,
),
- ("KIND_TRADE_ORDER_REQUEST", kinds::KIND_TRADE_ORDER_REQUEST),
+ ("KIND_ORDER_REQUEST", kinds::KIND_ORDER_REQUEST),
+ ("KIND_ORDER_DECISION", kinds::KIND_ORDER_DECISION),
(
- "KIND_TRADE_ORDER_RESPONSE",
- kinds::KIND_TRADE_ORDER_RESPONSE,
+ "KIND_ORDER_REVISION_PROPOSAL",
+ kinds::KIND_ORDER_REVISION_PROPOSAL,
),
(
- "KIND_TRADE_ORDER_DECISION",
- kinds::KIND_TRADE_ORDER_DECISION,
- ),
- (
- "KIND_TRADE_ORDER_REVISION",
- kinds::KIND_TRADE_ORDER_REVISION,
- ),
- (
- "KIND_TRADE_ORDER_REVISION_RESPONSE",
- kinds::KIND_TRADE_ORDER_REVISION_RESPONSE,
+ "KIND_ORDER_REVISION_DECISION",
+ kinds::KIND_ORDER_REVISION_DECISION,
),
+ ("KIND_ORDER_CANCELLATION", kinds::KIND_ORDER_CANCELLATION),
("KIND_TRADE_QUESTION", kinds::KIND_TRADE_QUESTION),
("KIND_TRADE_ANSWER", kinds::KIND_TRADE_ANSWER),
(
@@ -138,7 +132,6 @@ const EVENT_KIND_EXPORTS: &[(&str, u32)] = &[
"KIND_TRADE_FORBIDDEN_3431",
kinds::KIND_TRADE_FORBIDDEN_3431,
),
- ("KIND_TRADE_CANCEL", kinds::KIND_TRADE_CANCEL),
(
"KIND_TRADE_FULFILLMENT_UPDATE",
kinds::KIND_TRADE_FULFILLMENT_UPDATE,
@@ -148,54 +141,6 @@ const EVENT_KIND_EXPORTS: &[(&str, u32)] = &[
"KIND_TRADE_VALIDATION_RECEIPT",
kinds::KIND_TRADE_VALIDATION_RECEIPT,
),
- (
- "KIND_TRADE_LISTING_ORDER_REQ",
- kinds::KIND_TRADE_LISTING_ORDER_REQ,
- ),
- (
- "KIND_TRADE_LISTING_ORDER_RES",
- kinds::KIND_TRADE_LISTING_ORDER_RES,
- ),
- (
- "KIND_TRADE_LISTING_ORDER_REVISION_REQ",
- kinds::KIND_TRADE_LISTING_ORDER_REVISION_REQ,
- ),
- (
- "KIND_TRADE_LISTING_ORDER_REVISION_RES",
- kinds::KIND_TRADE_LISTING_ORDER_REVISION_RES,
- ),
- (
- "KIND_TRADE_LISTING_QUESTION_REQ",
- kinds::KIND_TRADE_LISTING_QUESTION_REQ,
- ),
- (
- "KIND_TRADE_LISTING_ANSWER_RES",
- kinds::KIND_TRADE_LISTING_ANSWER_RES,
- ),
- (
- "KIND_TRADE_LISTING_DISCOUNT_REQ",
- kinds::KIND_TRADE_LISTING_DISCOUNT_REQ,
- ),
- (
- "KIND_TRADE_LISTING_DISCOUNT_OFFER_RES",
- kinds::KIND_TRADE_LISTING_DISCOUNT_OFFER_RES,
- ),
- (
- "KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ",
- kinds::KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ,
- ),
- (
- "KIND_TRADE_LISTING_CANCEL_REQ",
- kinds::KIND_TRADE_LISTING_CANCEL_REQ,
- ),
- (
- "KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ",
- kinds::KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ,
- ),
- (
- "KIND_TRADE_LISTING_RECEIPT_REQ",
- kinds::KIND_TRADE_LISTING_RECEIPT_REQ,
- ),
("KIND_JOB_REQUEST_MIN", kinds::KIND_JOB_REQUEST_MIN),
("KIND_JOB_REQUEST_MAX", kinds::KIND_JOB_REQUEST_MAX),
("KIND_JOB_RESULT_MIN", kinds::KIND_JOB_RESULT_MIN),
diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml
@@ -58,8 +58,10 @@ runtime = [
"dep:hex",
"dep:radroots_authority",
"dep:radroots_event_store",
+ "dep:radroots_geocoder",
"dep:radroots_outbox",
"dep:radroots_relay_transport",
+ "dep:radroots_runtime_paths",
"dep:sha2",
"dep:sqlx",
"dep:uuid",
@@ -104,9 +106,11 @@ radroots_authority = { workspace = true, optional = true, default-features = fal
radroots_event_store = { workspace = true, optional = true, default-features = false }
radroots_events = { workspace = true, default-features = false }
radroots_events_codec = { workspace = true, default-features = false }
+radroots_geocoder = { workspace = true, optional = true }
radroots_outbox = { workspace = true, optional = true, default-features = false }
radroots_publish_proxy_protocol = { workspace = true, optional = true, default-features = false }
radroots_relay_transport = { workspace = true, optional = true, default-features = false }
+radroots_runtime_paths = { workspace = true, optional = true, default-features = false }
radroots_trade = { workspace = true, default-features = false }
radroots_identity = { workspace = true, optional = true, default-features = false }
radroots_nostr = { workspace = true, optional = true, default-features = false }
diff --git a/crates/sdk/src/geonames.rs b/crates/sdk/src/geonames.rs
@@ -0,0 +1,89 @@
+#![cfg(feature = "runtime")]
+
+use std::path::{Path, PathBuf};
+
+pub use radroots_geocoder::{
+ GEONAMES_1_0_ASSET, GEONAMES_ASSET_BYTE_SIZE, GEONAMES_ASSET_FILE_NAME, GEONAMES_ASSET_HOST,
+ GEONAMES_ASSET_SHA256, GEONAMES_ASSET_URL, GEONAMES_ASSET_VERSION, GeoNamesAssetFetcher,
+ GeoNamesAssetSpec, GeoNamesAssetState, GeoNamesAssetStatus, GeoNamesBlockingHttpFetcher,
+ Geocoder, GeocoderCountryListResult, GeocoderError, GeocoderPoint, GeocoderReverseOptions,
+ GeocoderReverseResult,
+};
+use radroots_geocoder::{
+ ensure_default_geonames_asset_in_cache_root, ensure_geonames_asset_in_cache_root_with_fetcher,
+ inspect_default_geonames_asset_in_cache_root, inspect_geonames_asset_path,
+};
+use radroots_runtime_paths::{
+ default_shared_geonames_database_path_from_cache_root,
+ default_shared_geonames_root_from_cache_root,
+};
+
+pub fn radroots_sdk_geonames_database_path_from_cache_root(
+ cache_root: impl AsRef<Path>,
+) -> PathBuf {
+ default_shared_geonames_database_path_from_cache_root(cache_root, GEONAMES_ASSET_VERSION)
+}
+
+pub fn radroots_sdk_geonames_database_path_from_cache_root_for_version(
+ cache_root: impl AsRef<Path>,
+ version: &str,
+) -> PathBuf {
+ default_shared_geonames_database_path_from_cache_root(cache_root, version)
+}
+
+pub fn radroots_sdk_geonames_root_from_cache_root(cache_root: impl AsRef<Path>) -> PathBuf {
+ default_shared_geonames_root_from_cache_root(cache_root)
+}
+
+pub fn radroots_sdk_inspect_geonames_database_in_cache_root(
+ cache_root: impl AsRef<Path>,
+) -> Result<GeoNamesAssetStatus, GeocoderError> {
+ inspect_default_geonames_asset_in_cache_root(cache_root)
+}
+
+pub fn radroots_sdk_inspect_geonames_database_path_with_spec(
+ path: impl AsRef<Path>,
+ spec: &GeoNamesAssetSpec,
+) -> Result<GeoNamesAssetStatus, GeocoderError> {
+ inspect_geonames_asset_path(path, spec)
+}
+
+pub fn radroots_sdk_ensure_geonames_database_in_cache_root(
+ cache_root: impl AsRef<Path>,
+) -> Result<GeoNamesAssetStatus, GeocoderError> {
+ ensure_default_geonames_asset_in_cache_root(cache_root)
+}
+
+pub fn radroots_sdk_ensure_geonames_database_in_cache_root_with_fetcher<F>(
+ cache_root: impl AsRef<Path>,
+ fetcher: &F,
+) -> Result<GeoNamesAssetStatus, GeocoderError>
+where
+ F: GeoNamesAssetFetcher,
+{
+ ensure_geonames_asset_in_cache_root_with_fetcher(cache_root, &GEONAMES_1_0_ASSET, fetcher)
+}
+
+pub fn radroots_sdk_ensure_geonames_database_in_cache_root_with_spec_and_fetcher<F>(
+ cache_root: impl AsRef<Path>,
+ spec: &GeoNamesAssetSpec,
+ fetcher: &F,
+) -> Result<GeoNamesAssetStatus, GeocoderError>
+where
+ F: GeoNamesAssetFetcher,
+{
+ ensure_geonames_asset_in_cache_root_with_fetcher(cache_root, spec, fetcher)
+}
+
+pub fn radroots_sdk_open_verified_geonames_database(
+ path: impl AsRef<Path>,
+) -> Result<Geocoder, GeocoderError> {
+ Geocoder::open_verified_geonames_asset(path, &GEONAMES_1_0_ASSET)
+}
+
+pub fn radroots_sdk_open_verified_geonames_database_with_spec(
+ path: impl AsRef<Path>,
+ spec: &GeoNamesAssetSpec,
+) -> Result<Geocoder, GeocoderError> {
+ Geocoder::open_verified_geonames_asset(path, spec)
+}
diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs
@@ -19,6 +19,8 @@ mod farm;
#[cfg(feature = "runtime")]
mod farms_runtime;
#[cfg(feature = "runtime")]
+mod geonames;
+#[cfg(feature = "runtime")]
mod idempotency;
#[cfg(feature = "identity-models")]
mod identity;
@@ -54,6 +56,23 @@ pub use crate::farms_runtime::{
FarmPreparePublishRequest, FarmPublishPlan,
};
#[cfg(feature = "runtime")]
+pub use crate::geonames::{
+ GEONAMES_1_0_ASSET, GEONAMES_ASSET_BYTE_SIZE, GEONAMES_ASSET_FILE_NAME, GEONAMES_ASSET_HOST,
+ GEONAMES_ASSET_SHA256, GEONAMES_ASSET_URL, GEONAMES_ASSET_VERSION, GeoNamesAssetFetcher,
+ GeoNamesAssetSpec, GeoNamesAssetState, GeoNamesAssetStatus, GeoNamesBlockingHttpFetcher,
+ Geocoder, GeocoderCountryListResult, GeocoderError, GeocoderPoint, GeocoderReverseOptions,
+ GeocoderReverseResult, radroots_sdk_ensure_geonames_database_in_cache_root,
+ radroots_sdk_ensure_geonames_database_in_cache_root_with_fetcher,
+ radroots_sdk_ensure_geonames_database_in_cache_root_with_spec_and_fetcher,
+ radroots_sdk_geonames_database_path_from_cache_root,
+ radroots_sdk_geonames_database_path_from_cache_root_for_version,
+ radroots_sdk_geonames_root_from_cache_root,
+ radroots_sdk_inspect_geonames_database_in_cache_root,
+ radroots_sdk_inspect_geonames_database_path_with_spec,
+ radroots_sdk_open_verified_geonames_database,
+ radroots_sdk_open_verified_geonames_database_with_spec,
+};
+#[cfg(feature = "runtime")]
pub use crate::idempotency::{SDK_IDEMPOTENCY_KEY_MAX_LEN, SdkIdempotencyKey};
#[cfg(feature = "runtime")]
pub use crate::listings_runtime::{
diff --git a/crates/sdk/tests/facade.rs b/crates/sdk/tests/facade.rs
@@ -10,7 +10,7 @@ use radroots_events::kinds::{
};
use radroots_events::listing::{
RadrootsListing, RadrootsListingAvailability, RadrootsListingBin,
- RadrootsListingDeliveryMethod, RadrootsListingLocation, RadrootsListingProduct,
+ RadrootsListingDeliveryMethod, RadrootsListingProduct, RadrootsListingPublicLocation,
RadrootsListingStatus,
};
use radroots_events::order::{
@@ -103,14 +103,12 @@ fn sample_listing() -> RadrootsListing {
status: RadrootsListingStatus::Active,
}),
delivery_method: Some(RadrootsListingDeliveryMethod::Pickup),
- location: Some(RadrootsListingLocation {
+ location: Some(RadrootsListingPublicLocation {
primary: "North Farm".into(),
city: None,
region: None,
country: None,
- lat: None,
- lng: None,
- geohash: None,
+ geohash: "9q8yy".into(),
}),
images: None,
}
diff --git a/crates/sdk/tests/geonames.rs b/crates/sdk/tests/geonames.rs
@@ -0,0 +1,48 @@
+#![cfg(feature = "runtime")]
+
+use radroots_sdk::{
+ GEONAMES_ASSET_HOST, GEONAMES_ASSET_VERSION, GeoNamesAssetState,
+ radroots_sdk_geonames_database_path_from_cache_root,
+ radroots_sdk_geonames_database_path_from_cache_root_for_version,
+ radroots_sdk_geonames_root_from_cache_root,
+ radroots_sdk_inspect_geonames_database_in_cache_root,
+};
+
+#[test]
+fn sdk_geonames_facade_resolves_shared_cache_paths_and_reports_missing_state() {
+ let tempdir = tempfile::tempdir().expect("tempdir");
+ let cache_root = tempdir.path().join("cache");
+
+ assert_eq!(GEONAMES_ASSET_HOST, "assets.radroots.io");
+ assert_eq!(GEONAMES_ASSET_VERSION, "1.0");
+ assert_eq!(
+ radroots_sdk_geonames_root_from_cache_root(&cache_root),
+ cache_root.join("shared").join("geonames")
+ );
+ assert_eq!(
+ radroots_sdk_geonames_database_path_from_cache_root(&cache_root),
+ cache_root
+ .join("shared")
+ .join("geonames")
+ .join("geonames-1.0.db")
+ );
+ assert_eq!(
+ radroots_sdk_geonames_database_path_from_cache_root_for_version(&cache_root, "1.1"),
+ cache_root
+ .join("shared")
+ .join("geonames")
+ .join("geonames-1.1.db")
+ );
+
+ let status =
+ radroots_sdk_inspect_geonames_database_in_cache_root(&cache_root).expect("inspection");
+ assert_eq!(status.state, GeoNamesAssetState::Missing);
+ assert_eq!(status.version, "1.0");
+ assert_eq!(
+ status.path,
+ cache_root
+ .join("shared")
+ .join("geonames")
+ .join("geonames-1.0.db")
+ );
+}
diff --git a/crates/trade_bindings/src/dto.rs b/crates/trade_bindings/src/dto.rs
@@ -74,7 +74,10 @@ imported_ts_type!(
"RadrootsListingDeliveryMethod"
);
imported_ts_type!(RadrootsListingImageImport, "RadrootsListingImage");
-imported_ts_type!(RadrootsListingLocationImport, "RadrootsListingLocation");
+imported_ts_type!(
+ RadrootsListingPublicLocationImport,
+ "RadrootsListingPublicLocation"
+);
imported_ts_type!(RadrootsListingProductImport, "RadrootsListingProduct");
imported_ts_type!(RadrootsNostrEventPtrImport, "RadrootsNostrEventPtr");
imported_ts_type!(RadrootsPlotRefImport, "RadrootsPlotRef");
@@ -207,7 +210,7 @@ pub struct RadrootsTradeListingProjection {
pub inventory_available: Option<RadrootsCoreDecimalImport>,
pub availability: Option<RadrootsListingAvailabilityImport>,
pub delivery_method: Option<RadrootsListingDeliveryMethodImport>,
- pub location: Option<RadrootsListingLocationImport>,
+ pub location: Option<RadrootsListingPublicLocationImport>,
pub images: Option<Vec<RadrootsListingImageImport>>,
pub order_count: u32,
pub open_order_count: u32,
diff --git a/crates/trade_bindings/src/lib.rs b/crates/trade_bindings/src/lib.rs
@@ -35,8 +35,8 @@ pub const TRADE_TYPE_INVENTORY: &[TradeTypeInventoryEntry] = &[
event_import("RadrootsListingAvailability"),
event_import("RadrootsListingBin"),
event_import("RadrootsListingDeliveryMethod"),
- event_import("RadrootsListingLocation"),
event_import("RadrootsListingProduct"),
+ event_import("RadrootsListingPublicLocation"),
event_import("RadrootsListingStatus"),
local_shape("RadrootsTradeFacetCount"),
source_root("RadrootsTradeListing"),
@@ -181,8 +181,8 @@ mod tests {
"RadrootsListingAvailability",
"RadrootsListingBin",
"RadrootsListingDeliveryMethod",
- "RadrootsListingLocation",
"RadrootsListingProduct",
+ "RadrootsListingPublicLocation",
"RadrootsListingStatus",
"RadrootsTradeFacetCount",
"RadrootsTradeListing",
@@ -230,8 +230,8 @@ mod tests {
"RadrootsListingAvailability",
"RadrootsListingBin",
"RadrootsListingDeliveryMethod",
- "RadrootsListingLocation",
"RadrootsListingProduct",
+ "RadrootsListingPublicLocation",
"RadrootsListingStatus",
"RadrootsTradeMessageType",
"RadrootsTradeOrderStatus",
diff --git a/packages/events-bindings/src/generated/kinds.ts b/packages/events-bindings/src/generated/kinds.ts
@@ -51,37 +51,24 @@ export const KIND_ACCOUNT_CLAIM = 30380;
export const KIND_APP_DATA = 30078;
export const KIND_LISTING = 30402;
export const KIND_APPLICATION_HANDLER = 31990;
-export const KIND_TRADE_LISTING_VALIDATE_REQ = 5321;
-export const KIND_TRADE_LISTING_VALIDATE_RES = 6321;
-export const KIND_WORKER_TRADE_TRANSITION_PROOF_REQ = 5322;
-export const KIND_WORKER_TRADE_TRANSITION_PROOF_RES = 6322;
-export const KIND_TRADE_ORDER_REQUEST = 3422;
-export const KIND_TRADE_ORDER_RESPONSE = 3423;
-export const KIND_TRADE_ORDER_DECISION = 3423;
-export const KIND_TRADE_ORDER_REVISION = 3424;
-export const KIND_TRADE_ORDER_REVISION_RESPONSE = 3425;
+export const KIND_TRADE_LISTING_VALIDATION_REQUEST = 5321;
+export const KIND_TRADE_LISTING_VALIDATION_RESULT = 6321;
+export const KIND_TRADE_TRANSITION_PROOF_REQUEST = 5322;
+export const KIND_TRADE_TRANSITION_PROOF_RESULT = 6322;
+export const KIND_ORDER_REQUEST = 3422;
+export const KIND_ORDER_DECISION = 3423;
+export const KIND_ORDER_REVISION_PROPOSAL = 3424;
+export const KIND_ORDER_REVISION_DECISION = 3425;
+export const KIND_ORDER_CANCELLATION = 3432;
export const KIND_TRADE_QUESTION = 3426;
export const KIND_TRADE_ANSWER = 3427;
export const KIND_TRADE_DISCOUNT_REQUEST = 3428;
export const KIND_TRADE_DISCOUNT_OFFER = 3429;
export const KIND_TRADE_DISCOUNT_ACCEPT = 3430;
export const KIND_TRADE_FORBIDDEN_3431 = 3431;
-export const KIND_TRADE_CANCEL = 3432;
export const KIND_TRADE_FULFILLMENT_UPDATE = 3433;
export const KIND_TRADE_RECEIPT = 3434;
export const KIND_TRADE_VALIDATION_RECEIPT = 3440;
-export const KIND_TRADE_LISTING_ORDER_REQ = 3422;
-export const KIND_TRADE_LISTING_ORDER_RES = 3423;
-export const KIND_TRADE_LISTING_ORDER_REVISION_REQ = 3424;
-export const KIND_TRADE_LISTING_ORDER_REVISION_RES = 3425;
-export const KIND_TRADE_LISTING_QUESTION_REQ = 3426;
-export const KIND_TRADE_LISTING_ANSWER_RES = 3427;
-export const KIND_TRADE_LISTING_DISCOUNT_REQ = 3428;
-export const KIND_TRADE_LISTING_DISCOUNT_OFFER_RES = 3429;
-export const KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ = 3430;
-export const KIND_TRADE_LISTING_CANCEL_REQ = 3432;
-export const KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ = 3433;
-export const KIND_TRADE_LISTING_RECEIPT_REQ = 3434;
export const KIND_JOB_REQUEST_MIN = 5000;
export const KIND_JOB_REQUEST_MAX = 5999;
export const KIND_JOB_RESULT_MIN = 6000;
diff --git a/packages/events-bindings/src/generated/types.ts b/packages/events-bindings/src/generated/types.ts
@@ -19,14 +19,20 @@ export type JobPaymentRequest = { amount_sat: number, bolt11?: string | null, };
export type RadrootsAccountClaim = { username: string, pubkey: string, nip05?: string | null, };
-export type RadrootsActiveTradeEnvelope<T> = { version: number, domain: RadrootsTradeDomain, type: RadrootsActiveTradeMessageType, order_id: string, listing_addr: string, payload: T, };
-
-export type RadrootsActiveTradeMessageType = "TradeOrderRequested" | "TradeOrderDecision" | "TradeOrderRevisionProposed" | "TradeOrderRevisionDecision" | "TradeOrderCancelled";
-
export type RadrootsAppData = { d_tag: string, content: string, };
export type RadrootsComment = { root: RadrootsNostrEventRef, parent: RadrootsNostrEventRef, content: string, };
+export type RadrootsCommercialDomain = "trade:listing";
+
+export type RadrootsCommercialEnvelope<T> = { version: number, domain: RadrootsCommercialDomain, type: RadrootsCommercialMessageType, order_id?: string | null, listing_addr: string, payload: T, };
+
+export type RadrootsCommercialMessagePayload = { kind: "listing_validate_request", amount: RadrootsTradeListingValidateRequest, } | { kind: "listing_validate_result", amount: RadrootsTradeListingValidateResult, } | { kind: "trade_order_requested", amount: RadrootsOrderRequest, } | { kind: "order_response", amount: RadrootsOrderResponse, } | { kind: "order_revision", amount: RadrootsOrderRevision, } | { kind: "order_revision_accept", amount: RadrootsOrderRevisionResponse, } | { kind: "order_revision_decline", amount: RadrootsOrderRevisionResponse, } | { kind: "question", amount: RadrootsListingQuestion, } | { kind: "answer", amount: RadrootsListingAnswer, } | { kind: "discount_request", amount: RadrootsListingDiscountRequest, } | { kind: "discount_offer", amount: RadrootsListingDiscountOffer, } | { kind: "discount_accept", amount: RadrootsListingDiscountDecision, } | { kind: "discount_decline", amount: RadrootsListingDiscountDecision, } | { kind: "cancel", amount: RadrootsListingCancel, };
+
+export type RadrootsCommercialMessageType = "listing_validate_request" | "listing_validate_result" | "order_request" | "order_response" | "order_revision" | "order_revision_accept" | "order_revision_decline" | "question" | "answer" | "discount_request" | "discount_offer" | "discount_accept" | "discount_decline" | "cancel";
+
+export type RadrootsCommercialTransportLane = "service" | "public";
+
export type RadrootsCoop = { d_tag: string, name: string, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, location?: RadrootsCoopLocation | null, tags?: Array<string> | null, };
export type RadrootsCoopLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, };
@@ -37,9 +43,9 @@ export type RadrootsDocument = { d_tag: string, doc_type: string, title: string,
export type RadrootsDocumentSubject = { pubkey: string, address?: string | null, };
-export type RadrootsFarm = { d_tag: string, name: string, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, location?: RadrootsFarmLocation | null, tags?: Array<string> | null, };
+export type RadrootsFarm = { d_tag: string, name: string, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, location?: RadrootsFarmPublicLocation | null, tags?: Array<string> | null, };
-export type RadrootsFarmLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs?: RadrootsGcsLocation | null, };
+export type RadrootsFarmPublicLocation = { primary: string, city?: string | null, region?: string | null, country?: string | null, geohash: string, };
export type RadrootsFarmRef = { pubkey: string, d_tag: string, };
@@ -75,24 +81,38 @@ export type RadrootsListEntry = { tag: string, values: Array<string>, };
export type RadrootsListSet = { d_tag: string, content: string, entries: Array<RadrootsListEntry>, title?: string | null, description?: string | null, image?: string | null, };
-export type RadrootsListing = { d_tag: string, published_at?: number | null, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, };
+export type RadrootsListing = { d_tag: string, published_at?: number | null, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingPublicLocation | null, images?: Array<RadrootsListingImage> | null, };
+
+export type RadrootsListingAnswer = { question_id: string, };
export type RadrootsListingAvailability = { kind: "window", amount: { start?: number | null, end?: number | null, }, } | { kind: "status", amount: { status: RadrootsListingStatus, }, };
export type RadrootsListingBin = { bin_id: string, quantity: RadrootsCoreQuantity, price_per_canonical_unit: RadrootsCoreQuantityPrice, display_amount?: RadrootsCoreDecimal | null, display_unit?: RadrootsCoreUnit | null, display_label?: string | null, display_price?: RadrootsCoreMoney | null, display_price_unit?: RadrootsCoreUnit | null, };
+export type RadrootsListingCancel = { reason?: string | null, };
+
export type RadrootsListingDeliveryMethod = { kind: "pickup", } | { kind: "local_delivery", } | { kind: "shipping", } | { kind: "other", amount: { method: string, }, };
+export type RadrootsListingDiscountDecision = { kind: "accept", amount: { value: RadrootsCoreDiscountValue, }, } | { kind: "decline", amount: { reason?: string | null, }, };
+
+export type RadrootsListingDiscountOffer = { discount_id: string, value: RadrootsCoreDiscountValue, };
+
+export type RadrootsListingDiscountRequest = { discount_id: string, value: RadrootsCoreDiscountValue, };
+
export type RadrootsListingImage = { url: string, size?: RadrootsListingImageSize | null, };
export type RadrootsListingImageSize = { w: number, h: number, };
-export type RadrootsListingLocation = { primary: string, city?: string | null, region?: string | null, country?: string | null, lat?: number | null, lng?: number | null, geohash?: string | null, };
+export type RadrootsListingParseError = { InvalidKind: number, } | { MissingTag: string, } | { InvalidTag: string, } | { InvalidNumber: string, } | "InvalidUnit" | "InvalidCurrency" | { InvalidJson: string, } | { InvalidDiscount: string, };
export type RadrootsListingProduct = { key: string, title: string, category: string, summary?: string | null, process?: string | null, lot?: string | null, location?: string | null, profile?: string | null, year?: string | null, };
export type RadrootsListingProductTagKeys = readonly ["key", "title", "category", "summary", "process", "lot", "location", "profile", "year"];
+export type RadrootsListingPublicLocation = { primary: string, city?: string | null, region?: string | null, country?: string | null, geohash: string, };
+
+export type RadrootsListingQuestion = { question_id: string, };
+
export type RadrootsListingStatus = { kind: "active", } | { kind: "sold", } | { kind: "other", amount: { value: string, }, };
export type RadrootsMessage = { recipients: Array<RadrootsMessageRecipient>, content: string, reply_to?: RadrootsNostrEventPtr | null, subject?: string | null, };
@@ -109,104 +129,84 @@ export type RadrootsNostrEventPtr = { id: string, relays?: string | null, };
export type RadrootsNostrEventRef = { id: string, author: string, kind: number, d_tag?: string | null, relays?: Array<string> | null, };
-export type RadrootsPlot = { d_tag: string, farm: RadrootsFarmRef, name: string, about?: string | null, location?: RadrootsPlotLocation | null, tags?: Array<string> | null, };
-
-export type RadrootsPlotLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, };
-
-export type RadrootsPlotRef = { pubkey: string, d_tag: string, };
-
-export type RadrootsPost = { content: string, };
-
-export type RadrootsProfile = { name: string, display_name?: string | null, nip05?: string | null, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, lud06?: string | null, lud16?: string | null, bot?: string | null, };
-
-export type RadrootsProfileType = "individual" | "farm" | "coop" | "any" | "radrootsd";
-
-export type RadrootsReaction = { root: RadrootsNostrEventRef, content: string, };
-
-export type RadrootsRelayDocument = { name?: string | null, description?: string | null, pubkey?: string | null, contact?: string | null, supported_nips?: Array<number> | null, software?: string | null, version?: string | null, };
-
-export type RadrootsResourceArea = { d_tag: string, name: string, about?: string | null, location: RadrootsResourceAreaLocation, tags?: Array<string> | null, };
-
-export type RadrootsResourceAreaLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, };
-
-export type RadrootsResourceAreaRef = { pubkey: string, d_tag: string, };
+export type RadrootsOrderCancellation = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, reason: string, };
-export type RadrootsResourceHarvestCap = { d_tag: string, resource_area: RadrootsResourceAreaRef, product: RadrootsResourceHarvestProduct, start: bigint, end: bigint, cap_quantity: RadrootsCoreQuantity, display_amount?: RadrootsCoreDecimal | null, display_unit?: RadrootsCoreUnit | null, display_label?: string | null, tags?: Array<string> | null, };
+export type RadrootsOrderChange = { kind: "bin_count", amount: { item_index: number, bin_count: number, }, } | { kind: "item_add", amount: { item: RadrootsOrderItem, }, } | { kind: "item_remove", amount: { item_index: number, }, };
-export type RadrootsResourceHarvestProduct = { key: string, category?: string | null, };
+export type RadrootsOrderDecision = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, decision: RadrootsOrderDecisionOutcome, };
-export type RadrootsSeal = { content: string, };
+export type RadrootsOrderDecisionOutcome = { decision: "accepted", inventory_commitments: Array<RadrootsOrderInventoryCommitment>, } | { decision: "declined", reason: string, };
-export type RadrootsTradeAnswer = { question_id: string, };
+export type RadrootsOrderEconomicActor = "buyer" | "seller";
-export type RadrootsTradeDiscountDecision = { kind: "accept", amount: { value: RadrootsCoreDiscountValue, }, } | { kind: "decline", amount: { reason?: string | null, }, };
+export type RadrootsOrderEconomicEffect = "increase" | "decrease";
-export type RadrootsTradeDiscountOffer = { discount_id: string, value: RadrootsCoreDiscountValue, };
+export type RadrootsOrderEconomicItem = { bin_id: string, bin_count: number, quantity_amount: RadrootsCoreDecimal, quantity_unit: RadrootsCoreUnit, unit_price_amount: RadrootsCoreDecimal, unit_price_currency: RadrootsCoreCurrency, line_subtotal: RadrootsCoreMoney, };
-export type RadrootsTradeDiscountRequest = { discount_id: string, value: RadrootsCoreDiscountValue, };
+export type RadrootsOrderEconomicLine = { id: string, kind: RadrootsOrderEconomicLineKind, actor: RadrootsOrderEconomicActor, effect: RadrootsOrderEconomicEffect, amount: RadrootsCoreMoney, reason: string, };
-export type RadrootsTradeDomain = "trade:listing";
+export type RadrootsOrderEconomicLineKind = "listing_discount" | "basket_adjustment" | "revision_adjustment";
-export type RadrootsTradeEconomicActor = "buyer" | "seller";
+export type RadrootsOrderEconomicTotals = { subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, };
-export type RadrootsTradeEconomicEffect = "increase" | "decrease";
+export type RadrootsOrderEconomics = { quote_id: string, quote_version: number, pricing_basis: RadrootsOrderPricingBasis, currency: RadrootsCoreCurrency, items: Array<RadrootsOrderEconomicItem>, discounts: Array<RadrootsOrderEconomicLine>, adjustments: Array<RadrootsOrderEconomicLine>, subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, };
-export type RadrootsTradeEconomicLineKind = "listing_discount" | "basket_adjustment" | "revision_adjustment";
+export type RadrootsOrderEnvelope<T> = { version: number, domain: RadrootsCommercialDomain, type: RadrootsOrderEventType, order_id: string, listing_addr: string, payload: T, };
-export type RadrootsTradeEnvelope<T> = { version: number, domain: RadrootsTradeDomain, type: RadrootsTradeMessageType, order_id?: string | null, listing_addr: string, payload: T, };
+export type RadrootsOrderEventType = "TradeOrderRequested" | "TradeOrderDecision" | "TradeOrderRevisionProposed" | "TradeOrderRevisionDecision" | "TradeOrderCancelled";
-export type RadrootsTradeInventoryCommitment = { bin_id: string, bin_count: number, };
+export type RadrootsOrderInventoryCommitment = { bin_id: string, bin_count: number, };
-export type RadrootsTradeListingCancel = { reason?: string | null, };
+export type RadrootsOrderItem = { bin_id: string, bin_count: number, };
-export type RadrootsTradeListingParseError = { InvalidKind: number, } | { MissingTag: string, } | { InvalidTag: string, } | { InvalidNumber: string, } | "InvalidUnit" | "InvalidCurrency" | { InvalidJson: string, } | { InvalidDiscount: string, };
+export type RadrootsOrderPricingBasis = "listing_event";
-export type RadrootsTradeListingValidateRequest = { listing_event?: RadrootsNostrEventPtr | null, };
+export type RadrootsOrderRequest = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, items: Array<RadrootsOrderItem>, economics: RadrootsOrderEconomics, };
-export type RadrootsTradeListingValidateResult = { valid: boolean, errors: Array<RadrootsTradeListingValidationError>, };
+export type RadrootsOrderResponse = { accepted: boolean, reason?: string | null, };
-export type RadrootsTradeListingValidationError = { kind: "invalid_kind", amount: { kind: number, }, } | { kind: "missing_listing_id", } | { kind: "listing_event_not_found", amount: { listing_addr: string, }, } | { kind: "listing_event_fetch_failed", amount: { listing_addr: string, }, } | { kind: "parse_error", amount: { error: RadrootsTradeListingParseError, }, } | { kind: "invalid_seller", } | { kind: "missing_farm_profile", } | { kind: "missing_farm_record", } | { kind: "missing_title", } | { kind: "missing_description", } | { kind: "missing_product_type", } | { kind: "missing_bins", } | { kind: "missing_primary_bin", } | { kind: "invalid_bin", } | { kind: "missing_price", } | { kind: "invalid_price", } | { kind: "missing_inventory", } | { kind: "invalid_inventory", } | { kind: "missing_availability", } | { kind: "missing_location", } | { kind: "missing_delivery_method", };
+export type RadrootsOrderRevision = { revision_id: string, changes: Array<RadrootsOrderChange>, };
-export type RadrootsTradeMessagePayload = { kind: "listing_validate_request", amount: RadrootsTradeListingValidateRequest, } | { kind: "listing_validate_result", amount: RadrootsTradeListingValidateResult, } | { kind: "trade_order_requested", amount: RadrootsTradeOrderRequested, } | { kind: "order_response", amount: RadrootsTradeOrderResponse, } | { kind: "order_revision", amount: RadrootsTradeOrderRevision, } | { kind: "order_revision_accept", amount: RadrootsTradeOrderRevisionResponse, } | { kind: "order_revision_decline", amount: RadrootsTradeOrderRevisionResponse, } | { kind: "question", amount: RadrootsTradeQuestion, } | { kind: "answer", amount: RadrootsTradeAnswer, } | { kind: "discount_request", amount: RadrootsTradeDiscountRequest, } | { kind: "discount_offer", amount: RadrootsTradeDiscountOffer, } | { kind: "discount_accept", amount: RadrootsTradeDiscountDecision, } | { kind: "discount_decline", amount: RadrootsTradeDiscountDecision, } | { kind: "cancel", amount: RadrootsTradeListingCancel, };
+export type RadrootsOrderRevisionDecision = { decision: "accepted", } | { decision: "declined", reason: string, };
-export type RadrootsTradeMessageType = "listing_validate_request" | "listing_validate_result" | "order_request" | "order_response" | "order_revision" | "order_revision_accept" | "order_revision_decline" | "question" | "answer" | "discount_request" | "discount_offer" | "discount_accept" | "discount_decline" | "cancel";
+export type RadrootsOrderRevisionDecisionEvent = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, decision: RadrootsOrderRevisionDecision, };
-export type RadrootsTradeOrderCancelled = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, reason: string, };
+export type RadrootsOrderRevisionProposed = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, items: Array<RadrootsOrderItem>, economics: RadrootsOrderEconomics, reason: string, };
-export type RadrootsTradeOrderChange = { kind: "bin_count", amount: { item_index: number, bin_count: number, }, } | { kind: "item_add", amount: { item: RadrootsTradeOrderItem, }, } | { kind: "item_remove", amount: { item_index: number, }, };
+export type RadrootsOrderRevisionResponse = { accepted: boolean, reason?: string | null, };
-export type RadrootsTradeOrderDecision = { decision: "accepted", inventory_commitments: Array<RadrootsTradeInventoryCommitment>, } | { decision: "declined", reason: string, };
+export type RadrootsOrderStatus = "draft" | "validated" | "requested" | "questioned" | "revised" | "accepted" | "declined" | "cancelled";
-export type RadrootsTradeOrderDecisionEvent = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, decision: RadrootsTradeOrderDecision, };
+export type RadrootsPlot = { d_tag: string, farm: RadrootsFarmRef, name: string, about?: string | null, location?: RadrootsPlotLocation | null, tags?: Array<string> | null, };
-export type RadrootsTradeOrderEconomicItem = { bin_id: string, bin_count: number, quantity_amount: RadrootsCoreDecimal, quantity_unit: RadrootsCoreUnit, unit_price_amount: RadrootsCoreDecimal, unit_price_currency: RadrootsCoreCurrency, line_subtotal: RadrootsCoreMoney, };
+export type RadrootsPlotLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, };
-export type RadrootsTradeOrderEconomicLine = { id: string, kind: RadrootsTradeEconomicLineKind, actor: RadrootsTradeEconomicActor, effect: RadrootsTradeEconomicEffect, amount: RadrootsCoreMoney, reason: string, };
+export type RadrootsPlotRef = { pubkey: string, d_tag: string, };
-export type RadrootsTradeOrderEconomicTotals = { subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, };
+export type RadrootsPost = { content: string, };
-export type RadrootsTradeOrderEconomics = { quote_id: string, quote_version: number, pricing_basis: RadrootsTradePricingBasis, currency: RadrootsCoreCurrency, items: Array<RadrootsTradeOrderEconomicItem>, discounts: Array<RadrootsTradeOrderEconomicLine>, adjustments: Array<RadrootsTradeOrderEconomicLine>, subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, };
+export type RadrootsProfile = { name: string, display_name?: string | null, nip05?: string | null, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, lud06?: string | null, lud16?: string | null, bot?: string | null, };
-export type RadrootsTradeOrderItem = { bin_id: string, bin_count: number, };
+export type RadrootsProfileType = "individual" | "farm" | "coop" | "any" | "radrootsd";
-export type RadrootsTradeOrderRequested = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, items: Array<RadrootsTradeOrderItem>, economics: RadrootsTradeOrderEconomics, };
+export type RadrootsReaction = { root: RadrootsNostrEventRef, content: string, };
-export type RadrootsTradeOrderResponse = { accepted: boolean, reason?: string | null, };
+export type RadrootsRelayDocument = { name?: string | null, description?: string | null, pubkey?: string | null, contact?: string | null, supported_nips?: Array<number> | null, software?: string | null, version?: string | null, };
-export type RadrootsTradeOrderRevision = { revision_id: string, changes: Array<RadrootsTradeOrderChange>, };
+export type RadrootsResourceArea = { d_tag: string, name: string, about?: string | null, location: RadrootsResourceAreaLocation, tags?: Array<string> | null, };
-export type RadrootsTradeOrderRevisionDecision = { decision: "accepted", } | { decision: "declined", reason: string, };
+export type RadrootsResourceAreaLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, };
-export type RadrootsTradeOrderRevisionDecisionEvent = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, decision: RadrootsTradeOrderRevisionDecision, };
+export type RadrootsResourceAreaRef = { pubkey: string, d_tag: string, };
-export type RadrootsTradeOrderRevisionProposed = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, items: Array<RadrootsTradeOrderItem>, economics: RadrootsTradeOrderEconomics, reason: string, };
+export type RadrootsResourceHarvestCap = { d_tag: string, resource_area: RadrootsResourceAreaRef, product: RadrootsResourceHarvestProduct, start: bigint, end: bigint, cap_quantity: RadrootsCoreQuantity, display_amount?: RadrootsCoreDecimal | null, display_unit?: RadrootsCoreUnit | null, display_label?: string | null, tags?: Array<string> | null, };
-export type RadrootsTradeOrderRevisionResponse = { accepted: boolean, reason?: string | null, };
+export type RadrootsResourceHarvestProduct = { key: string, category?: string | null, };
-export type RadrootsTradeOrderStatus = "draft" | "validated" | "requested" | "questioned" | "revised" | "accepted" | "declined" | "cancelled";
+export type RadrootsSeal = { content: string, };
-export type RadrootsTradePricingBasis = "listing_event";
+export type RadrootsTradeListingValidateRequest = { listing_event?: RadrootsNostrEventPtr | null, };
-export type RadrootsTradeQuestion = { question_id: string, };
+export type RadrootsTradeListingValidateResult = { valid: boolean, errors: Array<RadrootsTradeListingValidationError>, };
-export type RadrootsTradeTransportLane = "service" | "public";
+export type RadrootsTradeListingValidationError = { kind: "invalid_kind", amount: { kind: number, }, } | { kind: "missing_listing_id", } | { kind: "listing_event_not_found", amount: { listing_addr: string, }, } | { kind: "listing_event_fetch_failed", amount: { listing_addr: string, }, } | { kind: "parse_error", amount: { error: RadrootsListingParseError, }, } | { kind: "invalid_seller", } | { kind: "missing_farm_profile", } | { kind: "missing_farm_record", } | { kind: "missing_title", } | { kind: "missing_description", } | { kind: "missing_product_type", } | { kind: "missing_bins", } | { kind: "missing_primary_bin", } | { kind: "invalid_bin", } | { kind: "missing_price", } | { kind: "invalid_price", } | { kind: "missing_inventory", } | { kind: "invalid_inventory", } | { kind: "missing_availability", } | { kind: "missing_location", } | { kind: "missing_delivery_method", };
diff --git a/packages/trade-bindings/src/generated/types.ts b/packages/trade-bindings/src/generated/types.ts
@@ -16,8 +16,8 @@ import type {
RadrootsListingBin,
RadrootsListingDeliveryMethod,
RadrootsListingImage,
- RadrootsListingLocation,
RadrootsListingProduct,
+ RadrootsListingPublicLocation,
RadrootsNostrEventPtr,
RadrootsPlotRef,
RadrootsResourceAreaRef,
@@ -30,7 +30,7 @@ import type {
export type RadrootsTradeFacetCount = { key: string, count: number, };
-export type RadrootsTradeListing = { listing_id: string, listing_addr: string, seller_pubkey: string, title: string, description: string, product_type: string, primary_bin_id: string, bin_quantity: RadrootsCoreQuantity, unit: RadrootsCoreUnit, unit_price: RadrootsCoreMoney, inventory_available: RadrootsCoreDecimal, availability: RadrootsListingAvailability, location: RadrootsListingLocation, delivery_method: RadrootsListingDeliveryMethod, listing: RadrootsListing, };
+export type RadrootsTradeListing = { listing_id: string, listing_addr: string, seller_pubkey: string, title: string, description: string, product_type: string, primary_bin_id: string, bin_quantity: RadrootsCoreQuantity, unit: RadrootsCoreUnit, unit_price: RadrootsCoreMoney, inventory_available: RadrootsCoreDecimal, availability: RadrootsListingAvailability, location: RadrootsListingPublicLocation, delivery_method: RadrootsListingDeliveryMethod, listing: RadrootsListing, };
export type RadrootsTradeListingBackofficeOverlay = { listing_addr: string, review_queue?: RadrootsTradeReviewQueueEntry | null, moderation_flags: Array<RadrootsTradeModerationFlag>, };
@@ -44,7 +44,7 @@ export type RadrootsTradeListingFacets = { seller_pubkeys: Array<RadrootsTradeFa
export type RadrootsTradeListingMarketStatus = "unknown" | "window" | "active" | "sold" | { other: { value: string, }, };
-export type RadrootsTradeListingProjection = { listing_addr: string, seller_pubkey: string, listing_id: string, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsTradeListingBinProjection>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, order_count: number, open_order_count: number, terminal_order_count: number, };
+export type RadrootsTradeListingProjection = { listing_addr: string, seller_pubkey: string, listing_id: string, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsTradeListingBinProjection>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingPublicLocation | null, images?: Array<RadrootsListingImage> | null, order_count: number, open_order_count: number, terminal_order_count: number, };
export type RadrootsTradeListingQuery = { seller_pubkey?: string | null, farm_pubkey?: string | null, farm_id?: string | null, product_key?: string | null, product_category?: string | null, listing_status?: RadrootsTradeListingMarketStatus | null, };
diff --git a/tools/xtask/src/dto_roots.rs b/tools/xtask/src/dto_roots.rs
@@ -262,8 +262,8 @@ fn trade_import_options(mut options: DtoRegistryRenderOptions) -> DtoRegistryRen
"RadrootsListingBin",
"RadrootsListingDeliveryMethod",
"RadrootsListingImage",
- "RadrootsListingLocation",
"RadrootsListingProduct",
+ "RadrootsListingPublicLocation",
"RadrootsListingStatus",
"RadrootsNostrEventPtr",
"RadrootsPlotRef",
@@ -380,7 +380,7 @@ mod tests {
"RadrootsDocument",
"RadrootsDocumentSubject",
"RadrootsFarm",
- "RadrootsFarmLocation",
+ "RadrootsFarmPublicLocation",
"RadrootsFarmRef",
"RadrootsFollow",
"RadrootsFollowProfile",
@@ -404,9 +404,9 @@ mod tests {
"RadrootsListingDeliveryMethod",
"RadrootsListingImage",
"RadrootsListingImageSize",
- "RadrootsListingLocation",
"RadrootsListingProduct",
"RadrootsListingProductTagKeys",
+ "RadrootsListingPublicLocation",
"RadrootsListingStatus",
"RadrootsMessage",
"RadrootsMessageFile",