diff --git a/packages/contracts/vault/src/lib.rs b/packages/contracts/vault/src/lib.rs index 2da4054..67dc3e6 100644 --- a/packages/contracts/vault/src/lib.rs +++ b/packages/contracts/vault/src/lib.rs @@ -141,6 +141,7 @@ pub enum ContractError { /// malformed protocol response. Depositing would dilute all existing /// holders. AdapterReportedNoAssets = 17, + AdapterCreditedNothing = 15, } // --------------------------------------------------------------------------- @@ -250,6 +251,9 @@ impl MeridianVault { // Adapter deploys USDC to the underlying protocol and returns its own shares. let adapter_shares = AdapterClient::new(&env, &adapter_addr).deposit(&amount); + if adapter_shares <= 0 { + return Err(ContractError::AdapterCreditedNothing); + } // Mint mUSDC shares to caller. token::StellarAssetClient::new(&env, &musdc).mint(&caller, &shares_to_mint); @@ -1731,6 +1735,28 @@ mod tests { assert_eq!(result, Err(Ok(ContractError::SameAdapter))); } + #[test] + fn deposit_fails_when_adapter_returns_zero_shares() { + use zero_share_mock::{ZeroShareMockAdapter, ZeroShareMockAdapterClient}; + + let (env, admin, user, usdc, _adapter, _vault) = setup(); + let amount = 100_000000_i128; + +// Register and initialize zero share adapter +let zero_share_adapter_id = env.register(ZeroShareMockAdapter, ()); +ZeroShareMockAdapterClient::new(&env, &zero_share_adapter_id).initialize(&usdc); + +// Deploy a vault configured with the zero-share adapter +let musdc_id = env.register_stellar_asset_contract_v2(admin.clone()).address(); +let vault_id = env.register(MeridianVault, ()); +let vault = MeridianVaultClient::new(&env, &vault_id); +vault.initialize(&admin, &usdc, &musdc_id, &zero_share_adapter_id); + +// Attempt deposit and assert it returns AdapterCreditedNothing (error code 15) +let result = vault.try_deposit(&user, &amount); +assert_eq!(result, Err(Ok(ContractError::AdapterCreditedNothing))); +} + #[test] fn migrate_adapter_rejects_value_drift_beyond_slippage() { use lossy_mock::{LossyMockAdapter, LossyMockAdapterClient};