11#![ allow( missing_docs) ]
22use crate :: math:: Decimal ;
3- use solana_program:: { msg , pubkey:: Pubkey } ;
3+ use solana_program:: pubkey:: Pubkey ;
44use std:: fmt;
55
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 ,
1018}
1119
1220impl fmt:: Display for LogEventType {
@@ -15,49 +23,115 @@ impl fmt::Display for LogEventType {
1523 }
1624}
1725
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 ( ) )
2138}
2239
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+ } ;
2546}
2647
48+ #[ derive( Serialize ) ]
2749pub struct PythOraclePriceUpdate {
50+ pub event_type : LogEventType ,
51+ #[ serde( serialize_with = "pubkey_serialize" ) ]
2852 pub oracle_pubkey : Pubkey ,
53+ #[ serde( serialize_with = "decimal_serialize" ) ]
2954 pub price : Decimal ,
30- pub conf : u64 ,
55+ pub confidence : u64 ,
3156 pub published_slot : u64 ,
3257}
3358
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 ,
4565}
4666
67+ #[ derive( Serialize ) ]
4768pub struct SwitchboardV1OraclePriceUpdate {
69+ pub event_type : LogEventType ,
70+ #[ serde( serialize_with = "pubkey_serialize" ) ]
4871 pub oracle_pubkey : Pubkey ,
72+ #[ serde( serialize_with = "decimal_serialize" ) ]
4973 pub price : Decimal ,
5074 pub published_slot : u64 ,
5175}
5276
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 ,
63137}
0 commit comments