diff --git a/src/EulerSwapRegistry.sol b/src/EulerSwapRegistry.sol index 5d67ef1..0594544 100644 --- a/src/EulerSwapRegistry.sol +++ b/src/EulerSwapRegistry.sol @@ -314,6 +314,8 @@ contract EulerSwapRegistry is IEulerSwapRegistry, EVCUtil { bondAmount = validityBonds[pool]; if (bondAmount != 0) { + address owner = evc.getAccountOwner(recipient); + if (owner != address(0)) recipient = owner; validityBonds[pool] = 0; (bool success,) = recipient.call{value: bondAmount}(""); require(success, ChallengeMissingBond()); diff --git a/test/Custodian.t.sol b/test/Custodian.t.sol index bc58915..145762c 100644 --- a/test/Custodian.t.sol +++ b/test/Custodian.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.24; import { - IEVault, IEulerSwap, EulerSwapTestBase, EulerSwap, EulerSwapRegistry, TestERC20 + IEVC, IEVault, IEulerSwap, EulerSwapTestBase, EulerSwap, EulerSwapRegistry, TestERC20 } from "./EulerSwapTestBase.t.sol"; contract CuratorTest is EulerSwapTestBase { @@ -79,4 +79,24 @@ contract CuratorTest is EulerSwapTestBase { assertEq(eulerSwapRegistry.validityBond(address(eulerSwap)), 0.2e18); } + + function test_bondsSubAccount() public { + (IEulerSwap.StaticParams memory sParams, IEulerSwap.DynamicParams memory dParams) = + getEulerSwapParams(1000e18, 1000e18, 1e18, 1e18, 0.85e18, 0.85e18, 0, address(0), 0, address(0)); + IEulerSwap.InitialState memory initialState = IEulerSwap.InitialState({reserve0: 1000e18, reserve1: 1000e18}); + + sParams.eulerAccount = address(uint160(holder) ^ 1); + + vm.deal(holder, 0.123e18); + eulerSwap = createEulerSwapFull(sParams, dParams, initialState); + + assertEq(holder.balance, 0); + + vm.prank(holder); + evc.setAccountOperator(sParams.eulerAccount, address(eulerSwap), false); + vm.prank(holder); + IEVC(evc).call(address(eulerSwapRegistry), sParams.eulerAccount, 0, abi.encodeCall(EulerSwapRegistry.unregisterPool, ())); + + assertEq(holder.balance, 0.123e18); + } } diff --git a/test/EulerSwapTestBase.t.sol b/test/EulerSwapTestBase.t.sol index c078816..a784d33 100644 --- a/test/EulerSwapTestBase.t.sol +++ b/test/EulerSwapTestBase.t.sol @@ -156,18 +156,20 @@ contract EulerSwapTestBase is EVaultTestBase { address predictedAddr = eulerSwapFactory.computePoolAddress(sParams, salt); vm.prank(holder); - evc.setAccountOperator(holder, predictedAddr, true); + evc.setAccountOperator(sParams.eulerAccount, predictedAddr, true); installedOperator = predictedAddr; uint256 ethBalance = holder.balance; + vm.prank(holder); if (expectAccountLiquidityRevert) vm.expectRevert(E_AccountLiquidity.selector); - EulerSwap eulerSwap = EulerSwap(eulerSwapFactory.deployPool(sParams, dParams, initialState, salt)); - if (expectAccountLiquidityRevert) return eulerSwap; + bytes memory result = IEVC(evc).call(address(eulerSwapFactory), sParams.eulerAccount, 0, abi.encodeCall(EulerSwapFactory.deployPool, (sParams, dParams, initialState, salt))); + if (expectAccountLiquidityRevert) return EulerSwap(address(0)); // Just to return to test + EulerSwap eulerSwap = EulerSwap(abi.decode(result, (address))); vm.prank(holder); if (expectInsufficientValidityBondRevert) vm.expectRevert(EulerSwapRegistry.InsufficientValidityBond.selector); - eulerSwapRegistry.registerPool{value: ethBalance}(address(eulerSwap)); + IEVC(evc).call{value: ethBalance}(address(eulerSwapRegistry), sParams.eulerAccount, ethBalance, abi.encodeCall(EulerSwapRegistry.registerPool, (address(eulerSwap)))); return eulerSwap; }