From 847d2f7d716abb5db0143e3697ef96df3ad2e50e Mon Sep 17 00:00:00 2001 From: kasperpawlowski <25374117+kasperpawlowski@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:13:46 +0000 Subject: [PATCH] fix: invert debt socialization logic, refactor initialize function, check cfg flags in skim function --- src/EVault/modules/Initialize.sol | 11 ----- src/EVault/modules/Liquidation.sol | 2 +- src/EVault/modules/Vault.sol | 4 ++ src/EVault/shared/Constants.sol | 2 +- ...t.deposit.t.sol => ESVault.allocate.t.sol} | 17 +++++-- .../modules/Initialize/configflags.t.sol | 48 ------------------- 6 files changed, 20 insertions(+), 64 deletions(-) rename test/unit/esvault/{ESVault.deposit.t.sol => ESVault.allocate.t.sol} (56%) delete mode 100644 test/unit/evault/modules/Initialize/configflags.t.sol diff --git a/src/EVault/modules/Initialize.sol b/src/EVault/modules/Initialize.sol index 893a92d3..69a7e74f 100644 --- a/src/EVault/modules/Initialize.sol +++ b/src/EVault/modules/Initialize.sol @@ -46,12 +46,6 @@ abstract contract InitializeModule is IInitialize, Base, BorrowUtils { snapshot.reset(); - { - uint32 defaultConfigFlags = CFG_SOCIALIZE_DEBT; - if (isEVCCompatible(address(asset))) defaultConfigFlags |= CFG_EVC_COMPATIBLE_ASSET; - marketStorage.configFlags = Flags.wrap(defaultConfigFlags); - } - // Emit logs emit EVaultCreated(proxyCreator, address(asset), dToken); @@ -62,11 +56,6 @@ abstract contract InitializeModule is IInitialize, Base, BorrowUtils { constructor() { initialized = true; } - - function isEVCCompatible(address asset) private view returns (bool) { - (bool success, bytes memory data) = asset.staticcall(abi.encodeCall(IGovernance.EVC, ())); - return success && data.length >= 32 && abi.decode(data, (address)) == address(evc); - } } contract Initialize is InitializeModule { diff --git a/src/EVault/modules/Liquidation.sol b/src/EVault/modules/Liquidation.sol index 877c7fdd..53b11147 100644 --- a/src/EVault/modules/Liquidation.sol +++ b/src/EVault/modules/Liquidation.sol @@ -201,7 +201,7 @@ abstract contract LiquidationModule is ILiquidation, Base, BalanceUtils, Liquidi // Handle debt socialization if ( - marketCache.configFlags.isSet(CFG_SOCIALIZE_DEBT) && liqCache.owed > liqCache.repay + marketCache.configFlags.isNotSet(CFG_DONT_SOCIALIZE_DEBT) && liqCache.owed > liqCache.repay && checkNoCollateral(liqCache.violator, liqCache.collaterals) ) { Assets owedRemaining = liqCache.owed - liqCache.repay; diff --git a/src/EVault/modules/Vault.sol b/src/EVault/modules/Vault.sol index 4e98408a..89548585 100644 --- a/src/EVault/modules/Vault.sol +++ b/src/EVault/modules/Vault.sol @@ -188,6 +188,10 @@ abstract contract VaultModule is IVault, Base, AssetTransfers, BalanceUtils { Shares shares = assets.toSharesDown(marketCache); if (shares.isZero()) revert E_ZeroShares(); + if (marketCache.configFlags.isSet(CFG_ONLY_ASSET_CAN_DEPOSIT) && receiver != asset()) { + revert E_OnlyAssetCanDeposit(); + } + increaseBalance(marketCache, receiver, account, shares, assets); marketStorage.cash = marketCache.cash = marketCache.cash + assets; diff --git a/src/EVault/shared/Constants.sol b/src/EVault/shared/Constants.sol index c9588547..8faa5905 100644 --- a/src/EVault/shared/Constants.sol +++ b/src/EVault/shared/Constants.sol @@ -44,7 +44,7 @@ uint32 constant OP_ACCRUE_INTEREST = 1 << 15; // Config Flags -uint32 constant CFG_SOCIALIZE_DEBT = 1 << 0; +uint32 constant CFG_DONT_SOCIALIZE_DEBT = 1 << 0; uint32 constant CFG_EVC_COMPATIBLE_ASSET = 1 << 1; uint32 constant CFG_ONLY_ASSET_CAN_DEPOSIT = 1 << 2; diff --git a/test/unit/esvault/ESVault.deposit.t.sol b/test/unit/esvault/ESVault.allocate.t.sol similarity index 56% rename from test/unit/esvault/ESVault.deposit.t.sol rename to test/unit/esvault/ESVault.allocate.t.sol index 58d591af..3f6f2133 100644 --- a/test/unit/esvault/ESVault.deposit.t.sol +++ b/test/unit/esvault/ESVault.allocate.t.sol @@ -5,19 +5,30 @@ pragma solidity ^0.8.0; import {ESVaultTestBase, ESynth} from "./ESVaultTestBase.t.sol"; import {Errors} from "../../../src/EVault/shared/Errors.sol"; -contract ESVaultTestDeposit is ESVaultTestBase { +contract ESVaultTestAllocate is ESVaultTestBase { function setUp() public override { super.setUp(); assetTSTAsSynth.setCapacity(address(this), 10000e18); } - function test_deposit_from_non_synth() public { + function test_allocate_from_non_synth() public { + // enable all the ops to show that when only asset is configured to deposit, mint and skim will fail + eTST.setLockedOps(0); + eTST.setDisabledOps(0); + vm.expectRevert(Errors.E_OnlyAssetCanDeposit.selector); eTST.deposit(100, address(this)); + + vm.expectRevert(Errors.E_OnlyAssetCanDeposit.selector); + eTST.mint(100, address(this)); + + assetTSTAsSynth.mint(address(eTST), 100); + vm.expectRevert(Errors.E_OnlyAssetCanDeposit.selector); + eTST.skim(100, address(this)); } - function test_deposit_from_synth() public { + function test_allocate_from_synth() public { assetTSTAsSynth.mint(address(assetTSTAsSynth), 100); assetTSTAsSynth.allocate(address(eTST), 100); diff --git a/test/unit/evault/modules/Initialize/configflags.t.sol b/test/unit/evault/modules/Initialize/configflags.t.sol deleted file mode 100644 index 90d4fd28..00000000 --- a/test/unit/evault/modules/Initialize/configflags.t.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -pragma solidity ^0.8.0; - -import {EVaultTestBase} from "../../EVaultTestBase.t.sol"; - -import {TestERC20} from "../../../../mocks/TestERC20.sol"; - -import "src/EVault/shared/types/Types.sol"; - -contract Initialize_ConfigFlags is EVaultTestBase { - using TypesLib for uint256; - - function setUp() public override { - super.setUp(); - } - - function test_evc_compatiblity() public { - // Incompatible asset - { - TestERC20 assetJUNK = new TestERC20("Test Token", "JUNK", 18, false); - - IEVault eJUNK = - IEVault(factory.createProxy(true, abi.encodePacked(address(assetJUNK), address(oracle), unitOfAccount))); - assertTrue(eJUNK.configFlags() & CFG_EVC_COMPATIBLE_ASSET == 0); - } - - // Compatible asset - { - TestERC20 assetJUNK = new TestERC20("Test Token", "JUNK", 18, false); - assetJUNK.configure("evc/address", abi.encode(address(evc))); - - IEVault eJUNK = - IEVault(factory.createProxy(true, abi.encodePacked(address(assetJUNK), address(oracle), unitOfAccount))); - assertTrue(eJUNK.configFlags() & CFG_EVC_COMPATIBLE_ASSET != 0); - } - - // Different EVC - { - TestERC20 assetJUNK = new TestERC20("Test Token", "JUNK", 18, false); - assetJUNK.configure("evc/address", abi.encode(address(eTST))); - - IEVault eJUNK = - IEVault(factory.createProxy(true, abi.encodePacked(address(assetJUNK), address(oracle), unitOfAccount))); - assertTrue(eJUNK.configFlags() & CFG_EVC_COMPATIBLE_ASSET == 0); - } - } -}