commit 8101c9ae14012f2b1e22a0d6db25b2302e54385c
parent ca48754f8c7775dee8368d245f305ba3f892353a
Author: triesap <tyson@radroots.org>
Date: Mon, 25 May 2026 20:35:19 +0000
order: use observed listing provenance
- accept observed relay delivery evidence for shared signed listing provenance
- ignore target and connected relays when observed relay provenance is unknown
- keep pending and failed delivery evidence out of order relay targeting
- cover acknowledged-free observed provenance extraction in order tests
Diffstat:
| M | src/runtime/order.rs | | | 78 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ |
1 file changed, 60 insertions(+), 18 deletions(-)
diff --git a/src/runtime/order.rs b/src/runtime/order.rs
@@ -9038,10 +9038,7 @@ fn resolve_shared_signed_listing_provenance(
}
let delivery = record.relay_delivery_json.as_ref()?;
let evidence = RelayDeliveryEvidence::from_json_value(delivery).ok()?;
- if evidence.state != RelayDeliveryState::Acknowledged {
- return None;
- }
- let relays = normalize_listing_relay_set(evidence.acknowledged_relays).ok()?;
+ let relays = listing_provenance_relays_from_delivery_evidence(evidence).ok()?;
if relays.is_empty() {
return None;
}
@@ -9058,6 +9055,17 @@ fn resolve_shared_signed_listing_provenance(
Ok(candidates.pop())
}
+fn listing_provenance_relays_from_delivery_evidence(
+ evidence: RelayDeliveryEvidence,
+) -> Result<Vec<String>, String> {
+ let relays = match evidence.state {
+ RelayDeliveryState::Acknowledged => evidence.acknowledged_relays,
+ RelayDeliveryState::Observed => evidence.observed_relays,
+ RelayDeliveryState::Pending | RelayDeliveryState::Failed => Vec::new(),
+ };
+ normalize_listing_relay_set(relays)
+}
+
fn trade_product_listing_addr_filter(listing_addr: &str) -> ITradeProductFieldsFilter {
ITradeProductFieldsFilter {
id: None,
@@ -12534,20 +12542,22 @@ mod tests {
LoadedOrderDraft, ORDER_ACTOR_CONTEXT_NETWORK_ONLY, ORDER_ACTOR_CONTEXT_RESOLVED_ACCOUNT,
ORDER_BUYER_ACTOR_SOURCE_RESOLVED_ACCOUNT, ORDER_DRAFT_KIND, ORDER_SUBMIT_SOURCE,
OrderDraft, OrderDraftBuyerActor, OrderDraftDocument, OrderDraftItem, OrderStatusContext,
- ResolvedOrderEconomicsProduct, ResolvedOrderListing, ResolvedSellerOrderRequest,
- SellerOrderRequestResolution, accepted_order_decision_payload_from_request,
- active_request_record_from_resolved, canonical_order_request_payload_from_loaded,
- collect_issues, declined_order_decision_payload_from_request, inspect_document,
- next_order_id, order_accept_inventory_preflight_view_from_projection,
- order_cancellation_dry_run_view, order_cancellation_event_parts,
- order_cancellation_payload_from_status, order_cancellation_preflight_view_from_status,
- order_decision_dry_run_view, order_decision_preflight_view_from_status,
- order_decision_view_from_resolution, order_economics_from_resolved_listing,
- order_event_list_entry_from_event, order_event_list_from_receipt,
- order_fulfillment_dry_run_view, order_fulfillment_preflight_view_from_status,
- order_listing_event_ptr, order_payment_dry_run_view, order_payment_event_parts,
- order_payment_payload_from_status, order_payment_preflight_view_from_status,
- order_receipt_dry_run_view, order_receipt_event_parts, order_receipt_payload_from_status,
+ RelayDeliveryEvidence, ResolvedOrderEconomicsProduct, ResolvedOrderListing,
+ ResolvedSellerOrderRequest, SellerOrderRequestResolution,
+ accepted_order_decision_payload_from_request, active_request_record_from_resolved,
+ canonical_order_request_payload_from_loaded, collect_issues,
+ declined_order_decision_payload_from_request, inspect_document,
+ listing_provenance_relays_from_delivery_evidence, next_order_id,
+ order_accept_inventory_preflight_view_from_projection, order_cancellation_dry_run_view,
+ order_cancellation_event_parts, order_cancellation_payload_from_status,
+ order_cancellation_preflight_view_from_status, order_decision_dry_run_view,
+ order_decision_preflight_view_from_status, order_decision_view_from_resolution,
+ order_economics_from_resolved_listing, order_event_list_entry_from_event,
+ order_event_list_from_receipt, order_fulfillment_dry_run_view,
+ order_fulfillment_preflight_view_from_status, order_listing_event_ptr,
+ order_payment_dry_run_view, order_payment_event_parts, order_payment_payload_from_status,
+ order_payment_preflight_view_from_status, order_receipt_dry_run_view,
+ order_receipt_event_parts, order_receipt_payload_from_status,
order_receipt_preflight_view_from_status, order_relay_publish_client, order_request_filter,
order_revision_decision_event_parts, order_revision_decision_payload_from_proposal,
order_revision_decision_preflight_view_from_status, order_revision_event_parts,
@@ -13772,6 +13782,38 @@ mod tests {
}
#[test]
+ fn listing_provenance_relays_use_observed_relays_without_acknowledgement() {
+ let evidence = RelayDeliveryEvidence::observed(
+ ["ws://target.test"],
+ ["ws://connected.test"],
+ ["ws://observed.test"],
+ Vec::new(),
+ )
+ .expect("observed evidence");
+
+ let relays =
+ listing_provenance_relays_from_delivery_evidence(evidence).expect("listing relays");
+
+ assert_eq!(relays, vec!["ws://observed.test"]);
+ }
+
+ #[test]
+ fn listing_provenance_relays_ignore_connected_relays_when_observed_relay_is_unknown() {
+ let evidence = RelayDeliveryEvidence::observed(
+ ["ws://target.test"],
+ ["ws://connected.test"],
+ Vec::<String>::new(),
+ Vec::new(),
+ )
+ .expect("observed evidence");
+
+ let relays =
+ listing_provenance_relays_from_delivery_evidence(evidence).expect("listing relays");
+
+ assert!(relays.is_empty());
+ }
+
+ #[test]
fn order_submit_dry_run_deduplicates_identical_visible_request() {
let dir = tempdir().expect("tempdir");
let mut config = sample_config(dir.path());