ERC7579Mock.sol 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.24;
  3. import {
  4. MODULE_TYPE_HOOK,
  5. MODULE_TYPE_FALLBACK,
  6. MODULE_TYPE_VALIDATOR,
  7. IERC7579Hook,
  8. IERC7579Module,
  9. IERC7579Validator
  10. } from "../../../interfaces/draft-IERC7579.sol";
  11. import {SignatureChecker} from "../../../utils/cryptography/SignatureChecker.sol";
  12. import {PackedUserOperation} from "../../../interfaces/draft-IERC4337.sol";
  13. import {IERC1271} from "../../../interfaces/IERC1271.sol";
  14. import {ERC4337Utils} from "../../../account/utils/draft-ERC4337Utils.sol";
  15. abstract contract ERC7579ModuleMock is IERC7579Module {
  16. uint256 private _moduleTypeId;
  17. event ModuleInstalledReceived(address account, bytes data);
  18. event ModuleUninstalledReceived(address account, bytes data);
  19. constructor(uint256 moduleTypeId) {
  20. _moduleTypeId = moduleTypeId;
  21. }
  22. function onInstall(bytes calldata data) public virtual {
  23. emit ModuleInstalledReceived(msg.sender, data);
  24. }
  25. function onUninstall(bytes calldata data) public virtual {
  26. emit ModuleUninstalledReceived(msg.sender, data);
  27. }
  28. function isModuleType(uint256 moduleTypeId) external view returns (bool) {
  29. return moduleTypeId == _moduleTypeId;
  30. }
  31. }
  32. abstract contract ERC7579HookMock is ERC7579ModuleMock(MODULE_TYPE_HOOK), IERC7579Hook {
  33. event PreCheck(address sender, uint256 value, bytes data);
  34. event PostCheck(bytes hookData);
  35. function preCheck(
  36. address msgSender,
  37. uint256 value,
  38. bytes calldata msgData
  39. ) external returns (bytes memory hookData) {
  40. emit PreCheck(msgSender, value, msgData);
  41. return msgData;
  42. }
  43. function postCheck(bytes calldata hookData) external {
  44. emit PostCheck(hookData);
  45. }
  46. }
  47. abstract contract ERC7579FallbackHandlerMock is ERC7579ModuleMock(MODULE_TYPE_FALLBACK) {
  48. event ERC7579FallbackHandlerMockCalled(address account, address sender, uint256 value, bytes data);
  49. error ERC7579FallbackHandlerMockRevert();
  50. function _msgAccount() internal view returns (address) {
  51. return msg.sender;
  52. }
  53. function _msgSender() internal pure returns (address) {
  54. return address(bytes20(msg.data[msg.data.length - 20:]));
  55. }
  56. function _msgData() internal pure returns (bytes calldata) {
  57. return msg.data[:msg.data.length - 20];
  58. }
  59. function callPayable() public payable {
  60. emit ERC7579FallbackHandlerMockCalled(_msgAccount(), _msgSender(), msg.value, _msgData());
  61. }
  62. function callView() public view returns (address, address) {
  63. return (_msgAccount(), _msgSender());
  64. }
  65. function callRevert() public pure {
  66. revert ERC7579FallbackHandlerMockRevert();
  67. }
  68. }
  69. abstract contract ERC7579ValidatorMock is ERC7579ModuleMock(MODULE_TYPE_VALIDATOR), IERC7579Validator {
  70. mapping(address sender => address signer) private _associatedSigners;
  71. function onInstall(bytes calldata data) public virtual override(IERC7579Module, ERC7579ModuleMock) {
  72. _associatedSigners[msg.sender] = address(bytes20(data[0:20]));
  73. super.onInstall(data);
  74. }
  75. function onUninstall(bytes calldata data) public virtual override(IERC7579Module, ERC7579ModuleMock) {
  76. delete _associatedSigners[msg.sender];
  77. super.onUninstall(data);
  78. }
  79. function validateUserOp(
  80. PackedUserOperation calldata userOp,
  81. bytes32 userOpHash
  82. ) public view virtual returns (uint256) {
  83. return
  84. SignatureChecker.isValidSignatureNow(_associatedSigners[msg.sender], userOpHash, userOp.signature)
  85. ? ERC4337Utils.SIG_VALIDATION_SUCCESS
  86. : ERC4337Utils.SIG_VALIDATION_FAILED;
  87. }
  88. function isValidSignatureWithSender(
  89. address /*sender*/,
  90. bytes32 hash,
  91. bytes calldata signature
  92. ) public view virtual returns (bytes4) {
  93. return
  94. SignatureChecker.isValidSignatureNow(_associatedSigners[msg.sender], hash, signature)
  95. ? IERC1271.isValidSignature.selector
  96. : bytes4(0xffffffff);
  97. }
  98. }