// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "forge-std/Test.sol"; import "../../contracts/vault/Vault.sol"; import "../../contracts/vault/Ledger.sol"; import "../../contracts/vault/RegulatedEntityRegistry.sol"; import "../../contracts/vault/XAUOracle.sol"; import "../../contracts/vault/RateAccrual.sol"; import "../../contracts/vault/adapters/CollateralAdapter.sol"; import "../../contracts/vault/adapters/eMoneyJoin.sol"; import "../../contracts/vault/tokens/DepositToken.sol"; import "../../contracts/vault/tokens/DebtToken.sol"; import "../../contracts/emoney/eMoneyToken.sol"; import "../../contracts/oracle/Aggregator.sol"; contract VaultTest is Test { Vault public vault; Ledger public ledger; RegulatedEntityRegistry public entityRegistry; XAUOracle public xauOracle; RateAccrual public rateAccrual; CollateralAdapter public collateralAdapter; eMoneyJoin public eMoneyJoinAdapter; DepositToken public depositToken; DebtToken public debtToken; eMoneyToken public eMoneyTokenInstance; address public admin = address(0x1); address public owner = address(0x2); address public entity = address(0x3); address public user = address(0x4); address public eth = address(0); function setUp() public { vm.startPrank(admin); // Deploy entity registry entityRegistry = new RegulatedEntityRegistry(admin); entityRegistry.registerEntity(entity, keccak256("US"), new address[](0)); entityRegistry.addAuthorizedWallet(entity, owner); // Deploy oracle infrastructure Aggregator ethFeed = new Aggregator("ETH/XAU", admin, 3600, 50); ethFeed.addTransmitter(admin); ethFeed.updateAnswer(0.05e18); // 1 ETH = 0.05 oz XAU xauOracle = new XAUOracle(admin); xauOracle.addPriceFeed(address(ethFeed), 10000); xauOracle.updatePrice(); rateAccrual = new RateAccrual(admin); rateAccrual.setInterestRate(address(0), 500); // 5% // Deploy ledger ledger = new Ledger(admin, address(xauOracle), address(rateAccrual)); ledger.setRiskParameters(eth, 1_000_000e18, 11000, 50000); // Deploy adapters collateralAdapter = new CollateralAdapter(admin, address(ledger)); collateralAdapter.approveAsset(eth); ledger.grantVaultRole(address(collateralAdapter)); eMoneyJoinAdapter = new eMoneyJoin(admin); ledger.grantVaultRole(address(eMoneyJoinAdapter)); // Deploy eMoney token (mock) // Note: Would need full eMoney setup with PolicyManager, etc. // For now, create simplified version // Deploy vault vault = new Vault( owner, entity, address(ledger), address(entityRegistry), address(collateralAdapter), address(eMoneyJoinAdapter) ); ledger.grantVaultRole(address(vault)); vm.stopPrank(); } function test_Deposit() public { vm.deal(owner, 10 ether); vm.startPrank(owner); vault.deposit{value: 5 ether}(eth, 5 ether); vm.stopPrank(); assertEq(ledger.collateral(address(vault), eth), 5 ether); } function test_Deposit_RevertIfNotAuthorized() public { address unauthorized = address(0x999); vm.deal(unauthorized, 10 ether); vm.prank(unauthorized); vm.expectRevert("Vault: not authorized"); vault.deposit{value: 5 ether}(eth, 5 ether); } function test_Withdraw() public { vm.deal(owner, 10 ether); vm.startPrank(owner); vault.deposit{value: 10 ether}(eth, 10 ether); vault.withdraw(eth, 5 ether); vm.stopPrank(); assertEq(ledger.collateral(address(vault), eth), 5 ether); } function test_GetHealth() public { vm.deal(owner, 10 ether); vm.prank(owner); vault.deposit{value: 10 ether}(eth, 10 ether); (uint256 healthRatio, uint256 collateralValue, uint256 debtValue) = vault.getHealth(); assertGt(collateralValue, 0); assertEq(debtValue, 0); assertEq(healthRatio, type(uint256).max); } }