1use chrono::{DateTime, Utc};
2use rust_decimal::Decimal;
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6use hypercall_types::WalletAddress;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct PmSettlementPoolProjection {
10 pub underlying: String,
11 pub config_version: i32,
12 pub policy_version: i32,
13 pub pool_available_usdc: Decimal,
14 pub pool_target_usdc: Decimal,
15 pub pool_capacity_usdc: Decimal,
16 pub pool_utilization: Option<Decimal>,
17 pub active_timing_bridge_usdc: Decimal,
18 pub active_settlement_debt_usdc: Decimal,
19 pub target_short_oi_notional_multiplier: Option<Decimal>,
20 pub utilization_kink: Option<Decimal>,
21 pub apr_at_kink: Option<Decimal>,
22 pub max_apr: Option<Decimal>,
23 pub normal_utilization_cap: Option<Decimal>,
24 pub crisis_utilization_cap: Option<Decimal>,
25 pub bridge_window_ms: Option<i64>,
26 pub last_engine_command_id: i64,
27 pub projection_seq: i64,
28 pub updated_at: DateTime<Utc>,
29}
30
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32pub struct PmSettlementAccountProjection {
33 pub wallet: WalletAddress,
34 pub underlying: String,
35 pub status: String,
36 pub timing_bridge_principal_usdc: Decimal,
37 pub settlement_debt_principal_usdc: Decimal,
38 pub accrued_interest_usdc: Decimal,
39 pub interest_cursor_ms: i64,
40 pub bridge_deadline_ms: Option<i64>,
41 pub active_recovery_plan_id: Option<String>,
42 pub policy_version: i32,
43 pub last_engine_command_id: i64,
44 pub projection_seq: i64,
45 pub updated_at: DateTime<Utc>,
46}
47
48#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
49pub struct PmSettlementAccountGateCounts {
50 pub total_accounts: i64,
51 pub bridged_accounts: i64,
52 pub debt_accounts: i64,
53 pub overdue_bridge_accounts: i64,
54 pub active_recovery_accounts: i64,
55 pub active_bridge_usdc: Decimal,
56 pub active_debt_usdc: Decimal,
57}
58
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
60pub struct PmSettlementPoolGateCounts {
61 pub total_pools: i64,
62 pub below_target_pools: i64,
63 pub above_crisis_cap_pools: i64,
64 pub missing_utilization_pools: i64,
65 pub missing_crisis_cap_pools: i64,
66}
67
68#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
69pub struct PmRecoveryActionGateCounts {
70 pub total_actions: i64,
71 pub planned_actions: i64,
72 pub submitted_actions: i64,
73 pub terminal_actions: i64,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
77pub struct PmSettlementEventProjection {
78 pub event_key: String,
79 pub wallet: WalletAddress,
80 pub underlying: String,
81 pub event_type: String,
82 pub amount_usdc: Decimal,
83 pub request_id: Uuid,
84 pub input_digest: String,
85 pub engine_command_id: i64,
86 pub projection_seq: i64,
87 pub created_at: DateTime<Utc>,
88}
89
90#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
91pub struct PmSettlementInterestEventProjection {
92 pub request_id: Uuid,
93 pub wallet: WalletAddress,
94 pub underlying: String,
95 pub from_ms: i64,
96 pub to_ms: i64,
97 pub utilization: Decimal,
98 pub apr: Decimal,
99 pub interest_usdc: Decimal,
100 pub policy_version: i32,
101 pub engine_command_id: i64,
102 pub projection_seq: i64,
103 pub created_at: DateTime<Utc>,
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
107pub struct PmSettlementRepaymentEventProjection {
108 pub request_id: Uuid,
109 pub wallet: WalletAddress,
110 pub underlying: String,
111 pub amount_usdc: Decimal,
112 pub interest_paid_usdc: Decimal,
113 pub principal_paid_usdc: Decimal,
114 pub reason: String,
115 pub source_event_id: String,
116 pub engine_command_id: i64,
117 pub projection_seq: i64,
118 pub created_at: DateTime<Utc>,
119}
120
121#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
122pub struct PmRecoveryPlanProjection {
123 pub plan_id: String,
124 pub wallet: WalletAddress,
125 pub underlying: String,
126 pub status: String,
127 pub placeholder: bool,
128 pub trigger: Option<String>,
129 pub reason: Option<String>,
130 pub policy_version: Option<i32>,
131 pub recovery_priority_version: Option<i32>,
132 pub target_reduction_usdc: Option<Decimal>,
133 pub expected_usdc_recovered: Option<Decimal>,
134 pub expected_obligation_reduced: Option<Decimal>,
135 pub expected_impact_usdc: Option<Decimal>,
136 pub post_plan_utilization: Option<Decimal>,
137 pub engine_command_id: i64,
138 pub projection_seq: i64,
139 pub created_at: DateTime<Utc>,
140 pub updated_at: DateTime<Utc>,
141}
142
143#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
144pub struct PmRecoveryActionProjection {
145 pub plan_id: String,
146 pub action_id: String,
147 pub action_type: String,
148 pub status: String,
149 pub target: Option<String>,
150 pub attempt: Option<i32>,
151 pub external_id: Option<String>,
152 pub external_kind: Option<String>,
153 pub result_external_id: Option<String>,
154 pub result: Option<String>,
155 pub expected_usdc_recovered: Option<Decimal>,
156 pub expected_obligation_reduced: Option<Decimal>,
157 pub expected_impact_usdc: Option<Decimal>,
158 pub recovered_usdc: Option<Decimal>,
159 pub liability_reduction_usdc: Option<Decimal>,
160 pub engine_command_id: i64,
161 pub projection_seq: i64,
162 pub created_at: DateTime<Utc>,
163 pub updated_at: DateTime<Utc>,
164}
165
166#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
167pub enum PmSettlementProjectionWrite {
168 Pool(PmSettlementPoolProjectionWrite),
169 Account(PmSettlementAccountProjectionWrite),
170 Event(PmSettlementEventProjectionWrite),
171 InterestEvent(PmSettlementInterestEventProjectionWrite),
172 RepaymentEvent(PmSettlementRepaymentEventProjectionWrite),
173 VaultDeposit(PmVaultDepositProjectionWrite),
174 VaultWithdrawal(PmVaultWithdrawalProjectionWrite),
175 RecoveryPlan(PmRecoveryPlanProjectionWrite),
176}
177
178#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
179pub struct PmSettlementPoolProjectionWrite {
180 pub underlying: String,
181 pub config_version: i32,
182 pub policy_version: i32,
183 pub pool_available_usdc: Decimal,
184 pub pool_target_usdc: Decimal,
185 pub pool_capacity_usdc: Decimal,
186 pub pool_utilization: Option<Decimal>,
187 pub active_timing_bridge_usdc: Decimal,
188 pub active_settlement_debt_usdc: Decimal,
189 pub target_short_oi_notional_multiplier: Option<Decimal>,
190 pub utilization_kink: Option<Decimal>,
191 pub apr_at_kink: Option<Decimal>,
192 pub max_apr: Option<Decimal>,
193 pub normal_utilization_cap: Option<Decimal>,
194 pub crisis_utilization_cap: Option<Decimal>,
195 pub bridge_window_ms: Option<i64>,
196 pub projection_seq: i64,
197 pub updated_at_ms: i64,
198}
199
200#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
201pub struct PmSettlementAccountProjectionWrite {
202 pub wallet: WalletAddress,
203 pub underlying: String,
204 pub status: String,
205 pub timing_bridge_principal_usdc: Decimal,
206 pub settlement_debt_principal_usdc: Decimal,
207 pub accrued_interest_usdc: Decimal,
208 pub interest_cursor_ms: i64,
209 pub bridge_deadline_ms: Option<i64>,
210 pub active_recovery_plan_id: Option<String>,
211 pub policy_version: i32,
212 pub projection_seq: i64,
213 pub updated_at_ms: i64,
214}
215
216#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
217pub struct PmSettlementEventProjectionWrite {
218 pub event_key: String,
219 pub wallet: WalletAddress,
220 pub underlying: String,
221 pub event_type: String,
222 pub amount_usdc: Decimal,
223 pub request_id: Uuid,
224 pub input_digest: String,
225}
226
227#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
228pub struct PmSettlementInterestEventProjectionWrite {
229 pub request_id: Uuid,
230 pub wallet: WalletAddress,
231 pub underlying: String,
232 pub from_ms: i64,
233 pub to_ms: i64,
234 pub utilization: Decimal,
235 pub apr: Decimal,
236 pub interest_usdc: Decimal,
237 pub policy_version: i32,
238}
239
240#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
241pub struct PmSettlementRepaymentEventProjectionWrite {
242 pub request_id: Uuid,
243 pub wallet: WalletAddress,
244 pub underlying: String,
245 pub amount_usdc: Decimal,
246 pub interest_paid_usdc: Decimal,
247 pub principal_paid_usdc: Decimal,
248 pub reason: String,
249 pub source_event_id: String,
250}
251
252#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
253pub struct PmVaultDepositProjectionWrite {
254 pub deposit_id: Uuid,
255 pub depositor: WalletAddress,
256 pub underlying: String,
257 pub principal_usdc: Decimal,
258 pub remaining_usdc: Decimal,
259 pub withdrawn_usdc: Decimal,
260 pub reserved_withdrawal_usdc: Decimal,
261 pub chain_id: i64,
262 pub source_contract_address: WalletAddress,
263 pub tx_hash: String,
264 pub log_index: i32,
265 pub max_listed_expiry_ts_ms: i64,
266 pub settlement_grace_ms: i64,
267 pub lock_until_ms: i64,
268 pub status: PmVaultDepositProjectionStatus,
269 pub projection_seq: i64,
270 pub created_at_ms: i64,
271 pub updated_at_ms: i64,
272}
273
274#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
275pub struct PmVaultWithdrawalProjectionWrite {
276 pub withdrawal_id: Uuid,
277 pub deposit_id: Uuid,
278 pub depositor: WalletAddress,
279 pub underlying: String,
280 pub amount_usdc: Decimal,
281 pub lock_until_ms: i64,
282 pub status: PmVaultWithdrawalProjectionStatus,
283 pub projection_seq: i64,
284 pub requested_at_ms: i64,
285 pub updated_at_ms: i64,
286}
287
288#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
289pub enum PmVaultDepositProjectionStatus {
290 Active,
291 PartiallyReserved,
292 Reserved,
293}
294
295impl PmVaultDepositProjectionStatus {
296 pub fn as_str(self) -> &'static str {
297 match self {
298 Self::Active => "Active",
299 Self::PartiallyReserved => "PartiallyReserved",
300 Self::Reserved => "Reserved",
301 }
302 }
303}
304
305#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
306pub enum PmVaultWithdrawalProjectionStatus {
307 Reserved,
308}
309
310impl PmVaultWithdrawalProjectionStatus {
311 pub fn as_str(self) -> &'static str {
312 match self {
313 Self::Reserved => "Reserved",
314 }
315 }
316}
317
318#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
319pub struct PmRecoveryPlanProjectionWrite {
320 pub plan_id: String,
321 pub wallet: WalletAddress,
322 pub underlying: String,
323 pub status: String,
324 pub trigger: String,
325 pub reason: String,
326 pub policy_version: i32,
327 pub recovery_priority_version: i32,
328 pub target_reduction_usdc: Decimal,
329 pub expected_usdc_recovered: Decimal,
330 pub expected_obligation_reduced: Decimal,
331 pub expected_impact_usdc: Decimal,
332 pub post_plan_utilization: Option<Decimal>,
333 pub projection_seq: i64,
334 pub updated_at_ms: i64,
335 pub actions: Vec<PmRecoveryActionProjectionWrite>,
336}
337
338#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
339pub struct PmRecoveryActionProjectionWrite {
340 pub plan_id: String,
341 pub action_id: String,
342 pub action_type: String,
343 pub status: String,
344 pub target: String,
345 pub attempt: i32,
346 pub external_id: Option<String>,
347 pub external_kind: Option<String>,
348 pub result_external_id: Option<String>,
349 pub result: Option<String>,
350 pub expected_usdc_recovered: Decimal,
351 pub expected_obligation_reduced: Decimal,
352 pub expected_impact_usdc: Decimal,
353 pub recovered_usdc: Decimal,
354 pub liability_reduction_usdc: Decimal,
355 pub projection_seq: i64,
356 pub updated_at_ms: i64,
357}