Skip to content

Commit df515bd

Browse files
committed
evm: Make skipping rate limiting more explicit
1 parent 00f8375 commit df515bd

11 files changed

+80
-52
lines changed

evm/src/NttManager/NttManager.sol

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ contract NttManager is INttManager, NttManagerState {
2727
address _token,
2828
Mode _mode,
2929
uint16 _chainId,
30-
uint64 _rateLimitDuration
31-
) NttManagerState(_token, _mode, _chainId, _rateLimitDuration) {}
30+
uint64 _rateLimitDuration,
31+
bool _skipRateLimiting
32+
) NttManagerState(_token, _mode, _chainId, _rateLimitDuration, _skipRateLimiting) {}
3233

3334
// ==================== External Interface ===============================================
3435

evm/src/NttManager/NttManagerState.sol

+3-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ abstract contract NttManagerState is
5151
address _token,
5252
INttManager.Mode _mode,
5353
uint16 _chainId,
54-
uint64 _rateLimitDuration
55-
) RateLimiter(_rateLimitDuration) {
54+
uint64 _rateLimitDuration,
55+
bool _skipRateLimiting
56+
) RateLimiter(_rateLimitDuration, _skipRateLimiting) {
5657
token = _token;
5758
tokenDecimals_ = _initializeTokenDecimals();
5859
mode = _mode;

evm/src/interfaces/IRateLimiter.sol

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ interface IRateLimiter {
3939
/// @param newLimit The new limit.
4040
error CapacityCannotExceedLimit(TrimmedAmount newCurrentCapacity, TrimmedAmount newLimit);
4141

42+
/// @notice If the rate limiting behaviour isn't explicitly defined in the constructor.
43+
/// @dev Selector 0xe543ef05.
44+
error UndefinedRateLimiting();
45+
4246
/// @notice Parameters used in determining rate limits and queuing.
4347
/// @dev
4448
/// - limit: current rate limit value.

evm/src/libraries/RateLimiter.sol

+8-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,14 @@ abstract contract RateLimiter is IRateLimiter, IRateLimiterEvents {
6969
}
7070
}
7171

72-
constructor(uint64 _rateLimitDuration) {
72+
constructor(uint64 _rateLimitDuration, bool _skipRateLimiting) {
73+
if (
74+
_rateLimitDuration == 0 && !_skipRateLimiting
75+
|| _rateLimitDuration != 0 && _skipRateLimiting
76+
) {
77+
revert UndefinedRateLimiting();
78+
}
79+
7380
rateLimitDuration = _rateLimitDuration;
7481
}
7582

evm/test/IntegrationRelayer.t.sol

+12-8
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,9 @@ contract TestEndToEndRelayer is
9898
vm.deal(userA, 1 ether);
9999
DummyToken t1 = new DummyToken();
100100

101-
NttManager implementation =
102-
new MockNttManagerContract(address(t1), INttManager.Mode.LOCKING, chainId1, 1 days);
101+
NttManager implementation = new MockNttManagerContract(
102+
address(t1), INttManager.Mode.LOCKING, chainId1, 1 days, false
103+
);
103104

104105
nttManagerChain1 =
105106
MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
@@ -131,8 +132,9 @@ contract TestEndToEndRelayer is
131132

132133
// Chain 2 setup
133134
DummyToken t2 = new DummyTokenMintAndBurn();
134-
NttManager implementationChain2 =
135-
new MockNttManagerContract(address(t2), INttManager.Mode.BURNING, chainId2, 1 days);
135+
NttManager implementationChain2 = new MockNttManagerContract(
136+
address(t2), INttManager.Mode.BURNING, chainId2, 1 days, false
137+
);
136138

137139
nttManagerChain2 =
138140
MockNttManagerContract(address(new ERC1967Proxy(address(implementationChain2), "")));
@@ -444,8 +446,9 @@ contract TestRelayerEndToEndManual is
444446

445447
vm.chainId(chainId1);
446448
DummyToken t1 = new DummyToken();
447-
NttManager implementation =
448-
new MockNttManagerContract(address(t1), INttManager.Mode.LOCKING, chainId1, 1 days);
449+
NttManager implementation = new MockNttManagerContract(
450+
address(t1), INttManager.Mode.LOCKING, chainId1, 1 days, false
451+
);
449452

450453
nttManagerChain1 =
451454
MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
@@ -471,8 +474,9 @@ contract TestRelayerEndToEndManual is
471474
// Chain 2 setup
472475
vm.chainId(chainId2);
473476
DummyToken t2 = new DummyTokenMintAndBurn();
474-
NttManager implementationChain2 =
475-
new MockNttManagerContract(address(t2), INttManager.Mode.BURNING, chainId2, 1 days);
477+
NttManager implementationChain2 = new MockNttManagerContract(
478+
address(t2), INttManager.Mode.BURNING, chainId2, 1 days, false
479+
);
476480

477481
nttManagerChain2 =
478482
MockNttManagerContract(address(new ERC1967Proxy(address(implementationChain2), "")));

evm/test/IntegrationStandalone.t.sol

+6-4
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ contract TestEndToEndBase is Test, INttManagerEvents, IRateLimiterEvents {
6363

6464
vm.chainId(chainId1);
6565
DummyToken t1 = new DummyToken();
66-
NttManager implementation =
67-
new MockNttManagerContract(address(t1), INttManager.Mode.LOCKING, chainId1, 1 days);
66+
NttManager implementation = new MockNttManagerContract(
67+
address(t1), INttManager.Mode.LOCKING, chainId1, 1 days, false
68+
);
6869

6970
nttManagerChain1 =
7071
MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
@@ -99,8 +100,9 @@ contract TestEndToEndBase is Test, INttManagerEvents, IRateLimiterEvents {
99100
// Chain 2 setup
100101
vm.chainId(chainId2);
101102
DummyToken t2 = new DummyTokenMintAndBurn();
102-
NttManager implementationChain2 =
103-
new MockNttManagerContract(address(t2), INttManager.Mode.BURNING, chainId2, 1 days);
103+
NttManager implementationChain2 = new MockNttManagerContract(
104+
address(t2), INttManager.Mode.BURNING, chainId2, 1 days, false
105+
);
104106

105107
nttManagerChain2 =
106108
MockNttManagerContract(address(new ERC1967Proxy(address(implementationChain2), "")));

evm/test/NttManager.t.sol

+7-7
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
4949

5050
DummyToken t = new DummyToken();
5151
NttManager implementation =
52-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days);
52+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days, false);
5353

5454
NttManager otherImplementation =
55-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days);
55+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days, false);
5656

5757
nttManager = MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
5858
nttManager.initialize();
@@ -77,7 +77,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
7777
function test_disabledRateLimiter() public {
7878
DummyToken t = new DummyToken();
7979
NttManager implementation =
80-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 0);
80+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 0, true);
8181

8282
nttManagerZeroRateLimiter =
8383
MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
@@ -188,7 +188,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
188188
// a convenience check, not a security one)
189189
DummyToken t = new DummyToken();
190190
NttManager altNttManager =
191-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days);
191+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days, false);
192192
DummyTransceiver e = new DummyTransceiver(address(altNttManager));
193193
nttManager.setTransceiver(address(e));
194194
}
@@ -458,7 +458,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
458458
function test_noAutomaticSlot() public {
459459
DummyToken t = new DummyToken();
460460
MockNttManagerContract c =
461-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, 1, 1 days);
461+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, 1, 1 days, false);
462462
assertEq(c.lastSlot(), 0x0);
463463
}
464464

@@ -467,7 +467,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
467467

468468
vm.startStateDiffRecording();
469469

470-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, 1, 1 days);
470+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, 1, 1 days, false);
471471

472472
Utils.assertSafeUpgradeableConstructor(vm.stopAndReturnStateDiff());
473473
}
@@ -569,7 +569,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
569569

570570
// Step 2 (upgrade to a new nttManager)
571571
MockNttManagerContract newNttManager = new MockNttManagerContract(
572-
nttManager.token(), INttManager.Mode.LOCKING, chainId, 1 days
572+
nttManager.token(), INttManager.Mode.LOCKING, chainId, 1 days, false
573573
);
574574
nttManagerOther.upgrade(address(newNttManager));
575575

evm/test/Ownership.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ contract OwnershipTests is Test {
1515
function setUp() public {
1616
DummyToken t = new DummyToken();
1717
NttManager implementation =
18-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days);
18+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days, false);
1919

2020
nttManager = MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
2121
nttManager.initialize();

evm/test/RateLimit.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ contract TestRateLimit is Test, IRateLimiterEvents {
3636

3737
DummyToken t = new DummyToken();
3838
NttManager implementation =
39-
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days);
39+
new MockNttManagerContract(address(t), INttManager.Mode.LOCKING, chainId, 1 days, false);
4040

4141
nttManager = MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
4242
nttManager.initialize();

evm/test/Upgrades.t.sol

+20-16
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
6262

6363
vm.chainId(chainId1);
6464
DummyToken t1 = new DummyToken();
65-
NttManager implementation =
66-
new MockNttManagerContract(address(t1), INttManager.Mode.LOCKING, chainId1, 1 days);
65+
NttManager implementation = new MockNttManagerContract(
66+
address(t1), INttManager.Mode.LOCKING, chainId1, 1 days, false
67+
);
6768

6869
nttManagerChain1 =
6970
MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
@@ -89,8 +90,9 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
8990
// Chain 2 setup
9091
vm.chainId(chainId2);
9192
DummyToken t2 = new DummyTokenMintAndBurn();
92-
NttManager implementationChain2 =
93-
new MockNttManagerContract(address(t2), INttManager.Mode.BURNING, chainId2, 1 days);
93+
NttManager implementationChain2 = new MockNttManagerContract(
94+
address(t2), INttManager.Mode.BURNING, chainId2, 1 days, false
95+
);
9496

9597
nttManagerChain2 =
9698
MockNttManagerContract(address(new ERC1967Proxy(address(implementationChain2), "")));
@@ -140,7 +142,7 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
140142
function test_basicUpgradeNttManager() public {
141143
// Basic call to upgrade with the same contact as ewll
142144
NttManager newImplementation = new MockNttManagerContract(
143-
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days
145+
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days, false
144146
);
145147
nttManagerChain1.upgrade(address(newImplementation));
146148

@@ -167,13 +169,13 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
167169
function test_doubleUpgradeNttManager() public {
168170
// Basic call to upgrade with the same contact as ewll
169171
NttManager newImplementation = new MockNttManagerContract(
170-
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days
172+
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days, false
171173
);
172174
nttManagerChain1.upgrade(address(newImplementation));
173175
basicFunctionality();
174176

175177
newImplementation = new MockNttManagerContract(
176-
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days
178+
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days, false
177179
);
178180
nttManagerChain1.upgrade(address(newImplementation));
179181

@@ -204,7 +206,7 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
204206
function test_storageSlotNttManager() public {
205207
// Basic call to upgrade with the same contact as ewll
206208
NttManager newImplementation = new MockNttManagerStorageLayoutChange(
207-
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days
209+
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days, false
208210
);
209211
nttManagerChain1.upgrade(address(newImplementation));
210212

@@ -241,7 +243,7 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
241243
function test_callMigrateNttManager() public {
242244
// Basic call to upgrade with the same contact as ewll
243245
NttManager newImplementation = new MockNttManagerMigrateBasic(
244-
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days
246+
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days, false
245247
);
246248

247249
vm.expectRevert("Proper migrate called");
@@ -273,7 +275,7 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
273275

274276
// Basic call to upgrade with the same contact as ewll
275277
NttManager newImplementation = new MockNttManagerImmutableCheck(
276-
address(tnew), INttManager.Mode.LOCKING, chainId1, 1 days
278+
address(tnew), INttManager.Mode.LOCKING, chainId1, 1 days, false
277279
);
278280

279281
vm.expectRevert(); // Reverts with a panic on the assert. So, no way to tell WHY this happened.
@@ -311,7 +313,7 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
311313

312314
// Basic call to upgrade with the same contact as ewll
313315
NttManager newImplementation = new MockNttManagerImmutableRemoveCheck(
314-
address(tnew), INttManager.Mode.LOCKING, chainId1, 1 days
316+
address(tnew), INttManager.Mode.LOCKING, chainId1, 1 days, false
315317
);
316318

317319
// Allow an upgrade, since we enabled the ability to edit the immutables within the code
@@ -350,7 +352,7 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
350352

351353
// Basic call to upgrade so that we can get the real implementation.
352354
NttManager newImplementation = new MockNttManagerContract(
353-
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days
355+
address(nttManagerChain1.token()), INttManager.Mode.LOCKING, chainId1, 1 days, false
354356
);
355357
nttManagerChain1.upgrade(address(newImplementation));
356358

@@ -594,8 +596,9 @@ contract TestInitialize is Test {
594596

595597
vm.chainId(chainId1);
596598
DummyToken t1 = new DummyToken();
597-
NttManager implementation =
598-
new MockNttManagerContract(address(t1), INttManager.Mode.LOCKING, chainId1, 1 days);
599+
NttManager implementation = new MockNttManagerContract(
600+
address(t1), INttManager.Mode.LOCKING, chainId1, 1 days, false
601+
);
599602

600603
nttManagerChain1 =
601604
MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
@@ -614,8 +617,9 @@ contract TestInitialize is Test {
614617

615618
vm.chainId(chainId1);
616619
DummyToken t1 = new DummyToken();
617-
NttManager implementation =
618-
new MockNttManagerContract(address(t1), INttManager.Mode.LOCKING, chainId1, 1 days);
620+
NttManager implementation = new MockNttManagerContract(
621+
address(t1), INttManager.Mode.LOCKING, chainId1, 1 days, false
622+
);
619623

620624
nttManagerChain1 =
621625
MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));

evm/test/mocks/MockNttManager.sol

+15-10
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ contract MockNttManagerContract is NttManager {
99
address token,
1010
Mode mode,
1111
uint16 chainId,
12-
uint64 rateLimitDuration
13-
) NttManager(token, mode, chainId, rateLimitDuration) {}
12+
uint64 rateLimitDuration,
13+
bool skipRateLimiting
14+
) NttManager(token, mode, chainId, rateLimitDuration, skipRateLimiting) {}
1415

1516
/// We create a dummy storage variable here with standard solidity slot assignment.
1617
/// Then we check that its assigned slot is 0, i.e. that the super contract doesn't
@@ -39,8 +40,9 @@ contract MockNttManagerMigrateBasic is NttManager {
3940
address token,
4041
Mode mode,
4142
uint16 chainId,
42-
uint64 rateLimitDuration
43-
) NttManager(token, mode, chainId, rateLimitDuration) {}
43+
uint64 rateLimitDuration,
44+
bool skipRateLimiting
45+
) NttManager(token, mode, chainId, rateLimitDuration, skipRateLimiting) {}
4446

4547
function _migrate() internal view override {
4648
_checkThresholdInvariants();
@@ -55,8 +57,9 @@ contract MockNttManagerImmutableCheck is NttManager {
5557
address token,
5658
Mode mode,
5759
uint16 chainId,
58-
uint64 rateLimitDuration
59-
) NttManager(token, mode, chainId, rateLimitDuration) {}
60+
uint64 rateLimitDuration,
61+
bool skipRateLimiting
62+
) NttManager(token, mode, chainId, rateLimitDuration, skipRateLimiting) {}
6063
}
6164

6265
contract MockNttManagerImmutableRemoveCheck is NttManager {
@@ -65,8 +68,9 @@ contract MockNttManagerImmutableRemoveCheck is NttManager {
6568
address token,
6669
Mode mode,
6770
uint16 chainId,
68-
uint64 rateLimitDuration
69-
) NttManager(token, mode, chainId, rateLimitDuration) {}
71+
uint64 rateLimitDuration,
72+
bool skipRateLimiting
73+
) NttManager(token, mode, chainId, rateLimitDuration, skipRateLimiting) {}
7074

7175
// Turns on the capability to EDIT the immutables
7276
function _migrate() internal override {
@@ -84,8 +88,9 @@ contract MockNttManagerStorageLayoutChange is NttManager {
8488
address token,
8589
Mode mode,
8690
uint16 chainId,
87-
uint64 rateLimitDuration
88-
) NttManager(token, mode, chainId, rateLimitDuration) {}
91+
uint64 rateLimitDuration,
92+
bool skipRateLimiting
93+
) NttManager(token, mode, chainId, rateLimitDuration, skipRateLimiting) {}
8994

9095
function setData() public {
9196
a = address(0x1);

0 commit comments

Comments
 (0)