Skip to content

Commit

Permalink
Simplify stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
DaSichuan committed Mar 16, 2022
1 parent 7b4be89 commit 671bc48
Show file tree
Hide file tree
Showing 20 changed files with 424 additions and 72 deletions.
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.

31 changes: 31 additions & 0 deletions test_output
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Running: cargo-build-bpf --manifest-path /root/repos/solana-program-library/token-lending/program/Cargo.toml --bpf-out-dir /root/repos/solana-program-library/target/deploy
BPF SDK: /root/.local/share/solana/install/releases/1.8.16/solana-release/bin/sdk/bpf
cargo-build-bpf child: rustup toolchain list -v
cargo-build-bpf child: cargo +bpf build --target bpfel-unknown-unknown --release
cargo-build-bpf child: /root/.local/share/solana/install/releases/1.8.16/solana-release/bin/sdk/bpf/dependencies/bpf-tools/llvm/bin/llvm-readelf --dyn-symbols /root/repos/solana-program-library/target/deploy/spl_token_lending.so

To deploy this program:
$ solana program deploy /root/repos/solana-program-library/target/deploy/spl_token_lending.so
The program address will default to this keypair (override with --program-id):
/root/repos/solana-program-library/target/deploy/spl_token_lending-keypair.json
Running: /root/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/cargo test --manifest-path /root/repos/solana-program-library/token-lending/program/Cargo.toml --test borrow_obligation_liquidity --features test-bpf

running 5 tests
test test_borrow_too_large ... ok
test test_borrow_usdc_fixed_amount ... FAILED
test test_borrow_sol_max_amount ... ok
test test_borrow_max_reserves ... ok
test test_borrow_limit ... ok

failures:

---- test_borrow_usdc_fixed_amount stdout ----
thread 'test_borrow_usdc_fixed_amount' panicked at 'assertion failed: banks_client.process_transaction(transaction).await.is_ok()', token-lending/program/tests/borrow_obligation_liquidity.rs:120:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
test_borrow_usdc_fixed_amount

test result: FAILED. 4 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.93s

4 changes: 4 additions & 0 deletions token-lending/program/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ 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"
arrform = "0.1.1"

[dev-dependencies]
assert_matches = "1.5.0"
Expand Down
3 changes: 3 additions & 0 deletions token-lending/program/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
138 changes: 106 additions & 32 deletions token-lending/program/src/logs.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
#![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 {
PythOraclePriceUpdateType,
SwitchboardV1OraclePriceUpdateType,
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 {
Expand All @@ -15,49 +23,115 @@ impl fmt::Display for LogEventType {
}
}

pub fn emit_log_event(e: &dyn LogEvent) {
msg!("Solend Log Event");
msg!(&e.to_string());
fn pubkey_serialize<S>(x: &Pubkey, s: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
s.serialize_str(&x.to_string())
}

fn decimal_serialize<S>(x: &Decimal, s: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
s.serialize_str(&x.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,
#[serde(serialize_with = "pubkey_serialize")]
pub oracle_pubkey: Pubkey,
#[serde(serialize_with = "decimal_serialize")]
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 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,
#[serde(serialize_with = "decimal_serialize")]
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,
);
}
#[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,
#[serde(serialize_with = "pubkey_serialize")]
pub reserve_id: Pubkey,
pub available_amount: u64,
#[serde(serialize_with = "decimal_serialize")]
pub borrowed_amount_wads: Decimal,
#[serde(serialize_with = "decimal_serialize")]
pub cumulative_borrow_rate_wads: Decimal,
pub collateral_mint_total_supply: u64,
pub collateral_exchange_rate: String,
}

#[derive(Serialize)]
pub struct ObligationStateUpdate {
pub event_type: LogEventType,
#[serde(serialize_with = "pubkey_serialize")]
pub obligation_id: Pubkey,
#[serde(serialize_with = "decimal_serialize")]
pub allowed_borrow_value: Decimal,
#[serde(serialize_with = "decimal_serialize")]
pub unhealthy_borrow_value: Decimal,
pub deposits: Vec<DepositLog>,
pub borrows: Vec<BorrowLog>,
}

#[derive(Serialize)]
pub struct DepositLog {
#[serde(serialize_with = "pubkey_serialize")]
pub reserve_id: Pubkey,
pub deposited_amount: u64,
#[serde(serialize_with = "decimal_serialize")]
pub market_value: Decimal,
}

#[derive(Serialize)]
pub struct BorrowLog {
#[serde(serialize_with = "pubkey_serialize")]
pub reserve_id: Pubkey,
#[serde(serialize_with = "decimal_serialize")]
pub cumulative_borrow_rate_wads: Decimal,
#[serde(serialize_with = "decimal_serialize")]
pub borrowed_amount_wads: Decimal,
#[serde(serialize_with = "decimal_serialize")]
pub market_value: 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

0 comments on commit 671bc48

Please sign in to comment.