Skip to content

Commit 6e8a8c8

Browse files
authored
Merge pull request #69 from euler-xyz/simplify-getParams
avoid use of assembly in getParams (suggested by @MiloTruck)
2 parents d6a30a6 + 533934e commit 6e8a8c8

File tree

3 files changed

+35
-24
lines changed

3 files changed

+35
-24
lines changed

src/libraries/CtxLib.sol

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,15 @@ library CtxLib {
1919
}
2020
}
2121

22+
error InsufficientCalldata();
23+
2224
/// @dev Unpacks encoded Params from trailing calldata. Loosely based on
2325
/// the implementation from EIP-3448 (except length is hard-coded).
26+
/// 384 is the size of the Params struct after ABI encoding.
2427
function getParams() internal pure returns (IEulerSwap.Params memory p) {
25-
bytes memory data;
26-
27-
assembly {
28-
let size := 384
29-
let dataPtr := sub(calldatasize(), size)
30-
data := mload(64)
31-
// increment free memory pointer by metadata size + 32 bytes (length)
32-
mstore(64, add(data, add(size, 32)))
33-
mstore(data, size)
34-
let memPtr := add(data, 32)
35-
calldatacopy(memPtr, dataPtr, size)
28+
require(msg.data.length >= 384, InsufficientCalldata());
29+
unchecked {
30+
return abi.decode(msg.data[msg.data.length - 384:], (IEulerSwap.Params));
3631
}
37-
38-
return abi.decode(data, (IEulerSwap.Params));
3932
}
4033
}

test/Ctx.t.sol

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: GPL-2.0-or-later
22
pragma solidity ^0.8.24;
33

4-
import {EulerSwapTestBase, IEulerSwap} from "./EulerSwapTestBase.t.sol";
4+
import {EulerSwapTestBase, EulerSwap, IEulerSwap} from "./EulerSwapTestBase.t.sol";
55
import {CtxLib} from "../src/libraries/CtxLib.sol";
66

77
contract CtxTest is EulerSwapTestBase {
@@ -17,4 +17,32 @@ contract CtxTest is EulerSwapTestBase {
1717
IEulerSwap.Params memory params = getEulerSwapParams(1e18, 1e18, 1e18, 1e18, 0.4e18, 0.85e18, 0, 0, address(0));
1818
assertEq(abi.encode(params).length, 384);
1919
}
20+
21+
function test_insufficientCalldata() public {
22+
// Proxy appends 384 bytes of calldata, so you can't call directly without this
23+
24+
vm.expectRevert(CtxLib.InsufficientCalldata.selector);
25+
EulerSwap(eulerSwapImpl).getParams();
26+
}
27+
28+
function test_callImplementationDirectly() public {
29+
// Underlying implementation is locked: must call via a proxy
30+
31+
bool success;
32+
33+
vm.expectRevert(EulerSwap.AlreadyActivated.selector);
34+
(success,) = eulerSwapImpl.call(
35+
padCalldata(
36+
abi.encodeCall(EulerSwap.activate, (IEulerSwap.InitialState({currReserve0: 1e18, currReserve1: 1e18})))
37+
)
38+
);
39+
40+
vm.expectRevert(EulerSwap.Locked.selector);
41+
(success,) = eulerSwapImpl.call(padCalldata(abi.encodeCall(EulerSwap.getReserves, ())));
42+
}
43+
44+
function padCalldata(bytes memory inp) internal pure returns (bytes memory) {
45+
IEulerSwap.Params memory params;
46+
return abi.encodePacked(inp, abi.encode(params));
47+
}
2048
}

test/FactoryTest.t.sol

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -249,14 +249,4 @@ contract FactoryTest is EulerSwapTestBase {
249249
assertEq(pools.length, 1);
250250
assertEq(pools[0], hookAddress);
251251
}
252-
253-
function testCallImpl() public {
254-
// Underlying implementation is locked: must call via a proxy
255-
256-
vm.expectRevert(EulerSwap.AlreadyActivated.selector);
257-
EulerSwap(eulerSwapImpl).activate(IEulerSwap.InitialState({currReserve0: 1e18, currReserve1: 1e18}));
258-
259-
vm.expectRevert(EulerSwap.Locked.selector);
260-
EulerSwap(eulerSwapImpl).getReserves();
261-
}
262252
}

0 commit comments

Comments
 (0)