1
1
#![ allow( missing_docs) ]
2
2
use crate :: math:: Decimal ;
3
- use solana_program:: { msg , pubkey:: Pubkey } ;
3
+ use solana_program:: pubkey:: Pubkey ;
4
4
use std:: fmt;
5
5
6
- #[ derive( Debug ) ]
7
- enum LogEventType {
8
- PythOraclePriceUpdateType ,
9
- SwitchboardV1OraclePriceUpdateType ,
6
+ extern crate serde;
7
+ extern crate serde_json;
8
+
9
+ #[ derive( Debug , Serialize ) ]
10
+ pub enum LogEventType {
11
+ ObligationStateUpdate ,
12
+ ProgramVersion ,
13
+ PythError ,
14
+ PythOraclePriceUpdate ,
15
+ ReserveStateUpdate ,
16
+ SwitchboardError ,
17
+ SwitchboardV1OraclePriceUpdate ,
10
18
}
11
19
12
20
impl fmt:: Display for LogEventType {
@@ -15,49 +23,115 @@ impl fmt::Display for LogEventType {
15
23
}
16
24
}
17
25
18
- pub fn emit_log_event ( e : & dyn LogEvent ) {
19
- msg ! ( "Solend Log Event" ) ;
20
- msg ! ( & e. to_string( ) ) ;
26
+ fn pubkey_serialize < S > ( x : & Pubkey , s : S ) -> Result < S :: Ok , S :: Error >
27
+ where
28
+ S : serde:: ser:: Serializer ,
29
+ {
30
+ s. serialize_str ( & x. to_string ( ) )
31
+ }
32
+
33
+ fn decimal_serialize < S > ( x : & Decimal , s : S ) -> Result < S :: Ok , S :: Error >
34
+ where
35
+ S : serde:: ser:: Serializer ,
36
+ {
37
+ s. serialize_str ( & x. to_string ( ) )
21
38
}
22
39
23
- pub trait LogEvent {
24
- fn to_string ( & self ) -> String ;
40
+ #[ macro_export]
41
+ macro_rules! emit_log_event {
42
+ ( $e: expr) => {
43
+ msg!( "solend-event-log:" ) ;
44
+ msg!( & serde_json:: to_string( $e) . unwrap( ) ) ;
45
+ } ;
25
46
}
26
47
48
+ #[ derive( Serialize ) ]
27
49
pub struct PythOraclePriceUpdate {
50
+ pub event_type : LogEventType ,
51
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
28
52
pub oracle_pubkey : Pubkey ,
53
+ #[ serde( serialize_with = "decimal_serialize" ) ]
29
54
pub price : Decimal ,
30
- pub conf : u64 ,
55
+ pub confidence : u64 ,
31
56
pub published_slot : u64 ,
32
57
}
33
58
34
- impl LogEvent for PythOraclePriceUpdate {
35
- fn to_string ( & self ) -> String {
36
- return format ! (
37
- "{},{},{},{},{}" ,
38
- LogEventType :: PythOraclePriceUpdateType . to_string( ) ,
39
- self . oracle_pubkey. to_string( ) ,
40
- self . price. to_string( ) ,
41
- self . conf. to_string( ) ,
42
- self . published_slot,
43
- ) ;
44
- }
59
+ #[ derive( Serialize ) ]
60
+ pub struct PythError {
61
+ pub event_type : LogEventType ,
62
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
63
+ pub oracle_pubkey : Pubkey ,
64
+ pub error_message : String ,
45
65
}
46
66
67
+ #[ derive( Serialize ) ]
47
68
pub struct SwitchboardV1OraclePriceUpdate {
69
+ pub event_type : LogEventType ,
70
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
48
71
pub oracle_pubkey : Pubkey ,
72
+ #[ serde( serialize_with = "decimal_serialize" ) ]
49
73
pub price : Decimal ,
50
74
pub published_slot : u64 ,
51
75
}
52
76
53
- impl LogEvent for SwitchboardV1OraclePriceUpdate {
54
- fn to_string ( & self ) -> String {
55
- return format ! (
56
- "{},{},{},{}" ,
57
- LogEventType :: SwitchboardV1OraclePriceUpdateType . to_string( ) ,
58
- self . oracle_pubkey. to_string( ) ,
59
- self . price. to_string( ) ,
60
- self . published_slot,
61
- ) ;
62
- }
77
+ #[ derive( Serialize ) ]
78
+ pub struct SwitchboardError {
79
+ pub event_type : LogEventType ,
80
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
81
+ pub oracle_pubkey : Pubkey ,
82
+ pub error_message : String ,
83
+ }
84
+
85
+ #[ derive( Serialize ) ]
86
+ pub struct ProgramVersion {
87
+ pub event_type : LogEventType ,
88
+ pub version : u8 ,
89
+ }
90
+
91
+ #[ derive( Serialize ) ]
92
+ pub struct ReserveStateUpdate {
93
+ pub event_type : LogEventType ,
94
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
95
+ pub reserve_id : Pubkey ,
96
+ pub available_amount : u64 ,
97
+ #[ serde( serialize_with = "decimal_serialize" ) ]
98
+ pub borrowed_amount_wads : Decimal ,
99
+ #[ serde( serialize_with = "decimal_serialize" ) ]
100
+ pub cumulative_borrow_rate_wads : Decimal ,
101
+ pub collateral_mint_total_supply : u64 ,
102
+ pub collateral_exchange_rate : String ,
103
+ }
104
+
105
+ #[ derive( Serialize ) ]
106
+ pub struct ObligationStateUpdate {
107
+ pub event_type : LogEventType ,
108
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
109
+ pub obligation_id : Pubkey ,
110
+ #[ serde( serialize_with = "decimal_serialize" ) ]
111
+ pub allowed_borrow_value : Decimal ,
112
+ #[ serde( serialize_with = "decimal_serialize" ) ]
113
+ pub unhealthy_borrow_value : Decimal ,
114
+ pub deposits : Vec < DepositLog > ,
115
+ pub borrows : Vec < BorrowLog > ,
116
+ }
117
+
118
+ #[ derive( Serialize ) ]
119
+ pub struct DepositLog {
120
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
121
+ pub reserve_id : Pubkey ,
122
+ pub deposited_amount : u64 ,
123
+ #[ serde( serialize_with = "decimal_serialize" ) ]
124
+ pub market_value : Decimal ,
125
+ }
126
+
127
+ #[ derive( Serialize ) ]
128
+ pub struct BorrowLog {
129
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
130
+ pub reserve_id : Pubkey ,
131
+ #[ serde( serialize_with = "decimal_serialize" ) ]
132
+ pub cumulative_borrow_rate_wads : Decimal ,
133
+ #[ serde( serialize_with = "decimal_serialize" ) ]
134
+ pub borrowed_amount_wads : Decimal ,
135
+ #[ serde( serialize_with = "decimal_serialize" ) ]
136
+ pub market_value : Decimal ,
63
137
}
0 commit comments