Skip to content

Commit 22fd8de

Browse files
authored
Merge pull request #64 from euler-xyz/validate-proxy-hook-addrs
validate proxy addrs are valid hooks, don't bother with the implement…
2 parents 63a7896 + eebc566 commit 22fd8de

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

src/UniswapHook.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ contract UniswapHook is BaseHook {
3535
}
3636

3737
function activateHook(IEulerSwap.Params memory p) internal {
38+
Hooks.validateHookPermissions(this, getHookPermissions());
39+
3840
address asset0Addr = IEVault(p.vault0).asset();
3941
address asset1Addr = IEVault(p.vault1).asset();
4042

@@ -58,6 +60,11 @@ contract UniswapHook is BaseHook {
5860
return _poolKey;
5961
}
6062

63+
/// @dev Prevent hook address validation in constructor, which is not needed
64+
/// because hook instances are proxies. Instead, the address is validated
65+
/// in activateHook().
66+
function validateHookAddress(BaseHook _this) internal pure override {}
67+
6168
function _beforeSwap(address, PoolKey calldata key, IPoolManager.SwapParams calldata params, bytes calldata)
6269
internal
6370
override

test/EulerSwapTestBase.t.sol

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {EulerSwapFactory} from "../src/EulerSwapFactory.sol";
99
import {EulerSwapPeriphery} from "../src/EulerSwapPeriphery.sol";
1010
import {IPoolManager} from "@uniswap/v4-core/src/interfaces/IPoolManager.sol";
1111
import {HookMiner} from "./utils/HookMiner.sol";
12-
import {HookMiner as v4HookMiner} from "v4-periphery/src/utils/HookMiner.sol";
1312
import {Hooks} from "@uniswap/v4-core/src/libraries/Hooks.sol";
1413
import {MetaProxyDeployer} from "../src/utils/MetaProxyDeployer.sol";
1514

@@ -38,18 +37,7 @@ contract EulerSwapTestBase is EVaultTestBase {
3837
}
3938

4039
function deployEulerSwap(address poolManager_) public {
41-
// use the canonical miner to find a valid 'implementation' address
42-
(, bytes32 salt) = v4HookMiner.find(
43-
address(this),
44-
uint160(
45-
Hooks.BEFORE_INITIALIZE_FLAG | Hooks.BEFORE_SWAP_FLAG | Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG
46-
| Hooks.BEFORE_ADD_LIQUIDITY_FLAG
47-
),
48-
type(EulerSwap).creationCode,
49-
abi.encode(address(evc), poolManager_)
50-
);
51-
52-
eulerSwapImpl = address(new EulerSwap{salt: salt}(address(evc), poolManager_));
40+
eulerSwapImpl = address(new EulerSwap(address(evc), poolManager_));
5341
eulerSwapFactory = new EulerSwapFactory(address(evc), address(factory), eulerSwapImpl, address(this));
5442
periphery = new EulerSwapPeriphery();
5543
}

test/FactoryTest.t.sol

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ contract FactoryTest is EulerSwapTestBase {
4141
(hookAddress, salt) = HookMiner.find(address(eulerSwapFactory), holder, flags, creationCode);
4242
}
4343

44+
function mineBadSalt(IEulerSwap.Params memory poolParams)
45+
internal
46+
view
47+
returns (address hookAddress, bytes32 salt)
48+
{
49+
// missing BEFORE_ADD_LIQUIDITY_FLAG
50+
uint160 flags =
51+
uint160(Hooks.BEFORE_INITIALIZE_FLAG | Hooks.BEFORE_SWAP_FLAG | Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG);
52+
bytes memory creationCode = MetaProxyDeployer.creationCodeMetaProxy(eulerSwapImpl, abi.encode(poolParams));
53+
(hookAddress, salt) = HookMiner.find(address(eulerSwapFactory), holder, flags, creationCode);
54+
}
55+
4456
function testDeployPool() public {
4557
uint256 allPoolsLengthBefore = eulerSwapFactory.poolsLength();
4658

@@ -117,6 +129,18 @@ contract FactoryTest is EulerSwapTestBase {
117129
evc.batch(items);
118130
}
119131

132+
function testBadSalt() public {
133+
(IEulerSwap.Params memory poolParams, IEulerSwap.InitialState memory initialState) = getBasicParams();
134+
(address hookAddress, bytes32 salt) = mineBadSalt(poolParams);
135+
136+
vm.prank(holder);
137+
evc.setAccountOperator(holder, hookAddress, true);
138+
139+
vm.expectRevert(abi.encodeWithSelector(Hooks.HookAddressNotValid.selector, hookAddress));
140+
vm.prank(holder);
141+
eulerSwapFactory.deployPool(poolParams, initialState, salt);
142+
}
143+
120144
function testInvalidPoolsSliceOutOfBounds() public {
121145
vm.expectRevert(EulerSwapFactory.SliceOutOfBounds.selector);
122146
eulerSwapFactory.poolsSlice(1, 0);

0 commit comments

Comments
 (0)