-
Notifications
You must be signed in to change notification settings - Fork 125
/
Copy pathDelayedSelectorBasedAccessManager.sol
81 lines (67 loc) · 2.16 KB
/
DelayedSelectorBasedAccessManager.sol
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
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
import "../../lib/Claimable.sol";
import "../../thirdparty/BytesUtil.sol";
import "./DelayedTransaction.sol";
/// @title DelayedSelectorBasedAccessManager
/// @author Break Xiong - <[email protected]>
contract DelayedSelectorBasedAccessManager is DelayedTransaction, Claimable {
using BytesUtil for bytes;
address public immutable target;
mapping(address => mapping(bytes4 => bool)) public permissions;
event PermissionUpdate(
address indexed user,
bytes4 indexed selector,
bool allowed
);
modifier withAccess(bytes4 selector) {
require(hasAccessTo(msg.sender, selector), "PERMISSION_DENIED");
_;
}
constructor(
address _target,
uint _timeToLive
) DelayedTransaction(_timeToLive) {
require(_target != address(0), "ZERO_ADDRESS");
target = _target;
}
receive() external payable {}
fallback() external payable {
transact(msg.data);
}
function grantAccess(
address user,
bytes4 selector,
bool granted
) external onlyOwner {
require(permissions[user][selector] != granted, "INVALID_VALUE");
permissions[user][selector] = granted;
emit PermissionUpdate(user, selector, granted);
}
function transact(
bytes calldata data
) public payable withAccess(data.toBytes4(0)) {
transactInternal(target, msg.value, data);
}
function transact(
address,
bytes calldata
) external payable override nonReentrant onlyAuthorized {
revert("Deprecated");
}
function hasAccessTo(
address user,
bytes4 selector
) public view returns (bool) {
return user == owner || permissions[user][selector];
}
function isAuthorizedForTransactions(
address sender
) internal view override returns (bool) {
return hasAccessTo(sender, msg.data.toBytes4(0));
}
function setFunctionDelay(bytes4 functionSelector, uint delay) internal {
setFunctionDelay(target, functionSelector, delay);
}
}