diff --git a/src/test/utils/ERC4337Helpers.sol b/src/test/utils/ERC4337Helpers.sol index 2f4e8a11..de8dc786 100644 --- a/src/test/utils/ERC4337Helpers.sol +++ b/src/test/utils/ERC4337Helpers.sol @@ -178,17 +178,44 @@ library ERC4337Helpers { function checkRevertMessage(bytes memory actualReason) internal view { bytes memory revertMessage = getExpectRevertMessage(); - - if (revertMessage.length == 4) { - bytes4 expected = bytes4(revertMessage); + if (actualReason.length >= 4) { bytes4 actual = bytes4(actualReason); - if (expected != actual) { - revert InvalidRevertMessage(expected, actual); - } - } else { - if (revertMessage.length != actualReason.length) { + bytes4 expected = bytes4(revertMessage); + if (actual == bytes4(0x65c8fd4d)) { + return parseFailedOpWithRevert(actualReason, revertMessage); + } else if (actual != expected) { revert InvalidRevertMessageBytes(revertMessage, actualReason); } + return; + } + if (revertMessage.length != actualReason.length) { + revert InvalidRevertMessageBytes(revertMessage, actualReason); + } + } + + function parseFailedOpWithRevert( + bytes memory actualReason, + bytes memory revertMessage + ) + internal + pure + { + bytes memory lastBytes = new bytes(32); + uint256 start = actualReason.length >= 32 ? actualReason.length - 32 : 0; + + assembly { + let srcPtr := add(add(actualReason, 0x20), start) + let destPtr := add(lastBytes, 0x20) + mstore(destPtr, mload(srcPtr)) + } + + bytes4 actual; + assembly { + actual := mload(add(lastBytes, 0x20)) + } + bytes4 expected = bytes4(revertMessage); + if (expected != actual) { + revert InvalidRevertMessage(expected, actual); } } diff --git a/test/Diff.t.sol b/test/Diff.t.sol index d1c504e3..bc9892de 100644 --- a/test/Diff.t.sol +++ b/test/Diff.t.sol @@ -128,24 +128,20 @@ contract ERC7579DifferentialModuleKitLibTest is BaseTest { // No revert reason _revertWhen__ValidationReverts(""); - // Revert selector - _revertWhen__ValidationReverts(abi.encodePacked(bytes4(0x65c8fd4d))); - // Revert message bytes memory revertMessage; AccountType env = ModuleKitHelpers.getAccountType(); + + // Revert selector + _revertWhen__ValidationReverts( + abi.encodePacked(bytes4(env == AccountType.SAFE ? 0xacfdb444 : 0x0)) + ); + if (env == AccountType.SAFE) { - revertMessage = abi.encodeWithSignature( - "FailedOpWithRevert(uint256,string,bytes)", - 0, - "AA23 reverted", - abi.encode(bytes4(0xacfdb444)) - ); + revertMessage = abi.encode(bytes4(0xacfdb444)); } else { - revertMessage = abi.encodeWithSignature( - "FailedOpWithRevert(uint256,string,bytes)", 0, "AA23 reverted", "" - ); + revertMessage = abi.encode(bytes4(0x0)); } _revertWhen__ValidationReverts(revertMessage);