Skip to content
This repository has been archived by the owner on Jan 10, 2025. It is now read-only.

lending: cross collateral / cross liquidity support #1441

Merged
merged 192 commits into from
Apr 29, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
192 commits
Select commit Hold shift + click to select a range
60c2591
' -> `
jordaaash Mar 11, 2021
b1723d3
updated instructions
jordaaash Mar 11, 2021
a1f0f3a
rename instruction and function refs
jordaaash Mar 11, 2021
a399999
origination fees come out of liquidity now
jordaaash Mar 11, 2021
a2d0a78
fixme comment
jordaaash Mar 11, 2021
69e15eb
obligation structs + pack
jordaaash Mar 11, 2021
c142c7d
make cumulative_borrow_rate_wads consistent
jordaaash Mar 11, 2021
772fbc4
more instructions
jordaaash Mar 12, 2021
6430410
add errors
jordaaash Mar 12, 2021
4176afe
remove unused import
jordaaash Mar 12, 2021
07219d7
add new instructions
jordaaash Mar 12, 2021
aa0a745
check lending market authority before packing
jordaaash Mar 12, 2021
dedc603
format
jordaaash Mar 12, 2021
5d02229
split up collateral state
jordaaash Mar 12, 2021
c6f7b57
use consts where possible
jordaaash Mar 12, 2021
1a8b267
fixme / todo comments
jordaaash Mar 12, 2021
43e5eb6
borrowed_liquidity_wads -> liquidity.borrowed_wads
jordaaash Mar 12, 2021
bf7c38e
processor wip
jordaaash Mar 12, 2021
499b448
refactor
jordaaash Mar 12, 2021
3bd5d7c
test changes
jordaaash Mar 12, 2021
897728e
more errors
jordaaash Mar 14, 2021
8301a6b
instruction doc changes + style
jordaaash Mar 14, 2021
e0d4feb
instruction changes
jordaaash Mar 14, 2021
81e6469
fix init_obligation
jordaaash Mar 14, 2021
d158fd6
Token -> Account
jordaaash Mar 14, 2021
c931873
check mint owner
jordaaash Mar 14, 2021
88ebed5
add/remove todo comments
jordaaash Mar 14, 2021
17688fc
fix deposit_obligation_collateral
jordaaash Mar 14, 2021
407f744
fix init_obligation_collateral
jordaaash Mar 14, 2021
b57da0b
fix init_obligation_liquidity
jordaaash Mar 14, 2021
334ff8f
add refresh processors
jordaaash Mar 14, 2021
271ad6b
withdraw_obligation_collateral wip
jordaaash Mar 14, 2021
9ef59d6
obligation/collateral/liquidity state changes
jordaaash Mar 14, 2021
e7c703e
checked math
jordaaash Mar 14, 2021
c67a16c
stale handling
jordaaash Mar 14, 2021
bba100a
move reserve loan_to_value_ratio and liquidation_threshold to lending…
jordaaash Mar 14, 2021
7289a1c
use checked math
jordaaash Mar 14, 2021
ceb9998
catch err
jordaaash Mar 14, 2021
ee7232e
optimize imports
jordaaash Mar 15, 2021
715dbf9
fmt
jordaaash Mar 15, 2021
4f16949
split up collateral and liquidity market value
jordaaash Mar 15, 2021
dff7905
update comments and method sigs
jordaaash Mar 15, 2021
2504dd3
new business logic for collateral withdraw
jordaaash Mar 15, 2021
ce28091
fees receiver -> fee receiver; consistent with other fee names
jordaaash Mar 15, 2021
b537486
use checked math
jordaaash Mar 15, 2021
6233b1d
more errors
jordaaash Mar 16, 2021
17e7e5c
remove unused imports
jordaaash Mar 16, 2021
c5892d4
todo / fixme comments
jordaaash Mar 16, 2021
c66c4e4
market_value -> value
jordaaash Mar 16, 2021
61f3a3a
derive lending market authority where possible
jordaaash Mar 16, 2021
26431ef
use rate for LTV
jordaaash Mar 16, 2021
06b380c
check dex market validity
jordaaash Mar 16, 2021
ffcfb21
borrow implementation
jordaaash Mar 16, 2021
9c902a6
add amount type to other instructions
jordaaash Mar 16, 2021
7718026
fmt [skip ci]
jordaaash Mar 16, 2021
89d1011
add fixme comments
jordaaash Mar 16, 2021
0988f5b
redeem collateral nit
jordaaash Mar 16, 2021
5201935
add todos, safety checks
jordaaash Mar 16, 2021
8a56024
repay implementation
jordaaash Mar 16, 2021
e10933d
withdraw collateral handles percent
jordaaash Mar 16, 2021
2ade896
converter -> token_converter
jordaaash Mar 16, 2021
bfc68b5
clean up msg text
jordaaash Mar 17, 2021
2fa1964
use assert_rent_exempt
jordaaash Mar 17, 2021
b9f71c5
sort keys
jordaaash Mar 17, 2021
c621190
fixme comment
jordaaash Mar 17, 2021
225b9ba
don't use default()
jordaaash Mar 17, 2021
1feba6d
repay fixes
jordaaash Mar 17, 2021
5c3f681
liquidate wip
jordaaash Mar 17, 2021
cf87372
remove mem comments [skip ci]
jordaaash Mar 17, 2021
0ed4830
fixme comment [skip ci]
jordaaash Mar 17, 2021
66e24f8
liquidate implementation
jordaaash Mar 18, 2021
76f61a0
last update impl
jordaaash Mar 18, 2021
efdd17a
renaming
jordaaash Mar 18, 2021
bb6f388
move repay to reserve
jordaaash Mar 18, 2021
a1eb2c6
format
jordaaash Mar 18, 2021
d792fa4
checked math
jordaaash Mar 18, 2021
74f5777
fixme comment [skip-ci]
jordaaash Mar 18, 2021
3583724
refactor Reserve::borrow_liquidity
jordaaash Mar 18, 2021
392f96d
fixme / formatting [skip ci]
jordaaash Mar 18, 2021
d7daabc
fix Reserve::repay_liquidity
jordaaash Mar 18, 2021
eb4e82c
.mark_stale() -> .last_update.mark_stale()
jordaaash Mar 18, 2021
f015c66
fee calc enum
jordaaash Mar 18, 2021
96dfed2
comment / fmt [skip-ci]
jordaaash Mar 18, 2021
ce97e24
major reorg [skip ci]
jordaaash Mar 18, 2021
3c1d27a
interest is only accrued on refresh
jordaaash Mar 18, 2021
3da729e
fix borrow fees
jordaaash Mar 19, 2021
652cfcd
32 -> PUBKEY_LEN [skip ci]
jordaaash Mar 19, 2021
bbadd91
check rent exempt / uninitialized status first
jordaaash Mar 19, 2021
b3d58d8
fixme comments
jordaaash Mar 19, 2021
d9a3e70
PUBKEY_LEN, 32 -> PUBKEY_BYTES [skip ci]
jordaaash Mar 19, 2021
b30430b
add solana-flux-aggregator
jordaaash Mar 19, 2021
94d1004
first pass
jordaaash Mar 19, 2021
a4a417b
oracle wip
jordaaash Mar 22, 2021
b9b345f
organized errors
jordaaash Mar 23, 2021
d5635a2
update docs
jordaaash Mar 23, 2021
973a87a
mass todo completion
jordaaash Mar 23, 2021
5ac820f
remove bad underscore
jordaaash Mar 23, 2021
64d0063
no longer using hashmap
jordaaash Mar 23, 2021
c4c8af7
use Rate for percent
jordaaash Mar 23, 2021
d92cf6c
rm unused error
jordaaash Mar 23, 2021
eb3f5d8
fix @FIXME (type conversions)
jordaaash Mar 23, 2021
8acbf21
fixing some mutable references
jordaaash Mar 23, 2021
8aab061
continuing work on mutable borrows
jordaaash Mar 23, 2021
ee18322
doc comment
jordaaash Mar 24, 2021
9fc94df
fixme comments
jordaaash Mar 24, 2021
52dde76
all clippy errors fixed!
jordaaash Mar 24, 2021
832599a
return collateral/liquidity and index together
jordaaash Mar 24, 2021
a660f91
fixed doc comments
jordaaash Mar 24, 2021
746f38a
addressing some of justin's review feedback
jordaaash Mar 24, 2021
4781168
collateral/liquidity -> deposits/borrows (in some cases)
jordaaash Mar 24, 2021
621b01c
add periods to make doc comment display format consistent
jordaaash Mar 24, 2021
6f3c0e1
reuse allocated structs and inline construction
jordaaash Mar 24, 2021
4b301b1
clarify todo comment
jordaaash Mar 25, 2021
d07b5f8
add new/init functions
jordaaash Mar 25, 2021
7b0cfee
AmountType::Percent -> u64::MAX
jordaaash Mar 25, 2021
7cc02aa
match rounding to what's used in Reserve::borrow_liquidity
jordaaash Mar 25, 2021
b137101
remove collateral/liquidity from deposits/borrows if zeroed out
jordaaash Mar 25, 2021
8bd4e20
more verbose naming
jordaaash Mar 25, 2021
479dc26
[WIP] move loan_to_value_ratio and liquidation_threshold back to reserve
jordaaash Mar 26, 2021
c6443e8
remove unused memory account
jordaaash Mar 26, 2021
6c0548d
remove serum dex
jordaaash Mar 26, 2021
62ce81e
add obligation owner authority
jordaaash Mar 30, 2021
d24399e
add obligation collateral token mint
jordaaash Mar 30, 2021
ab995da
set new obligation length
jordaaash Mar 30, 2021
431b34d
remove unused function
jordaaash Mar 30, 2021
97e27c7
bool -> boolean
jordaaash Mar 30, 2021
0b05aac
fmt
jordaaash Mar 30, 2021
4aea356
allow same repay and withdraw currency on liquidation
jordaaash Mar 30, 2021
c940f03
comment addressed in review
jordaaash Mar 30, 2021
f182b87
fix clippy errors
jordaaash Mar 30, 2021
a206c25
make order consistent
jordaaash Mar 30, 2021
7196676
mark reserves stale on updates
jordaaash Mar 31, 2021
0b44cee
add helper methods
jordaaash Mar 31, 2021
9d576b0
fix missing set
jordaaash Mar 31, 2021
47f50c6
lending market not needed on obligation refresh
jordaaash Apr 2, 2021
49c5821
add fixme comment for collateral withdraw
jordaaash Apr 2, 2021
ad48cfa
convert quote price to base decimals
jordaaash Apr 2, 2021
501b869
remove unused account infos
jordaaash Apr 3, 2021
63065f0
do conversion for currency decimals * market price
jordaaash Apr 3, 2021
b9bbc72
fix withdraw value calculation
jordaaash Apr 3, 2021
ff4cf6c
remove superfluous type
jordaaash Apr 3, 2021
be3d1ce
adjust liquidation math
jordaaash Apr 5, 2021
6c81fdb
change STALE_AFTER_SLOTS semantics
jordaaash Apr 5, 2021
2d81b54
init obligation token mint and output on deposit
jordaaash Apr 6, 2021
4af2ecb
add additional safety checks
jordaaash Apr 6, 2021
fd7f88f
add more errors for deposits and borrows
jordaaash Apr 7, 2021
b60b6be
implement per-collateral LTV
jordaaash Apr 7, 2021
b8b0794
fmt / clippy fixes
jordaaash Apr 7, 2021
d9da807
median_price -> market_price
jordaaash Apr 7, 2021
28b5b18
reserves are already checked to be not stale
jordaaash Apr 7, 2021
68509f2
check that obligation token mint authority matches lending market
jordaaash Apr 7, 2021
6e42c82
add more checks and revisit all errors
jordaaash Apr 7, 2021
17ea0b8
can't fit Rate in 8 bytes without losing precision
jordaaash Apr 7, 2021
bc74134
rewrite functional tests
jordaaash Apr 6, 2021
36ee3e5
new end to end test
jordaaash Apr 6, 2021
d371cce
restore original order to make code review easier
jordaaash Apr 8, 2021
f5b2941
addressing review feedback
jordaaash Apr 13, 2021
37be9f7
update comments
jordaaash Apr 14, 2021
e3dd781
review fixes
jordaaash Apr 14, 2021
9f2ea9a
mint_supply / mint_total_supply -> mint_amount
jordaaash Apr 14, 2021
81a1002
remove obligation tokens
jordaaash Apr 14, 2021
cb42fd0
cargo fmt/clippy
jordaaash Apr 14, 2021
0e7e100
add comments
jordaaash Apr 15, 2021
c2f2cbe
misc todos / test fixes
jordaaash Apr 15, 2021
0fa9002
reordering instructions and processors
jordaaash Apr 15, 2021
671affb
reorganize state packing
jordaaash Apr 15, 2021
ae22a74
add quote mint decimals check for aggregator
jordaaash Apr 15, 2021
a9b4775
remove unneeded token account checks
jordaaash Apr 15, 2021
54f18ba
verify reserve liquidity fee receiver mint
jordaaash Apr 15, 2021
4471020
add/remove/fix comments
jordaaash Apr 16, 2021
50ca23d
update rust and remove std::u64
jordaaash Apr 16, 2021
c1067fc
check market values before liquidation
jordaaash Apr 16, 2021
d6ef272
withdraw reserve doesn't need to be writable
jordaaash Apr 16, 2021
8d3ac2e
removed genesis account test
jordaaash Apr 27, 2021
9f0eaa6
values are selectively checked to be nonzero where used
jordaaash Apr 27, 2021
b3a584e
simplify obligation LTV and liquidation threshold
jordaaash Apr 27, 2021
187a21a
simplify algebra: borrowed_value/(allowed_borrow_value/deposited_valu…
jordaaash Apr 27, 2021
68c123d
fix fmt / clippy
jordaaash Apr 27, 2021
289eb56
use oracle instead of aggregator except where using an instance of Ag…
jordaaash Apr 27, 2021
e355f36
initialize reserve liquidity fee receiver
jordaaash Apr 27, 2021
32323a8
receive amount is missing the fee
jordaaash Apr 28, 2021
acfc83a
add todo comment
jordaaash Apr 28, 2021
ddde468
fix variable name
jordaaash Apr 28, 2021
ffde502
fix tests
jordaaash Apr 28, 2021
896e0ee
reverted mint_total_supply change
jordaaash Apr 28, 2021
0ec9fda
Merge branch 'master' into xcl
jordaaash Apr 28, 2021
52cafde
remove token-lending/client, clippy passing
jordaaash Apr 28, 2021
522eba4
fix js test
jordaaash Apr 28, 2021
1f4b96d
restore unit tests from master
jordaaash Apr 28, 2021
9190d02
unit tests passing
jordaaash Apr 28, 2021
b3b0daf
fmt / clippy
jordaaash Apr 28, 2021
357e13b
remove unused function for clippy
jordaaash Apr 28, 2021
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
28 changes: 15 additions & 13 deletions token-lending/program/src/state/lending_market.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,26 @@ const LENDING_MARKET_LEN: usize = 226; // 1 + 1 + 32 + 32 + 32 + 128
impl Pack for LendingMarket {
const LEN: usize = LENDING_MARKET_LEN;

/// Unpacks a byte buffer into a [LendingMarketInfo](struct.LendingMarketInfo.html).
fn pack_into_slice(&self, output: &mut [u8]) {
let output = array_mut_ref![output, 0, LENDING_MARKET_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (version, bump_seed, owner, quote_token_mint, token_program_id, _padding) =
mut_array_refs![output, 1, 1, PUBKEY_BYTES, PUBKEY_BYTES, PUBKEY_BYTES, 128];

*version = self.version.to_le_bytes();
*bump_seed = self.bump_seed.to_le_bytes();
owner.copy_from_slice(self.owner.as_ref());
quote_token_mint.copy_from_slice(self.quote_token_mint.as_ref());
token_program_id.copy_from_slice(self.token_program_id.as_ref());
}

/// Unpacks a byte buffer into a [LendingMarketInfo](struct.LendingMarketInfo.html)
fn unpack_from_slice(input: &[u8]) -> Result<Self, ProgramError> {
let input = array_ref![input, 0, LENDING_MARKET_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (version, bump_seed, owner, quote_token_mint, token_program_id, _padding) =
array_refs![input, 1, 1, PUBKEY_BYTES, PUBKEY_BYTES, PUBKEY_BYTES, 128];

let version = u8::from_le_bytes(*version);
if version > PROGRAM_VERSION {
msg!("Lending market version does not match lending program version");
Expand All @@ -85,16 +99,4 @@ impl Pack for LendingMarket {
token_program_id: Pubkey::new_from_array(*token_program_id),
})
}

fn pack_into_slice(&self, output: &mut [u8]) {
let output = array_mut_ref![output, 0, LENDING_MARKET_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (version, bump_seed, owner, quote_token_mint, token_program_id, _padding) =
mut_array_refs![output, 1, 1, PUBKEY_BYTES, PUBKEY_BYTES, PUBKEY_BYTES, 128];
*version = self.version.to_le_bytes();
*bump_seed = self.bump_seed.to_le_bytes();
owner.copy_from_slice(self.owner.as_ref());
quote_token_mint.copy_from_slice(self.quote_token_mint.as_ref());
token_program_id.copy_from_slice(self.token_program_id.as_ref());
}
}
151 changes: 78 additions & 73 deletions token-lending/program/src/state/obligation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -325,15 +325,90 @@ impl ObligationLiquidity {
}
}

// @TODO: Adjust padding, but what's a reasonable number?
// Or should there be no padding to save space, but we need account resizing implemented?
const OBLIGATION_COLLATERAL_LEN: usize = 56; // 32 + 8 + 16
const OBLIGATION_LIQUIDITY_LEN: usize = 80; // 32 + 16 + 16 + 16
const OBLIGATION_LEN: usize = 916; // 1 + 8 + 1 + 32 + 32 + 16 + 16 + 16 + 16 + 1 + 1 + (56 * 1) + (80 * 9)
// @TODO: break this up by obligation / collateral / liquidity
impl Pack for Obligation {
const LEN: usize = OBLIGATION_LEN;

fn pack_into_slice(&self, dst: &mut [u8]) {
let output = array_mut_ref![dst, 0, OBLIGATION_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (
version,
last_update_slot,
last_update_stale,
lending_market,
owner,
deposited_value,
borrowed_value,
loan_to_value_ratio,
liquidation_threshold,
deposits_len,
borrows_len,
data_flat,
) = mut_array_refs![
output,
1,
8,
1,
PUBKEY_BYTES,
PUBKEY_BYTES,
16,
16,
16,
16,
1,
1,
OBLIGATION_COLLATERAL_LEN + (OBLIGATION_LIQUIDITY_LEN * (MAX_OBLIGATION_RESERVES - 1))
];

// obligation
*version = self.version.to_le_bytes();
*last_update_slot = self.last_update.slot.to_le_bytes();
pack_bool(self.last_update.stale, last_update_stale);
lending_market.copy_from_slice(self.lending_market.as_ref());
owner.copy_from_slice(self.owner.as_ref());
pack_decimal(self.deposited_value, deposited_value);
pack_decimal(self.borrowed_value, borrowed_value);
pack_rate(self.loan_to_value_ratio, loan_to_value_ratio);
pack_rate(self.liquidation_threshold, liquidation_threshold);
*deposits_len = u8::try_from(self.deposits.len()).unwrap().to_le_bytes();
*borrows_len = u8::try_from(self.borrows.len()).unwrap().to_le_bytes();

let mut offset = 0;

// deposits
for collateral in &self.deposits {
let deposits_flat = array_mut_ref![data_flat, offset, OBLIGATION_COLLATERAL_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (deposit_reserve, deposited_amount, market_value) =
mut_array_refs![deposits_flat, PUBKEY_BYTES, 8, 16];
deposit_reserve.copy_from_slice(collateral.deposit_reserve.as_ref());
*deposited_amount = collateral.deposited_amount.to_le_bytes();
pack_decimal(collateral.market_value, market_value);
offset += OBLIGATION_COLLATERAL_LEN;
}

// borrows
for liquidity in &self.borrows {
let borrows_flat = array_mut_ref![data_flat, offset, OBLIGATION_LIQUIDITY_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (borrow_reserve, cumulative_borrow_rate_wads, borrowed_amount_wads, market_value) =
mut_array_refs![borrows_flat, PUBKEY_BYTES, 16, 16, 16];
borrow_reserve.copy_from_slice(liquidity.borrow_reserve.as_ref());
pack_decimal(
liquidity.cumulative_borrow_rate_wads,
cumulative_borrow_rate_wads,
);
pack_decimal(liquidity.borrowed_amount_wads, borrowed_amount_wads);
pack_decimal(liquidity.market_value, market_value);
offset += OBLIGATION_LIQUIDITY_LEN;
}
}

/// Unpacks a byte buffer into an [ObligationInfo](struct.ObligationInfo.html).
fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
let input = array_ref![src, 0, OBLIGATION_LEN];
#[allow(clippy::ptr_offset_with_cast)]
Expand Down Expand Up @@ -365,6 +440,7 @@ impl Pack for Obligation {
1,
OBLIGATION_COLLATERAL_LEN + (OBLIGATION_LIQUIDITY_LEN * (MAX_OBLIGATION_RESERVES - 1))
];

let version = u8::from_le_bytes(*version);
if version > PROGRAM_VERSION {
msg!("Obligation version does not match lending program version");
Expand Down Expand Up @@ -419,75 +495,4 @@ impl Pack for Obligation {
liquidation_threshold: unpack_rate(liquidation_threshold),
})
}

fn pack_into_slice(&self, dst: &mut [u8]) {
let output = array_mut_ref![dst, 0, OBLIGATION_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (
version,
last_update_slot,
last_update_stale,
lending_market,
owner,
deposited_value,
borrowed_value,
loan_to_value_ratio,
liquidation_threshold,
deposits_len,
borrows_len,
data_flat,
) = mut_array_refs![
output,
1,
8,
1,
PUBKEY_BYTES,
PUBKEY_BYTES,
16,
16,
16,
16,
1,
1,
OBLIGATION_COLLATERAL_LEN + (OBLIGATION_LIQUIDITY_LEN * (MAX_OBLIGATION_RESERVES - 1))
];

*version = self.version.to_le_bytes();
*last_update_slot = self.last_update.slot.to_le_bytes();
pack_bool(self.last_update.stale, last_update_stale);
lending_market.copy_from_slice(self.lending_market.as_ref());
owner.copy_from_slice(self.owner.as_ref());
pack_decimal(self.deposited_value, deposited_value);
pack_decimal(self.borrowed_value, borrowed_value);
pack_rate(self.loan_to_value_ratio, loan_to_value_ratio);
pack_rate(self.liquidation_threshold, liquidation_threshold);
*deposits_len = u8::try_from(self.deposits.len()).unwrap().to_le_bytes();
*borrows_len = u8::try_from(self.borrows.len()).unwrap().to_le_bytes();

let mut offset = 0;
for collateral in &self.deposits {
let deposits_flat = array_mut_ref![data_flat, offset, OBLIGATION_COLLATERAL_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (deposit_reserve, deposited_amount, market_value) =
mut_array_refs![deposits_flat, PUBKEY_BYTES, 8, 16];
deposit_reserve.copy_from_slice(collateral.deposit_reserve.as_ref());
*deposited_amount = collateral.deposited_amount.to_le_bytes();
pack_decimal(collateral.market_value, market_value);
offset += OBLIGATION_COLLATERAL_LEN;
}
for liquidity in &self.borrows {
let borrows_flat = array_mut_ref![data_flat, offset, OBLIGATION_LIQUIDITY_LEN];
#[allow(clippy::ptr_offset_with_cast)]
let (borrow_reserve, cumulative_borrow_rate_wads, borrowed_amount_wads, market_value) =
mut_array_refs![borrows_flat, PUBKEY_BYTES, 16, 16, 16];
borrow_reserve.copy_from_slice(liquidity.borrow_reserve.as_ref());
pack_decimal(
liquidity.cumulative_borrow_rate_wads,
cumulative_borrow_rate_wads,
);
pack_decimal(liquidity.borrowed_amount_wads, borrowed_amount_wads);
pack_decimal(liquidity.market_value, market_value);
offset += OBLIGATION_LIQUIDITY_LEN;
}
}
}
Loading