diff --git a/Cargo.lock b/Cargo.lock index f29a0f5bdbd..d7b24b84cf7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3328,6 +3328,8 @@ dependencies = [ "num-traits", "proptest", "serde", + "serde_derive", + "serde_json", "serde_yaml", "solana-program", "solana-program-test", diff --git a/token-lending/program/Cargo.toml b/token-lending/program/Cargo.toml index 6b1ba47e5b6..2b8fcc283af 100644 --- a/token-lending/program/Cargo.toml +++ b/token-lending/program/Cargo.toml @@ -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" diff --git a/token-lending/program/src/lib.rs b/token-lending/program/src/lib.rs index 8c73f9beadd..070d58ed942 100644 --- a/token-lending/program/src/lib.rs +++ b/token-lending/program/src/lib.rs @@ -14,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" diff --git a/token-lending/program/src/logs.rs b/token-lending/program/src/logs.rs index d4267569195..1a2b4080d25 100644 --- a/token-lending/program/src/logs.rs +++ b/token-lending/program/src/logs.rs @@ -1,10 +1,13 @@ #![allow(missing_docs)] use crate::math::Decimal; -use solana_program::{msg, pubkey::Pubkey}; +use solana_program::pubkey::Pubkey; use std::fmt; -#[derive(Debug)] -enum LogEventType { +extern crate serde; +extern crate serde_json; + +#[derive(Debug, Serialize)] +pub enum LogEventType { PythOraclePriceUpdateType, SwitchboardV1OraclePriceUpdateType, } @@ -15,49 +18,27 @@ impl fmt::Display for LogEventType { } } -pub fn emit_log_event(e: &dyn LogEvent) { - msg!("Solend Log Event"); - msg!(&e.to_string()); -} - -pub trait LogEvent { - fn to_string(&self) -> 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, pub oracle_pubkey: Pubkey, pub price: Decimal, - pub conf: u64, + pub confidence: u64, pub published_slot: u64, } -impl LogEvent for PythOraclePriceUpdate { - fn to_string(&self) -> String { - return format!( - "{},{},{},{},{}", - LogEventType::PythOraclePriceUpdateType.to_string(), - self.oracle_pubkey.to_string(), - self.price.to_string(), - self.conf.to_string(), - self.published_slot, - ); - } -} - +#[derive(Serialize)] pub struct SwitchboardV1OraclePriceUpdate { + pub event_type: LogEventType, pub oracle_pubkey: Pubkey, pub price: Decimal, pub published_slot: u64, } - -impl LogEvent for SwitchboardV1OraclePriceUpdate { - fn to_string(&self) -> String { - return format!( - "{},{},{},{}", - LogEventType::SwitchboardV1OraclePriceUpdateType.to_string(), - self.oracle_pubkey.to_string(), - self.price.to_string(), - self.published_slot, - ); - } -} diff --git a/token-lending/program/src/math/decimal.rs b/token-lending/program/src/math/decimal.rs index 8cc3fc8baa9..fe754d63dcc 100644 --- a/token-lending/program/src/math/decimal.rs +++ b/token-lending/program/src/math/decimal.rs @@ -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 { diff --git a/token-lending/program/src/processor.rs b/token-lending/program/src/processor.rs index 6c2ada2811a..9290ae4626e 100644 --- a/token-lending/program/src/processor.rs +++ b/token-lending/program/src/processor.rs @@ -1,10 +1,10 @@ //! Program state processor use crate::{ - self as spl_token_lending, + self as spl_token_lending, emit_log_event, error::LendingError, instruction::LendingInstruction, - logs::{emit_log_event, PythOraclePriceUpdate, SwitchboardV1OraclePriceUpdate}, + logs::{LogEventType, PythOraclePriceUpdate, SwitchboardV1OraclePriceUpdate}, math::{Decimal, Rate, TryAdd, TryDiv, TryMul, TrySub, WAD}, pyth, state::{ @@ -2215,10 +2215,11 @@ fn get_pyth_price(pyth_price_info: &AccountInfo, clock: &Clock) -> Result