Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add misc logging #77

Open
wants to merge 3 commits into
base: upcoming
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions token-lending/program/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ spl-token = { version = "3.2.0", features=["no-entrypoint"] }
switchboard-program = "0.2.0"
thiserror = "1.0"
uint = "=0.9.0"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

[dev-dependencies]
assert_matches = "1.5.0"
Expand Down
4 changes: 4 additions & 0 deletions token-lending/program/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
pub mod entrypoint;
pub mod error;
pub mod instruction;
pub mod logs;
pub mod math;
pub mod processor;
pub mod pyth;
Expand All @@ -13,6 +14,9 @@ pub mod state;
// Export current sdk types for downstream users building with a different sdk version
pub use solana_program;

#[macro_use]
extern crate serde_derive;

solana_program::declare_id!("So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo");

/// Canonical null pubkey. Prints out as "nu11111111111111111111111111111111111111111"
Expand Down
114 changes: 114 additions & 0 deletions token-lending/program/src/logs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#![allow(missing_docs)]
use crate::math::Decimal;
use solana_program::pubkey::Pubkey;
use std::fmt;

extern crate serde;
extern crate serde_json;

#[derive(Debug, Serialize)]
pub enum LogEventType {
ObligationStateUpdate,
ProgramVersion,
PythError,
PythOraclePriceUpdate,
ReserveStateUpdate,
SwitchboardError,
SwitchboardV1OraclePriceUpdate,
}

impl fmt::Display for LogEventType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}

fn pubkey_serialize<S>(x: &Pubkey, s: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
s.serialize_str(&x.to_string())
}

#[macro_export]
macro_rules! emit_log_event {
($e:expr) => {
msg!("solend-event-log:");
msg!(&serde_json::to_string($e).unwrap());
};
}

#[derive(Serialize)]
pub struct PythOraclePriceUpdate {
pub event_type: LogEventType,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't this be a macro?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which part?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the event type being on every struct

#[serde(serialize_with = "pubkey_serialize")]
pub oracle_pubkey: Pubkey,
pub price: Decimal,
pub confidence: u64,
pub published_slot: u64,
}

#[derive(Serialize)]
pub struct PythError {
pub event_type: LogEventType,
#[serde(serialize_with = "pubkey_serialize")]
pub oracle_pubkey: Pubkey,
pub error_message: String,
}

#[derive(Serialize)]
pub struct SwitchboardV1OraclePriceUpdate {
pub event_type: LogEventType,
#[serde(serialize_with = "pubkey_serialize")]
pub oracle_pubkey: Pubkey,
pub price: Decimal,
pub published_slot: u64,
}

#[derive(Serialize)]
pub struct SwitchboardError {
pub event_type: LogEventType,
#[serde(serialize_with = "pubkey_serialize")]
pub oracle_pubkey: Pubkey,
pub error_message: String,
}

#[derive(Serialize)]
pub struct ProgramVersion {
pub event_type: LogEventType,
pub version: u8,
}

#[derive(Serialize)]
pub struct ReserveStateUpdate {
pub event_type: LogEventType,
pub available_amount: u64,
pub borrowed_amount_wads: Decimal,
pub cumulative_borrow_rate_wads: Decimal,
pub collateral_mint_total_supply: u64,
pub collateral_exchange_rate: String,
}

// ObligationStateUpdate intentionally does not contain the obligation ID
// to save on compute since it is contained in the transaction itself.
#[derive(Serialize)]
pub struct ObligationStateUpdate {
pub event_type: LogEventType,
pub allowed_borrow_value: Decimal,
pub unhealthy_borrow_value: Decimal,
pub deposits: Vec<DepositLog>,
pub borrows: Vec<BorrowLog>,
}

#[derive(Serialize)]
pub struct DepositLog {
pub reserve_id_index: u8,
pub deposited_amount: u64,
}

#[derive(Serialize)]
pub struct BorrowLog {
pub reserve_id_index: u8,
pub borrowed_amount_wads: Decimal,
pub cumulative_borrow_rate_wads: Decimal,
}
3 changes: 2 additions & 1 deletion token-lending/program/src/math/decimal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ use uint::construct_uint;

// U192 with 192 bits consisting of 3 x 64-bit words
construct_uint! {
#[derive(Serialize)]
pub struct U192(3);
}

/// Large decimal values, precise to 18 digits
#[derive(Clone, Copy, Debug, Default, PartialEq, PartialOrd, Eq, Ord)]
#[derive(Clone, Copy, Debug, Default, PartialEq, PartialOrd, Eq, Ord, Serialize)]
pub struct Decimal(pub U192);

impl Decimal {
Expand Down
Loading