Files
no_five/test/vault/DBISInstitutionalVault.t.sol
2025-11-20 15:35:25 -08:00

125 lines
3.6 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "forge-std/Test.sol";
import "../../contracts/core/DBISInstitutionalVault.sol";
import "../../contracts/interfaces/IVault.sol";
import "../../contracts/interfaces/IOracleAdapter.sol";
/**
* @title DBISInstitutionalVaultTest
* @notice Unit tests for DBIS Institutional Vault
*/
contract DBISInstitutionalVaultTest is Test {
DBISInstitutionalVault public vault;
address public oracleAdapter;
address public aavePool;
address public aaveUserAccount;
address public owner;
address public kernel;
address public operator;
event CollateralAdded(address indexed asset, uint256 amount);
event DebtRepaid(address indexed asset, uint256 amount);
event PositionSnapshot(
uint256 collateralBefore,
uint256 debtBefore,
uint256 collateralAfter,
uint256 debtAfter,
uint256 healthFactorBefore,
uint256 healthFactorAfter
);
function setUp() public {
owner = address(this);
kernel = address(0x1);
operator = address(0x2);
oracleAdapter = address(0x3);
aavePool = address(0x4);
aaveUserAccount = address(0x5);
vault = new DBISInstitutionalVault(
oracleAdapter,
aavePool,
aaveUserAccount,
owner
);
vault.grantKernel(kernel);
vault.grantOperator(operator);
}
function test_InitialState() public view {
assertEq(address(vault.oracleAdapter()), oracleAdapter);
assertEq(address(vault.aavePool()), aavePool);
assertEq(vault.aaveUserAccount(), aaveUserAccount);
assertTrue(vault.hasRole(vault.DEFAULT_ADMIN_ROLE(), owner));
}
function test_RecordCollateralAdded() public {
address asset = address(0x100);
uint256 amount = 1000e18;
vm.prank(kernel);
vm.expectEmit(true, false, false, true);
emit CollateralAdded(asset, amount);
vault.recordCollateralAdded(asset, amount);
(uint256 collateral, uint256 debt) = vault.getAssetPosition(asset);
assertEq(collateral, amount);
assertEq(debt, 0);
}
function test_RecordDebtRepaid() public {
address asset = address(0x100);
uint256 debtAmount = 500e18;
uint256 repayAmount = 300e18;
// First add some debt (simulated)
vm.startPrank(kernel);
vault.recordCollateralAdded(asset, 1000e18);
// Manually set debt (would need internal access or mock)
vm.stopPrank();
vm.prank(kernel);
vm.expectEmit(true, false, false, true);
emit DebtRepaid(asset, repayAmount);
vault.recordDebtRepaid(asset, repayAmount);
}
function test_SnapshotPosition() public {
vm.prank(kernel);
(uint256 collateral, uint256 debt, uint256 hf) = vault.snapshotPosition();
// Values would depend on Aave pool mock
assertTrue(collateral >= 0);
assertTrue(debt >= 0);
assertTrue(hf >= 0);
}
function test_OnlyKernelCanRecord() public {
address asset = address(0x100);
uint256 amount = 1000e18;
vm.prank(operator);
vm.expectRevert();
vault.recordCollateralAdded(asset, amount);
}
function test_UpdateOracleAdapter() public {
address newOracle = address(0x200);
vault.setOracleAdapter(newOracle);
assertEq(address(vault.oracleAdapter()), newOracle);
}
function test_OnlyOwnerCanUpdateOracle() public {
address newOracle = address(0x200);
vm.prank(operator);
vm.expectRevert();
vault.setOracleAdapter(newOracle);
}
}