ERC7579Mock.sol 4.0 KB

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