commit e0f98dce63b3369fc23c982ef8f92ca85cf15025
parent cf169684d5001a5893d73ababa434f624091e3f2
Author: triesap <tyson@radroots.org>
Date: Sun, 14 Jun 2026 01:48:20 -0700
events_codec: use canonical order listing address
- replace the order-specific listing address parser with RadrootsListingAddress
- update trade validation and order canonicalization to consume canonical listing addresses
- rename public SDK metadata from RadrootsOrderListingAddress to RadrootsListingAddress
- classify radroots_authority as deferred so sdk validation remains green
Diffstat:
16 files changed, 88 insertions(+), 134 deletions(-)
diff --git a/crates/authority/Cargo.toml b/crates/authority/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "radroots_authority"
-publish = ["crates-io"]
+publish = false
version = "0.1.0-alpha.2"
edition.workspace = true
authors = ["Tyson Lupul <tyson@radroots.org>"]
diff --git a/crates/events_codec/src/order/decode.rs b/crates/events_codec/src/order/decode.rs
@@ -4,8 +4,8 @@ use alloc::{borrow::ToOwned, format, string::String, vec::Vec};
#[cfg(feature = "serde_json")]
use radroots_events::{
RadrootsNostrEvent, RadrootsNostrEventPtr,
- ids::{RadrootsEventId, RadrootsPublicKey},
- kinds::{KIND_PROFILE, is_order_event_kind},
+ ids::{RadrootsEventId, RadrootsIdParseError, RadrootsListingAddress, RadrootsPublicKey},
+ kinds::is_order_event_kind,
order::{
RadrootsOrderCancellation, RadrootsOrderDecision, RadrootsOrderEnvelope,
RadrootsOrderEnvelopeError, RadrootsOrderEventType, RadrootsOrderFulfillmentUpdate,
@@ -19,8 +19,6 @@ use radroots_events::{
use serde::de::DeserializeOwned;
#[cfg(feature = "serde_json")]
-use crate::d_tag::is_d_tag_base64url;
-#[cfg(feature = "serde_json")]
use crate::order::tags::{
TAG_LISTING_EVENT, parse_order_counterparty_tag, parse_order_listing_event_tag,
parse_order_prev_tag, parse_order_root_tag,
@@ -44,7 +42,7 @@ pub enum RadrootsOrderEnvelopeParseError {
PayloadBindingMismatch(&'static str),
AuthorMismatch,
CounterpartyTagMismatch,
- InvalidListingAddr(RadrootsOrderListingAddressError),
+ InvalidListingAddr(RadrootsIdParseError),
}
#[cfg(feature = "serde_json")]
@@ -104,69 +102,6 @@ pub struct RadrootsOrderEventContext {
}
#[cfg(feature = "serde_json")]
-#[derive(Clone, Debug, PartialEq, Eq)]
-pub struct RadrootsOrderListingAddress {
- pub kind: u32,
- pub seller_pubkey: String,
- pub listing_id: String,
-}
-
-#[cfg(feature = "serde_json")]
-impl RadrootsOrderListingAddress {
- pub fn parse(addr: &str) -> Result<Self, RadrootsOrderListingAddressError> {
- let (kind_raw, seller_and_listing) = addr
- .split_once(':')
- .ok_or(RadrootsOrderListingAddressError::InvalidFormat)?;
- let (seller_pubkey_raw, listing_id_raw) = seller_and_listing
- .split_once(':')
- .ok_or(RadrootsOrderListingAddressError::InvalidFormat)?;
- if listing_id_raw.contains(':') {
- return Err(RadrootsOrderListingAddressError::InvalidFormat);
- }
- let kind = kind_raw
- .parse::<u32>()
- .map_err(|_| RadrootsOrderListingAddressError::InvalidFormat)?;
- let seller_pubkey = seller_pubkey_raw.to_owned();
- let listing_id = listing_id_raw.to_owned();
- if kind == KIND_PROFILE
- || seller_pubkey.trim().is_empty()
- || listing_id.trim().is_empty()
- || !is_d_tag_base64url(&listing_id)
- {
- return Err(RadrootsOrderListingAddressError::InvalidFormat);
- }
- Ok(Self {
- kind,
- seller_pubkey,
- listing_id,
- })
- }
-
- #[inline]
- pub fn as_str(&self) -> String {
- format!("{}:{}:{}", self.kind, self.seller_pubkey, self.listing_id)
- }
-}
-
-#[cfg(feature = "serde_json")]
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub enum RadrootsOrderListingAddressError {
- InvalidFormat,
-}
-
-#[cfg(feature = "serde_json")]
-impl core::fmt::Display for RadrootsOrderListingAddressError {
- fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
- match self {
- Self::InvalidFormat => write!(f, "invalid listing address format"),
- }
- }
-}
-
-#[cfg(all(feature = "std", feature = "serde_json"))]
-impl std::error::Error for RadrootsOrderListingAddressError {}
-
-#[cfg(feature = "serde_json")]
pub fn order_envelope_from_event<T: DeserializeOwned>(
event: &RadrootsNostrEvent,
) -> Result<RadrootsOrderEnvelope<T>, RadrootsOrderEnvelopeParseError> {
@@ -189,7 +124,7 @@ pub fn order_envelope_from_event<T: DeserializeOwned>(
if envelope.listing_addr != listing_addr {
return Err(RadrootsOrderEnvelopeParseError::ListingAddrTagMismatch);
}
- RadrootsOrderListingAddress::parse(&envelope.listing_addr)
+ RadrootsListingAddress::parse(&envelope.listing_addr)
.map_err(RadrootsOrderEnvelopeParseError::InvalidListingAddr)?;
let tag_order_id = required_order_tag_value(&event.tags, TAG_D)?;
@@ -603,11 +538,11 @@ fn validate_order_binding<T>(
#[cfg(all(test, feature = "serde_json"))]
mod tests {
use super::{
- RadrootsOrderEnvelopeParseError, RadrootsOrderListingAddress,
- order_cancellation_from_event, order_decision_from_event, order_envelope_from_event,
- order_fulfillment_update_from_event, order_payment_record_from_event,
- order_receipt_from_event, order_request_from_event, order_revision_decision_from_event,
- order_revision_proposal_from_event, order_settlement_decision_from_event,
+ RadrootsOrderEnvelopeParseError, order_cancellation_from_event, order_decision_from_event,
+ order_envelope_from_event, order_fulfillment_update_from_event,
+ order_payment_record_from_event, order_receipt_from_event, order_request_from_event,
+ order_revision_decision_from_event, order_revision_proposal_from_event,
+ order_settlement_decision_from_event,
};
use crate::order::encode::{
order_cancellation_event_build, order_decision_event_build,
@@ -896,8 +831,8 @@ mod tests {
#[test]
fn listing_address_roundtrips() {
- let raw = format!("30402:{}:AAAAAAAAAAAAAAAAAAAAAg", seller_pubkey_wire());
- let addr = RadrootsOrderListingAddress::parse(&raw).expect("parse listing address");
+ let raw = format!("30402:{}:listing-1", seller_pubkey_wire());
+ let addr = RadrootsListingAddress::parse(&raw).expect("parse listing address");
assert_eq!(addr.as_str(), raw);
}
diff --git a/crates/events_codec/src/order/mod.rs b/crates/events_codec/src/order/mod.rs
@@ -4,12 +4,11 @@ pub mod tags;
#[cfg(feature = "serde_json")]
pub use decode::{
- RadrootsOrderEnvelopeParseError, RadrootsOrderEventContext, RadrootsOrderListingAddress,
- RadrootsOrderListingAddressError, order_cancellation_from_event, order_decision_from_event,
- order_envelope_from_event, order_event_context_from_tags, order_fulfillment_update_from_event,
- order_payment_record_from_event, order_receipt_from_event, order_request_from_event,
- order_revision_decision_from_event, order_revision_proposal_from_event,
- order_settlement_decision_from_event,
+ RadrootsOrderEnvelopeParseError, RadrootsOrderEventContext, order_cancellation_from_event,
+ order_decision_from_event, order_envelope_from_event, order_event_context_from_tags,
+ order_fulfillment_update_from_event, order_payment_record_from_event, order_receipt_from_event,
+ order_request_from_event, order_revision_decision_from_event,
+ order_revision_proposal_from_event, order_settlement_decision_from_event,
};
#[cfg(feature = "serde_json")]
pub use encode::{
diff --git a/crates/trade/src/listing/publish.rs b/crates/trade/src/listing/publish.rs
@@ -74,6 +74,8 @@ mod tests {
canonicalize_listing_for_seller, resolve_listing_kind, validate_listing_for_seller,
};
+ const SELLER: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+
fn d_tag(raw: &str) -> RadrootsDTag {
RadrootsDTag::parse(raw).expect("d tag")
}
@@ -159,17 +161,17 @@ mod tests {
#[test]
fn canonicalize_listing_sets_missing_farm_pubkey() {
- let listing = canonicalize_listing_for_seller(base_listing(), "seller");
- assert_eq!(listing.farm.pubkey, "seller");
+ let listing = canonicalize_listing_for_seller(base_listing(), SELLER);
+ assert_eq!(listing.farm.pubkey, SELLER);
}
#[test]
fn validate_listing_for_seller_returns_listing_addr() {
- let listing = canonicalize_listing_for_seller(base_listing(), "seller");
+ let listing = canonicalize_listing_for_seller(base_listing(), SELLER);
let validated =
- validate_listing_for_seller(listing, "seller", radroots_events::kinds::KIND_LISTING)
+ validate_listing_for_seller(listing, SELLER, radroots_events::kinds::KIND_LISTING)
.expect("validated listing");
- assert_eq!(validated.seller_pubkey, "seller");
- assert!(validated.listing_addr.contains(":seller:"));
+ assert_eq!(validated.seller_pubkey, SELLER);
+ assert!(validated.listing_addr.contains(&format!(":{SELLER}:")));
}
}
diff --git a/crates/trade/src/listing/validation.rs b/crates/trade/src/listing/validation.rs
@@ -1,21 +1,22 @@
#![forbid(unsafe_code)]
#[cfg(not(feature = "std"))]
-use alloc::{string::String, vec::Vec};
+use alloc::{format, string::String, vec::Vec};
use radroots_core::{
RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCoreQuantity, RadrootsCoreUnit,
};
use radroots_events::{
RadrootsNostrEvent,
+ ids::RadrootsListingAddress,
kinds::is_listing_kind,
listing::{
RadrootsListing, RadrootsListingAvailability, RadrootsListingDeliveryMethod,
RadrootsListingLocation,
},
+ order::RadrootsListingParseError,
trade_validation::RadrootsTradeValidationListingError as TradeListingValidationError,
};
-use radroots_events_codec::order::RadrootsOrderListingAddress as OrderListingAddress;
use crate::listing::codec::listing_from_event_parts;
@@ -54,12 +55,12 @@ pub fn validate_listing_event(
if listing.farm.pubkey != seller_pubkey {
return Err(TradeListingValidationError::InvalidSeller);
}
- let listing_addr = OrderListingAddress {
- kind: event.kind as _,
- seller_pubkey: seller_pubkey.clone(),
- listing_id: listing_id.clone(),
- }
- .as_str();
+ let listing_addr_raw = format!("{}:{}:{}", event.kind, seller_pubkey, listing_id);
+ let listing_addr = RadrootsListingAddress::parse(&listing_addr_raw)
+ .map_err(|_| TradeListingValidationError::ParseError {
+ error: RadrootsListingParseError::InvalidTag("listing_addr".to_string()),
+ })?
+ .into_string();
let title = listing.product.title.trim().to_string();
if title.is_empty() {
@@ -180,6 +181,9 @@ mod tests {
},
};
+ const SELLER: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+ const OTHER_SELLER: &str = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
+
fn d_tag(raw: &str) -> RadrootsDTag {
RadrootsDTag::parse(raw).expect("d tag")
}
@@ -193,7 +197,7 @@ mod tests {
d_tag: d_tag("AAAAAAAAAAAAAAAAAAAAAg"),
published_at: None,
farm: RadrootsFarmRef {
- pubkey: "seller".into(),
+ pubkey: SELLER.into(),
d_tag: "AAAAAAAAAAAAAAAAAAAAAA".into(),
},
product: RadrootsListingProduct {
@@ -254,7 +258,7 @@ mod tests {
fn base_event(listing: &RadrootsListing) -> RadrootsNostrEvent {
RadrootsNostrEvent {
id: "evt".into(),
- author: "seller".into(),
+ author: SELLER.into(),
created_at: 0,
kind: KIND_LISTING,
tags: vec![
@@ -291,7 +295,7 @@ mod tests {
let validated = validate_listing_event(&event).expect("draft listing");
assert_eq!(
validated.listing_addr,
- format!("30403:seller:{}", listing.d_tag)
+ format!("30403:{SELLER}:{}", listing.d_tag)
);
}
@@ -315,8 +319,8 @@ mod tests {
event.content = String::new();
event.tags = vec![
vec!["d".into(), "AAAAAAAAAAAAAAAAAAAAAg".into()],
- vec!["p".into(), "seller".into()],
- vec!["a".into(), "30340:seller:AAAAAAAAAAAAAAAAAAAAAA".into()],
+ vec!["p".into(), SELLER.into()],
+ vec!["a".into(), format!("30340:{SELLER}:AAAAAAAAAAAAAAAAAAAAAA")],
vec!["key".into(), "coffee".into()],
vec!["title".into(), "Coffee".into()],
vec!["category".into(), "coffee".into()],
@@ -352,7 +356,7 @@ mod tests {
fn validate_listing_rejects_mismatched_seller() {
let listing = base_listing();
let mut event = base_event(&listing);
- event.author = "other".into();
+ event.author = OTHER_SELLER.into();
let err = validate_listing_event(&event).unwrap_err();
assert_eq!(err, TradeListingValidationError::InvalidSeller);
}
diff --git a/crates/trade/src/order.rs b/crates/trade/src/order.rs
@@ -20,7 +20,6 @@ use radroots_events::order::{
RadrootsOrderRequest, RadrootsOrderRevisionDecision, RadrootsOrderRevisionOutcome,
RadrootsOrderRevisionProposal, RadrootsOrderSettlementDecision, RadrootsOrderSettlementOutcome,
};
-use radroots_events_codec::order::RadrootsOrderListingAddress as OrderListingAddress;
#[cfg(feature = "serde_json")]
use sha2::{Digest, Sha256};
use thiserror::Error;
@@ -912,17 +911,14 @@ pub fn canonicalize_order_request_for_signer(
}
let seller_pubkey = request.seller_pubkey.clone();
- if seller_pubkey.as_str() != listing_addr.seller_pubkey {
+ if seller_pubkey != listing_addr.seller_pubkey {
return Err(RadrootsOrderCanonicalizationError::InvalidSellerListing);
}
canonicalize_items(&mut request.items)?;
request.economics.canonicalize();
request.order_id = order_id;
- request.listing_addr =
- RadrootsListingAddress::parse(listing_addr.as_str()).map_err(|error| {
- RadrootsOrderCanonicalizationError::InvalidListingAddress(error.to_string())
- })?;
+ request.listing_addr = listing_addr.address;
request.buyer_pubkey = buyer_pubkey;
request.seller_pubkey = seller_pubkey;
Ok(request)
@@ -937,9 +933,7 @@ pub fn canonicalize_order_decision_for_signer(
let listing_addr = parse_public_listing_addr(&listing_addr_raw)?;
let seller_pubkey = decision_event.seller_pubkey.clone();
- if seller_pubkey.as_str() != signer_pubkey
- || seller_pubkey.as_str() != listing_addr.seller_pubkey
- {
+ if seller_pubkey.as_str() != signer_pubkey || seller_pubkey != listing_addr.seller_pubkey {
return Err(RadrootsOrderCanonicalizationError::InvalidSellerListing);
}
@@ -947,10 +941,7 @@ pub fn canonicalize_order_decision_for_signer(
canonicalize_decision(&mut decision_event.decision)?;
decision_event.order_id = order_id;
- decision_event.listing_addr =
- RadrootsListingAddress::parse(listing_addr.as_str()).map_err(|error| {
- RadrootsOrderCanonicalizationError::InvalidListingAddress(error.to_string())
- })?;
+ decision_event.listing_addr = listing_addr.address;
decision_event.buyer_pubkey = buyer_pubkey;
decision_event.seller_pubkey = seller_pubkey;
Ok(decision_event)
@@ -3344,16 +3335,37 @@ fn invalid_projection_with_payment(
}
}
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct RadrootsPublicListingAddressParts {
+ address: RadrootsListingAddress,
+ seller_pubkey: RadrootsPublicKey,
+}
+
fn parse_public_listing_addr(
listing_addr_raw: &str,
-) -> Result<OrderListingAddress, RadrootsOrderCanonicalizationError> {
- let listing_addr = OrderListingAddress::parse(listing_addr_raw).map_err(|error| {
+) -> Result<RadrootsPublicListingAddressParts, RadrootsOrderCanonicalizationError> {
+ let address = RadrootsListingAddress::parse(listing_addr_raw).map_err(|error| {
RadrootsOrderCanonicalizationError::InvalidListingAddress(error.to_string())
})?;
- if u32::from(listing_addr.kind) != KIND_LISTING {
+ let (kind_raw, seller_and_listing) = address.as_str().split_once(':').ok_or_else(|| {
+ RadrootsOrderCanonicalizationError::InvalidListingAddress(listing_addr_raw.to_string())
+ })?;
+ let (seller_pubkey_raw, _) = seller_and_listing.split_once(':').ok_or_else(|| {
+ RadrootsOrderCanonicalizationError::InvalidListingAddress(listing_addr_raw.to_string())
+ })?;
+ let kind = kind_raw.parse::<u32>().map_err(|_| {
+ RadrootsOrderCanonicalizationError::InvalidListingAddress(listing_addr_raw.to_string())
+ })?;
+ if kind != KIND_LISTING {
return Err(RadrootsOrderCanonicalizationError::InvalidListingKind);
}
- Ok(listing_addr)
+ let seller_pubkey = RadrootsPublicKey::parse(seller_pubkey_raw).map_err(|error| {
+ RadrootsOrderCanonicalizationError::InvalidListingAddress(error.to_string())
+ })?;
+ Ok(RadrootsPublicListingAddressParts {
+ address,
+ seller_pubkey,
+ })
}
fn canonicalize_items(
diff --git a/crates/xtask/src/contract.rs b/crates/xtask/src/contract.rs
@@ -4349,7 +4349,7 @@ public = [
"RadrootsNostrEvent",
"RadrootsNostrEventRef",
"RadrootsNostrEventPtr",
- "RadrootsOrderListingAddress",
+ "RadrootsListingAddress",
"RadrootsProfile",
"RadrootsFarm",
"RadrootsListing",
diff --git a/spec/RCLD.md b/spec/RCLD.md
@@ -126,7 +126,7 @@ Examples:
- `RadrootsSignedNostrEvent`
- `RadrootsNostrEvent`
- `RadrootsNostrEventRef`
-- `RadrootsOrderListingAddress`
+- `RadrootsListingAddress`
### 3. Shared Errors
@@ -341,7 +341,7 @@ Input:
Output:
-- `RadrootsOrderListingAddress`
+- `RadrootsListingAddress`
Determinism:
@@ -381,7 +381,7 @@ Recommended Tier 1 shared types:
- `RadrootsNostrEvent`
- `RadrootsNostrEventRef`
- `RadrootsNostrEventPtr`
-- `RadrootsOrderListingAddress`
+- `RadrootsListingAddress`
- public model types required by Tier 1 operations:
- `RadrootsProfile`
- `RadrootsFarm`
@@ -509,7 +509,7 @@ public = [
"RadrootsNostrEvent",
"RadrootsNostrEventRef",
"RadrootsNostrEventPtr",
- "RadrootsOrderListingAddress",
+ "RadrootsListingAddress",
"RadrootsProfile",
"RadrootsFarm",
"RadrootsListing",
@@ -618,7 +618,7 @@ networking = "native"
"RadrootsFrozenEventDraft" = "RadrootsFrozenEventDraft"
"RadrootsSignedNostrEvent" = "RadrootsSignedNostrEvent"
"RadrootsNostrEvent" = "RadrootsNostrEvent"
-"RadrootsOrderListingAddress" = "OrderListingAddress"
+"RadrootsListingAddress" = "ListingAddress"
[artifacts]
models_dir = "src/generated"
diff --git a/spec/README.md b/spec/README.md
@@ -96,6 +96,7 @@ The public Rust story is tiered explicitly.
- `radroots_replica_sync`
- Deferred crates.io publication:
- `radroots_types`
+ - `radroots_authority`
- `radroots_event_store`
- `radroots_outbox`
- `radroots_relay_transport`
diff --git a/spec/manifest.toml b/spec/manifest.toml
@@ -42,6 +42,7 @@ published_support = [
]
deferred_publication = [
"radroots_types",
+ "radroots_authority",
"radroots_event_store",
"radroots_outbox",
"radroots_relay_transport",
diff --git a/spec/operations.toml b/spec/operations.toml
@@ -14,7 +14,7 @@ public = [
"RadrootsNostrEvent",
"RadrootsNostrEventRef",
"RadrootsNostrEventPtr",
- "RadrootsOrderListingAddress",
+ "RadrootsListingAddress",
"RadrootsProfile",
"RadrootsFarm",
"RadrootsListing",
@@ -368,7 +368,7 @@ domain = "order"
id = "order.parse_listing_address"
stability = "beta"
inputs = ["listing_addr"]
-outputs = ["RadrootsOrderListingAddress"]
+outputs = ["RadrootsListingAddress"]
error_class = "address_error"
deterministic = true
signing = "native"
@@ -377,7 +377,7 @@ transport = "native"
[operations.order_parse_listing_address.implementation]
rust_modules = ["crates/events_codec/src/order/decode.rs"]
rust_types = [
- "radroots_events_codec::order::decode::RadrootsOrderListingAddress",
+ "radroots_events::ids::RadrootsListingAddress",
]
[operations.order_parse_listing_address.conformance]
diff --git a/spec/sdk-exports/go.toml b/spec/sdk-exports/go.toml
@@ -39,7 +39,7 @@ order = 3
"RadrootsNostrEvent" = "RadrootsNostrEvent"
"RadrootsNostrEventRef" = "RadrootsNostrEventRef"
"RadrootsNostrEventPtr" = "RadrootsNostrEventPtr"
-"RadrootsOrderListingAddress" = "OrderListingAddress"
+"RadrootsListingAddress" = "ListingAddress"
"RadrootsProfile" = "RadrootsProfile"
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
diff --git a/spec/sdk-exports/kotlin.toml b/spec/sdk-exports/kotlin.toml
@@ -39,7 +39,7 @@ order = 2
"RadrootsNostrEvent" = "RadrootsNostrEvent"
"RadrootsNostrEventRef" = "RadrootsNostrEventRef"
"RadrootsNostrEventPtr" = "RadrootsNostrEventPtr"
-"RadrootsOrderListingAddress" = "OrderListingAddress"
+"RadrootsListingAddress" = "ListingAddress"
"RadrootsProfile" = "RadrootsProfile"
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
diff --git a/spec/sdk-exports/py.toml b/spec/sdk-exports/py.toml
@@ -39,7 +39,7 @@ order = 3
"RadrootsNostrEvent" = "RadrootsNostrEvent"
"RadrootsNostrEventRef" = "RadrootsNostrEventRef"
"RadrootsNostrEventPtr" = "RadrootsNostrEventPtr"
-"RadrootsOrderListingAddress" = "OrderListingAddress"
+"RadrootsListingAddress" = "ListingAddress"
"RadrootsProfile" = "RadrootsProfile"
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
diff --git a/spec/sdk-exports/swift.toml b/spec/sdk-exports/swift.toml
@@ -39,7 +39,7 @@ order = 2
"RadrootsNostrEvent" = "RadrootsNostrEvent"
"RadrootsNostrEventRef" = "RadrootsNostrEventRef"
"RadrootsNostrEventPtr" = "RadrootsNostrEventPtr"
-"RadrootsOrderListingAddress" = "OrderListingAddress"
+"RadrootsListingAddress" = "ListingAddress"
"RadrootsProfile" = "RadrootsProfile"
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"
diff --git a/spec/sdk-exports/ts.toml b/spec/sdk-exports/ts.toml
@@ -40,7 +40,7 @@ order = 1
"RadrootsNostrEvent" = "RadrootsNostrEvent"
"RadrootsNostrEventRef" = "RadrootsNostrEventRef"
"RadrootsNostrEventPtr" = "RadrootsNostrEventPtr"
-"RadrootsOrderListingAddress" = "OrderListingAddress"
+"RadrootsListingAddress" = "ListingAddress"
"RadrootsProfile" = "RadrootsProfile"
"RadrootsFarm" = "RadrootsFarm"
"RadrootsListing" = "RadrootsListing"