Skip to main content

chio_web3/
settlement_proof_types.rs

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}