@bloxchain/contracts 1.0.0-alpha.2 → 1.0.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +7 -7
  2. package/abi/BaseStateMachine.abi.json +798 -753
  3. package/abi/EngineBlox.abi.json +566 -576
  4. package/abi/GuardController.abi.json +1546 -2095
  5. package/abi/GuardControllerDefinitions.abi.json +416 -0
  6. package/abi/IDefinition.abi.json +57 -47
  7. package/abi/RuntimeRBAC.abi.json +901 -959
  8. package/abi/RuntimeRBACDefinitions.abi.json +265 -81
  9. package/abi/SecureOwnable.abi.json +1522 -2581
  10. package/abi/SecureOwnableDefinitions.abi.json +174 -164
  11. package/components/README.md +8 -0
  12. package/core/access/RuntimeRBAC.sol +253 -270
  13. package/core/access/interface/IRuntimeRBAC.sol +55 -84
  14. package/core/access/lib/definitions/RuntimeRBACDefinitions.sol +97 -4
  15. package/core/base/BaseStateMachine.sol +198 -108
  16. package/core/base/interface/IBaseStateMachine.sol +153 -153
  17. package/core/execution/GuardController.sol +156 -131
  18. package/core/execution/interface/IGuardController.sol +146 -120
  19. package/core/execution/lib/definitions/GuardControllerDefinitions.sol +207 -45
  20. package/core/lib/EngineBlox.sol +2636 -2322
  21. package/{interfaces → core/lib/interfaces}/IDefinition.sol +49 -49
  22. package/{interfaces → core/lib/interfaces}/IEventForwarder.sol +5 -3
  23. package/{utils → core/lib/utils}/SharedValidation.sol +69 -22
  24. package/core/pattern/Account.sol +84 -0
  25. package/core/security/SecureOwnable.sol +180 -146
  26. package/core/security/interface/ISecureOwnable.sol +105 -104
  27. package/core/security/lib/definitions/SecureOwnableDefinitions.sol +818 -786
  28. package/package.json +5 -5
  29. package/standards/README.md +12 -0
  30. package/standards/behavior/ICopyable.sol +34 -0
  31. package/standards/hooks/IOnActionHook.sol +21 -0
  32. package/abi/AccountBlox.abi.json +0 -5799
  33. package/abi/BareBlox.abi.json +0 -1284
  34. package/abi/RoleBlox.abi.json +0 -4209
  35. package/abi/SecureBlox.abi.json +0 -3828
  36. package/abi/SimpleRWA20.abi.json +0 -5288
  37. package/abi/SimpleRWA20Definitions.abi.json +0 -191
  38. package/abi/SimpleVault.abi.json +0 -4951
  39. package/abi/SimpleVaultDefinitions.abi.json +0 -269
  40. package/core/research/BloxchainWallet.sol +0 -306
  41. package/core/research/erc20-blox/ERC20Blox.sol +0 -140
  42. package/core/research/erc20-blox/lib/definitions/ERC20BloxDefinitions.sol +0 -185
  43. package/interfaces/IOnActionHook.sol +0 -79
@@ -1,786 +1,818 @@
1
- // SPDX-License-Identifier: MPL-2.0
2
- pragma solidity 0.8.33;
3
-
4
- import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
5
- import "../../../lib/EngineBlox.sol";
6
- import "../../../../interfaces/IDefinition.sol";
7
-
8
- /**
9
- * @title SecureOwnableDefinitions
10
- * @dev Library containing predefined definitions for SecureOwnable initialization
11
- * This library holds static data that can be used to initialize SecureOwnable contracts
12
- * without increasing the main contract size
13
- *
14
- * This library implements the IDefinition interface from EngineBlox
15
- * and provides a direct initialization function for SecureOwnable contracts
16
- *
17
- * Permission Model:
18
- * - Handler Functions (triggering functions): Permissions checked via msg.sig in BaseStateMachine
19
- * - Time-delay handler functions: Checked with EXECUTE_TIME_DELAY_* actions
20
- * - Meta-transaction handler functions: Checked with EXECUTE_META_* actions
21
- * - Execution Functions (target functions): Permissions checked in EngineBlox library
22
- * - For time-delay: EXECUTE_TIME_DELAY_APPROVE/CANCEL actions
23
- * - For meta-transactions: EXECUTE_META_* and SIGN_META_* actions (both handler and execution)
24
- */
25
- library SecureOwnableDefinitions {
26
-
27
- // Operation Type Constants
28
- bytes32 public constant OWNERSHIP_TRANSFER = keccak256("OWNERSHIP_TRANSFER");
29
- bytes32 public constant BROADCASTER_UPDATE = keccak256("BROADCASTER_UPDATE");
30
- bytes32 public constant RECOVERY_UPDATE = keccak256("RECOVERY_UPDATE");
31
- bytes32 public constant TIMELOCK_UPDATE = keccak256("TIMELOCK_UPDATE");
32
-
33
- // Function Selector Constants
34
- bytes4 public constant TRANSFER_OWNERSHIP_SELECTOR = bytes4(keccak256("executeTransferOwnership(address)"));
35
- bytes4 public constant UPDATE_BROADCASTER_SELECTOR = bytes4(keccak256("executeBroadcasterUpdate(address)"));
36
- bytes4 public constant UPDATE_RECOVERY_SELECTOR = bytes4(keccak256("executeRecoveryUpdate(address)"));
37
- bytes4 public constant UPDATE_TIMELOCK_SELECTOR = bytes4(keccak256("executeTimeLockUpdate(uint256)"));
38
-
39
- // Time Delay Function Selectors (Handler Functions - checked via msg.sig)
40
- bytes4 public constant TRANSFER_OWNERSHIP_REQUEST_SELECTOR = bytes4(keccak256("transferOwnershipRequest()"));
41
- bytes4 public constant TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR = bytes4(keccak256("transferOwnershipDelayedApproval(uint256)"));
42
- bytes4 public constant TRANSFER_OWNERSHIP_CANCELLATION_SELECTOR = bytes4(keccak256("transferOwnershipCancellation(uint256)"));
43
- bytes4 public constant UPDATE_BROADCASTER_REQUEST_SELECTOR = bytes4(keccak256("updateBroadcasterRequest(address)"));
44
- bytes4 public constant UPDATE_BROADCASTER_DELAYED_APPROVAL_SELECTOR = bytes4(keccak256("updateBroadcasterDelayedApproval(uint256)"));
45
- bytes4 public constant UPDATE_BROADCASTER_CANCELLATION_SELECTOR = bytes4(keccak256("updateBroadcasterCancellation(uint256)"));
46
-
47
- // Meta-transaction Function Selectors (Handler Functions - checked via msg.sig)
48
- // Note: Solidity function selector calculation for struct parameters uses 2 opening parentheses: ((tuple))
49
- // Verified: This format produces selector 0x458102e4 which matches the actual function selector
50
- bytes4 public constant TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR = bytes4(keccak256("transferOwnershipApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
51
- bytes4 public constant TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR = bytes4(keccak256("transferOwnershipCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
52
- bytes4 public constant UPDATE_BROADCASTER_APPROVE_META_SELECTOR = bytes4(keccak256("updateBroadcasterApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
53
- bytes4 public constant UPDATE_BROADCASTER_CANCEL_META_SELECTOR = bytes4(keccak256("updateBroadcasterCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
54
- bytes4 public constant UPDATE_RECOVERY_META_SELECTOR = bytes4(keccak256("updateRecoveryRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
55
- bytes4 public constant UPDATE_TIMELOCK_META_SELECTOR = bytes4(keccak256("updateTimeLockRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
56
-
57
- /**
58
- * @dev Returns predefined function schemas
59
- * @return Array of function schema definitions
60
- */
61
- function getFunctionSchemas() public pure returns (EngineBlox.FunctionSchema[] memory) {
62
- EngineBlox.FunctionSchema[] memory schemas = new EngineBlox.FunctionSchema[](16);
63
-
64
- // Meta-transaction function schemas
65
- EngineBlox.TxAction[] memory metaApproveActions = new EngineBlox.TxAction[](2);
66
- metaApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
67
- metaApproveActions[1] = EngineBlox.TxAction.SIGN_META_APPROVE;
68
-
69
- EngineBlox.TxAction[] memory metaCancelActions = new EngineBlox.TxAction[](2);
70
- metaCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
71
- metaCancelActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
72
-
73
- EngineBlox.TxAction[] memory metaRequestApproveActions = new EngineBlox.TxAction[](2);
74
- metaRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
75
- metaRequestApproveActions[1] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
76
-
77
- // Time-delayed functions
78
- EngineBlox.TxAction[] memory timeDelayRequestActions = new EngineBlox.TxAction[](1);
79
- timeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
80
-
81
- EngineBlox.TxAction[] memory timeDelayApproveActions = new EngineBlox.TxAction[](1);
82
- timeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
83
-
84
- EngineBlox.TxAction[] memory timeDelayCancelActions = new EngineBlox.TxAction[](1);
85
- timeDelayCancelActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
86
-
87
- // Execution selector actions (for meta-transactions and time-delay)
88
- // These execution selectors support both approve and cancel actions for both meta-tx and time-delay
89
- // Also support request action for time-delay (needed for txRequest permission check)
90
- EngineBlox.TxAction[] memory executionApproveCancelActions = new EngineBlox.TxAction[](7);
91
- executionApproveCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
92
- executionApproveCancelActions[1] = EngineBlox.TxAction.SIGN_META_APPROVE;
93
- executionApproveCancelActions[2] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
94
- executionApproveCancelActions[3] = EngineBlox.TxAction.SIGN_META_CANCEL;
95
- executionApproveCancelActions[4] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
96
- executionApproveCancelActions[5] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
97
- executionApproveCancelActions[6] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
98
-
99
- EngineBlox.TxAction[] memory executionMetaRequestApproveActions = new EngineBlox.TxAction[](2);
100
- executionMetaRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
101
- executionMetaRequestApproveActions[1] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
102
-
103
- // Prepare handlerForSelectors arrays
104
- // Execution selectors must have self-reference (at least one element pointing to themselves)
105
- bytes4[] memory transferOwnershipExecutionHandlerForSelectors = new bytes4[](1);
106
- transferOwnershipExecutionHandlerForSelectors[0] = TRANSFER_OWNERSHIP_SELECTOR;
107
- bytes4[] memory broadcasterExecutionHandlerForSelectors = new bytes4[](1);
108
- broadcasterExecutionHandlerForSelectors[0] = UPDATE_BROADCASTER_SELECTOR;
109
- bytes4[] memory recoveryExecutionHandlerForSelectors = new bytes4[](1);
110
- recoveryExecutionHandlerForSelectors[0] = UPDATE_RECOVERY_SELECTOR;
111
- bytes4[] memory timelockExecutionHandlerForSelectors = new bytes4[](1);
112
- timelockExecutionHandlerForSelectors[0] = UPDATE_TIMELOCK_SELECTOR;
113
-
114
- // Handler selectors point to execution selectors
115
- bytes4[] memory transferOwnershipHandlerForSelectors = new bytes4[](1);
116
- transferOwnershipHandlerForSelectors[0] = TRANSFER_OWNERSHIP_SELECTOR;
117
- bytes4[] memory broadcasterHandlerForSelectors = new bytes4[](1);
118
- broadcasterHandlerForSelectors[0] = UPDATE_BROADCASTER_SELECTOR;
119
- bytes4[] memory recoveryHandlerForSelectors = new bytes4[](1);
120
- recoveryHandlerForSelectors[0] = UPDATE_RECOVERY_SELECTOR;
121
- bytes4[] memory timelockHandlerForSelectors = new bytes4[](1);
122
- timelockHandlerForSelectors[0] = UPDATE_TIMELOCK_SELECTOR;
123
-
124
- // Meta-transaction functions
125
- schemas[0] = EngineBlox.FunctionSchema({
126
- functionSignature: "transferOwnershipApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
127
- functionSelector: TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR,
128
- operationType: OWNERSHIP_TRANSFER,
129
- operationName: "OWNERSHIP_TRANSFER",
130
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaApproveActions),
131
- isProtected: true,
132
- handlerForSelectors: transferOwnershipHandlerForSelectors
133
- });
134
-
135
- schemas[1] = EngineBlox.FunctionSchema({
136
- functionSignature: "transferOwnershipCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
137
- functionSelector: TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR,
138
- operationType: OWNERSHIP_TRANSFER,
139
- operationName: "OWNERSHIP_TRANSFER",
140
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaCancelActions),
141
- isProtected: true,
142
- handlerForSelectors: transferOwnershipHandlerForSelectors
143
- });
144
-
145
- schemas[2] = EngineBlox.FunctionSchema({
146
- functionSignature: "updateBroadcasterApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
147
- functionSelector: UPDATE_BROADCASTER_APPROVE_META_SELECTOR,
148
- operationType: BROADCASTER_UPDATE,
149
- operationName: "BROADCASTER_UPDATE",
150
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaApproveActions),
151
- isProtected: true,
152
- handlerForSelectors: broadcasterHandlerForSelectors
153
- });
154
-
155
- schemas[3] = EngineBlox.FunctionSchema({
156
- functionSignature: "updateBroadcasterCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
157
- functionSelector: UPDATE_BROADCASTER_CANCEL_META_SELECTOR,
158
- operationType: BROADCASTER_UPDATE,
159
- operationName: "BROADCASTER_UPDATE",
160
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaCancelActions),
161
- isProtected: true,
162
- handlerForSelectors: broadcasterHandlerForSelectors
163
- });
164
-
165
- schemas[4] = EngineBlox.FunctionSchema({
166
- functionSignature: "updateRecoveryRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
167
- functionSelector: UPDATE_RECOVERY_META_SELECTOR,
168
- operationType: RECOVERY_UPDATE,
169
- operationName: "RECOVERY_UPDATE",
170
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaRequestApproveActions),
171
- isProtected: true,
172
- handlerForSelectors: recoveryHandlerForSelectors
173
- });
174
-
175
- schemas[5] = EngineBlox.FunctionSchema({
176
- functionSignature: "updateTimeLockRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
177
- functionSelector: UPDATE_TIMELOCK_META_SELECTOR,
178
- operationType: TIMELOCK_UPDATE,
179
- operationName: "TIMELOCK_UPDATE",
180
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaRequestApproveActions),
181
- isProtected: true,
182
- handlerForSelectors: timelockHandlerForSelectors
183
- });
184
-
185
- // Time-delayed functions
186
- schemas[6] = EngineBlox.FunctionSchema({
187
- functionSignature: "transferOwnershipRequest()",
188
- functionSelector: TRANSFER_OWNERSHIP_REQUEST_SELECTOR,
189
- operationType: OWNERSHIP_TRANSFER,
190
- operationName: "OWNERSHIP_TRANSFER",
191
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayRequestActions),
192
- isProtected: true,
193
- handlerForSelectors: transferOwnershipHandlerForSelectors
194
- });
195
-
196
- schemas[7] = EngineBlox.FunctionSchema({
197
- functionSignature: "transferOwnershipDelayedApproval(uint256)",
198
- functionSelector: TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR,
199
- operationType: OWNERSHIP_TRANSFER,
200
- operationName: "OWNERSHIP_TRANSFER",
201
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayApproveActions),
202
- isProtected: true,
203
- handlerForSelectors: transferOwnershipHandlerForSelectors
204
- });
205
-
206
- schemas[8] = EngineBlox.FunctionSchema({
207
- functionSignature: "transferOwnershipCancellation(uint256)",
208
- functionSelector: TRANSFER_OWNERSHIP_CANCELLATION_SELECTOR,
209
- operationType: OWNERSHIP_TRANSFER,
210
- operationName: "OWNERSHIP_TRANSFER",
211
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayCancelActions),
212
- isProtected: true,
213
- handlerForSelectors: transferOwnershipHandlerForSelectors
214
- });
215
-
216
- schemas[9] = EngineBlox.FunctionSchema({
217
- functionSignature: "updateBroadcasterRequest(address)",
218
- functionSelector: UPDATE_BROADCASTER_REQUEST_SELECTOR,
219
- operationType: BROADCASTER_UPDATE,
220
- operationName: "BROADCASTER_UPDATE",
221
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayRequestActions),
222
- isProtected: true,
223
- handlerForSelectors: broadcasterHandlerForSelectors
224
- });
225
-
226
- schemas[10] = EngineBlox.FunctionSchema({
227
- functionSignature: "updateBroadcasterDelayedApproval(uint256)",
228
- functionSelector: UPDATE_BROADCASTER_DELAYED_APPROVAL_SELECTOR,
229
- operationType: BROADCASTER_UPDATE,
230
- operationName: "BROADCASTER_UPDATE",
231
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayApproveActions),
232
- isProtected: true,
233
- handlerForSelectors: broadcasterHandlerForSelectors
234
- });
235
-
236
- schemas[11] = EngineBlox.FunctionSchema({
237
- functionSignature: "updateBroadcasterCancellation(uint256)",
238
- functionSelector: UPDATE_BROADCASTER_CANCELLATION_SELECTOR,
239
- operationType: BROADCASTER_UPDATE,
240
- operationName: "BROADCASTER_UPDATE",
241
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayCancelActions),
242
- isProtected: true,
243
- handlerForSelectors: broadcasterHandlerForSelectors
244
- });
245
-
246
- // Execution selector schemas (required for meta-transaction dual-permission model)
247
- // Execution selectors must have self-reference in handlerForSelectors array
248
- schemas[12] = EngineBlox.FunctionSchema({
249
- functionSignature: "executeTransferOwnership(address)",
250
- functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
251
- operationType: OWNERSHIP_TRANSFER,
252
- operationName: "OWNERSHIP_TRANSFER",
253
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionApproveCancelActions),
254
- isProtected: true,
255
- handlerForSelectors: transferOwnershipExecutionHandlerForSelectors
256
- });
257
-
258
- schemas[13] = EngineBlox.FunctionSchema({
259
- functionSignature: "executeBroadcasterUpdate(address)",
260
- functionSelector: UPDATE_BROADCASTER_SELECTOR,
261
- operationType: BROADCASTER_UPDATE,
262
- operationName: "BROADCASTER_UPDATE",
263
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionApproveCancelActions),
264
- isProtected: true,
265
- handlerForSelectors: broadcasterExecutionHandlerForSelectors
266
- });
267
-
268
- schemas[14] = EngineBlox.FunctionSchema({
269
- functionSignature: "executeRecoveryUpdate(address)",
270
- functionSelector: UPDATE_RECOVERY_SELECTOR,
271
- operationType: RECOVERY_UPDATE,
272
- operationName: "RECOVERY_UPDATE",
273
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionMetaRequestApproveActions),
274
- isProtected: true,
275
- handlerForSelectors: recoveryExecutionHandlerForSelectors
276
- });
277
-
278
- schemas[15] = EngineBlox.FunctionSchema({
279
- functionSignature: "executeTimeLockUpdate(uint256)",
280
- functionSelector: UPDATE_TIMELOCK_SELECTOR,
281
- operationType: TIMELOCK_UPDATE,
282
- operationName: "TIMELOCK_UPDATE",
283
- supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionMetaRequestApproveActions),
284
- isProtected: true,
285
- handlerForSelectors: timelockExecutionHandlerForSelectors
286
- });
287
-
288
- return schemas;
289
- }
290
-
291
- /**
292
- * @dev Returns predefined role hashes and their corresponding function permissions
293
- * @return RolePermission struct containing roleHashes and functionPermissions arrays
294
- */
295
- function getRolePermissions() public pure returns (IDefinition.RolePermission memory) {
296
- // Calculate total permissions needed
297
- // Broadcaster: 6 handler (meta-tx) + 4 execution = 10
298
- // Owner: 4 handler (time-delay) + 6 handler (meta-tx) + 4 execution = 14
299
- // Recovery: 3 handler (time-delay) + 1 execution = 4
300
- // Total: 28 permissions
301
- bytes32[] memory roleHashes = new bytes32[](28);
302
- EngineBlox.FunctionPermission[] memory functionPermissions = new EngineBlox.FunctionPermission[](28);
303
-
304
- uint256 index = 0;
305
-
306
- // ============ BROADCASTER ROLE PERMISSIONS ============
307
- index = _addBroadcasterPermissions(roleHashes, functionPermissions, index);
308
-
309
- // ============ OWNER ROLE PERMISSIONS ============
310
- index = _addOwnerPermissions(roleHashes, functionPermissions, index);
311
-
312
- // ============ RECOVERY ROLE PERMISSIONS ============
313
- index = _addRecoveryPermissions(roleHashes, functionPermissions, index);
314
-
315
- return IDefinition.RolePermission({
316
- roleHashes: roleHashes,
317
- functionPermissions: functionPermissions
318
- });
319
- }
320
-
321
- // ============ INTERNAL HELPER FUNCTIONS ============
322
-
323
- /**
324
- * @dev Adds broadcaster role permissions
325
- * @param roleHashes Array to populate with role hashes
326
- * @param functionPermissions Array to populate with function permissions
327
- * @param startIndex Starting index in arrays
328
- * @return Next available index after adding permissions
329
- */
330
- function _addBroadcasterPermissions(
331
- bytes32[] memory roleHashes,
332
- EngineBlox.FunctionPermission[] memory functionPermissions,
333
- uint256 startIndex
334
- ) internal pure returns (uint256) {
335
- uint256 index = startIndex;
336
-
337
- // Action arrays for broadcaster
338
- EngineBlox.TxAction[] memory broadcasterMetaApproveActions = new EngineBlox.TxAction[](1);
339
- broadcasterMetaApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
340
-
341
- EngineBlox.TxAction[] memory broadcasterMetaCancelActions = new EngineBlox.TxAction[](1);
342
- broadcasterMetaCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
343
-
344
- EngineBlox.TxAction[] memory broadcasterMetaRequestApproveActions = new EngineBlox.TxAction[](1);
345
- broadcasterMetaRequestApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
346
-
347
- EngineBlox.TxAction[] memory broadcasterExecutionApproveCancelActions = new EngineBlox.TxAction[](2);
348
- broadcasterExecutionApproveCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
349
- broadcasterExecutionApproveCancelActions[1] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
350
-
351
- EngineBlox.TxAction[] memory broadcasterExecutionRequestApproveActions = new EngineBlox.TxAction[](1);
352
- broadcasterExecutionRequestApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
353
-
354
- // ============ BROADCASTER: HANDLER FUNCTION PERMISSIONS (Meta-transactions) ============
355
- // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
356
-
357
- // Create reusable handlerForSelectors arrays
358
- bytes4[] memory transferOwnershipHandlers = new bytes4[](1);
359
- transferOwnershipHandlers[0] = TRANSFER_OWNERSHIP_SELECTOR;
360
- bytes4[] memory updateBroadcasterHandlers = new bytes4[](1);
361
- updateBroadcasterHandlers[0] = UPDATE_BROADCASTER_SELECTOR;
362
- bytes4[] memory updateRecoveryHandlers = new bytes4[](1);
363
- updateRecoveryHandlers[0] = UPDATE_RECOVERY_SELECTOR;
364
- bytes4[] memory updateTimelockHandlers = new bytes4[](1);
365
- updateTimelockHandlers[0] = UPDATE_TIMELOCK_SELECTOR;
366
-
367
- // Transfer Ownership Approve Meta (handler function)
368
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
369
- functionPermissions[index] = EngineBlox.FunctionPermission({
370
- functionSelector: TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR,
371
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaApproveActions),
372
- handlerForSelectors: transferOwnershipHandlers
373
- });
374
- index++;
375
-
376
- // Transfer Ownership Cancel Meta (handler function)
377
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
378
- functionPermissions[index] = EngineBlox.FunctionPermission({
379
- functionSelector: TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR,
380
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaCancelActions),
381
- handlerForSelectors: transferOwnershipHandlers
382
- });
383
- index++;
384
-
385
- // Update Broadcaster Approve Meta (handler function)
386
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
387
- functionPermissions[index] = EngineBlox.FunctionPermission({
388
- functionSelector: UPDATE_BROADCASTER_APPROVE_META_SELECTOR,
389
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaApproveActions),
390
- handlerForSelectors: updateBroadcasterHandlers
391
- });
392
- index++;
393
-
394
- // Update Broadcaster Cancel Meta (handler function)
395
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
396
- functionPermissions[index] = EngineBlox.FunctionPermission({
397
- functionSelector: UPDATE_BROADCASTER_CANCEL_META_SELECTOR,
398
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaCancelActions),
399
- handlerForSelectors: updateBroadcasterHandlers
400
- });
401
- index++;
402
-
403
- // Update Recovery Meta (handler function)
404
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
405
- functionPermissions[index] = EngineBlox.FunctionPermission({
406
- functionSelector: UPDATE_RECOVERY_META_SELECTOR,
407
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaRequestApproveActions),
408
- handlerForSelectors: updateRecoveryHandlers
409
- });
410
- index++;
411
-
412
- // Update Timelock Meta (handler function)
413
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
414
- functionPermissions[index] = EngineBlox.FunctionPermission({
415
- functionSelector: UPDATE_TIMELOCK_META_SELECTOR,
416
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaRequestApproveActions),
417
- handlerForSelectors: updateTimelockHandlers
418
- });
419
- index++;
420
-
421
- // ============ BROADCASTER: EXECUTION FUNCTION PERMISSIONS ============
422
- // These are checked in EngineBlox library functions
423
-
424
- // Transfer Ownership Execution (for approve/cancel meta-tx)
425
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
426
- functionPermissions[index] = EngineBlox.FunctionPermission({
427
- functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
428
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionApproveCancelActions),
429
- handlerForSelectors: transferOwnershipHandlers // Self-reference indicates execution selector
430
- });
431
- index++;
432
-
433
- // Update Broadcaster Execution (for approve/cancel meta-tx)
434
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
435
- functionPermissions[index] = EngineBlox.FunctionPermission({
436
- functionSelector: UPDATE_BROADCASTER_SELECTOR,
437
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionApproveCancelActions),
438
- handlerForSelectors: updateBroadcasterHandlers // Self-reference indicates execution selector
439
- });
440
- index++;
441
-
442
- // Update Recovery Execution (for request and approve meta-tx)
443
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
444
- functionPermissions[index] = EngineBlox.FunctionPermission({
445
- functionSelector: UPDATE_RECOVERY_SELECTOR,
446
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionRequestApproveActions),
447
- handlerForSelectors: updateRecoveryHandlers // Self-reference indicates execution selector
448
- });
449
- index++;
450
-
451
- // Update Timelock Execution (for request and approve meta-tx)
452
- roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
453
- functionPermissions[index] = EngineBlox.FunctionPermission({
454
- functionSelector: UPDATE_TIMELOCK_SELECTOR,
455
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionRequestApproveActions),
456
- handlerForSelectors: updateTimelockHandlers // Self-reference indicates execution selector
457
- });
458
- index++;
459
-
460
- return index;
461
- }
462
-
463
- /**
464
- * @dev Adds owner role permissions
465
- * @param roleHashes Array to populate with role hashes
466
- * @param functionPermissions Array to populate with function permissions
467
- * @param startIndex Starting index in arrays
468
- * @return Next available index after adding permissions
469
- */
470
- function _addOwnerPermissions(
471
- bytes32[] memory roleHashes,
472
- EngineBlox.FunctionPermission[] memory functionPermissions,
473
- uint256 startIndex
474
- ) internal pure returns (uint256) {
475
- uint256 index = startIndex;
476
-
477
- // Action arrays for owner
478
- EngineBlox.TxAction[] memory ownerTimeDelayRequestActions = new EngineBlox.TxAction[](1);
479
- ownerTimeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
480
-
481
- EngineBlox.TxAction[] memory ownerTimeDelayApproveActions = new EngineBlox.TxAction[](1);
482
- ownerTimeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
483
-
484
- EngineBlox.TxAction[] memory ownerTimeDelayCancelActions = new EngineBlox.TxAction[](1);
485
- ownerTimeDelayCancelActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
486
-
487
- EngineBlox.TxAction[] memory ownerMetaApproveActions = new EngineBlox.TxAction[](1);
488
- ownerMetaApproveActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
489
-
490
- EngineBlox.TxAction[] memory ownerMetaCancelActions = new EngineBlox.TxAction[](1);
491
- ownerMetaCancelActions[0] = EngineBlox.TxAction.SIGN_META_CANCEL;
492
-
493
- EngineBlox.TxAction[] memory ownerMetaRequestApproveActions = new EngineBlox.TxAction[](1);
494
- ownerMetaRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
495
-
496
- EngineBlox.TxAction[] memory ownerExecutionApproveCancelActions = new EngineBlox.TxAction[](2);
497
- ownerExecutionApproveCancelActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
498
- ownerExecutionApproveCancelActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
499
-
500
- EngineBlox.TxAction[] memory ownerExecutionRequestApproveActions = new EngineBlox.TxAction[](1);
501
- ownerExecutionRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
502
-
503
- EngineBlox.TxAction[] memory ownerExecutionTimeDelayRequestActions = new EngineBlox.TxAction[](1);
504
- ownerExecutionTimeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
505
-
506
- EngineBlox.TxAction[] memory ownerExecutionTimeDelayApproveActions = new EngineBlox.TxAction[](1);
507
- ownerExecutionTimeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
508
-
509
- // Create reusable handlerForSelectors arrays for owner permissions
510
- bytes4[] memory ownerTransferOwnershipHandlers = new bytes4[](1);
511
- ownerTransferOwnershipHandlers[0] = TRANSFER_OWNERSHIP_SELECTOR;
512
- bytes4[] memory ownerUpdateBroadcasterHandlers = new bytes4[](1);
513
- ownerUpdateBroadcasterHandlers[0] = UPDATE_BROADCASTER_SELECTOR;
514
- bytes4[] memory ownerUpdateRecoveryHandlers = new bytes4[](1);
515
- ownerUpdateRecoveryHandlers[0] = UPDATE_RECOVERY_SELECTOR;
516
- bytes4[] memory ownerUpdateTimelockHandlers = new bytes4[](1);
517
- ownerUpdateTimelockHandlers[0] = UPDATE_TIMELOCK_SELECTOR;
518
-
519
- // ============ OWNER: HANDLER FUNCTION PERMISSIONS (Time-delay) ============
520
- // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
521
-
522
- // Transfer Ownership Delayed Approval (handler function)
523
- roleHashes[index] = EngineBlox.OWNER_ROLE;
524
- functionPermissions[index] = EngineBlox.FunctionPermission({
525
- functionSelector: TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR,
526
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayApproveActions),
527
- handlerForSelectors: ownerTransferOwnershipHandlers
528
- });
529
- index++;
530
-
531
- // Update Broadcaster Request (handler function)
532
- roleHashes[index] = EngineBlox.OWNER_ROLE;
533
- functionPermissions[index] = EngineBlox.FunctionPermission({
534
- functionSelector: UPDATE_BROADCASTER_REQUEST_SELECTOR,
535
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayRequestActions),
536
- handlerForSelectors: ownerUpdateBroadcasterHandlers
537
- });
538
- index++;
539
-
540
- // Update Broadcaster Delayed Approval (handler function)
541
- roleHashes[index] = EngineBlox.OWNER_ROLE;
542
- functionPermissions[index] = EngineBlox.FunctionPermission({
543
- functionSelector: UPDATE_BROADCASTER_DELAYED_APPROVAL_SELECTOR,
544
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayApproveActions),
545
- handlerForSelectors: ownerUpdateBroadcasterHandlers
546
- });
547
- index++;
548
-
549
- // Update Broadcaster Cancellation (handler function)
550
- roleHashes[index] = EngineBlox.OWNER_ROLE;
551
- functionPermissions[index] = EngineBlox.FunctionPermission({
552
- functionSelector: UPDATE_BROADCASTER_CANCELLATION_SELECTOR,
553
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayCancelActions),
554
- handlerForSelectors: ownerUpdateBroadcasterHandlers
555
- });
556
- index++;
557
-
558
- // ============ OWNER: HANDLER FUNCTION PERMISSIONS (Meta-transactions) ============
559
- // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
560
- // Note: Owner signs meta-transactions, but doesn't execute them (broadcaster executes)
561
-
562
- // Transfer Ownership Approve Meta (handler function - for signing)
563
- roleHashes[index] = EngineBlox.OWNER_ROLE;
564
- functionPermissions[index] = EngineBlox.FunctionPermission({
565
- functionSelector: TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR,
566
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaApproveActions),
567
- handlerForSelectors: ownerTransferOwnershipHandlers
568
- });
569
- index++;
570
-
571
- // Transfer Ownership Cancel Meta (handler function - for signing)
572
- roleHashes[index] = EngineBlox.OWNER_ROLE;
573
- functionPermissions[index] = EngineBlox.FunctionPermission({
574
- functionSelector: TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR,
575
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaCancelActions),
576
- handlerForSelectors: ownerTransferOwnershipHandlers
577
- });
578
- index++;
579
-
580
- // Update Broadcaster Approve Meta (handler function - for signing)
581
- roleHashes[index] = EngineBlox.OWNER_ROLE;
582
- functionPermissions[index] = EngineBlox.FunctionPermission({
583
- functionSelector: UPDATE_BROADCASTER_APPROVE_META_SELECTOR,
584
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaApproveActions),
585
- handlerForSelectors: ownerUpdateBroadcasterHandlers
586
- });
587
- index++;
588
-
589
- // Update Broadcaster Cancel Meta (handler function - for signing)
590
- roleHashes[index] = EngineBlox.OWNER_ROLE;
591
- functionPermissions[index] = EngineBlox.FunctionPermission({
592
- functionSelector: UPDATE_BROADCASTER_CANCEL_META_SELECTOR,
593
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaCancelActions),
594
- handlerForSelectors: ownerUpdateBroadcasterHandlers
595
- });
596
- index++;
597
-
598
- // Update Recovery Meta (handler function - for signing)
599
- roleHashes[index] = EngineBlox.OWNER_ROLE;
600
- functionPermissions[index] = EngineBlox.FunctionPermission({
601
- functionSelector: UPDATE_RECOVERY_META_SELECTOR,
602
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaRequestApproveActions),
603
- handlerForSelectors: ownerUpdateRecoveryHandlers
604
- });
605
- index++;
606
-
607
- // Update Timelock Meta (handler function - for signing)
608
- roleHashes[index] = EngineBlox.OWNER_ROLE;
609
- functionPermissions[index] = EngineBlox.FunctionPermission({
610
- functionSelector: UPDATE_TIMELOCK_META_SELECTOR,
611
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaRequestApproveActions),
612
- handlerForSelectors: ownerUpdateTimelockHandlers
613
- });
614
- index++;
615
-
616
- // ============ OWNER: EXECUTION FUNCTION PERMISSIONS ============
617
- // These are checked in EngineBlox library functions
618
-
619
- // Transfer Ownership Execution (for approve/cancel meta-tx - owner signs)
620
- // Also supports time-delay approve (for transferOwnershipDelayedApproval)
621
- EngineBlox.TxAction[] memory ownerTransferOwnershipAllActions = new EngineBlox.TxAction[](3);
622
- ownerTransferOwnershipAllActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
623
- ownerTransferOwnershipAllActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
624
- ownerTransferOwnershipAllActions[2] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
625
-
626
- roleHashes[index] = EngineBlox.OWNER_ROLE;
627
- functionPermissions[index] = EngineBlox.FunctionPermission({
628
- functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
629
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTransferOwnershipAllActions),
630
- handlerForSelectors: ownerTransferOwnershipHandlers // Self-reference indicates execution selector
631
- });
632
- index++;
633
-
634
- // Update Broadcaster Execution (for approve/cancel meta-tx and time-delay request/approve/cancel - owner signs)
635
- // Supports:
636
- // - SIGN_META_APPROVE, SIGN_META_CANCEL: for meta-transactions
637
- // - EXECUTE_TIME_DELAY_REQUEST: for updateBroadcasterRequest (checked in txRequest)
638
- // - EXECUTE_TIME_DELAY_APPROVE: for updateBroadcasterDelayedApproval (checked in txDelayedApproval)
639
- // - EXECUTE_TIME_DELAY_CANCEL: for updateBroadcasterCancellation (checked in txCancellation)
640
- EngineBlox.TxAction[] memory ownerBroadcasterExecutionAllActions = new EngineBlox.TxAction[](5);
641
- ownerBroadcasterExecutionAllActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
642
- ownerBroadcasterExecutionAllActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
643
- ownerBroadcasterExecutionAllActions[2] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
644
- ownerBroadcasterExecutionAllActions[3] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
645
- ownerBroadcasterExecutionAllActions[4] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
646
-
647
- roleHashes[index] = EngineBlox.OWNER_ROLE;
648
- functionPermissions[index] = EngineBlox.FunctionPermission({
649
- functionSelector: UPDATE_BROADCASTER_SELECTOR,
650
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerBroadcasterExecutionAllActions),
651
- handlerForSelectors: ownerUpdateBroadcasterHandlers // Self-reference indicates execution selector
652
- });
653
- index++;
654
-
655
- // Update Recovery Execution (for request and approve meta-tx - owner signs)
656
- roleHashes[index] = EngineBlox.OWNER_ROLE;
657
- functionPermissions[index] = EngineBlox.FunctionPermission({
658
- functionSelector: UPDATE_RECOVERY_SELECTOR,
659
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerExecutionRequestApproveActions),
660
- handlerForSelectors: ownerUpdateRecoveryHandlers // Self-reference indicates execution selector
661
- });
662
- index++;
663
-
664
- // Update Timelock Execution (for request and approve meta-tx - owner signs)
665
- roleHashes[index] = EngineBlox.OWNER_ROLE;
666
- functionPermissions[index] = EngineBlox.FunctionPermission({
667
- functionSelector: UPDATE_TIMELOCK_SELECTOR,
668
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerExecutionRequestApproveActions),
669
- handlerForSelectors: ownerUpdateTimelockHandlers // Self-reference indicates execution selector
670
- });
671
- index++;
672
-
673
- return index;
674
- }
675
-
676
- /**
677
- * @dev Adds recovery role permissions
678
- * @param roleHashes Array to populate with role hashes
679
- * @param functionPermissions Array to populate with function permissions
680
- * @param startIndex Starting index in arrays
681
- * @return Next available index after adding permissions
682
- */
683
- function _addRecoveryPermissions(
684
- bytes32[] memory roleHashes,
685
- EngineBlox.FunctionPermission[] memory functionPermissions,
686
- uint256 startIndex
687
- ) internal pure returns (uint256) {
688
- uint256 index = startIndex;
689
-
690
- // Action arrays for recovery
691
- EngineBlox.TxAction[] memory recoveryTimeDelayRequestActions = new EngineBlox.TxAction[](1);
692
- recoveryTimeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
693
-
694
- EngineBlox.TxAction[] memory recoveryTimeDelayApproveActions = new EngineBlox.TxAction[](1);
695
- recoveryTimeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
696
-
697
- EngineBlox.TxAction[] memory recoveryTimeDelayCancelActions = new EngineBlox.TxAction[](1);
698
- recoveryTimeDelayCancelActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
699
-
700
- // Create reusable handlerForSelectors array for recovery permissions
701
- bytes4[] memory recoveryTransferOwnershipHandlers = new bytes4[](1);
702
- recoveryTransferOwnershipHandlers[0] = TRANSFER_OWNERSHIP_SELECTOR;
703
-
704
- // ============ RECOVERY: HANDLER FUNCTION PERMISSIONS (Time-delay) ============
705
- // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
706
-
707
- // Transfer Ownership Request (handler function)
708
- roleHashes[index] = EngineBlox.RECOVERY_ROLE;
709
- functionPermissions[index] = EngineBlox.FunctionPermission({
710
- functionSelector: TRANSFER_OWNERSHIP_REQUEST_SELECTOR,
711
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryTimeDelayRequestActions),
712
- handlerForSelectors: recoveryTransferOwnershipHandlers
713
- });
714
- index++;
715
-
716
- // Transfer Ownership Delayed Approval (handler function)
717
- roleHashes[index] = EngineBlox.RECOVERY_ROLE;
718
- functionPermissions[index] = EngineBlox.FunctionPermission({
719
- functionSelector: TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR,
720
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryTimeDelayApproveActions),
721
- handlerForSelectors: recoveryTransferOwnershipHandlers
722
- });
723
- index++;
724
-
725
- // Transfer Ownership Cancellation (handler function)
726
- roleHashes[index] = EngineBlox.RECOVERY_ROLE;
727
- functionPermissions[index] = EngineBlox.FunctionPermission({
728
- functionSelector: TRANSFER_OWNERSHIP_CANCELLATION_SELECTOR,
729
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryTimeDelayCancelActions),
730
- handlerForSelectors: recoveryTransferOwnershipHandlers
731
- });
732
- index++;
733
-
734
- // ============ RECOVERY: EXECUTION FUNCTION PERMISSIONS ============
735
- // These are checked in EngineBlox library functions
736
-
737
- // Transfer Ownership Execution (for time-delay request/approve/cancel)
738
- // Recovery needs this for:
739
- // - EXECUTE_TIME_DELAY_REQUEST: when calling transferOwnershipRequest (checked in txRequest)
740
- // - EXECUTE_TIME_DELAY_APPROVE: when calling transferOwnershipDelayedApproval
741
- // - EXECUTE_TIME_DELAY_CANCEL: when calling transferOwnershipCancellation
742
- EngineBlox.TxAction[] memory recoveryExecutionAllActions = new EngineBlox.TxAction[](3);
743
- recoveryExecutionAllActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
744
- recoveryExecutionAllActions[1] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
745
- recoveryExecutionAllActions[2] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
746
-
747
- roleHashes[index] = EngineBlox.RECOVERY_ROLE;
748
- functionPermissions[index] = EngineBlox.FunctionPermission({
749
- functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
750
- grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryExecutionAllActions),
751
- handlerForSelectors: recoveryTransferOwnershipHandlers // Self-reference indicates execution selector
752
- });
753
- index++;
754
-
755
- return index;
756
- }
757
-
758
- /**
759
- * @dev Creates execution params for updating the recovery address (pure helper for EngineBlox).
760
- * @param newRecoveryAddress The new recovery address
761
- * @return The execution params for executeRecoveryUpdate
762
- * @notice Caller is responsible for validation; contract validates on execution.
763
- */
764
- function updateRecoveryExecutionParams(address newRecoveryAddress) public pure returns (bytes memory) {
765
- return abi.encode(newRecoveryAddress);
766
- }
767
-
768
- /**
769
- * @dev Creates execution params for updating the time lock period (pure helper for EngineBlox).
770
- * @param newTimeLockPeriodSec The new time lock period in seconds
771
- * @return The execution params for executeTimeLockUpdate
772
- * @notice Caller is responsible for validation; contract validates on execution.
773
- */
774
- function updateTimeLockExecutionParams(uint256 newTimeLockPeriodSec) public pure returns (bytes memory) {
775
- return abi.encode(newTimeLockPeriodSec);
776
- }
777
-
778
- /**
779
- * @dev ERC165: report support for IDefinition and IERC165 when this library is used at an address.
780
- * IDefinition extends IERC165; both interface IDs must be reported for ERC165 compliance.
781
- */
782
- function supportsInterface(bytes4 interfaceId) external pure returns (bool) {
783
- return interfaceId == type(IERC165).interfaceId || interfaceId == type(IDefinition).interfaceId;
784
- }
785
-
786
- }
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ pragma solidity 0.8.35;
3
+
4
+ import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
5
+ import "../../../lib/EngineBlox.sol";
6
+ import "../../../lib/interfaces/IDefinition.sol";
7
+
8
+ /**
9
+ * @title SecureOwnableDefinitions
10
+ * @dev Library containing predefined definitions for SecureOwnable initialization
11
+ * This library holds static data that can be used to initialize SecureOwnable contracts
12
+ * without increasing the main contract size
13
+ *
14
+ * This library implements the IDefinition interface from EngineBlox
15
+ * and provides a direct initialization function for SecureOwnable contracts
16
+ *
17
+ * Permission Model:
18
+ * - Handler Functions (triggering functions): Permissions checked via msg.sig in BaseStateMachine
19
+ * - Time-delay handler functions: Checked with EXECUTE_TIME_DELAY_* actions
20
+ * - Meta-transaction handler functions: Checked with EXECUTE_META_* actions
21
+ * - Execution Functions (target functions): Permissions checked in EngineBlox library
22
+ * - For time-delay: EXECUTE_TIME_DELAY_APPROVE/CANCEL actions
23
+ * - For meta-transactions: EXECUTE_META_* and SIGN_META_* actions (both handler and execution)
24
+ */
25
+ library SecureOwnableDefinitions {
26
+
27
+ // Operation Type Constants
28
+ bytes32 public constant OWNERSHIP_TRANSFER = keccak256("OWNERSHIP_TRANSFER");
29
+ bytes32 public constant BROADCASTER_UPDATE = keccak256("BROADCASTER_UPDATE");
30
+ bytes32 public constant RECOVERY_UPDATE = keccak256("RECOVERY_UPDATE");
31
+ bytes32 public constant TIMELOCK_UPDATE = keccak256("TIMELOCK_UPDATE");
32
+
33
+ // Function Selector Constants
34
+ bytes4 public constant TRANSFER_OWNERSHIP_SELECTOR = bytes4(keccak256("executeTransferOwnership(address)"));
35
+ bytes4 public constant UPDATE_BROADCASTER_SELECTOR = bytes4(keccak256("executeBroadcasterUpdate(address,address)"));
36
+ bytes4 public constant UPDATE_RECOVERY_SELECTOR = bytes4(keccak256("executeRecoveryUpdate(address)"));
37
+ bytes4 public constant UPDATE_TIMELOCK_SELECTOR = bytes4(keccak256("executeTimeLockUpdate(uint256)"));
38
+
39
+ // Time Delay Function Selectors (Handler Functions - checked via msg.sig)
40
+ bytes4 public constant TRANSFER_OWNERSHIP_REQUEST_SELECTOR = bytes4(keccak256("transferOwnershipRequest()"));
41
+ bytes4 public constant TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR = bytes4(keccak256("transferOwnershipDelayedApproval(uint256)"));
42
+ bytes4 public constant TRANSFER_OWNERSHIP_CANCELLATION_SELECTOR = bytes4(keccak256("transferOwnershipCancellation(uint256)"));
43
+ bytes4 public constant UPDATE_BROADCASTER_REQUEST_SELECTOR = bytes4(keccak256("updateBroadcasterRequest(address,address)"));
44
+ bytes4 public constant UPDATE_BROADCASTER_DELAYED_APPROVAL_SELECTOR = bytes4(keccak256("updateBroadcasterDelayedApproval(uint256)"));
45
+ bytes4 public constant UPDATE_BROADCASTER_CANCELLATION_SELECTOR = bytes4(keccak256("updateBroadcasterCancellation(uint256)"));
46
+
47
+ // Meta-transaction Function Selectors (Handler Functions - checked via msg.sig)
48
+ // Note: Solidity function selector calculation for struct parameters uses 2 opening parentheses: ((tuple))
49
+ // Verified: This format produces selector 0x458102e4 which matches the actual function selector
50
+ bytes4 public constant TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR = bytes4(keccak256("transferOwnershipApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
51
+ bytes4 public constant TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR = bytes4(keccak256("transferOwnershipCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
52
+ bytes4 public constant UPDATE_BROADCASTER_APPROVE_META_SELECTOR = bytes4(keccak256("updateBroadcasterApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
53
+ bytes4 public constant UPDATE_BROADCASTER_CANCEL_META_SELECTOR = bytes4(keccak256("updateBroadcasterCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
54
+ bytes4 public constant UPDATE_RECOVERY_META_SELECTOR = bytes4(keccak256("updateRecoveryRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
55
+ bytes4 public constant UPDATE_TIMELOCK_META_SELECTOR = bytes4(keccak256("updateTimeLockRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))"));
56
+
57
+ /**
58
+ * @dev Returns predefined function schemas
59
+ * @return Array of function schema definitions
60
+ */
61
+ function getFunctionSchemas() public pure returns (EngineBlox.FunctionSchema[] memory) {
62
+ EngineBlox.FunctionSchema[] memory schemas = new EngineBlox.FunctionSchema[](16);
63
+
64
+ // Meta-transaction function schemas
65
+ EngineBlox.TxAction[] memory metaApproveActions = new EngineBlox.TxAction[](2);
66
+ metaApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
67
+ metaApproveActions[1] = EngineBlox.TxAction.SIGN_META_APPROVE;
68
+
69
+ EngineBlox.TxAction[] memory metaCancelActions = new EngineBlox.TxAction[](2);
70
+ metaCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
71
+ metaCancelActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
72
+
73
+ EngineBlox.TxAction[] memory metaRequestApproveActions = new EngineBlox.TxAction[](2);
74
+ metaRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
75
+ metaRequestApproveActions[1] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
76
+
77
+ // Time-delayed functions
78
+ EngineBlox.TxAction[] memory timeDelayRequestActions = new EngineBlox.TxAction[](1);
79
+ timeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
80
+
81
+ EngineBlox.TxAction[] memory timeDelayApproveActions = new EngineBlox.TxAction[](1);
82
+ timeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
83
+
84
+ EngineBlox.TxAction[] memory timeDelayCancelActions = new EngineBlox.TxAction[](1);
85
+ timeDelayCancelActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
86
+
87
+ // Execution selector actions (for meta-transactions and time-delay)
88
+ // These execution selectors support both approve and cancel actions for both meta-tx and time-delay
89
+ // Also support request action for time-delay (needed for txRequest permission check)
90
+ EngineBlox.TxAction[] memory executionApproveCancelActions = new EngineBlox.TxAction[](7);
91
+ executionApproveCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
92
+ executionApproveCancelActions[1] = EngineBlox.TxAction.SIGN_META_APPROVE;
93
+ executionApproveCancelActions[2] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
94
+ executionApproveCancelActions[3] = EngineBlox.TxAction.SIGN_META_CANCEL;
95
+ executionApproveCancelActions[4] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
96
+ executionApproveCancelActions[5] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
97
+ executionApproveCancelActions[6] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
98
+
99
+ EngineBlox.TxAction[] memory executionMetaRequestApproveActions = new EngineBlox.TxAction[](2);
100
+ executionMetaRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
101
+ executionMetaRequestApproveActions[1] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
102
+
103
+ // Prepare handlerForSelectors arrays
104
+ // Execution selectors must have self-reference (at least one element pointing to themselves)
105
+ bytes4[] memory transferOwnershipExecutionHandlerForSelectors = new bytes4[](1);
106
+ transferOwnershipExecutionHandlerForSelectors[0] = TRANSFER_OWNERSHIP_SELECTOR;
107
+ bytes4[] memory broadcasterExecutionHandlerForSelectors = new bytes4[](1);
108
+ broadcasterExecutionHandlerForSelectors[0] = UPDATE_BROADCASTER_SELECTOR;
109
+ bytes4[] memory recoveryExecutionHandlerForSelectors = new bytes4[](1);
110
+ recoveryExecutionHandlerForSelectors[0] = UPDATE_RECOVERY_SELECTOR;
111
+ bytes4[] memory timelockExecutionHandlerForSelectors = new bytes4[](1);
112
+ timelockExecutionHandlerForSelectors[0] = UPDATE_TIMELOCK_SELECTOR;
113
+
114
+ // Handler selectors point to execution selectors
115
+ bytes4[] memory transferOwnershipHandlerForSelectors = new bytes4[](1);
116
+ transferOwnershipHandlerForSelectors[0] = TRANSFER_OWNERSHIP_SELECTOR;
117
+ bytes4[] memory broadcasterHandlerForSelectors = new bytes4[](1);
118
+ broadcasterHandlerForSelectors[0] = UPDATE_BROADCASTER_SELECTOR;
119
+ bytes4[] memory recoveryHandlerForSelectors = new bytes4[](1);
120
+ recoveryHandlerForSelectors[0] = UPDATE_RECOVERY_SELECTOR;
121
+ bytes4[] memory timelockHandlerForSelectors = new bytes4[](1);
122
+ timelockHandlerForSelectors[0] = UPDATE_TIMELOCK_SELECTOR;
123
+
124
+ // Meta-transaction functions
125
+ schemas[0] = EngineBlox.FunctionSchema({
126
+ functionSignature: "transferOwnershipApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
127
+ functionSelector: TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR,
128
+ operationType: OWNERSHIP_TRANSFER,
129
+ operationName: "OWNERSHIP_TRANSFER",
130
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaApproveActions),
131
+ enforceHandlerRelations: true,
132
+ isProtected: true,
133
+ isGrantRevocable: false,
134
+ handlerForSelectors: transferOwnershipHandlerForSelectors
135
+ });
136
+
137
+ schemas[1] = EngineBlox.FunctionSchema({
138
+ functionSignature: "transferOwnershipCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
139
+ functionSelector: TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR,
140
+ operationType: OWNERSHIP_TRANSFER,
141
+ operationName: "OWNERSHIP_TRANSFER",
142
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaCancelActions),
143
+ enforceHandlerRelations: true,
144
+ isProtected: true,
145
+ isGrantRevocable: false,
146
+ handlerForSelectors: transferOwnershipHandlerForSelectors
147
+ });
148
+
149
+ schemas[2] = EngineBlox.FunctionSchema({
150
+ functionSignature: "updateBroadcasterApprovalWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
151
+ functionSelector: UPDATE_BROADCASTER_APPROVE_META_SELECTOR,
152
+ operationType: BROADCASTER_UPDATE,
153
+ operationName: "BROADCASTER_UPDATE",
154
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaApproveActions),
155
+ enforceHandlerRelations: true,
156
+ isProtected: true,
157
+ isGrantRevocable: false,
158
+ handlerForSelectors: broadcasterHandlerForSelectors
159
+ });
160
+
161
+ schemas[3] = EngineBlox.FunctionSchema({
162
+ functionSignature: "updateBroadcasterCancellationWithMetaTx(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
163
+ functionSelector: UPDATE_BROADCASTER_CANCEL_META_SELECTOR,
164
+ operationType: BROADCASTER_UPDATE,
165
+ operationName: "BROADCASTER_UPDATE",
166
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaCancelActions),
167
+ enforceHandlerRelations: true,
168
+ isProtected: true,
169
+ isGrantRevocable: false,
170
+ handlerForSelectors: broadcasterHandlerForSelectors
171
+ });
172
+
173
+ schemas[4] = EngineBlox.FunctionSchema({
174
+ functionSignature: "updateRecoveryRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
175
+ functionSelector: UPDATE_RECOVERY_META_SELECTOR,
176
+ operationType: RECOVERY_UPDATE,
177
+ operationName: "RECOVERY_UPDATE",
178
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaRequestApproveActions),
179
+ enforceHandlerRelations: true,
180
+ isProtected: true,
181
+ isGrantRevocable: false,
182
+ handlerForSelectors: recoveryHandlerForSelectors
183
+ });
184
+
185
+ schemas[5] = EngineBlox.FunctionSchema({
186
+ functionSignature: "updateTimeLockRequestAndApprove(((uint256,uint256,uint8,(address,address,uint256,uint256,bytes32,bytes4,bytes),bytes32,bytes32,(address,uint256,address,uint256)),(uint256,uint256,address,bytes4,uint8,uint256,uint256,address),bytes32,bytes,bytes))",
187
+ functionSelector: UPDATE_TIMELOCK_META_SELECTOR,
188
+ operationType: TIMELOCK_UPDATE,
189
+ operationName: "TIMELOCK_UPDATE",
190
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(metaRequestApproveActions),
191
+ enforceHandlerRelations: true,
192
+ isProtected: true,
193
+ isGrantRevocable: false,
194
+ handlerForSelectors: timelockHandlerForSelectors
195
+ });
196
+
197
+ // Time-delayed functions
198
+ schemas[6] = EngineBlox.FunctionSchema({
199
+ functionSignature: "transferOwnershipRequest()",
200
+ functionSelector: TRANSFER_OWNERSHIP_REQUEST_SELECTOR,
201
+ operationType: OWNERSHIP_TRANSFER,
202
+ operationName: "OWNERSHIP_TRANSFER",
203
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayRequestActions),
204
+ enforceHandlerRelations: true,
205
+ isProtected: true,
206
+ isGrantRevocable: false,
207
+ handlerForSelectors: transferOwnershipHandlerForSelectors
208
+ });
209
+
210
+ schemas[7] = EngineBlox.FunctionSchema({
211
+ functionSignature: "transferOwnershipDelayedApproval(uint256)",
212
+ functionSelector: TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR,
213
+ operationType: OWNERSHIP_TRANSFER,
214
+ operationName: "OWNERSHIP_TRANSFER",
215
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayApproveActions),
216
+ enforceHandlerRelations: true,
217
+ isProtected: true,
218
+ isGrantRevocable: false,
219
+ handlerForSelectors: transferOwnershipHandlerForSelectors
220
+ });
221
+
222
+ schemas[8] = EngineBlox.FunctionSchema({
223
+ functionSignature: "transferOwnershipCancellation(uint256)",
224
+ functionSelector: TRANSFER_OWNERSHIP_CANCELLATION_SELECTOR,
225
+ operationType: OWNERSHIP_TRANSFER,
226
+ operationName: "OWNERSHIP_TRANSFER",
227
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayCancelActions),
228
+ enforceHandlerRelations: true,
229
+ isProtected: true,
230
+ isGrantRevocable: false,
231
+ handlerForSelectors: transferOwnershipHandlerForSelectors
232
+ });
233
+
234
+ schemas[9] = EngineBlox.FunctionSchema({
235
+ functionSignature: "updateBroadcasterRequest(address,address)",
236
+ functionSelector: UPDATE_BROADCASTER_REQUEST_SELECTOR,
237
+ operationType: BROADCASTER_UPDATE,
238
+ operationName: "BROADCASTER_UPDATE",
239
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayRequestActions),
240
+ enforceHandlerRelations: true,
241
+ isProtected: true,
242
+ isGrantRevocable: false,
243
+ handlerForSelectors: broadcasterHandlerForSelectors
244
+ });
245
+
246
+ schemas[10] = EngineBlox.FunctionSchema({
247
+ functionSignature: "updateBroadcasterDelayedApproval(uint256)",
248
+ functionSelector: UPDATE_BROADCASTER_DELAYED_APPROVAL_SELECTOR,
249
+ operationType: BROADCASTER_UPDATE,
250
+ operationName: "BROADCASTER_UPDATE",
251
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayApproveActions),
252
+ enforceHandlerRelations: true,
253
+ isProtected: true,
254
+ isGrantRevocable: false,
255
+ handlerForSelectors: broadcasterHandlerForSelectors
256
+ });
257
+
258
+ schemas[11] = EngineBlox.FunctionSchema({
259
+ functionSignature: "updateBroadcasterCancellation(uint256)",
260
+ functionSelector: UPDATE_BROADCASTER_CANCELLATION_SELECTOR,
261
+ operationType: BROADCASTER_UPDATE,
262
+ operationName: "BROADCASTER_UPDATE",
263
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(timeDelayCancelActions),
264
+ enforceHandlerRelations: true,
265
+ isProtected: true,
266
+ isGrantRevocable: false,
267
+ handlerForSelectors: broadcasterHandlerForSelectors
268
+ });
269
+
270
+ // Execution selector schemas (required for meta-transaction dual-permission model)
271
+ // Execution selectors must have self-reference in handlerForSelectors array
272
+ schemas[12] = EngineBlox.FunctionSchema({
273
+ functionSignature: "executeTransferOwnership(address)",
274
+ functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
275
+ operationType: OWNERSHIP_TRANSFER,
276
+ operationName: "OWNERSHIP_TRANSFER",
277
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionApproveCancelActions),
278
+ enforceHandlerRelations: true,
279
+ isProtected: true,
280
+ isGrantRevocable: false,
281
+ handlerForSelectors: transferOwnershipExecutionHandlerForSelectors
282
+ });
283
+
284
+ schemas[13] = EngineBlox.FunctionSchema({
285
+ functionSignature: "executeBroadcasterUpdate(address,address)",
286
+ functionSelector: UPDATE_BROADCASTER_SELECTOR,
287
+ operationType: BROADCASTER_UPDATE,
288
+ operationName: "BROADCASTER_UPDATE",
289
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionApproveCancelActions),
290
+ enforceHandlerRelations: true,
291
+ isProtected: true,
292
+ isGrantRevocable: false,
293
+ handlerForSelectors: broadcasterExecutionHandlerForSelectors
294
+ });
295
+
296
+ schemas[14] = EngineBlox.FunctionSchema({
297
+ functionSignature: "executeRecoveryUpdate(address)",
298
+ functionSelector: UPDATE_RECOVERY_SELECTOR,
299
+ operationType: RECOVERY_UPDATE,
300
+ operationName: "RECOVERY_UPDATE",
301
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionMetaRequestApproveActions),
302
+ enforceHandlerRelations: true,
303
+ isProtected: true,
304
+ isGrantRevocable: false,
305
+ handlerForSelectors: recoveryExecutionHandlerForSelectors
306
+ });
307
+
308
+ schemas[15] = EngineBlox.FunctionSchema({
309
+ functionSignature: "executeTimeLockUpdate(uint256)",
310
+ functionSelector: UPDATE_TIMELOCK_SELECTOR,
311
+ operationType: TIMELOCK_UPDATE,
312
+ operationName: "TIMELOCK_UPDATE",
313
+ supportedActionsBitmap: EngineBlox.createBitmapFromActions(executionMetaRequestApproveActions),
314
+ enforceHandlerRelations: true,
315
+ isProtected: true,
316
+ isGrantRevocable: false,
317
+ handlerForSelectors: timelockExecutionHandlerForSelectors
318
+ });
319
+
320
+ return schemas;
321
+ }
322
+
323
+ /**
324
+ * @dev Returns predefined role hashes and their corresponding function permissions
325
+ * @return RolePermission struct containing roleHashes and functionPermissions arrays
326
+ */
327
+ function getRolePermissions() public pure returns (IDefinition.RolePermission memory) {
328
+ // Calculate total permissions needed
329
+ // Broadcaster: 6 handler (meta-tx) + 4 execution = 10
330
+ // Owner: 4 handler (time-delay) + 6 handler (meta-tx) + 4 execution = 14
331
+ // Recovery: 3 handler (time-delay) + 1 execution = 4
332
+ // Total: 28 permissions
333
+ bytes32[] memory roleHashes = new bytes32[](28);
334
+ EngineBlox.FunctionPermission[] memory functionPermissions = new EngineBlox.FunctionPermission[](28);
335
+
336
+ uint256 index = 0;
337
+
338
+ // ============ BROADCASTER ROLE PERMISSIONS ============
339
+ index = _addBroadcasterPermissions(roleHashes, functionPermissions, index);
340
+
341
+ // ============ OWNER ROLE PERMISSIONS ============
342
+ index = _addOwnerPermissions(roleHashes, functionPermissions, index);
343
+
344
+ // ============ RECOVERY ROLE PERMISSIONS ============
345
+ index = _addRecoveryPermissions(roleHashes, functionPermissions, index);
346
+
347
+ return IDefinition.RolePermission({
348
+ roleHashes: roleHashes,
349
+ functionPermissions: functionPermissions
350
+ });
351
+ }
352
+
353
+ // ============ INTERNAL HELPER FUNCTIONS ============
354
+
355
+ /**
356
+ * @dev Adds broadcaster role permissions
357
+ * @param roleHashes Array to populate with role hashes
358
+ * @param functionPermissions Array to populate with function permissions
359
+ * @param startIndex Starting index in arrays
360
+ * @return Next available index after adding permissions
361
+ */
362
+ function _addBroadcasterPermissions(
363
+ bytes32[] memory roleHashes,
364
+ EngineBlox.FunctionPermission[] memory functionPermissions,
365
+ uint256 startIndex
366
+ ) internal pure returns (uint256) {
367
+ uint256 index = startIndex;
368
+
369
+ // Action arrays for broadcaster
370
+ EngineBlox.TxAction[] memory broadcasterMetaApproveActions = new EngineBlox.TxAction[](1);
371
+ broadcasterMetaApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
372
+
373
+ EngineBlox.TxAction[] memory broadcasterMetaCancelActions = new EngineBlox.TxAction[](1);
374
+ broadcasterMetaCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
375
+
376
+ EngineBlox.TxAction[] memory broadcasterMetaRequestApproveActions = new EngineBlox.TxAction[](1);
377
+ broadcasterMetaRequestApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
378
+
379
+ EngineBlox.TxAction[] memory broadcasterExecutionApproveCancelActions = new EngineBlox.TxAction[](2);
380
+ broadcasterExecutionApproveCancelActions[0] = EngineBlox.TxAction.EXECUTE_META_APPROVE;
381
+ broadcasterExecutionApproveCancelActions[1] = EngineBlox.TxAction.EXECUTE_META_CANCEL;
382
+
383
+ EngineBlox.TxAction[] memory broadcasterExecutionRequestApproveActions = new EngineBlox.TxAction[](1);
384
+ broadcasterExecutionRequestApproveActions[0] = EngineBlox.TxAction.EXECUTE_META_REQUEST_AND_APPROVE;
385
+
386
+ // ============ BROADCASTER: HANDLER FUNCTION PERMISSIONS (Meta-transactions) ============
387
+ // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
388
+
389
+ // Create reusable handlerForSelectors arrays
390
+ bytes4[] memory transferOwnershipHandlers = new bytes4[](1);
391
+ transferOwnershipHandlers[0] = TRANSFER_OWNERSHIP_SELECTOR;
392
+ bytes4[] memory updateBroadcasterHandlers = new bytes4[](1);
393
+ updateBroadcasterHandlers[0] = UPDATE_BROADCASTER_SELECTOR;
394
+ bytes4[] memory updateRecoveryHandlers = new bytes4[](1);
395
+ updateRecoveryHandlers[0] = UPDATE_RECOVERY_SELECTOR;
396
+ bytes4[] memory updateTimelockHandlers = new bytes4[](1);
397
+ updateTimelockHandlers[0] = UPDATE_TIMELOCK_SELECTOR;
398
+
399
+ // Transfer Ownership Approve Meta (handler function)
400
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
401
+ functionPermissions[index] = EngineBlox.FunctionPermission({
402
+ functionSelector: TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR,
403
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaApproveActions),
404
+ handlerForSelectors: transferOwnershipHandlers
405
+ });
406
+ index++;
407
+
408
+ // Transfer Ownership Cancel Meta (handler function)
409
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
410
+ functionPermissions[index] = EngineBlox.FunctionPermission({
411
+ functionSelector: TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR,
412
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaCancelActions),
413
+ handlerForSelectors: transferOwnershipHandlers
414
+ });
415
+ index++;
416
+
417
+ // Update Broadcaster Approve Meta (handler function)
418
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
419
+ functionPermissions[index] = EngineBlox.FunctionPermission({
420
+ functionSelector: UPDATE_BROADCASTER_APPROVE_META_SELECTOR,
421
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaApproveActions),
422
+ handlerForSelectors: updateBroadcasterHandlers
423
+ });
424
+ index++;
425
+
426
+ // Update Broadcaster Cancel Meta (handler function)
427
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
428
+ functionPermissions[index] = EngineBlox.FunctionPermission({
429
+ functionSelector: UPDATE_BROADCASTER_CANCEL_META_SELECTOR,
430
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaCancelActions),
431
+ handlerForSelectors: updateBroadcasterHandlers
432
+ });
433
+ index++;
434
+
435
+ // Update Recovery Meta (handler function)
436
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
437
+ functionPermissions[index] = EngineBlox.FunctionPermission({
438
+ functionSelector: UPDATE_RECOVERY_META_SELECTOR,
439
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaRequestApproveActions),
440
+ handlerForSelectors: updateRecoveryHandlers
441
+ });
442
+ index++;
443
+
444
+ // Update Timelock Meta (handler function)
445
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
446
+ functionPermissions[index] = EngineBlox.FunctionPermission({
447
+ functionSelector: UPDATE_TIMELOCK_META_SELECTOR,
448
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterMetaRequestApproveActions),
449
+ handlerForSelectors: updateTimelockHandlers
450
+ });
451
+ index++;
452
+
453
+ // ============ BROADCASTER: EXECUTION FUNCTION PERMISSIONS ============
454
+ // These are checked in EngineBlox library functions
455
+
456
+ // Transfer Ownership Execution (for approve/cancel meta-tx)
457
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
458
+ functionPermissions[index] = EngineBlox.FunctionPermission({
459
+ functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
460
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionApproveCancelActions),
461
+ handlerForSelectors: transferOwnershipHandlers // Self-reference indicates execution selector
462
+ });
463
+ index++;
464
+
465
+ // Update Broadcaster Execution (for approve/cancel meta-tx)
466
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
467
+ functionPermissions[index] = EngineBlox.FunctionPermission({
468
+ functionSelector: UPDATE_BROADCASTER_SELECTOR,
469
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionApproveCancelActions),
470
+ handlerForSelectors: updateBroadcasterHandlers // Self-reference indicates execution selector
471
+ });
472
+ index++;
473
+
474
+ // Update Recovery Execution (for request and approve meta-tx)
475
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
476
+ functionPermissions[index] = EngineBlox.FunctionPermission({
477
+ functionSelector: UPDATE_RECOVERY_SELECTOR,
478
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionRequestApproveActions),
479
+ handlerForSelectors: updateRecoveryHandlers // Self-reference indicates execution selector
480
+ });
481
+ index++;
482
+
483
+ // Update Timelock Execution (for request and approve meta-tx)
484
+ roleHashes[index] = EngineBlox.BROADCASTER_ROLE;
485
+ functionPermissions[index] = EngineBlox.FunctionPermission({
486
+ functionSelector: UPDATE_TIMELOCK_SELECTOR,
487
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(broadcasterExecutionRequestApproveActions),
488
+ handlerForSelectors: updateTimelockHandlers // Self-reference indicates execution selector
489
+ });
490
+ index++;
491
+
492
+ return index;
493
+ }
494
+
495
+ /**
496
+ * @dev Adds owner role permissions
497
+ * @param roleHashes Array to populate with role hashes
498
+ * @param functionPermissions Array to populate with function permissions
499
+ * @param startIndex Starting index in arrays
500
+ * @return Next available index after adding permissions
501
+ */
502
+ function _addOwnerPermissions(
503
+ bytes32[] memory roleHashes,
504
+ EngineBlox.FunctionPermission[] memory functionPermissions,
505
+ uint256 startIndex
506
+ ) internal pure returns (uint256) {
507
+ uint256 index = startIndex;
508
+
509
+ // Action arrays for owner
510
+ EngineBlox.TxAction[] memory ownerTimeDelayRequestActions = new EngineBlox.TxAction[](1);
511
+ ownerTimeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
512
+
513
+ EngineBlox.TxAction[] memory ownerTimeDelayApproveActions = new EngineBlox.TxAction[](1);
514
+ ownerTimeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
515
+
516
+ EngineBlox.TxAction[] memory ownerTimeDelayCancelActions = new EngineBlox.TxAction[](1);
517
+ ownerTimeDelayCancelActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
518
+
519
+ EngineBlox.TxAction[] memory ownerMetaApproveActions = new EngineBlox.TxAction[](1);
520
+ ownerMetaApproveActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
521
+
522
+ EngineBlox.TxAction[] memory ownerMetaCancelActions = new EngineBlox.TxAction[](1);
523
+ ownerMetaCancelActions[0] = EngineBlox.TxAction.SIGN_META_CANCEL;
524
+
525
+ EngineBlox.TxAction[] memory ownerMetaRequestApproveActions = new EngineBlox.TxAction[](1);
526
+ ownerMetaRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
527
+
528
+ EngineBlox.TxAction[] memory ownerExecutionApproveCancelActions = new EngineBlox.TxAction[](2);
529
+ ownerExecutionApproveCancelActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
530
+ ownerExecutionApproveCancelActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
531
+
532
+ EngineBlox.TxAction[] memory ownerExecutionRequestApproveActions = new EngineBlox.TxAction[](1);
533
+ ownerExecutionRequestApproveActions[0] = EngineBlox.TxAction.SIGN_META_REQUEST_AND_APPROVE;
534
+
535
+ EngineBlox.TxAction[] memory ownerExecutionTimeDelayRequestActions = new EngineBlox.TxAction[](1);
536
+ ownerExecutionTimeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
537
+
538
+ EngineBlox.TxAction[] memory ownerExecutionTimeDelayApproveActions = new EngineBlox.TxAction[](1);
539
+ ownerExecutionTimeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
540
+
541
+ // Create reusable handlerForSelectors arrays for owner permissions
542
+ bytes4[] memory ownerTransferOwnershipHandlers = new bytes4[](1);
543
+ ownerTransferOwnershipHandlers[0] = TRANSFER_OWNERSHIP_SELECTOR;
544
+ bytes4[] memory ownerUpdateBroadcasterHandlers = new bytes4[](1);
545
+ ownerUpdateBroadcasterHandlers[0] = UPDATE_BROADCASTER_SELECTOR;
546
+ bytes4[] memory ownerUpdateRecoveryHandlers = new bytes4[](1);
547
+ ownerUpdateRecoveryHandlers[0] = UPDATE_RECOVERY_SELECTOR;
548
+ bytes4[] memory ownerUpdateTimelockHandlers = new bytes4[](1);
549
+ ownerUpdateTimelockHandlers[0] = UPDATE_TIMELOCK_SELECTOR;
550
+
551
+ // ============ OWNER: HANDLER FUNCTION PERMISSIONS (Time-delay) ============
552
+ // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
553
+
554
+ // Transfer Ownership Delayed Approval (handler function)
555
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
556
+ functionPermissions[index] = EngineBlox.FunctionPermission({
557
+ functionSelector: TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR,
558
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayApproveActions),
559
+ handlerForSelectors: ownerTransferOwnershipHandlers
560
+ });
561
+ index++;
562
+
563
+ // Update Broadcaster Request (handler function)
564
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
565
+ functionPermissions[index] = EngineBlox.FunctionPermission({
566
+ functionSelector: UPDATE_BROADCASTER_REQUEST_SELECTOR,
567
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayRequestActions),
568
+ handlerForSelectors: ownerUpdateBroadcasterHandlers
569
+ });
570
+ index++;
571
+
572
+ // Update Broadcaster Delayed Approval (handler function)
573
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
574
+ functionPermissions[index] = EngineBlox.FunctionPermission({
575
+ functionSelector: UPDATE_BROADCASTER_DELAYED_APPROVAL_SELECTOR,
576
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayApproveActions),
577
+ handlerForSelectors: ownerUpdateBroadcasterHandlers
578
+ });
579
+ index++;
580
+
581
+ // Update Broadcaster Cancellation (handler function)
582
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
583
+ functionPermissions[index] = EngineBlox.FunctionPermission({
584
+ functionSelector: UPDATE_BROADCASTER_CANCELLATION_SELECTOR,
585
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTimeDelayCancelActions),
586
+ handlerForSelectors: ownerUpdateBroadcasterHandlers
587
+ });
588
+ index++;
589
+
590
+ // ============ OWNER: HANDLER FUNCTION PERMISSIONS (Meta-transactions) ============
591
+ // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
592
+ // Note: Owner signs meta-transactions, but doesn't execute them (broadcaster executes)
593
+
594
+ // Transfer Ownership Approve Meta (handler function - for signing)
595
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
596
+ functionPermissions[index] = EngineBlox.FunctionPermission({
597
+ functionSelector: TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR,
598
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaApproveActions),
599
+ handlerForSelectors: ownerTransferOwnershipHandlers
600
+ });
601
+ index++;
602
+
603
+ // Transfer Ownership Cancel Meta (handler function - for signing)
604
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
605
+ functionPermissions[index] = EngineBlox.FunctionPermission({
606
+ functionSelector: TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR,
607
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaCancelActions),
608
+ handlerForSelectors: ownerTransferOwnershipHandlers
609
+ });
610
+ index++;
611
+
612
+ // Update Broadcaster Approve Meta (handler function - for signing)
613
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
614
+ functionPermissions[index] = EngineBlox.FunctionPermission({
615
+ functionSelector: UPDATE_BROADCASTER_APPROVE_META_SELECTOR,
616
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaApproveActions),
617
+ handlerForSelectors: ownerUpdateBroadcasterHandlers
618
+ });
619
+ index++;
620
+
621
+ // Update Broadcaster Cancel Meta (handler function - for signing)
622
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
623
+ functionPermissions[index] = EngineBlox.FunctionPermission({
624
+ functionSelector: UPDATE_BROADCASTER_CANCEL_META_SELECTOR,
625
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaCancelActions),
626
+ handlerForSelectors: ownerUpdateBroadcasterHandlers
627
+ });
628
+ index++;
629
+
630
+ // Update Recovery Meta (handler function - for signing)
631
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
632
+ functionPermissions[index] = EngineBlox.FunctionPermission({
633
+ functionSelector: UPDATE_RECOVERY_META_SELECTOR,
634
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaRequestApproveActions),
635
+ handlerForSelectors: ownerUpdateRecoveryHandlers
636
+ });
637
+ index++;
638
+
639
+ // Update Timelock Meta (handler function - for signing)
640
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
641
+ functionPermissions[index] = EngineBlox.FunctionPermission({
642
+ functionSelector: UPDATE_TIMELOCK_META_SELECTOR,
643
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerMetaRequestApproveActions),
644
+ handlerForSelectors: ownerUpdateTimelockHandlers
645
+ });
646
+ index++;
647
+
648
+ // ============ OWNER: EXECUTION FUNCTION PERMISSIONS ============
649
+ // These are checked in EngineBlox library functions
650
+
651
+ // Transfer Ownership Execution (for approve/cancel meta-tx - owner signs)
652
+ // Also supports time-delay approve (for transferOwnershipDelayedApproval)
653
+ EngineBlox.TxAction[] memory ownerTransferOwnershipAllActions = new EngineBlox.TxAction[](3);
654
+ ownerTransferOwnershipAllActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
655
+ ownerTransferOwnershipAllActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
656
+ ownerTransferOwnershipAllActions[2] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
657
+
658
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
659
+ functionPermissions[index] = EngineBlox.FunctionPermission({
660
+ functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
661
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerTransferOwnershipAllActions),
662
+ handlerForSelectors: ownerTransferOwnershipHandlers // Self-reference indicates execution selector
663
+ });
664
+ index++;
665
+
666
+ // Update Broadcaster Execution (for approve/cancel meta-tx and time-delay request/approve/cancel - owner signs)
667
+ // Supports:
668
+ // - SIGN_META_APPROVE, SIGN_META_CANCEL: for meta-transactions
669
+ // - EXECUTE_TIME_DELAY_REQUEST: for updateBroadcasterRequest (checked in txRequest)
670
+ // - EXECUTE_TIME_DELAY_APPROVE: for updateBroadcasterDelayedApproval (checked in txDelayedApproval)
671
+ // - EXECUTE_TIME_DELAY_CANCEL: for updateBroadcasterCancellation (checked in txCancellation)
672
+ EngineBlox.TxAction[] memory ownerBroadcasterExecutionAllActions = new EngineBlox.TxAction[](5);
673
+ ownerBroadcasterExecutionAllActions[0] = EngineBlox.TxAction.SIGN_META_APPROVE;
674
+ ownerBroadcasterExecutionAllActions[1] = EngineBlox.TxAction.SIGN_META_CANCEL;
675
+ ownerBroadcasterExecutionAllActions[2] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
676
+ ownerBroadcasterExecutionAllActions[3] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
677
+ ownerBroadcasterExecutionAllActions[4] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
678
+
679
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
680
+ functionPermissions[index] = EngineBlox.FunctionPermission({
681
+ functionSelector: UPDATE_BROADCASTER_SELECTOR,
682
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerBroadcasterExecutionAllActions),
683
+ handlerForSelectors: ownerUpdateBroadcasterHandlers // Self-reference indicates execution selector
684
+ });
685
+ index++;
686
+
687
+ // Update Recovery Execution (for request and approve meta-tx - owner signs)
688
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
689
+ functionPermissions[index] = EngineBlox.FunctionPermission({
690
+ functionSelector: UPDATE_RECOVERY_SELECTOR,
691
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerExecutionRequestApproveActions),
692
+ handlerForSelectors: ownerUpdateRecoveryHandlers // Self-reference indicates execution selector
693
+ });
694
+ index++;
695
+
696
+ // Update Timelock Execution (for request and approve meta-tx - owner signs)
697
+ roleHashes[index] = EngineBlox.OWNER_ROLE;
698
+ functionPermissions[index] = EngineBlox.FunctionPermission({
699
+ functionSelector: UPDATE_TIMELOCK_SELECTOR,
700
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(ownerExecutionRequestApproveActions),
701
+ handlerForSelectors: ownerUpdateTimelockHandlers // Self-reference indicates execution selector
702
+ });
703
+ index++;
704
+
705
+ return index;
706
+ }
707
+
708
+ /**
709
+ * @dev Adds recovery role permissions
710
+ * @param roleHashes Array to populate with role hashes
711
+ * @param functionPermissions Array to populate with function permissions
712
+ * @param startIndex Starting index in arrays
713
+ * @return Next available index after adding permissions
714
+ */
715
+ function _addRecoveryPermissions(
716
+ bytes32[] memory roleHashes,
717
+ EngineBlox.FunctionPermission[] memory functionPermissions,
718
+ uint256 startIndex
719
+ ) internal pure returns (uint256) {
720
+ uint256 index = startIndex;
721
+
722
+ // Action arrays for recovery
723
+ EngineBlox.TxAction[] memory recoveryTimeDelayRequestActions = new EngineBlox.TxAction[](1);
724
+ recoveryTimeDelayRequestActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
725
+
726
+ EngineBlox.TxAction[] memory recoveryTimeDelayApproveActions = new EngineBlox.TxAction[](1);
727
+ recoveryTimeDelayApproveActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
728
+
729
+ EngineBlox.TxAction[] memory recoveryTimeDelayCancelActions = new EngineBlox.TxAction[](1);
730
+ recoveryTimeDelayCancelActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
731
+
732
+ // Create reusable handlerForSelectors array for recovery permissions
733
+ bytes4[] memory recoveryTransferOwnershipHandlers = new bytes4[](1);
734
+ recoveryTransferOwnershipHandlers[0] = TRANSFER_OWNERSHIP_SELECTOR;
735
+
736
+ // ============ RECOVERY: HANDLER FUNCTION PERMISSIONS (Time-delay) ============
737
+ // These are checked via msg.sig in BaseStateMachine._validateCallingFunctionPermission
738
+
739
+ // Transfer Ownership Request (handler function)
740
+ roleHashes[index] = EngineBlox.RECOVERY_ROLE;
741
+ functionPermissions[index] = EngineBlox.FunctionPermission({
742
+ functionSelector: TRANSFER_OWNERSHIP_REQUEST_SELECTOR,
743
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryTimeDelayRequestActions),
744
+ handlerForSelectors: recoveryTransferOwnershipHandlers
745
+ });
746
+ index++;
747
+
748
+ // Transfer Ownership Delayed Approval (handler function)
749
+ roleHashes[index] = EngineBlox.RECOVERY_ROLE;
750
+ functionPermissions[index] = EngineBlox.FunctionPermission({
751
+ functionSelector: TRANSFER_OWNERSHIP_DELAYED_APPROVAL_SELECTOR,
752
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryTimeDelayApproveActions),
753
+ handlerForSelectors: recoveryTransferOwnershipHandlers
754
+ });
755
+ index++;
756
+
757
+ // Transfer Ownership Cancellation (handler function)
758
+ roleHashes[index] = EngineBlox.RECOVERY_ROLE;
759
+ functionPermissions[index] = EngineBlox.FunctionPermission({
760
+ functionSelector: TRANSFER_OWNERSHIP_CANCELLATION_SELECTOR,
761
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryTimeDelayCancelActions),
762
+ handlerForSelectors: recoveryTransferOwnershipHandlers
763
+ });
764
+ index++;
765
+
766
+ // ============ RECOVERY: EXECUTION FUNCTION PERMISSIONS ============
767
+ // These are checked in EngineBlox library functions
768
+
769
+ // Transfer Ownership Execution (for time-delay request/approve/cancel)
770
+ // Recovery needs this for:
771
+ // - EXECUTE_TIME_DELAY_REQUEST: when calling transferOwnershipRequest (checked in txRequest)
772
+ // - EXECUTE_TIME_DELAY_APPROVE: when calling transferOwnershipDelayedApproval
773
+ // - EXECUTE_TIME_DELAY_CANCEL: when calling transferOwnershipCancellation
774
+ EngineBlox.TxAction[] memory recoveryExecutionAllActions = new EngineBlox.TxAction[](3);
775
+ recoveryExecutionAllActions[0] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_REQUEST;
776
+ recoveryExecutionAllActions[1] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_APPROVE;
777
+ recoveryExecutionAllActions[2] = EngineBlox.TxAction.EXECUTE_TIME_DELAY_CANCEL;
778
+
779
+ roleHashes[index] = EngineBlox.RECOVERY_ROLE;
780
+ functionPermissions[index] = EngineBlox.FunctionPermission({
781
+ functionSelector: TRANSFER_OWNERSHIP_SELECTOR,
782
+ grantedActionsBitmap: EngineBlox.createBitmapFromActions(recoveryExecutionAllActions),
783
+ handlerForSelectors: recoveryTransferOwnershipHandlers // Self-reference indicates execution selector
784
+ });
785
+ index++;
786
+
787
+ return index;
788
+ }
789
+
790
+ /**
791
+ * @dev Creates execution params for updating the recovery address (pure helper for EngineBlox).
792
+ * @param newRecoveryAddress The new recovery address
793
+ * @return The execution params for executeRecoveryUpdate
794
+ * @notice Caller is responsible for validation; contract validates on execution.
795
+ */
796
+ function updateRecoveryExecutionParams(address newRecoveryAddress) public pure returns (bytes memory) {
797
+ return abi.encode(newRecoveryAddress);
798
+ }
799
+
800
+ /**
801
+ * @dev Creates execution params for updating the time lock period (pure helper for EngineBlox).
802
+ * @param newTimeLockPeriodSec The new time lock period in seconds
803
+ * @return The execution params for executeTimeLockUpdate
804
+ * @notice Caller is responsible for validation; contract validates on execution.
805
+ */
806
+ function updateTimeLockExecutionParams(uint256 newTimeLockPeriodSec) public pure returns (bytes memory) {
807
+ return abi.encode(newTimeLockPeriodSec);
808
+ }
809
+
810
+ /**
811
+ * @dev ERC165: report support for IDefinition and IERC165 when this library is used at an address.
812
+ * IDefinition extends IERC165; both interface IDs must be reported for ERC165 compliance.
813
+ */
814
+ function supportsInterface(bytes4 interfaceId) external pure returns (bool) {
815
+ return interfaceId == type(IERC165).interfaceId || interfaceId == type(IDefinition).interfaceId;
816
+ }
817
+
818
+ }