/
ModuleRole.sol
123 lines (114 loc) · 4.92 KB
/
ModuleRole.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
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
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import "./ModuleHooks.sol";
import "../../interfaces/IModuleAccount.sol";
import "../../interfaces/IModuleCall.sol";
import "../../utils/LibRole.sol";
contract ModuleRole is ModuleSelfAuth {
mapping(bytes4 => bytes12) public permissions;
error ConstantPermission(bytes4 _permission);
event AddPermission(bytes4 _permission, uint32 _ownerWeight, uint32 _assetsOpWeight, uint32 _guardianWeight);
event RemovePermission(bytes4 _permission);
function _addPermission(
bytes4 _permission,
uint32 _ownerWeight,
uint32 _assetsOpWeight,
uint32 _guardianWeight
) internal {
bytes12 roleWeight = (bytes12)((bytes4)(_ownerWeight)) |
(bytes12(bytes4(_assetsOpWeight)) >> 32) |
(bytes12(bytes4(_guardianWeight)) >> 64);
permissions[_permission] = roleWeight;
}
function _removePermission(bytes4 _permission) internal {
permissions[_permission] = bytes12(0);
}
/**
* @param _permission The Permission Of The Role, whose value is the selector of Method
* @param _ownerWeight The Threshold Weight of Role Owner
* @param _assetsOpWeight The Threshold Weight Of Role AssetsOp
* @param _guardianWeight The Threshold Weight Of Role Guardian
*/
function addPermission(
bytes4 _permission,
uint32 _ownerWeight,
uint32 _assetsOpWeight,
uint32 _guardianWeight
) external onlySelf {
if (
_permission == IModuleAccount.updateKeysetHash.selector ||
_permission == IModuleAccount.updateKeysetHashWithTimeLock.selector ||
_permission == IModuleAccount.updateTimeLockDuring.selector ||
_permission == IModuleAccount.updateImplementation.selector ||
_permission == ModuleHooks.addHook.selector ||
_permission == ModuleHooks.removeHook.selector ||
_permission == this.addPermission.selector ||
_permission == this.removePermission.selector ||
_permission == IModuleAccount.cancelLockKeysetHash.selector ||
_permission == IModuleAccount.syncAccount.selector
) {
revert ConstantPermission(_permission);
}
_addPermission(_permission, _ownerWeight, _assetsOpWeight, _guardianWeight);
emit AddPermission(_permission, _ownerWeight, _assetsOpWeight, _guardianWeight);
}
/**
* @param _permission The Permission
*/
function removePermission(bytes4 _permission) external onlySelf {
if (
_permission == IModuleAccount.updateKeysetHash.selector ||
_permission == IModuleAccount.updateKeysetHashWithTimeLock.selector ||
_permission == IModuleAccount.updateTimeLockDuring.selector ||
_permission == IModuleAccount.updateImplementation.selector ||
_permission == ModuleHooks.addHook.selector ||
_permission == ModuleHooks.removeHook.selector ||
_permission == this.addPermission.selector ||
_permission == this.removePermission.selector ||
_permission == IModuleAccount.cancelLockKeysetHash.selector ||
_permission == IModuleAccount.syncAccount.selector
) {
revert ConstantPermission(_permission);
}
_removePermission(_permission);
emit RemovePermission(_permission);
}
/**
* @param _permission The Permission
* @return ownerWeight The Threshold Weight of Role Owner
* @return assetsOpWeight The Threshold Weight Of Role AssetsOp
* @return guardianWeight The Threshold Weight Of Role Guardian
*/
function getRoleOfPermission(bytes4 _permission)
public
view
returns (
uint32 ownerWeight,
uint32 assetsOpWeight,
uint32 guardianWeight
)
{
if (
_permission == IModuleAccount.updateKeysetHash.selector ||
_permission == IModuleAccount.updateKeysetHashWithTimeLock.selector ||
_permission == IModuleAccount.updateTimeLockDuring.selector ||
_permission == IModuleAccount.updateImplementation.selector ||
_permission == IModuleAccount.cancelLockKeysetHash.selector ||
_permission == IModuleAccount.syncAccount.selector
) {
ownerWeight = LibRole.SYNC_TX_THRESHOLD;
} else if (
_permission == ModuleHooks.addHook.selector ||
_permission == ModuleHooks.removeHook.selector ||
_permission == this.addPermission.selector ||
_permission == this.removePermission.selector
) {
ownerWeight = LibRole.OWNER_THRESHOLD;
} else {
bytes12 roleWeight = permissions[_permission];
ownerWeight = uint32((bytes4)(roleWeight));
assetsOpWeight = uint32((bytes4)(roleWeight << 32));
guardianWeight = uint32((bytes4)(roleWeight << 64));
}
}
}