@bloxchain/contracts 1.0.0-alpha → 1.0.0-alpha.10

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