forked from OpenZeppelin/openzeppelin-contracts
-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathERC7579Mock.sol
More file actions
141 lines (113 loc) · 4.62 KB
/
ERC7579Mock.sol
File metadata and controls
141 lines (113 loc) · 4.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {
MODULE_TYPE_HOOK,
MODULE_TYPE_FALLBACK,
MODULE_TYPE_VALIDATOR,
IERC7579Hook,
IERC7579Module,
IERC7579Validator
} from "../../../interfaces/draft-IERC7579.sol";
import {SignatureChecker} from "../../../utils/cryptography/SignatureChecker.sol";
import {PackedUserOperation} from "../../../interfaces/draft-IERC4337.sol";
import {IERC1271} from "../../../interfaces/IERC1271.sol";
import {ERC4337Utils} from "../../../account/utils/draft-ERC4337Utils.sol";
abstract contract ERC7579ModuleMock is IERC7579Module {
uint256 private _moduleTypeId;
event ModuleInstalledReceived(address account, bytes data);
event ModuleUninstalledReceived(address account, bytes data);
constructor(uint256 moduleTypeId) {
_moduleTypeId = moduleTypeId;
}
function onInstall(bytes calldata data) public virtual {
emit ModuleInstalledReceived(msg.sender, data);
}
function onUninstall(bytes calldata data) public virtual {
emit ModuleUninstalledReceived(msg.sender, data);
}
function isModuleType(uint256 moduleTypeId) external view returns (bool) {
return moduleTypeId == _moduleTypeId;
}
}
abstract contract ERC7579ModuleMaliciousMock is ERC7579ModuleMock {
function onUninstall(bytes calldata /*data*/) public virtual override {
revert("uninstall reverts");
}
}
abstract contract ERC7579HookMock is ERC7579ModuleMock(MODULE_TYPE_HOOK), IERC7579Hook {
event PreCheck(address sender, uint256 value, bytes data);
event PostCheck(bytes hookData);
bool private _shouldRevertOnPreCheck = false;
bool private _shouldRevertOnPostCheck = false;
function revertOnPreCheck(bool shouldRevert) external {
_shouldRevertOnPreCheck = shouldRevert;
}
function revertOnPostCheck(bool shouldRevert) external {
_shouldRevertOnPostCheck = shouldRevert;
}
function preCheck(
address msgSender,
uint256 value,
bytes calldata msgData
) external returns (bytes memory hookData) {
require(!_shouldRevertOnPreCheck, "preCheck reverts");
emit PreCheck(msgSender, value, msgData);
return msgData;
}
function postCheck(bytes calldata hookData) external {
require(!_shouldRevertOnPostCheck, "postCheck reverts");
emit PostCheck(hookData);
}
}
abstract contract ERC7579FallbackHandlerMock is ERC7579ModuleMock(MODULE_TYPE_FALLBACK) {
event ERC7579FallbackHandlerMockCalled(address account, address sender, uint256 value, bytes data);
error ERC7579FallbackHandlerMockRevert();
function _msgAccount() internal view returns (address) {
return msg.sender;
}
function _msgSender() internal pure returns (address) {
return address(bytes20(msg.data[msg.data.length - 20:]));
}
function _msgData() internal pure returns (bytes calldata) {
return msg.data[:msg.data.length - 20];
}
function callPayable() public payable {
emit ERC7579FallbackHandlerMockCalled(_msgAccount(), _msgSender(), msg.value, _msgData());
}
function callView() public view returns (address, address) {
return (_msgAccount(), _msgSender());
}
function callRevert() public pure {
revert ERC7579FallbackHandlerMockRevert();
}
}
abstract contract ERC7579ValidatorMock is ERC7579ModuleMock(MODULE_TYPE_VALIDATOR), IERC7579Validator {
mapping(address sender => address signer) private _associatedSigners;
function onInstall(bytes calldata data) public virtual override(IERC7579Module, ERC7579ModuleMock) {
_associatedSigners[msg.sender] = address(bytes20(data[0:20]));
super.onInstall(data);
}
function onUninstall(bytes calldata data) public virtual override(IERC7579Module, ERC7579ModuleMock) {
delete _associatedSigners[msg.sender];
super.onUninstall(data);
}
function validateUserOp(
PackedUserOperation calldata userOp,
bytes32 userOpHash
) public view virtual returns (uint256) {
return
SignatureChecker.isValidSignatureNow(_associatedSigners[msg.sender], userOpHash, userOp.signature)
? ERC4337Utils.SIG_VALIDATION_SUCCESS
: ERC4337Utils.SIG_VALIDATION_FAILED;
}
function isValidSignatureWithSender(
address /*sender*/,
bytes32 hash,
bytes calldata signature
) public view virtual returns (bytes4) {
return
SignatureChecker.isValidSignatureNow(_associatedSigners[msg.sender], hash, signature)
? IERC1271.isValidSignature.selector
: bytes4(0xffffffff);
}
}