Skip to content

Commit 3686aea

Browse files
feat: add _msgSenderOnlyEVCAccount
1 parent 5025707 commit 3686aea

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/utils/EVCUtil.sol

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,24 @@ abstract contract EVCUtil {
133133
return sender;
134134
}
135135

136+
/// @notice Retrieves the message sender, ensuring it's any EVC account meaning that the execution context is in a
137+
/// standard state (not operator authenticated, not control collateral in progress, not checks in progress).
138+
/// @dev This function must not be used on functions utilized by liquidation flows, i.e. transfer or withdraw.
139+
/// @dev This function must not be used on checkAccountStatus and checkVaultStatus functions.
140+
/// @dev This function can be used on access controlled functions to prevent non-standard authentication paths on
141+
/// the EVC.
142+
/// @return The address of the message sender.
143+
function _msgSenderOnlyEVCAccount() internal view returns (address) {
144+
return _authenticateCallerWithStandardContextState(false);
145+
}
146+
136147
/// @notice Retrieves the message sender, ensuring it's the EVC account owner and that the execution context is in a
137148
/// standard state (not operator authenticated, not control collateral in progress, not checks in progress).
149+
/// @dev It assumes that if the caller is not the EVC, the caller is the account owner.
150+
/// @dev This function must not be used on functions utilized by liquidation flows, i.e. transfer or withdraw.
151+
/// @dev This function must not be used on checkAccountStatus and checkVaultStatus functions.
152+
/// @dev This function can be used on access controlled functions to prevent non-standard authentication paths on
153+
/// the EVC.
138154
/// @return The address of the message sender.
139155
function _msgSenderOnlyEVCAccountOwner() internal view returns (address) {
140156
return _authenticateCallerWithStandardContextState(true);

test/unit/EVCUtil/EVCUtil.t.sol

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ contract EVCClient is EVCUtil {
5757
return _msgSenderForBorrow();
5858
}
5959

60+
function msgSenderOnlyEVCAccount() external view returns (address) {
61+
return _msgSenderOnlyEVCAccount();
62+
}
63+
6064
function msgSenderOnlyEVCAccountOwner() external view returns (address) {
6165
return _msgSenderOnlyEVCAccountOwner();
6266
}
@@ -195,7 +199,7 @@ contract EVCUtilTest is Test {
195199
evcClient.calledByEVCWithChecksInProgress();
196200
}
197201

198-
function test_calledByEVCAccount_calledByEVCAccountOwner_msgSenderOnlyEVCAccountOwner(
202+
function test_calledByEVCAccount_calledByEVCAccountOwner_msgSenderOnlyEVCAccount_msgSenderOnlyEVCAccountOwner(
199203
address caller,
200204
uint8 id
201205
) external {
@@ -210,6 +214,9 @@ contract EVCUtilTest is Test {
210214
vm.prank(caller);
211215
evcClient.calledByEVCAccountOwner();
212216

217+
vm.prank(caller);
218+
assertEq(evcClient.msgSenderOnlyEVCAccount(), caller);
219+
213220
vm.prank(caller);
214221
assertEq(evcClient.msgSenderOnlyEVCAccountOwner(), caller);
215222

@@ -223,6 +230,10 @@ contract EVCUtilTest is Test {
223230
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
224231
evcClient.calledByEVCAccountOwner();
225232

233+
vm.prank(address(evc));
234+
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
235+
evcClient.msgSenderOnlyEVCAccount();
236+
226237
vm.prank(address(evc));
227238
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
228239
evcClient.msgSenderOnlyEVCAccountOwner();
@@ -238,6 +249,10 @@ contract EVCUtilTest is Test {
238249
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
239250
evcClient.calledByEVCAccountOwner();
240251

252+
vm.prank(address(evc));
253+
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
254+
evcClient.msgSenderOnlyEVCAccount();
255+
241256
vm.prank(address(evc));
242257
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
243258
evcClient.msgSenderOnlyEVCAccountOwner();
@@ -253,6 +268,10 @@ contract EVCUtilTest is Test {
253268
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
254269
evcClient.calledByEVCAccountOwner();
255270

271+
vm.prank(address(evc));
272+
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
273+
evcClient.msgSenderOnlyEVCAccount();
274+
256275
vm.prank(address(evc));
257276
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
258277
evcClient.msgSenderOnlyEVCAccountOwner();
@@ -268,6 +287,10 @@ contract EVCUtilTest is Test {
268287
vm.prank(address(evc));
269288
evcClient.calledByEVCAccountOwner();
270289

290+
assertEq(evc.getAccountOwner(caller), address(0));
291+
vm.prank(address(evc));
292+
assertEq(evcClient.msgSenderOnlyEVCAccount(), caller);
293+
271294
assertEq(evc.getAccountOwner(caller), address(0));
272295
vm.prank(address(evc));
273296
assertEq(evcClient.msgSenderOnlyEVCAccountOwner(), caller);
@@ -285,6 +308,10 @@ contract EVCUtilTest is Test {
285308
vm.prank(address(evc));
286309
evcClient.calledByEVCAccountOwner();
287310

311+
assertEq(evc.getAccountOwner(caller), caller);
312+
vm.prank(address(evc));
313+
assertEq(evcClient.msgSenderOnlyEVCAccount(), caller);
314+
288315
assertEq(evc.getAccountOwner(caller), caller);
289316
vm.prank(address(evc));
290317
assertEq(evcClient.msgSenderOnlyEVCAccountOwner(), caller);
@@ -298,6 +325,9 @@ contract EVCUtilTest is Test {
298325
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
299326
evcClient.calledByEVCAccountOwner();
300327

328+
vm.prank(address(evc));
329+
assertEq(evcClient.msgSenderOnlyEVCAccount(), address(uint160(uint160(caller) ^ id)));
330+
301331
vm.prank(address(evc));
302332
vm.expectRevert(abi.encodeWithSelector(EVCUtil.NotAuthorized.selector));
303333
evcClient.msgSenderOnlyEVCAccountOwner();

0 commit comments

Comments
 (0)