commit 05530a10ed58910f9309e1560820c9091edf300e
parent a4c9f542d50475f1d0f290214e29f68d3aa75e1f
Author: triesap <tyson@radroots.org>
Date: Wed, 1 Jul 2026 07:33:27 +0000
sdk: expose validation trust receipt fields
- carry shared validation authority and confidence types in DVM ingest receipts
- re-export the shared trust contract from the runtime SDK surface
- preserve local-only confidence until product validation APIs classify RHI evidence
- validate with radroots_sdk fmt, focused DVM test, and all-features check
Diffstat:
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/crates/sdk/src/dvm_runtime.rs b/crates/sdk/src/dvm_runtime.rs
@@ -26,6 +26,7 @@ use radroots_events_codec::wire::{WireEventParts, canonicalize_tags, to_frozen_d
use radroots_trade::dvm::RadrootsTradeInventoryBinWitnessDto;
#[cfg(feature = "runtime")]
use radroots_trade::validation_receipt::{
+ RadrootsTradeCommitmentConfidence, RadrootsTradeValidationAuthority,
RadrootsValidationReceiptExpectedBinding, RadrootsValidationReceiptProofSystem,
RadrootsValidationReceiptResult, RadrootsValidationReceiptType,
verify_validation_receipt_event,
@@ -393,6 +394,8 @@ pub struct DvmValidationReceiptIngestReceipt {
pub receipt_type: RadrootsValidationReceiptType,
pub result: RadrootsValidationReceiptResult,
pub proof_system: RadrootsValidationReceiptProofSystem,
+ pub validation_authority: Option<RadrootsTradeValidationAuthority>,
+ pub commitment_confidence: RadrootsTradeCommitmentConfidence,
pub local_event_seq: i64,
pub inserted: bool,
pub refresh: SyncProjectionRefreshReceipt,
@@ -518,6 +521,8 @@ impl<'sdk> DvmClient<'sdk> {
receipt_type: verified.receipt.receipt_type,
result: verified.receipt.result,
proof_system: verified.receipt.proof.system,
+ validation_authority: None,
+ commitment_confidence: validation_receipt_ingest_confidence(verified.receipt.result),
local_event_seq: ingest.seq,
inserted: ingest.inserted,
refresh,
@@ -526,6 +531,16 @@ impl<'sdk> DvmClient<'sdk> {
}
#[cfg(feature = "runtime")]
+fn validation_receipt_ingest_confidence(
+ result: RadrootsValidationReceiptResult,
+) -> RadrootsTradeCommitmentConfidence {
+ match result {
+ RadrootsValidationReceiptResult::Valid => RadrootsTradeCommitmentConfidence::LocalOnly,
+ RadrootsValidationReceiptResult::Invalid => RadrootsTradeCommitmentConfidence::Invalid,
+ }
+}
+
+#[cfg(feature = "runtime")]
fn dvm_trade_transition_proof_plan(
request: DvmTradeTransitionProofPrepareRequest,
created_at: RadrootsSdkTimestamp,
diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs
@@ -176,3 +176,7 @@ pub use crate::trade_storage::{
};
#[cfg(feature = "runtime")]
pub use radroots_trade::dvm::RadrootsTradeInventoryBinWitnessDto;
+#[cfg(feature = "runtime")]
+pub use radroots_trade::validation_receipt::{
+ RadrootsTradeCommitmentConfidence, RadrootsTradeValidationAuthority,
+};
diff --git a/crates/sdk/tests/dvm_runtime.rs b/crates/sdk/tests/dvm_runtime.rs
@@ -37,10 +37,11 @@ use radroots_sdk::{
#[cfg(feature = "signer-adapters")]
use radroots_sdk::{RadrootsSdkLocalKeySigner, RadrootsSdkSignerProvider};
use radroots_trade::validation_receipt::{
- RadrootsTradeValidationReceipt, RadrootsValidationReceiptProof,
- RadrootsValidationReceiptProofSystem, RadrootsValidationReceiptResult,
- RadrootsValidationReceiptStatement, RadrootsValidationReceiptType,
- validation_receipt_event_build, validation_receipt_public_values_hash_hex,
+ RadrootsTradeCommitmentConfidence, RadrootsTradeValidationReceipt,
+ RadrootsValidationReceiptProof, RadrootsValidationReceiptProofSystem,
+ RadrootsValidationReceiptResult, RadrootsValidationReceiptStatement,
+ RadrootsValidationReceiptType, validation_receipt_event_build,
+ validation_receipt_public_values_hash_hex,
};
const BUYER_SECRET_KEY_HEX: &str =
@@ -313,6 +314,11 @@ async fn dvm_validation_receipt_ingest_commits_pending_trade_status() {
ingest.proof_system,
RadrootsValidationReceiptProofSystem::None
);
+ assert_eq!(ingest.validation_authority, None);
+ assert_eq!(
+ ingest.commitment_confidence,
+ RadrootsTradeCommitmentConfidence::LocalOnly
+ );
assert_eq!(ingest.local_event_seq, 3);
assert!(ingest.inserted);
assert_eq!(ingest.refresh.validation_receipts, 1);