@layerzerolabs/utils-upgradeable-evm-contracts 0.2.74

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 (37) hide show
  1. package/.turbo/turbo-lint.log +491 -0
  2. package/.turbo/turbo-test.log +1356 -0
  3. package/LICENSE +23 -0
  4. package/contracts/access/AccessControl2StepUpgradeable.sol +144 -0
  5. package/contracts/allowlist/AllowlistBaseUpgradeable.sol +184 -0
  6. package/contracts/allowlist/AllowlistRBACUpgradeable.sol +55 -0
  7. package/contracts/fee-accounting/FeeHandlerBaseUpgradeable.sol +69 -0
  8. package/contracts/fee-accounting/FeeHandlerRBACUpgradeable.sol +34 -0
  9. package/contracts/fee-config/FeeConfigBaseUpgradeable.sol +128 -0
  10. package/contracts/fee-config/FeeConfigRBACUpgradeable.sol +44 -0
  11. package/contracts/libs/EnumerableSetPagination.sol +77 -0
  12. package/contracts/pause/PauseBaseUpgradeable.sol +107 -0
  13. package/contracts/pause/PauseRBACUpgradeable.sol +47 -0
  14. package/contracts/pause-by-id/PauseByIDBaseUpgradeable.sol +127 -0
  15. package/contracts/pause-by-id/PauseByIDRBACUpgradeable.sol +74 -0
  16. package/contracts/rate-limiter/RateLimiterBaseUpgradeable.sol +636 -0
  17. package/contracts/rate-limiter/RateLimiterRBACUpgradeable.sol +89 -0
  18. package/contracts/rate-limiter/libs/RateLimiterUtils.sol +82 -0
  19. package/foundry.toml +27 -0
  20. package/package.json +34 -0
  21. package/solhint.config.js +3 -0
  22. package/test/AccessControl2StepUpgradeable.t.sol +374 -0
  23. package/test/AllowlistBaseUpgradeable.t.sol +380 -0
  24. package/test/AllowlistRBACUpgradeable.t.sol +84 -0
  25. package/test/EnumerableSetPagination.t.sol +445 -0
  26. package/test/FeeConfigBaseUpgradeable.t.sol +232 -0
  27. package/test/FeeConfigRBACUpgradeable.t.sol +59 -0
  28. package/test/FeeHandlerBaseUpgradeable.t.sol +78 -0
  29. package/test/FeeHandlerRBACUpgradeable.t.sol +45 -0
  30. package/test/PauseBaseUpgradeable.t.sol +244 -0
  31. package/test/PauseByIDBaseUpgradeable.t.sol +337 -0
  32. package/test/PauseByIDRBACUpgradeable.t.sol +414 -0
  33. package/test/PauseRBACUpgradeable.t.sol +258 -0
  34. package/test/RateLimiterBaseUpgradeable.t.sol +826 -0
  35. package/test/RateLimiterRBACUpgradeable.t.sol +128 -0
  36. package/test/RateLimiterRBACUpgradeableInvariant.t.sol +444 -0
  37. package/test/RateLimiterUtils.t.sol +137 -0
@@ -0,0 +1,337 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.22;
3
+
4
+ import { IPauseByID } from "@layerzerolabs/utils-evm-contracts/contracts/interfaces/IPauseByID.sol";
5
+ import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
6
+ import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
7
+ import { Test } from "forge-std/Test.sol";
8
+ import { PauseByIDBaseUpgradeable } from "./../contracts/pause-by-id/PauseByIDBaseUpgradeable.sol";
9
+
10
+ /// @dev Interface for pause mock with management and test helper functions.
11
+ interface IPauseByIDBaseMock is IPauseByID {
12
+ function setDefaultPaused(bool _paused) external;
13
+ function setPaused(SetPausedParam[] calldata _params) external;
14
+ function assertNotPaused(uint256 _id) external view;
15
+ function functionWithModifier(uint256 _id) external;
16
+ function functionWithModifierReturns(uint256 _id) external view returns (uint256);
17
+ function callCount() external view returns (uint256);
18
+ }
19
+
20
+ contract PauseByIDBaseUpgradeableMock is PauseByIDBaseUpgradeable {
21
+ uint256 public callCount;
22
+
23
+ constructor() {
24
+ _disableInitializers();
25
+ }
26
+
27
+ function initialize() public initializer {}
28
+
29
+ function setDefaultPaused(bool _paused) public {
30
+ _setDefaultPaused(_paused);
31
+ }
32
+
33
+ function setPaused(SetPausedParam[] calldata _params) public {
34
+ _setPaused(_params);
35
+ }
36
+
37
+ function assertNotPaused(uint256 _id) public view {
38
+ _assertNotPaused(_id);
39
+ }
40
+
41
+ function functionWithModifier(uint256 _id) public whenNotPaused(_id) {
42
+ callCount++;
43
+ }
44
+
45
+ function functionWithModifierReturns(uint256 _id) public view whenNotPaused(_id) returns (uint256) {
46
+ return 42;
47
+ }
48
+ }
49
+
50
+ contract PauseByIDBaseUpgradeableTest is Test {
51
+ IPauseByIDBaseMock pauseHelper;
52
+
53
+ uint32 constant ID_1 = 1;
54
+ uint32 constant ID_2 = 2;
55
+
56
+ function _createPause() internal virtual returns (IPauseByIDBaseMock) {
57
+ PauseByIDBaseUpgradeableMock impl = new PauseByIDBaseUpgradeableMock();
58
+ TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(
59
+ address(impl),
60
+ address(this),
61
+ abi.encodeWithSelector(PauseByIDBaseUpgradeableMock.initialize.selector)
62
+ );
63
+ return IPauseByIDBaseMock(address(proxy));
64
+ }
65
+
66
+ function setUp() public virtual {
67
+ pauseHelper = _createPause();
68
+ }
69
+
70
+ function test_storageHash() public pure {
71
+ bytes32 storageHash = keccak256(abi.encode(uint256(keccak256("layerzerov2.storage.pausebyid")) - 1)) &
72
+ ~bytes32(uint256(0xff));
73
+ assertEq(storageHash, 0xac2cb783706dc5ac6b91d3675ceaddc73634a37f082a72b77dcdd25ee1f51300);
74
+ }
75
+
76
+ function test_defaultPaused_InitialState() public view {
77
+ assertFalse(pauseHelper.defaultPaused());
78
+ }
79
+
80
+ function test_isPaused_InitialState() public view {
81
+ assertFalse(pauseHelper.isPaused(ID_1));
82
+ assertFalse(pauseHelper.isPaused(ID_2));
83
+ }
84
+
85
+ function test_setDefaultPaused() public {
86
+ vm.expectEmit(false, false, false, true);
87
+ emit IPauseByID.DefaultPauseSet(true);
88
+ pauseHelper.setDefaultPaused(true);
89
+
90
+ assertTrue(pauseHelper.defaultPaused());
91
+ }
92
+
93
+ function test_setDefaultPaused_Fuzz(bool _paused) public {
94
+ if (!_paused) {
95
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.PauseStateIdempotent.selector, false));
96
+ pauseHelper.setDefaultPaused(_paused);
97
+ return;
98
+ }
99
+
100
+ vm.expectEmit(false, false, false, true);
101
+ emit IPauseByID.DefaultPauseSet(_paused);
102
+ pauseHelper.setDefaultPaused(_paused);
103
+ assertEq(pauseHelper.defaultPaused(), _paused);
104
+ }
105
+
106
+ function test_setPaused() public {
107
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
108
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
109
+
110
+ vm.expectEmit(false, false, false, true);
111
+ emit IPauseByID.PauseSet(ID_1, true, true);
112
+ pauseHelper.setPaused(params);
113
+
114
+ IPauseByID.PauseConfig memory config = pauseHelper.pauseConfig(ID_1);
115
+ assertTrue(config.paused);
116
+ assertTrue(config.enabled);
117
+ }
118
+
119
+ function test_setPaused_Fuzz(uint256 _id, bool _paused, bool _enabled) public {
120
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
121
+ params[0] = IPauseByID.SetPausedParam(_id, _paused, _enabled);
122
+
123
+ vm.expectEmit(false, false, false, true);
124
+ emit IPauseByID.PauseSet(_id, _paused, _enabled);
125
+ pauseHelper.setPaused(params);
126
+
127
+ IPauseByID.PauseConfig memory config = pauseHelper.pauseConfig(_id);
128
+ assertEq(config.paused, _paused);
129
+ assertEq(config.enabled, _enabled);
130
+ }
131
+
132
+ function test_setPaused_EmptyArray() public {
133
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](0);
134
+ pauseHelper.setPaused(params);
135
+ }
136
+
137
+ function test_isPaused_Default() public {
138
+ pauseHelper.setDefaultPaused(true);
139
+ assertTrue(pauseHelper.isPaused(ID_1));
140
+ assertTrue(pauseHelper.isPaused(ID_2));
141
+ }
142
+
143
+ function test_isPaused_Specific() public {
144
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
145
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
146
+ pauseHelper.setPaused(params);
147
+
148
+ assertTrue(pauseHelper.isPaused(ID_1));
149
+ assertFalse(pauseHelper.isPaused(ID_2));
150
+ }
151
+
152
+ function test_isPaused_SpecificDisabled() public {
153
+ pauseHelper.setDefaultPaused(true);
154
+
155
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
156
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
157
+ pauseHelper.setPaused(params);
158
+
159
+ params[0] = IPauseByID.SetPausedParam(ID_1, false, false);
160
+ pauseHelper.setPaused(params);
161
+
162
+ // When disabled, falls back to default.
163
+ assertTrue(pauseHelper.isPaused(ID_1));
164
+ }
165
+
166
+ function test_isPaused_Override() public {
167
+ pauseHelper.setDefaultPaused(true);
168
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
169
+ params[0] = IPauseByID.SetPausedParam(ID_1, false, true);
170
+ pauseHelper.setPaused(params);
171
+
172
+ assertFalse(pauseHelper.isPaused(ID_1));
173
+ assertTrue(pauseHelper.isPaused(ID_2));
174
+ }
175
+
176
+ function test_assertNotPaused_Success() public view {
177
+ pauseHelper.assertNotPaused(ID_1);
178
+ }
179
+
180
+ function test_assertNotPaused_Revert_DefaultPaused() public {
181
+ pauseHelper.setDefaultPaused(true);
182
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.Paused.selector, ID_1));
183
+ pauseHelper.assertNotPaused(ID_1);
184
+ }
185
+
186
+ function test_assertNotPaused_Revert_SpecificPaused() public {
187
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
188
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
189
+ pauseHelper.setPaused(params);
190
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.Paused.selector, ID_1));
191
+ pauseHelper.assertNotPaused(ID_1);
192
+ }
193
+
194
+ function test_pauseConfig() public {
195
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
196
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
197
+ pauseHelper.setPaused(params);
198
+
199
+ IPauseByID.PauseConfig memory config = pauseHelper.pauseConfig(ID_1);
200
+ assertTrue(config.paused);
201
+ assertTrue(config.enabled);
202
+
203
+ config = pauseHelper.pauseConfig(ID_2);
204
+ assertFalse(config.paused);
205
+ assertFalse(config.enabled);
206
+ }
207
+
208
+ function test_isPaused_MultipleIDs() public {
209
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](2);
210
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
211
+ params[1] = IPauseByID.SetPausedParam(ID_2, false, true);
212
+ pauseHelper.setPaused(params);
213
+
214
+ assertTrue(pauseHelper.isPaused(ID_1));
215
+ assertFalse(pauseHelper.isPaused(ID_2));
216
+ assertFalse(pauseHelper.isPaused(3));
217
+ }
218
+
219
+ function test_setPaused_Success_Toggle() public {
220
+ assertFalse(pauseHelper.isPaused(ID_1));
221
+
222
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
223
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
224
+ pauseHelper.setPaused(params);
225
+ assertTrue(pauseHelper.isPaused(ID_1));
226
+
227
+ params[0] = IPauseByID.SetPausedParam(ID_1, false, true);
228
+ pauseHelper.setPaused(params);
229
+ assertFalse(pauseHelper.isPaused(ID_1));
230
+ }
231
+
232
+ function test_defaultPause_AffectsMultipleIDs() public {
233
+ pauseHelper.setDefaultPaused(true);
234
+ assertTrue(pauseHelper.isPaused(1));
235
+ assertTrue(pauseHelper.isPaused(2));
236
+ assertTrue(pauseHelper.isPaused(100));
237
+ assertTrue(pauseHelper.isPaused(type(uint256).max));
238
+ }
239
+
240
+ function test_specificOverridesDefault_Fuzz(bool _defaultPaused, bool _specificPaused) public {
241
+ if (_defaultPaused) {
242
+ pauseHelper.setDefaultPaused(_defaultPaused);
243
+ }
244
+
245
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
246
+ params[0] = IPauseByID.SetPausedParam(ID_1, _specificPaused, true);
247
+ pauseHelper.setPaused(params);
248
+
249
+ assertEq(pauseHelper.isPaused(ID_1), _specificPaused);
250
+ assertEq(pauseHelper.isPaused(ID_2), _defaultPaused);
251
+ }
252
+
253
+ function test_initialize_Revert_AlreadyInitialized() public virtual {
254
+ vm.expectRevert(Initializable.InvalidInitialization.selector);
255
+ PauseByIDBaseUpgradeableMock(address(pauseHelper)).initialize();
256
+ }
257
+
258
+ function test_setPaused_Success_EdgeCase_IDZero() public {
259
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
260
+ params[0] = IPauseByID.SetPausedParam(0, true, true);
261
+ pauseHelper.setPaused(params);
262
+ assertTrue(pauseHelper.isPaused(0));
263
+ }
264
+
265
+ function test_setPaused_Success_EdgeCase_IDMaxUint256() public {
266
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
267
+ params[0] = IPauseByID.SetPausedParam(type(uint256).max, true, true);
268
+ pauseHelper.setPaused(params);
269
+ assertTrue(pauseHelper.isPaused(type(uint256).max));
270
+ }
271
+
272
+ function test_setDefaultPaused_Idempotent_Reverts() public {
273
+ pauseHelper.setDefaultPaused(true);
274
+
275
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.PauseStateIdempotent.selector, true));
276
+ pauseHelper.setDefaultPaused(true);
277
+ }
278
+
279
+ function test_setDefaultPaused_Idempotent_InitialState_Reverts() public {
280
+ assertFalse(pauseHelper.defaultPaused());
281
+
282
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.PauseStateIdempotent.selector, false));
283
+ pauseHelper.setDefaultPaused(false);
284
+ }
285
+
286
+ // ============ Modifier Tests ============
287
+
288
+ function test_whenNotPaused_Success() public {
289
+ pauseHelper.functionWithModifier(ID_1);
290
+ assertEq(pauseHelper.callCount(), 1);
291
+ }
292
+
293
+ function test_whenNotPaused_Revert_DefaultPaused() public {
294
+ pauseHelper.setDefaultPaused(true);
295
+
296
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.Paused.selector, ID_1));
297
+ pauseHelper.functionWithModifier(ID_1);
298
+
299
+ assertEq(pauseHelper.callCount(), 0);
300
+ }
301
+
302
+ function test_whenNotPaused_Revert_SpecificPaused() public {
303
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
304
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
305
+ pauseHelper.setPaused(params);
306
+
307
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.Paused.selector, ID_1));
308
+ pauseHelper.functionWithModifier(ID_1);
309
+
310
+ assertEq(pauseHelper.callCount(), 0);
311
+ }
312
+
313
+ function test_whenNotPaused_Success_SpecificUnpaused() public {
314
+ pauseHelper.setDefaultPaused(true);
315
+
316
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
317
+ params[0] = IPauseByID.SetPausedParam(ID_1, false, true);
318
+ pauseHelper.setPaused(params);
319
+
320
+ pauseHelper.functionWithModifier(ID_1);
321
+ assertEq(pauseHelper.callCount(), 1);
322
+ }
323
+
324
+ function test_whenNotPaused_WithReturnValue() public view {
325
+ uint256 result = pauseHelper.functionWithModifierReturns(ID_1);
326
+ assertEq(result, 42);
327
+ }
328
+
329
+ function test_whenNotPaused_WithReturnValue_Reverts() public {
330
+ IPauseByID.SetPausedParam[] memory params = new IPauseByID.SetPausedParam[](1);
331
+ params[0] = IPauseByID.SetPausedParam(ID_1, true, true);
332
+ pauseHelper.setPaused(params);
333
+
334
+ vm.expectRevert(abi.encodeWithSelector(IPauseByID.Paused.selector, ID_1));
335
+ pauseHelper.functionWithModifierReturns(ID_1);
336
+ }
337
+ }