lib

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

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:
Mcrates/authority/Cargo.toml | 2+-
Mcrates/events_codec/src/order/decode.rs | 87++++++++++---------------------------------------------------------------------
Mcrates/events_codec/src/order/mod.rs | 11+++++------
Mcrates/trade/src/listing/publish.rs | 14++++++++------
Mcrates/trade/src/listing/validation.rs | 32++++++++++++++++++--------------
Mcrates/trade/src/order.rs | 46+++++++++++++++++++++++++++++-----------------
Mcrates/xtask/src/contract.rs | 2+-
Mspec/RCLD.md | 10+++++-----
Mspec/README.md | 1+
Mspec/manifest.toml | 1+
Mspec/operations.toml | 6+++---
Mspec/sdk-exports/go.toml | 2+-
Mspec/sdk-exports/kotlin.toml | 2+-
Mspec/sdk-exports/py.toml | 2+-
Mspec/sdk-exports/swift.toml | 2+-
Mspec/sdk-exports/ts.toml | 2+-
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"