Skip to content

Commit 0def0ac

Browse files
committed
feat: Add a vault pause mechanism, refactor total
1 parent c946c52 commit 0def0ac

2 files changed

Lines changed: 52 additions & 15 deletions

File tree

contracts/vault/src/lib.rs

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ impl YieldVault {
175175

176176
/// Read the total underlying assets represented by the vault.
177177
pub fn total_assets(env: Env) -> i128 {
178-
Self::get_state(&env).total_assets
179178
let idle_assets = env.storage().instance().get::<_, i128>(&DataKey::TotalAssets).unwrap_or(0);
180179

181180
let strategy_assets = if let Some(strategy_addr) = Self::strategy(env.clone()) {
@@ -630,8 +629,6 @@ impl YieldVault {
630629
// Transfer assets from user to vault
631630
token_client.transfer(&user, &env.current_contract_address(), &amount);
632631

633-
token_client.transfer(&user, &env.current_contract_address(), &amount);
634-
635632
// Update state
636633
let ta = Self::total_assets(env.clone());
637634
env.storage()
@@ -711,14 +708,10 @@ impl YieldVault {
711708
.set(&DataKey::TotalShares, &Self::checked_sub(ts, shares)?);
712709

713710
env.storage().instance().set(
714-
&DataKey::ShareBalance(user.clone()),
711+
&user_key,
715712
&Self::checked_sub(user_shares, shares)?,
716713
);
717714

718-
env.storage()
719-
.instance()
720-
.set(&user_key, &(user_shares - shares));
721-
722715
env.events().publish(
723716
(symbol_short!("withdraw"), user),
724717
(assets_to_return, shares),
@@ -748,6 +741,7 @@ impl YieldVault {
748741

749742
// Update idle assets
750743
env.storage().instance().set(&DataKey::TotalAssets, &(idle_ta - amount));
744+
Ok(())
751745
}
752746

753747
/// Recall funds from the strategy.
@@ -784,6 +778,8 @@ impl YieldVault {
784778
.instance()
785779
.get::<_, i128>(&DataKey::TotalAssets)
786780
.unwrap_or(0);
781+
// Update total assets state
782+
let ta = env.storage().instance().get::<_, i128>(&DataKey::TotalAssets).unwrap_or(0);
787783
env.storage().instance().set(&DataKey::TotalAssets, &(ta + amount));
788784

789785
let mut state = Self::get_state(&env);
@@ -796,12 +792,7 @@ impl YieldVault {
796792
);
797793
}
798794

799-
/// Legacy admin function retained for compatibility.
800-
pub fn accrue_yield(env: Env, amount: i128) {
801-
Self::distribute_yield(env, amount);
802-
}
803-
804-
pub fn report_benji_yield(env: Env, strategy: Address, amount: i128) {
795+
pub fn report_benji_yield(env: Env, strategy: Address, amount: i128) -> Result<(), VaultError> {
805796
strategy.require_auth();
806797
if amount <= 0 {
807798
return Err(VaultError::InvalidAmount);
@@ -810,7 +801,7 @@ impl YieldVault {
810801
let token_addr = Self::token(env.clone());
811802
let token_client = token::Client::new(&env, &token_addr);
812803

813-
token_client.transfer(&admin, &env.current_contract_address(), &amount);
804+
token_client.transfer(&strategy, &env.current_contract_address(), &amount);
814805

815806
let ta = Self::total_assets(env.clone());
816807
env.storage()

contracts/vault/src/test.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,3 +767,49 @@ fn test_multiple_deposits_atomic_state_updates() {
767767
assert_eq!(vault.total_shares(), 200);
768768
assert_eq!(vault.total_assets(), 200);
769769
}
770+
771+
// ─── Pause Mechanism Tests ───────────────────────────────────────────────
772+
773+
#[test]
774+
fn test_pause_mechanism() {
775+
let env = Env::default();
776+
env.mock_all_auths();
777+
778+
let admin = Address::generate(&env);
779+
let user = Address::generate(&env);
780+
let token_admin = Address::generate(&env);
781+
let usdc = create_token_contract(&env, &token_admin);
782+
let usdc_admin_client = token::StellarAssetClient::new(&env, &usdc.address);
783+
usdc_admin_client.mint(&user, &1000);
784+
785+
let vault_id = env.register(YieldVault, ());
786+
let vault = YieldVaultClient::new(&env, &vault_id);
787+
vault.initialize(&admin, &usdc.address);
788+
789+
// 1. Initially NOT paused
790+
assert_eq!(vault.is_paused(), false);
791+
vault.deposit(&user, &100);
792+
assert_eq!(vault.balance(&user), 100);
793+
794+
// 2. Pause the vault
795+
vault.set_pause(&true);
796+
assert_eq!(vault.is_paused(), true);
797+
798+
// 3. Verify deposit reverts when paused
799+
let deposit_result = vault.try_deposit(&user, &100);
800+
assert_eq!(deposit_result, Err(Ok(VaultError::ContractPaused)));
801+
802+
// 4. Verify withdraw reverts when paused
803+
let withdraw_result = vault.try_withdraw(&user, &50);
804+
assert_eq!(withdraw_result, Err(Ok(VaultError::ContractPaused)));
805+
806+
// 5. Unpause the vault
807+
vault.set_pause(&false);
808+
assert_eq!(vault.is_paused(), false);
809+
810+
// 6. Verify operations resume
811+
vault.deposit(&user, &100);
812+
assert_eq!(vault.balance(&user), 200);
813+
vault.withdraw(&user, &50);
814+
assert_eq!(vault.balance(&user), 150);
815+
}

0 commit comments

Comments
 (0)