1
1
module suilend ::reserve_tests {
2
- use sui::balance;
3
- use sui::clock;
4
- use sui::test_scenario;
5
- use suilend::decimal::{Self , add, sub};
2
+ use sui::sui::{SUI };
3
+ use sui::balance::{Self , Balance , Supply };
4
+ use sprungsui::sprungsui::SPRUNGSUI ;
5
+ use sui::coin::{Self };
6
+ use suilend::decimal::{Decimal , Self , add, sub, mul, div, eq, floor, pow, le, ceil, min, max, saturating_sub};
7
+ use pyth::price_identifier::{PriceIdentifier };
8
+ use suilend::reserve_config::{
9
+ Self ,
10
+ ReserveConfig ,
11
+ calculate_apr,
12
+ calculate_supply_apr,
13
+ deposit_limit,
14
+ deposit_limit_usd,
15
+ borrow_limit,
16
+ borrow_limit_usd,
17
+ borrow_fee,
18
+ protocol_liquidation_fee,
19
+ spread_fee,
20
+ liquidation_bonus
21
+ };
6
22
use suilend::reserve::{
7
23
Self ,
8
24
create_for_testing,
@@ -14,7 +30,10 @@ module suilend::reserve_tests {
14
30
repay_liquidity,
15
31
Balances
16
32
};
17
- use suilend::reserve_config;
33
+ use sui::clock::{Self };
34
+ use suilend::liquidity_mining::{Self , PoolRewardManager };
35
+ use sui_system::sui_system::{SuiSystemState };
36
+ use sui::test_scenario::{Self , Scenario };
18
37
19
38
#[test_only]
20
39
public struct TEST_LM {}
@@ -192,7 +211,7 @@ module suilend::reserve_tests {
192
211
193
212
let owner = @0x26 ;
194
213
let mut scenario = test_scenario::begin (owner);
195
-
214
+ setup_sui_system (& mut scenario);
196
215
let mut reserve = create_for_testing <TEST_LM , TEST_USDC >(
197
216
{
198
217
let config = default_reserve_config ();
@@ -237,7 +256,10 @@ module suilend::reserve_tests {
237
256
assert !(balance::value (balances.available_amount ()) == available_amount_old - 404 , 0 );
238
257
assert !(balance::value (balances.fees ()) == 4 , 0 );
239
258
240
- let (ctoken_fees, fees) = claim_fees <TEST_LM , TEST_USDC >(&mut reserve);
259
+ let mut system_state = test_scenario::take_shared <SuiSystemState >(&mut scenario);
260
+ let (ctoken_fees, fees) = claim_fees <TEST_LM , TEST_USDC >(&mut reserve, &mut system_state, test_scenario::ctx (&mut scenario));
261
+ test_scenario::return_shared (system_state);
262
+
241
263
assert !(balance::value (&fees) == 4 , 0 );
242
264
assert !(balance::value (&ctoken_fees) == 0 , 0 );
243
265
@@ -345,6 +367,7 @@ module suilend::reserve_tests {
345
367
346
368
let owner = @0x26 ;
347
369
let mut scenario = test_scenario::begin (owner);
370
+ setup_sui_system (&mut scenario);
348
371
let mut clock = clock::create_for_testing (test_scenario::ctx (&mut scenario));
349
372
350
373
let mut reserve = create_for_testing <TEST_LM , TEST_USDC >(
@@ -398,7 +421,9 @@ module suilend::reserve_tests {
398
421
let old_available_amount = reserve.available_amount ();
399
422
let old_unclaimed_spread_fees = reserve.unclaimed_spread_fees ();
400
423
401
- let (ctoken_fees, fees) = claim_fees <TEST_LM , TEST_USDC >(&mut reserve);
424
+ let mut system_state = test_scenario::take_shared <SuiSystemState >(&mut scenario);
425
+ let (ctoken_fees, fees) = claim_fees <TEST_LM , TEST_USDC >(&mut reserve, &mut system_state, test_scenario::ctx (&mut scenario));
426
+ test_scenario::return_shared (system_state);
402
427
403
428
// 0.5% interest a second with 50% take rate => 0.25% fee on 50 USDC = 0.125 USDC
404
429
assert !(balance::value (&fees) == 125_000 , 0 );
@@ -423,6 +448,111 @@ module suilend::reserve_tests {
423
448
test_scenario::end (scenario);
424
449
}
425
450
451
+ use sui_system::governance_test_utils::{
452
+ advance_epoch_with_reward_amounts,
453
+ create_validator_for_testing,
454
+ create_sui_system_state_for_testing,
455
+ };
456
+
457
+
458
+ const SUILEND_VALIDATOR : address = @0xce8e537664ba5d1d5a6a857b17bd142097138706281882be6805e17065ecde89 ;
459
+
460
+ fun setup_sui_system (scenario: &mut Scenario ) {
461
+ test_scenario::next_tx (scenario, SUILEND_VALIDATOR );
462
+ let validator = create_validator_for_testing (SUILEND_VALIDATOR , 100 , test_scenario::ctx (scenario));
463
+ create_sui_system_state_for_testing (vector [validator], 0 , 0 , test_scenario::ctx (scenario));
464
+
465
+ advance_epoch_with_reward_amounts (0 , 0 , scenario);
466
+ }
467
+
468
+ #[test]
469
+ fun test_claim_fees_with_staker () {
470
+ use sui::test_scenario::{Self };
471
+ use suilend::reserve_config::{default_reserve_config};
472
+
473
+ let owner = @0x26 ;
474
+ let mut scenario = test_scenario::begin (owner);
475
+ setup_sui_system (&mut scenario);
476
+
477
+ let mut clock = clock::create_for_testing (test_scenario::ctx (&mut scenario));
478
+
479
+ let mut reserve = create_for_testing <TEST_LM , SUI >(
480
+ {
481
+ let config = default_reserve_config ();
482
+ let mut builder = reserve_config::from (&config, test_scenario::ctx (&mut scenario));
483
+ reserve_config::set_spread_fee_bps (&mut builder, 5000 );
484
+ reserve_config::set_interest_rate_utils (&mut builder, {
485
+ let mut v = vector ::empty ();
486
+ vector ::push_back (&mut v, 0 );
487
+ vector ::push_back (&mut v, 100 );
488
+ v
489
+ });
490
+ reserve_config::set_interest_rate_aprs (&mut builder, {
491
+ let mut v = vector ::empty ();
492
+ vector ::push_back (&mut v, 0 );
493
+ vector ::push_back (&mut v, 3153600000 );
494
+ v
495
+ });
496
+
497
+ sui::test_utils ::destroy (config);
498
+
499
+ reserve_config::build (builder, test_scenario::ctx (&mut scenario))
500
+ },
501
+ 0 ,
502
+ 9 ,
503
+ decimal::from (1 ),
504
+ 0 ,
505
+ 0 ,
506
+ 0 ,
507
+ decimal::from (0 ),
508
+ decimal::from (1 ),
509
+ 0 ,
510
+ test_scenario::ctx (&mut scenario)
511
+ );
512
+
513
+ let ctokens = deposit_liquidity_and_mint_ctokens <TEST_LM , SUI >(
514
+ &mut reserve,
515
+ balance::create_for_testing (100 * 1_000_000_000 )
516
+ );
517
+
518
+ let liquidity_request = borrow_liquidity <TEST_LM , SUI >(&mut reserve, 50 * 1_000_000_000 );
519
+ let tokens = reserve::fulfill_liquidity_request (&mut reserve, liquidity_request);
520
+
521
+ clock::set_for_testing (&mut clock, 1000 );
522
+ compound_interest (&mut reserve, &clock);
523
+
524
+ let old_available_amount = reserve.available_amount ();
525
+ let old_unclaimed_spread_fees = reserve.unclaimed_spread_fees ();
526
+
527
+ let mut system_state = test_scenario::take_shared <SuiSystemState >(&scenario);
528
+ let treasury_cap = coin::create_treasury_cap_for_testing <SPRUNGSUI >(scenario.ctx ());
529
+ reserve::init_staker <TEST_LM , SPRUNGSUI >(&mut reserve, treasury_cap, test_scenario::ctx (&mut scenario));
530
+ reserve::rebalance_staker <TEST_LM >(&mut reserve, &mut system_state, test_scenario::ctx (&mut scenario));
531
+
532
+ let (ctoken_fees, fees) = claim_fees <TEST_LM , SUI >(&mut reserve, &mut system_state, test_scenario::ctx (&mut scenario));
533
+
534
+ // 0.5% interest a second with 50% take rate => 0.25% fee on 50 SUI = 0.125 SUI
535
+ assert !(balance::value (&fees) == 125_000_000 , 0 );
536
+ assert !(balance::value (&ctoken_fees) == 0 , 0 );
537
+
538
+ assert !(reserve.available_amount () == old_available_amount - 125_000_000 , 0 );
539
+ assert !(reserve.unclaimed_spread_fees () == sub (old_unclaimed_spread_fees, decimal::from (125_000_000 )), 0 );
540
+
541
+ let balances: &Balances <TEST_LM , SUI > = reserve::balances (&reserve);
542
+ assert !(balance::value (balances.available_amount ()) == 0 , 0 ); // all the sui has been staked
543
+
544
+ test_scenario::return_shared (system_state);
545
+
546
+ sui::test_utils ::destroy (clock);
547
+ sui::test_utils ::destroy (ctoken_fees);
548
+ sui::test_utils ::destroy (fees);
549
+ sui::test_utils ::destroy (reserve);
550
+ sui::test_utils ::destroy (tokens);
551
+ sui::test_utils ::destroy (ctokens);
552
+
553
+ test_scenario::end (scenario);
554
+ }
555
+
426
556
#[test]
427
557
fun test_repay_happy () {
428
558
use suilend::test_usdc::{TEST_USDC };
0 commit comments