Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
42 changes: 18 additions & 24 deletions contracts/contracts/vault/OETHVaultCore.sol
Original file line number Diff line number Diff line change
Expand Up @@ -395,15 +395,24 @@ contract OETHVaultCore is VaultCore {
override
returns (uint256 balance)
{
if (_asset != weth) {
return 0;
}

// Get the WETH in the vault and the strategies
balance = super._checkBalance(_asset);

if (_asset == weth) {
WithdrawalQueueMetadata memory queue = withdrawalQueueMetadata;
// Need to remove WETH that is reserved for the withdrawal queue
if (balance + queue.claimed >= queue.queued) {
return balance + queue.claimed - queue.queued;
}
WithdrawalQueueMetadata memory queue = withdrawalQueueMetadata;

// If the vault becomes insolvent enough that the total value in the vault and all strategies
// is less than the outstanding withdrawals.
// For example, there was a mass slashing event and most users request a withdrawal.
if (balance + queue.claimed < queue.queued) {
return 0;
}

// Need to remove WETH that is reserved for the withdrawal queue
return balance + queue.claimed - queue.queued;
}

/**
Expand Down Expand Up @@ -446,29 +455,14 @@ contract OETHVaultCore is VaultCore {
emit AssetAllocated(weth, depositStrategyAddr, allocateAmount);
}

/// @dev The total value of all assets held by the vault and all its strategies
/// @dev The total value of all WETH held by the vault and all its strategies
/// less any WETH that is reserved for the withdrawal queue.
/// For OETH, this is just WETH in the vault and strategies.
///
// If there is not enough WETH in the vault and all strategies to cover all outstanding
// withdrawal requests then return a total value of 0.
function _totalValue() internal view override returns (uint256 value) {
value = _totalValueInVault() + _totalValueInStrategies();

// Need to remove WETH that is reserved for the withdrawal queue.
WithdrawalQueueMetadata memory queue = withdrawalQueueMetadata;
// reserved for the withdrawal queue = cumulative queued total - total claimed
uint256 reservedForQueue = queue.queued - queue.claimed;

if (value < reservedForQueue) {
// This can happen if the vault becomes insolvent enough that the
// total value in the vault and all strategies is less than the outstanding withdrawals.
// For example, there was a mass slashing event and most users request a withdrawal.
return 0;
}

// Adjust the total value by the amount reserved for the withdrawal queue
return value - reservedForQueue;
// As WETH is the only asset, just return the WETH balance
return _checkBalance(weth);
}

/// @dev Only WETH is supported in the OETH Vault so return the WETH balance only
Expand Down
5 changes: 5 additions & 0 deletions contracts/test/vault/oeth-vault.js
Original file line number Diff line number Diff line change
Expand Up @@ -2149,6 +2149,11 @@ describe("OETH Vault", function () {
// 100 from mints - 99 outstanding withdrawals - 2 from slashing = -1 value which is rounder up to zero
expect(await fixture.oethVault.totalValue()).to.equal(0);
});
it("Should have check balance of zero", async () => {
const { oethVault, weth } = fixture;
// 100 from mints - 99 outstanding withdrawals - 2 from slashing = -1 value which is rounder up to zero
expect(await oethVault.checkBalance(weth.address)).to.equal(0);
});
it("Fail to allow user to create a new request due to too many outstanding requests", async () => {
const { oethVault, matt } = fixture;

Expand Down