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,92 @@ 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 ( ) )
21
31
}
22
32
23
- pub trait LogEvent {
24
- fn to_string ( & self ) -> String ;
33
+ #[ macro_export]
34
+ macro_rules! emit_log_event {
35
+ ( $e: expr) => {
36
+ msg!( "solend-event-log:" ) ;
37
+ msg!( & serde_json:: to_string( $e) . unwrap( ) ) ;
38
+ } ;
25
39
}
26
40
41
+ #[ derive( Serialize ) ]
27
42
pub struct PythOraclePriceUpdate {
43
+ pub event_type : LogEventType ,
44
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
28
45
pub oracle_pubkey : Pubkey ,
29
46
pub price : Decimal ,
30
- pub conf : u64 ,
47
+ pub confidence : u64 ,
31
48
pub published_slot : u64 ,
32
49
}
33
50
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
- }
51
+ #[ derive( Serialize ) ]
52
+ pub struct PythError {
53
+ pub event_type : LogEventType ,
54
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
55
+ pub oracle_pubkey : Pubkey ,
56
+ pub error_message : String ,
45
57
}
46
58
59
+ #[ derive( Serialize ) ]
47
60
pub struct SwitchboardV1OraclePriceUpdate {
61
+ pub event_type : LogEventType ,
62
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
48
63
pub oracle_pubkey : Pubkey ,
49
64
pub price : Decimal ,
50
65
pub published_slot : u64 ,
51
66
}
52
67
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
- }
68
+ #[ derive( Serialize ) ]
69
+ pub struct SwitchboardError {
70
+ pub event_type : LogEventType ,
71
+ #[ serde( serialize_with = "pubkey_serialize" ) ]
72
+ pub oracle_pubkey : Pubkey ,
73
+ pub error_message : String ,
74
+ }
75
+
76
+ #[ derive( Serialize ) ]
77
+ pub struct ProgramVersion {
78
+ pub event_type : LogEventType ,
79
+ pub version : u8 ,
80
+ }
81
+
82
+ #[ derive( Serialize ) ]
83
+ pub struct ReserveStateUpdate {
84
+ pub event_type : LogEventType ,
85
+ pub available_amount : u64 ,
86
+ pub borrowed_amount_wads : Decimal ,
87
+ pub cumulative_borrow_rate_wads : Decimal ,
88
+ pub collateral_mint_total_supply : u64 ,
89
+ pub collateral_exchange_rate : String ,
90
+ }
91
+
92
+ // ObligationStateUpdate intentionally does not contain the obligation ID
93
+ // to save on compute since it is contained in the transaction itself.
94
+ #[ derive( Serialize ) ]
95
+ pub struct ObligationStateUpdate {
96
+ pub event_type : LogEventType ,
97
+ pub allowed_borrow_value : Decimal ,
98
+ pub unhealthy_borrow_value : Decimal ,
99
+ pub deposits : Vec < DepositLog > ,
100
+ pub borrows : Vec < BorrowLog > ,
101
+ }
102
+
103
+ #[ derive( Serialize ) ]
104
+ pub struct DepositLog {
105
+ pub reserve_id_index : u8 ,
106
+ pub deposited_amount : u64 ,
107
+ }
108
+
109
+ #[ derive( Serialize ) ]
110
+ pub struct BorrowLog {
111
+ pub reserve_id_index : u8 ,
112
+ pub borrowed_amount_wads : Decimal ,
113
+ pub cumulative_borrow_rate_wads : Decimal ,
63
114
}
0 commit comments