Skip to main content

hypercall_db/types/
pm_settlement.rs

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}