Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
cf1e4c6
Refactor OETHVaultCore and VaultCore to simplify asset handling and r…
clement-ux Dec 9, 2025
cdf5ee8
Add constructors to MockVault and MockVaultCoreInstantRebase for init…
clement-ux Dec 9, 2025
17ef9fb
Refactor OETHVaultCore and VaultCore to implement async withdrawal fu…
clement-ux Dec 9, 2025
7c38699
Refactor OETHVaultCore and VaultCore to remove unused functions and s…
clement-ux Dec 9, 2025
be6a697
Remove unused addWithdrawalQueueLiquidity function from OETHVaultCore…
clement-ux Dec 9, 2025
f49fa28
Refactor OETHVaultCore and VaultCore to remove unused imports and fun…
clement-ux Dec 9, 2025
9d58bde
Remove unused pricing functions and related imports in VaultCore to s…
clement-ux Dec 9, 2025
d480ca9
Update constructor parameter in OETHVaultCore to use _weth for clarity
clement-ux Dec 9, 2025
311fa8b
Add OUSDVaultCore contract and implement redeem functionality with ac…
clement-ux Dec 9, 2025
aedd14f
Refactor OETHVaultAdmin and VaultAdmin contracts to simplify code and…
clement-ux Dec 10, 2025
4a2a265
Refactor vault admin contracts to remove constructors and simplify in…
clement-ux Dec 10, 2025
87bf396
Refactor vault contracts to enforce backing asset restrictions and re…
clement-ux Dec 10, 2025
2c41717
Refactor VaultAdmin and VaultStorage contracts to simplify default st…
clement-ux Dec 10, 2025
f520e69
Refactor AbstractHarvester and related contracts to integrate oracle …
clement-ux Dec 10, 2025
3dd4788
Revert changes on Harvester
clement-ux Dec 10, 2025
16ab03b
remove old code
clement-ux Dec 11, 2025
3833da5
Refactor vault admin contracts to include backing asset address in co…
clement-ux Dec 12, 2025
0cd238a
Refactor OETH Vault tests to simplify strategy handling and improve e…
clement-ux Dec 12, 2025
2fce2d5
adjust decimal logic in VaultStorage
clement-ux Dec 12, 2025
0d931d4
wip fix test
clement-ux Dec 12, 2025
3d864d1
Refactor scaling logic in VaultCore to use scaleBy function for impro…
clement-ux Dec 15, 2025
b7b2445
Refactor Compound strategy tests to simplify logic and improve clarit…
clement-ux Dec 15, 2025
9705708
Refactor Vault tests to simplify logic by removing unused variables a…
clement-ux Dec 16, 2025
ceb6f82
Refactor Vault tests to simplify code by removing unused variables an…
clement-ux Dec 16, 2025
e2bb9e0
Refactor Vault redeem tests to simplify logic by removing unused vari…
clement-ux Dec 16, 2025
c7ce0f2
fix buyback fixture
clement-ux Dec 16, 2025
f9fbe28
Refactor Reborner contract and tests to use USDC instead of USDS, upd…
clement-ux Dec 16, 2025
377f32e
Refactor compoundingStakingSSVStrategyFixture to simplify default str…
clement-ux Dec 16, 2025
33c7e9a
Refactor Convex strategy tests to use USDC instead of USDS and simpli…
clement-ux Dec 16, 2025
e336f3e
Refactor MockVaultCoreInstantRebase constructor to accept backing ass…
clement-ux Dec 16, 2025
ac3684d
fix remaining unit test
clement-ux Dec 16, 2025
caf0e13
fix base setup
clement-ux Dec 17, 2025
fca7c79
fix sonic setup
clement-ux Dec 17, 2025
ba2591c
Add slither-disable comments for reentrancy checks in mint functions
clement-ux Dec 17, 2025
9a81eb3
Remove collateral swaps test file to streamline testing suite
clement-ux Dec 17, 2025
c5796c2
Add OUSDVaultAdmin contract and deployment script for OUSD Vault upgrade
clement-ux Dec 17, 2025
1db6636
fix vault fork test
clement-ux Dec 17, 2025
5c75d06
prettier
clement-ux Dec 17, 2025
d8ca994
fix more fork tests
clement-ux Dec 17, 2025
5c5af35
lint
clement-ux Dec 17, 2025
510b8ad
fix more tests
clement-ux Dec 17, 2025
d99f2e2
fix sonic fork test
clement-ux Dec 17, 2025
3560f0d
lint + prettier
clement-ux Dec 17, 2025
a6709b6
skip plume test
clement-ux Dec 17, 2025
8613c72
fix sonic fork test
clement-ux Dec 17, 2025
8f28790
fix sonic fork test
clement-ux Dec 17, 2025
2238a92
remove .only
clement-ux Dec 18, 2025
10e9644
remove old fix
clement-ux Dec 18, 2025
cd7b9bd
fix decimal conversion
clement-ux Dec 18, 2025
db1c4bf
refactor: change contracts to abstract for VaultAdmin, VaultCore, Vau…
clement-ux Dec 18, 2025
e4d7c73
fix test
clement-ux Dec 18, 2025
94b81f5
WIP add async withdraw test for OUSD
clement-ux Dec 18, 2025
e72adab
Add lot of test for async withdraw
clement-ux Dec 19, 2025
38a00fa
adjust comment
clement-ux Dec 19, 2025
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
8 changes: 5 additions & 3 deletions contracts/contracts/harvest/AbstractHarvester.sol
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ abstract contract AbstractHarvester is Governable {

// Revert if feed does not exist
// slither-disable-next-line unused-return
IOracle(IVault(vaultAddress).priceProvider()).price(_tokenAddress);
// IOracle(IVault(vaultAddress).priceProvider()).price(_tokenAddress);

IERC20 token = IERC20(_tokenAddress);
// if changing token swap provider cancel existing allowance
Expand Down Expand Up @@ -443,10 +443,12 @@ abstract contract AbstractHarvester is Governable {
_harvest(_strategyAddr);
IStrategy strategy = IStrategy(_strategyAddr);
address[] memory rewardTokens = strategy.getRewardTokenAddresses();
IOracle priceProvider = IOracle(IVault(vaultAddress).priceProvider());
//IOracle priceProvider = IOracle(IVault(vaultAddress).priceProvider());
uint256 len = rewardTokens.length;
for (uint256 i = 0; i < len; ++i) {
_swap(rewardTokens[i], _rewardTo, priceProvider);
// This harvester contract is not used anymore. Keeping the code
// for passing test deployment. Safe to use address(0x1) as oracle.
_swap(rewardTokens[i], _rewardTo, IOracle(address(0x1)));
}
}

Expand Down
83 changes: 10 additions & 73 deletions contracts/contracts/interfaces/IVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,29 @@ import { VaultStorage } from "../vault/VaultStorage.sol";
interface IVault {
// slither-disable-start constable-states

event AssetSupported(address _asset);
event AssetDefaultStrategyUpdated(address _asset, address _strategy);
event AssetAllocated(address _asset, address _strategy, uint256 _amount);
event StrategyApproved(address _addr);
event StrategyRemoved(address _addr);
event Mint(address _addr, uint256 _value);
event Redeem(address _addr, uint256 _value);
event CapitalPaused();
event CapitalUnpaused();
event DefaultStrategyUpdated(address _strategy);
event RebasePaused();
event RebaseUnpaused();
event VaultBufferUpdated(uint256 _vaultBuffer);
event RedeemFeeUpdated(uint256 _redeemFeeBps);
event PriceProviderUpdated(address _priceProvider);
event AllocateThresholdUpdated(uint256 _threshold);
event RebaseThresholdUpdated(uint256 _threshold);
event StrategistUpdated(address _address);
event MaxSupplyDiffChanged(uint256 maxSupplyDiff);
event YieldDistribution(address _to, uint256 _yield, uint256 _fee);
event TrusteeFeeBpsChanged(uint256 _basis);
event TrusteeAddressChanged(address _address);
event SwapperChanged(address _address);
event SwapAllowedUndervalueChanged(uint256 _basis);
event SwapSlippageChanged(address _asset, uint256 _basis);
event Swapped(
address indexed _fromAsset,
address indexed _toAsset,
uint256 _fromAssetAmount,
uint256 _toAssetAmount
);
event StrategyAddedToMintWhitelist(address indexed strategy);
event StrategyRemovedFromMintWhitelist(address indexed strategy);
event DripperChanged(address indexed _dripper);
event RebasePerSecondMaxChanged(uint256 rebaseRatePerSecond);
event DripDurationChanged(uint256 dripDuration);
event WithdrawalRequested(
address indexed _withdrawer,
uint256 indexed _requestId,
Expand All @@ -51,6 +41,7 @@ interface IVault {
uint256 _amount
);
event WithdrawalClaimable(uint256 _claimable, uint256 _newClaimable);
event WithdrawalClaimDelayUpdated(uint256 _newDelay);

// Governable.sol
function transferGovernance(address _newGovernor) external;
Expand All @@ -62,10 +53,6 @@ interface IVault {
function ADMIN_IMPLEMENTATION() external view returns (address);

// VaultAdmin.sol
function setPriceProvider(address _priceProvider) external;

function priceProvider() external view returns (address);

function setRedeemFeeBps(uint256 _redeemFeeBps) external;

function redeemFeeBps() external view returns (uint256);
Expand Down Expand Up @@ -98,28 +85,13 @@ interface IVault {

function trusteeFeeBps() external view returns (uint256);

function ousdMetaStrategy() external view returns (address);

function setSwapper(address _swapperAddr) external;

function setSwapAllowedUndervalue(uint16 _percentageBps) external;

function setOracleSlippage(address _asset, uint16 _allowedOracleSlippageBps)
external;

function supportAsset(address _asset, uint8 _unitConversion) external;

function approveStrategy(address _addr) external;

function removeStrategy(address _addr) external;

function setAssetDefaultStrategy(address _asset, address _strategy)
external;
function setDefaultStrategy(address _strategy) external;

function assetDefaultStrategies(address _asset)
external
view
returns (address);
function defaultStrategy() external view returns (address);

function pauseRebase() external;

Expand All @@ -135,10 +107,6 @@ interface IVault {

function transferToken(address _asset, uint256 _amount) external;

function priceUnitMint(address asset) external view returns (uint256);

function priceUnitRedeem(address asset) external view returns (uint256);

function withdrawAllFromStrategy(address _strategyAddr) external;

function withdrawAllFromStrategies() external;
Expand Down Expand Up @@ -172,14 +140,6 @@ interface IVault {

function rebase() external;

function swapCollateral(
address fromAsset,
address toAsset,
uint256 fromAssetAmount,
uint256 minToAssetAmount,
bytes calldata data
) external returns (uint256 toAssetAmount);

function totalValue() external view returns (uint256 value);

function checkBalance(address _asset) external view returns (uint256);
Expand All @@ -191,48 +151,24 @@ interface IVault {

function getAssetCount() external view returns (uint256);

function getAssetConfig(address _asset)
external
view
returns (VaultStorage.Asset memory config);

function getAllAssets() external view returns (address[] memory);

function getStrategyCount() external view returns (uint256);

function swapper() external view returns (address);

function allowedSwapUndervalue() external view returns (uint256);

function getAllStrategies() external view returns (address[] memory);

function isSupportedAsset(address _asset) external view returns (bool);

function netOusdMintForStrategyThreshold() external view returns (uint256);

function setOusdMetaStrategy(address _ousdMetaStrategy) external;

function setNetOusdMintForStrategyThreshold(uint256 _threshold) external;

function netOusdMintedForStrategy() external view returns (int256);

function setDripper(address _dripper) external;

function dripper() external view returns (address);

function weth() external view returns (address);

function cacheWETHAssetIndex() external;

function wethAssetIndex() external view returns (uint256);
function backingAsset() external view returns (address);

function initialize(address, address) external;
function initialize(address) external;

function setAdminImpl(address) external;

function removeAsset(address _asset) external;

// These are OETH specific functions
function addWithdrawalQueueLiquidity() external;

function requestWithdrawal(uint256 _amount)
Expand All @@ -257,7 +193,6 @@ interface IVault {
view
returns (VaultStorage.WithdrawalRequest memory);

// OETHb specific functions
function addStrategyToMintWhitelist(address strategyAddr) external;

function removeStrategyFromMintWhitelist(address strategyAddr) external;
Expand Down Expand Up @@ -285,5 +220,7 @@ interface IVault {

function previewYield() external view returns (uint256 yield);

function weth() external view returns (address);

// slither-disable-end constable-states
}
5 changes: 1 addition & 4 deletions contracts/contracts/mocks/MockEvilReentrantContract.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ contract MockEvilReentrantContract {
IVault public immutable oethVault;
address public immutable poolAddress;
bytes32 public immutable balancerPoolId;
address public immutable priceProvider;

constructor(
address _balancerVault,
Expand All @@ -37,7 +38,6 @@ contract MockEvilReentrantContract {
}

function doEvilStuff() public {
address priceProvider = oethVault.priceProvider();
uint256 rethPrice = IOracle(priceProvider).price(address(reth));

// 1. Join pool
Expand Down Expand Up @@ -99,9 +99,6 @@ contract MockEvilReentrantContract {
virtual
returns (uint256 bptExpected)
{
// Get the oracle from the OETH Vault
address priceProvider = oethVault.priceProvider();

for (uint256 i = 0; i < _assets.length; ++i) {
uint256 strategyAssetMarketPrice = IOracle(priceProvider).price(
_assets[i]
Expand Down
9 changes: 1 addition & 8 deletions contracts/contracts/mocks/MockOETHVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,6 @@ contract MockOETHVault is OETHVaultCore {
}

function supportAsset(address asset) external {
assets[asset] = Asset({
isSupported: true,
unitConversion: UnitConversion(0),
decimals: 18,
allowedOracleSlippageBps: 0
});

allAssets.push(asset);
require(asset == backingAsset, "Only backingAsset supported");
}
}
2 changes: 1 addition & 1 deletion contracts/contracts/mocks/MockOETHVaultAdmin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ contract MockOETHVaultAdmin is OETHVaultAdmin {
}

function wethAvailable() external view returns (uint256) {
return _wethAvailable();
return _backingAssetAvailable();
}
}
6 changes: 3 additions & 3 deletions contracts/contracts/mocks/MockRebornMinter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -97,15 +97,15 @@ contract Reborner {
log("We are attempting to mint..");
address asset = sanctum.asset();
address vault = sanctum.vault();
IERC20(asset).approve(vault, 1e18);
IVault(vault).mint(asset, 1e18, 0);
IERC20(asset).approve(vault, 1e6);
IVault(vault).mint(asset, 1e6, 0);
log("We are now minting..");
}

function redeem() public {
log("We are attempting to redeem..");
address vault = sanctum.vault();
IVault(vault).redeem(1e18, 1e18);
IVault(vault).redeem(1e18, 0);
log("We are now redeeming..");
}

Expand Down
5 changes: 3 additions & 2 deletions contracts/contracts/mocks/MockVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ pragma solidity ^0.8.0;

import { VaultCore } from "../vault/VaultCore.sol";
import { StableMath } from "../utils/StableMath.sol";
import { VaultInitializer } from "../vault/VaultInitializer.sol";
import "../utils/Helpers.sol";

contract MockVault is VaultCore {
using StableMath for uint256;

uint256 storedTotalValue;

constructor(address _backingAsset) VaultCore(_backingAsset) {}

function setTotalValue(uint256 _value) public {
storedTotalValue = _value;
}
Expand All @@ -31,7 +32,7 @@ contract MockVault is VaultCore {
{
// Avoids rounding errors by returning the total value
// in a single currency
if (allAssets[0] == _asset) {
if (backingAsset == _asset) {
uint256 decimals = Helpers.getDecimals(_asset);
return storedTotalValue.scaleBy(decimals, 18);
} else {
Expand Down
2 changes: 2 additions & 0 deletions contracts/contracts/mocks/MockVaultCoreInstantRebase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ pragma solidity ^0.8.0;
import { VaultCore } from "../vault/VaultCore.sol";

contract MockVaultCoreInstantRebase is VaultCore {
constructor(address _backingAsset) VaultCore(_backingAsset) {}

function _nextYield(uint256 supply, uint256 vaultValue)
internal
view
Expand Down
8 changes: 5 additions & 3 deletions contracts/contracts/strategies/BridgedWOETHStrategy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ contract BridgedWOETHStrategy is InitializableAbstractStrategy {
IWETH9 public immutable weth;
IERC20 public immutable bridgedWOETH;
IERC20 public immutable oethb;
IOracle public immutable oracle;

uint256 public constant MAX_PRICE_STALENESS = 2 days;

Expand All @@ -31,11 +32,13 @@ contract BridgedWOETHStrategy is InitializableAbstractStrategy {
BaseStrategyConfig memory _stratConfig,
address _weth,
address _bridgedWOETH,
address _oethb
address _oethb,
address _oracle
) InitializableAbstractStrategy(_stratConfig) {
weth = IWETH9(_weth);
bridgedWOETH = IERC20(_bridgedWOETH);
oethb = IERC20(_oethb);
oracle = IOracle(_oracle);
}

function initialize(uint128 _maxPriceDiffBps)
Expand Down Expand Up @@ -100,8 +103,7 @@ contract BridgedWOETHStrategy is InitializableAbstractStrategy {
*/
function _updateWOETHOraclePrice() internal returns (uint256) {
// WETH price per unit of bridged wOETH
uint256 oraclePrice = IOracle(IVault(vaultAddress).priceProvider())
.price(address(bridgedWOETH));
uint256 oraclePrice = oracle.price(address(bridgedWOETH));

// 1 wOETH > 1 WETH, always
require(oraclePrice > 1 ether, "Invalid wOETH value");
Expand Down
12 changes: 0 additions & 12 deletions contracts/contracts/vault/OETHVault.sol

This file was deleted.

Loading
Loading