rhi

Coordinated trade for connected markets
git clone https://radroots.dev/git/rhi.git
Log | Files | Refs | README | LICENSE

commit a77d44b3908e9452fbd413659825905979870f03
parent 48c1a3c3de3c906b53f30b43e62605d974f321b0
Author: triesap <tyson@radroots.org>
Date:   Sun, 14 Jun 2026 14:48:26 -0700

trade_listing: use canonical listing address parsers

- replace removed order listing address parsing with trade listing helpers
- keep generic listing validation separate from public order listing checks
- refresh Cargo.lock for the current radroots_trade graph
- verify cargo check from the rhi repository root

Diffstat:
MCargo.lock | 9+++++++++
Msrc/features/trade_listing/handlers/dvm.rs | 33++++++++++++++-------------------
2 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -3269,6 +3269,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] +name = "radroots_authority" +version = "0.1.0-alpha.2" +dependencies = [ + "radroots_events", + "thiserror 1.0.69", +] + +[[package]] name = "radroots_core" version = "0.1.0-alpha.2" dependencies = [ @@ -3421,6 +3429,7 @@ version = "0.1.0-alpha.2" dependencies = [ "base64 0.22.1", "hex", + "radroots_authority", "radroots_core", "radroots_events", "radroots_events_codec", diff --git a/src/features/trade_listing/handlers/dvm.rs b/src/features/trade_listing/handlers/dvm.rs @@ -22,12 +22,11 @@ use radroots_events::trade_validation::{ RadrootsTradeValidationListingResult as TradeListingValidateResult, }; use radroots_events_codec::order::{ - RadrootsOrderEnvelopeParseError, RadrootsOrderListingAddress as OrderListingAddress, - order_cancellation_from_event, order_decision_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, parse_order_listing_event_tag, parse_order_prev_tag, - parse_order_root_tag, + RadrootsOrderEnvelopeParseError, order_cancellation_from_event, order_decision_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, + parse_order_listing_event_tag, parse_order_prev_tag, parse_order_root_tag, }; use radroots_nostr::prelude::{ RadrootsNostrClient, RadrootsNostrEvent, RadrootsNostrEventBuilder, RadrootsNostrFilter, @@ -35,7 +34,9 @@ use radroots_nostr::prelude::{ radroots_nostr_build_event, radroots_nostr_build_event_job_feedback, radroots_nostr_fetch_event_by_id, radroots_nostr_parse_pubkey, radroots_nostr_send_event, }; -use radroots_trade::listing::validation::validate_listing_event; +use radroots_trade::listing::{ + parse_listing_address, parse_public_listing_address, validation::validate_listing_event, +}; use thiserror::Error; use crate::features::trade_listing::state::{ @@ -385,11 +386,7 @@ async fn handle_listing_validate_request( } let rr_event = radroots_event_from_nostr(event); let listing_addr = required_tag_value(&rr_event.tags, "a")?; - let parsed_listing_addr = OrderListingAddress::parse(&listing_addr) - .map_err(|_| TradeListingDvmError::InvalidListingAddr)?; - if !is_listing_kind(parsed_listing_addr.kind) { - return Err(TradeListingDvmError::InvalidListingAddr); - } + parse_listing_address(&listing_addr).map_err(|_| TradeListingDvmError::InvalidListingAddr)?; let payload: TradeListingValidateRequest = serde_json::from_str(&event.content)?; let listing_event = resolve_listing_event(client, &listing_addr, payload.listing_event).await; let (validated_event_id, errors) = match listing_event { @@ -494,11 +491,9 @@ async fn handle_order_request( ) -> Result<(), TradeListingDvmError> { let rr_event = radroots_event_from_nostr(event); let envelope = order_request_from_event(&rr_event).map_err(map_order_parse_error)?; - let listing_addr = OrderListingAddress::parse(&envelope.listing_addr) + let listing_addr = parse_public_listing_address(&envelope.listing_addr) .map_err(|_| TradeListingDvmError::InvalidListingAddr)?; - if !is_listing_kind(listing_addr.kind) - || envelope.payload.seller_pubkey != listing_addr.seller_pubkey - { + if envelope.payload.seller_pubkey != listing_addr.seller_pubkey { return Err(TradeListingDvmError::InvalidListingAddr); } let listing_event = parse_order_listing_event_tag(&rr_event.tags) @@ -821,15 +816,15 @@ async fn fetch_listing_by_addr( client: &RadrootsNostrClient, listing_addr: &str, ) -> Result<Option<RadrootsNostrEvent>, TradeListingDvmError> { - let addr = OrderListingAddress::parse(listing_addr) + let addr = parse_listing_address(listing_addr) .map_err(|_| TradeListingDvmError::InvalidListingAddr)?; - let author = radroots_nostr_parse_pubkey(&addr.seller_pubkey) + let author = radroots_nostr_parse_pubkey(addr.seller_pubkey.as_str()) .map_err(|_| TradeListingDvmError::InvalidListingAddr)?; let kind = u16::try_from(addr.kind).map_err(|_| TradeListingDvmError::InvalidListingAddr)?; let filter = RadrootsNostrFilter::new() .kind(RadrootsNostrKind::Custom(kind)) .author(author) - .identifier(addr.listing_id); + .identifier(addr.listing_id.into_string()); let events = fetch_events_io(client, filter, Duration::from_secs(10)).await?; Ok(events .into_iter()