rhi

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

commit 49e30c66dad8b1263f673e8c9d783177dbdcc7c4
parent edd69a0c12d033c6fc3aae1c17015925168762ea
Author: triesap <tyson@radroots.org>
Date:   Wed, 15 Jul 2026 01:18:45 +0000

runtime: align event envelope accessors

- replace direct event-envelope field reads with typed accessors
- raise the RHI Rust floor to 1.97.0 for the SDK/runtime stack

Diffstat:
MCargo.toml | 2+-
Mrust-toolchain.toml | 2+-
Msrc/adapters/nostr/event.rs | 6+++---
Msrc/features/trade_listing/handlers/dvm.rs | 10++++++----
Msrc/features/trade_validation_receipt.rs | 23++++++++++++++---------
5 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml @@ -3,7 +3,7 @@ name = "rhi" version = "0.1.0" edition = "2024" authors = ["Radroots Authors"] -rust-version = "1.92.0" +rust-version = "1.97.0" license = "AGPL-3.0-or-later" description = "Radroots trade validation and receipt worker" diff --git a/rust-toolchain.toml b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.92.0" +channel = "1.97.0" diff --git a/src/adapters/nostr/event.rs b/src/adapters/nostr/event.rs @@ -57,8 +57,8 @@ impl JobEventLike for NostrEventAdapter<'_> { fn raw_author(&self) -> String { self.author_hex.clone() } - fn raw_published_at(&self) -> u32 { - self.evt.created_at.as_secs() as u32 + fn raw_published_at(&self) -> u64 { + self.evt.created_at.as_secs() } fn raw_kind(&self) -> u32 { match self.evt.kind { @@ -139,7 +139,7 @@ mod tests { assert_eq!(JobEventLike::raw_kind(&adapter), 0); assert_eq!( JobEventLike::raw_published_at(&adapter), - event.created_at.as_secs() as u32 + event.created_at.as_secs() ); } } diff --git a/src/features/trade_listing/handlers/dvm.rs b/src/features/trade_listing/handlers/dvm.rs @@ -352,7 +352,7 @@ fn ensure_service_recipient( event: &RadrootsNostrEvent, keys: &RadrootsNostrKeys, ) -> Result<(), TradeListingDvmError> { - let tags = radroots_event_from_nostr(event).tags; + let tags = radroots_event_from_nostr(event).tags_as_vec(); if tag_has_value(&tags, "p", &keys.public_key().to_string()) { Ok(()) } else { @@ -394,7 +394,8 @@ 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 rr_tags = rr_event.tags_as_vec(); + let listing_addr = required_tag_value(&rr_tags, "a")?; 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; @@ -511,7 +512,8 @@ async fn handle_order_request( if request.payload.seller_pubkey != listing_addr.seller_pubkey { return Err(TradeListingDvmError::InvalidListingAddr); } - let listing_event = parse_order_listing_event_tag(&rr_event.tags) + let rr_tags = rr_event.tags_as_vec(); + let listing_event = parse_order_listing_event_tag(&rr_tags) .map_err(|error| TradeListingDvmError::InvalidPayload(error.to_string()))? .ok_or(TradeListingDvmError::MissingTag("listing_event"))?; let listing_snapshot_event_id = @@ -736,7 +738,7 @@ async fn validate_farm_dependencies( let has_profile = profile_event .map(|event| { let rr_event = radroots_event_from_nostr(&event); - tag_has_value(&rr_event.tags, "t", "radroots:type:farm") + tag_has_value(&rr_event.tags_as_vec(), "t", "radroots:type:farm") }) .unwrap_or(false); if !has_profile { diff --git a/src/features/trade_validation_receipt.rs b/src/features/trade_validation_receipt.rs @@ -9,6 +9,7 @@ use radroots_event::kinds::{ use radroots_event::order::{ RadrootsOrderDecision, RadrootsOrderDecisionOutcome, RadrootsOrderRequest, }; +use radroots_event::{RadrootsEventEnvelope, RadrootsEventEnvelopeParts}; use radroots_event_codec::order::{ order_decision_from_event, order_request_from_event, parse_order_listing_event_tag, parse_order_prev_tag, parse_order_root_tag, @@ -930,7 +931,10 @@ async fn process_trade_validation_receipt_job_request( TradeValidationReceiptJobError::InvalidActiveTradeEvent(error.to_string()) })?; - let listing_event_ptr = parse_order_listing_event_tag(&request_rr.tags) + let request_tags = request_rr.tags_as_vec(); + let decision_tags = decision_rr.tags_as_vec(); + + let listing_event_ptr = parse_order_listing_event_tag(&request_tags) .map_err(|error| { TradeValidationReceiptJobError::InvalidActiveTradeEvent(error.to_string()) })? @@ -939,10 +943,10 @@ async fn process_trade_validation_receipt_job_request( return Err(TradeValidationReceiptJobError::EventSetMismatch); } - let root_event_id = parse_order_root_tag(&decision_rr.tags).map_err(|error| { + let root_event_id = parse_order_root_tag(&decision_tags).map_err(|error| { TradeValidationReceiptJobError::InvalidActiveTradeEvent(error.to_string()) })?; - let prev_event_id = parse_order_prev_tag(&decision_rr.tags).map_err(|error| { + let prev_event_id = parse_order_prev_tag(&decision_tags).map_err(|error| { TradeValidationReceiptJobError::InvalidActiveTradeEvent(error.to_string()) })?; if root_event_id.as_deref() != Some(request.request_event_id.as_str()) @@ -982,7 +986,7 @@ async fn process_trade_validation_receipt_job_request( let receipt = validation_receipt_for_order_acceptance_proof(&proof_outcome.bundle)?; let receipt_parts = validation_receipt_event_build(&witness.request.order_id, &receipt)?; let verified_receipt = verify_validation_receipt_event( - &radroots_event::RadrootsEventEnvelope { + &RadrootsEventEnvelope::new(RadrootsEventEnvelopeParts { id: zero_event_id(), author: keys.public_key().to_string(), created_at: 0, @@ -990,7 +994,8 @@ async fn process_trade_validation_receipt_job_request( tags: receipt_parts.tags.clone(), content: receipt_parts.content.clone(), sig: zero_signature(), - }, + }) + .map_err(|_| TradeValidationReceiptJobError::InvalidSignedEvent)?, expected_receipt_binding( request, prover_policy, @@ -1819,7 +1824,7 @@ fn result_tags_from_dvm( .map_err(|_| TradeValidationReceiptJobError::EventSetMismatch)?, ), }; - let customer_pubkey = radroots_event::ids::RadrootsPublicKey::parse(request.author.as_str()) + let customer_pubkey = radroots_event::ids::RadrootsPublicKey::parse(request.author_str()) .map_err(|_| TradeValidationReceiptJobError::EventSetMismatch)?; build_transition_proof_result_tags(&request, &customer_pubkey, inputs, &binding) .map_err(TradeValidationReceiptJobError::from) @@ -6891,7 +6896,7 @@ mod tests { let mut request_json: serde_json::Value = serde_json::from_str(&job.content).expect("request json"); request_json["prover_backend"] = serde_json::Value::String("local_cpu_prove".to_string()); - let tags = radroots_event_from_nostr(&job).tags; + let tags = radroots_event_from_nostr(&job).tags_as_vec(); let job = signed_event( &requester, KIND_TRADE_TRANSITION_PROOF_REQUEST, @@ -7206,7 +7211,7 @@ mod tests { ) .is_ok() ); - assert_eq!(request_rr.kind, 3422); - assert_eq!(decision_rr.kind, 3423); + assert_eq!(request_rr.kind_u32(), 3422); + assert_eq!(decision_rr.kind_u32(), 3423); } }