1use serde::{Deserialize, Serialize};
2
3use crate::crypto::PublicKey;
4use crate::identity::SignedWeb3IdentityBinding;
5use crate::settlement::Web3SettlementExecutionReceiptArtifact;
6use crate::trust_profile::Web3SettlementPath;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(deny_unknown_fields)]
10pub struct PublicSettlementProofBundle {
11 pub schema: String,
12 pub bundle_id: String,
13 pub transaction_passport_id: String,
14 pub commerce_order_id: String,
15 pub order_binding: PublicSettlementOrderBinding,
16 pub chain_id: String,
17 pub settlement_receipt: Web3SettlementExecutionReceiptArtifact,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub deployment_provenance: Option<PublicSettlementDeploymentProvenance>,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub public_witness: Option<PublicSettlementWitnessReport>,
22 pub chain_snapshot: PublicSettlementChainSnapshot,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub dispute_snapshot: Option<PublicSettlementDisputeSnapshot>,
25 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub collateral_position_ref: Option<String>,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub guarantee_decision_ref: Option<String>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
30 pub sla_remedy_ref: Option<String>,
31 #[serde(default, skip_serializing_if = "Option::is_none")]
32 pub slash_authority_ref: Option<String>,
33 pub required_confirmations: u32,
34 pub observed_confirmations: u32,
35 pub dispute_posture: PublicSettlementDisputePosture,
36 #[serde(default, skip_serializing_if = "Option::is_none")]
37 pub bundle_signature: Option<PublicSettlementBundleSignature>,
38}
39
40impl PublicSettlementProofBundle {
41 pub fn has_trust_market_refs(&self) -> bool {
42 self.collateral_position_ref.is_some()
43 || self.guarantee_decision_ref.is_some()
44 || self.sla_remedy_ref.is_some()
45 || self.slash_authority_ref.is_some()
46 }
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50#[serde(deny_unknown_fields)]
51pub struct PublicSettlementBundleSignature {
52 pub algorithm: String,
53 pub signer_key: String,
54 pub signature: String,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58#[serde(deny_unknown_fields)]
59pub struct PublicSettlementOrderBinding {
60 pub transaction_passport_id: String,
61 pub commerce_order_id: String,
62 pub chain_id: String,
63 pub settlement_rail_id: String,
64 pub custody_provider_id: String,
65 pub settlement_reference: String,
66 pub settlement_tx_hash: String,
67 pub beneficiary_address: String,
68 pub escrow_id: String,
69 pub settlement_amount: crate::capability::scope::MonetaryAmount,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
73#[serde(deny_unknown_fields)]
74pub struct PublicSettlementDeploymentProvenance {
75 pub provenance_id: String,
76 pub chain_id: String,
77 pub contract_package_id: String,
78 pub reviewed_manifest_hash: String,
79 pub approval_hash: String,
80 pub create2_factory: String,
81 pub salt_namespace: String,
82 pub settlement_token_address: String,
83 pub root_registry_address: String,
84 pub root_registry_runtime_codehash: String,
85 pub identity_registry_address: String,
86 pub identity_registry_runtime_codehash: String,
87 pub escrow_contract: String,
88 pub escrow_runtime_codehash: String,
89 pub bond_vault_contract: String,
90 pub bond_vault_runtime_codehash: String,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[serde(deny_unknown_fields)]
95pub struct PublicSettlementWitnessReport {
96 pub witness_id: String,
97 pub mode: PublicSettlementWitnessMode,
98 pub body_hash: String,
99 pub chain_id: String,
100 pub registry_root: String,
101 pub root_registry_address: String,
102 pub root_registry_runtime_codehash: String,
103 pub identity_registry_address: String,
104 pub identity_registry_runtime_codehash: String,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
106 pub identity_registry_operator: Option<PublicSettlementIdentityRegistryOperatorSnapshot>,
107 pub escrow_contract: String,
108 pub escrow_runtime_codehash: String,
109 pub settlement_token_address: String,
110 pub bond_vault_contract: String,
111 pub bond_vault_runtime_codehash: String,
112 pub anchor_tx_hash: String,
113 pub anchored_merkle_root: String,
114 pub anchored_checkpoint_seq: u64,
115 pub observed_at: u64,
116}
117
118#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
119#[serde(rename_all = "snake_case")]
120pub enum PublicSettlementWitnessMode {
121 Live,
122 VerifiedCache,
123 Advisory,
124}
125
126#[derive(Debug, Clone, Default)]
127pub struct PublicSettlementVerifierTrust {
128 pub trusted_bundle_signer_keys: Vec<PublicKey>,
129 pub trusted_capital_signer_keys: Vec<PublicKey>,
130 pub trusted_anchor_kernel_keys: Vec<PublicKey>,
131 pub trusted_beneficiary_identity_keys: Vec<PublicKey>,
132 pub trusted_oracle_keys: Vec<PublicKey>,
133 pub allowed_chain_ids: Vec<String>,
134 pub mainnet_blocked: bool,
135 pub minimum_confirmations: Option<u32>,
136 pub expected_trust_market_context: Option<PublicSettlementTrustMarketContext>,
137 pub independent_chain_head: Option<PublicSettlementIndependentChainHead>,
138 pub trusted_dispute_event_blocks: Vec<PublicSettlementBlockSnapshot>,
139 pub trusted_release_event_blocks: Vec<PublicSettlementBlockSnapshot>,
140 pub trusted_release_event_logs: Vec<PublicSettlementReleaseEventLog>,
141 pub trusted_refund_event_logs: Vec<PublicSettlementRefundEventLog>,
142 pub verifier_now_unix_seconds: Option<u64>,
143 pub trusted_runtime_codehashes: Option<PublicSettlementRuntimeCodehashTrust>,
144}
145
146#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
147#[serde(deny_unknown_fields)]
148pub struct PublicSettlementRuntimeCodehashTrust {
149 pub contract_package_id: String,
150 pub reviewed_manifest_hash: String,
151 pub root_registry_runtime_codehash: String,
152 pub identity_registry_runtime_codehash: String,
153 pub escrow_runtime_codehash: String,
154 pub bond_vault_runtime_codehash: String,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
158#[serde(deny_unknown_fields)]
159pub struct PublicSettlementIndependentChainHead {
160 pub chain_id: String,
161 pub observed_block_number: u64,
162 pub observed_block_hash: String,
163 pub latest_block_number: u64,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize)]
167#[serde(deny_unknown_fields)]
168pub struct PublicSettlementChainSnapshot {
169 pub chain_id: String,
170 pub observed_block_number: u64,
171 pub latest_block_number: u64,
172 pub max_block_lag: u64,
173 pub root_registry_address: String,
174 pub root_registry_runtime_codehash: String,
175 pub identity_registry_address: String,
176 pub identity_registry_runtime_codehash: String,
177 #[serde(default, skip_serializing_if = "Option::is_none")]
178 pub identity_registry_operator: Option<PublicSettlementIdentityRegistryOperatorSnapshot>,
179 pub registry_root: String,
180 pub escrow: PublicSettlementEscrowSnapshot,
181 #[serde(default, skip_serializing_if = "Option::is_none")]
182 pub bond: Option<PublicSettlementBondSnapshot>,
183 #[serde(default, skip_serializing_if = "Option::is_none")]
184 pub block: Option<PublicSettlementBlockSnapshot>,
185 #[serde(default, skip_serializing_if = "Option::is_none")]
186 pub beneficiary_identity_binding: Option<SignedWeb3IdentityBinding>,
187}
188
189#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
190#[serde(deny_unknown_fields)]
191pub struct PublicSettlementIdentityRegistryOperatorSnapshot {
192 pub identity_registry_contract: String,
193 pub operator_address: String,
194 pub operator_key_hash: String,
195 pub settlement_key: String,
196 pub operator_epoch: u64,
197 pub active: bool,
198 pub block_number: u64,
199 pub block_hash: String,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
203#[serde(deny_unknown_fields)]
204pub struct PublicSettlementEscrowSnapshot {
205 pub escrow_id: String,
206 pub escrow_contract: String,
207 pub escrow_runtime_codehash: String,
208 pub settlement_token_address: String,
209 pub beneficiary_address: String,
210 pub locked_amount: crate::capability::scope::MonetaryAmount,
211 pub released_amount: crate::capability::scope::MonetaryAmount,
212 pub refunded: bool,
213 #[serde(default, skip_serializing_if = "Option::is_none")]
214 pub release_event: Option<PublicSettlementReleaseEvent>,
215 #[serde(default, skip_serializing_if = "Option::is_none")]
216 pub refund_event: Option<PublicSettlementRefundEvent>,
217}
218
219#[derive(Debug, Clone, Serialize, Deserialize)]
220#[serde(deny_unknown_fields)]
221pub struct PublicSettlementReleaseEvent {
222 pub escrow_id: String,
223 pub release_tx_hash: String,
224 pub receipt_hash: String,
225 pub amount: crate::capability::scope::MonetaryAmount,
226 #[serde(default, skip_serializing_if = "Option::is_none")]
227 pub remaining_amount: Option<crate::capability::scope::MonetaryAmount>,
228 pub partial: bool,
229 pub block: PublicSettlementBlockSnapshot,
230}
231
232#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
233#[serde(rename_all = "snake_case")]
234pub enum PublicSettlementReleaseEventKind {
235 EscrowReleased,
236 EscrowPartialRelease,
237}
238
239#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
240#[serde(deny_unknown_fields)]
241pub struct PublicSettlementReleaseEventLog {
242 pub contract_address: String,
243 pub event: PublicSettlementReleaseEventKind,
244 pub escrow_id: String,
245 pub release_tx_hash: String,
246 pub receipt_hash: String,
247 pub amount: crate::capability::scope::MonetaryAmount,
248 #[serde(default, skip_serializing_if = "Option::is_none")]
249 pub remaining_amount: Option<crate::capability::scope::MonetaryAmount>,
250 pub block_number: u64,
251 pub block_hash: String,
252 pub log_index: u64,
253}
254
255#[derive(Debug, Clone, Serialize, Deserialize)]
256#[serde(deny_unknown_fields)]
257pub struct PublicSettlementRefundEvent {
258 pub escrow_id: String,
259 pub refund_tx_hash: String,
260 pub amount: crate::capability::scope::MonetaryAmount,
261 pub block: PublicSettlementBlockSnapshot,
262}
263
264#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
265#[serde(deny_unknown_fields)]
266pub struct PublicSettlementRefundEventLog {
267 pub contract_address: String,
268 pub escrow_id: String,
269 pub refund_tx_hash: String,
270 pub amount: crate::capability::scope::MonetaryAmount,
271 pub block_number: u64,
272 pub block_hash: String,
273 pub log_index: u64,
274}
275
276#[derive(Debug, Clone, Serialize, Deserialize)]
277#[serde(deny_unknown_fields)]
278pub struct PublicSettlementBondSnapshot {
279 pub bond_vault_contract: String,
280 pub bond_vault_runtime_codehash: String,
281 pub posted_amount: crate::capability::scope::MonetaryAmount,
282 pub minimum_required_amount: crate::capability::scope::MonetaryAmount,
283}
284
285#[derive(Debug, Clone, Serialize, Deserialize)]
286#[serde(deny_unknown_fields)]
287pub struct PublicSettlementBlockSnapshot {
288 pub block_number: u64,
289 pub block_hash: String,
290 pub transaction_hashes: Vec<String>,
291}
292
293#[derive(Debug, Clone, Serialize, Deserialize)]
294#[serde(deny_unknown_fields)]
295pub struct PublicSettlementDisputeSnapshot {
296 pub schema: String,
297 pub dispute_id: String,
298 pub posture: PublicSettlementDisputePosture,
299 pub observed_at: u64,
300 pub challenge_window_secs: u64,
301 pub window_closed_at: u64,
302 pub open_dispute_count: u32,
303 pub linked_receipt_ids: Vec<String>,
304 pub chain_event_tx_hashes: Vec<String>,
305 #[serde(default, skip_serializing_if = "Vec::is_empty")]
306 pub chain_event_blocks: Vec<PublicSettlementBlockSnapshot>,
307}
308
309#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
310#[serde(rename_all = "snake_case")]
311pub enum PublicSettlementDisputePosture {
312 Undisputed,
313 Challenged,
314 Bonded,
315 Slashed,
316 Refunded,
317 Appealed,
318 Closed,
319}
320
321#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
322#[serde(deny_unknown_fields)]
323pub struct PublicSettlementVerifierReport {
324 pub schema: String,
325 pub id: String,
326 pub verdict: String,
327 pub bundle_id: String,
328 pub transaction_passport_id: String,
329 pub commerce_order_id: String,
330 pub recomputed_settlement_state: String,
331 pub chain_context: PublicSettlementChainContext,
332 pub public_witness: PublicSettlementWitnessContext,
333 pub finality_decision: PublicSettlementFinalityDecision,
334 pub dispute_context: PublicSettlementDisputeContext,
335 pub dispute_posture: PublicSettlementDisputePosture,
336 #[serde(default, skip_serializing_if = "Option::is_none")]
337 pub trust_market_context: Option<PublicSettlementTrustMarketContext>,
338 pub verified_claims: Vec<String>,
339}
340
341#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
342#[serde(deny_unknown_fields)]
343pub struct PublicSettlementChainContext {
344 pub chain_id: String,
345 pub settlement_path: Web3SettlementPath,
346 pub settlement_reference: String,
347 pub observed_block_number: u64,
348 pub registry_root: String,
349 pub escrow_id: String,
350 pub bond_vault_contract: String,
351 pub posted_bond_amount: crate::capability::scope::MonetaryAmount,
352 pub minimum_bond_amount: crate::capability::scope::MonetaryAmount,
353 pub block_hash: String,
354 pub anchor_tx_hash: String,
355 pub settlement_tx_hash: String,
356 pub beneficiary_address: String,
357 pub beneficiary_chio_identity: String,
358}
359
360#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
361#[serde(deny_unknown_fields)]
362pub struct PublicSettlementWitnessContext {
363 pub witness_id: String,
364 pub mode: PublicSettlementWitnessMode,
365 pub body_hash: String,
366 pub observed_at: u64,
367}
368
369#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
370#[serde(deny_unknown_fields)]
371pub struct PublicSettlementDisputeContext {
372 pub dispute_id: String,
373 pub posture: PublicSettlementDisputePosture,
374 pub observed_at: u64,
375 pub challenge_window_secs: u64,
376 pub window_closed_at: u64,
377 pub open_dispute_count: u32,
378}
379
380#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
381#[serde(deny_unknown_fields)]
382pub struct PublicSettlementFinalityDecision {
383 pub status: String,
384 pub required_confirmations: u32,
385 pub observed_confirmations: u32,
386}
387
388#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
389#[serde(deny_unknown_fields)]
390pub struct PublicSettlementTrustMarketContext {
391 pub collateral_position_ref: String,
392 pub guarantee_decision_ref: String,
393 pub sla_remedy_ref: String,
394 pub slash_authority_ref: String,
395}