Skip to content

Commit 3e6cbba

Browse files
committed
evm: Set inbound limit when registering manager peer
1 parent 8b0aa09 commit 3e6cbba

8 files changed

+79
-25
lines changed

evm/src/NttManager/NttManagerState.sol

+7-2
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,12 @@ abstract contract NttManagerState is
257257
}
258258

259259
/// @inheritdoc INttManagerState
260-
function setPeer(uint16 peerChainId, bytes32 peerContract, uint8 decimals) public onlyOwner {
260+
function setPeer(
261+
uint16 peerChainId,
262+
bytes32 peerContract,
263+
uint8 decimals,
264+
uint256 inboundLimit
265+
) public onlyOwner {
261266
if (peerChainId == 0) {
262267
revert InvalidPeerChainIdZero();
263268
}
@@ -273,7 +278,7 @@ abstract contract NttManagerState is
273278
_getPeersStorage()[peerChainId].peerAddress = peerContract;
274279
_getPeersStorage()[peerChainId].tokenDecimals = decimals;
275280

276-
_setInboundLimit(TrimmedAmountLib.max(tokenDecimals_), peerChainId);
281+
_setInboundLimit(inboundLimit.trim(tokenDecimals_, tokenDecimals_), peerChainId);
277282

278283
emit PeerUpdated(
279284
peerChainId, oldPeer.peerAddress, oldPeer.tokenDecimals, peerContract, decimals

evm/src/interfaces/INttManagerState.sol

+7-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,13 @@ interface INttManagerState {
6464
/// @param peerChainId The chain ID of the peer.
6565
/// @param peerContract The address of the peer nttManager contract.
6666
/// @param decimals The number of decimals of the token on the peer chain.
67-
function setPeer(uint16 peerChainId, bytes32 peerContract, uint8 decimals) external;
67+
/// @param inboundLimit The inbound rate limit for the peer chain id
68+
function setPeer(
69+
uint16 peerChainId,
70+
bytes32 peerContract,
71+
uint8 decimals,
72+
uint256 inboundLimit
73+
) external;
6874

6975
/// @notice Checks if a message has been approved. The message should have at least
7076
/// the minimum threshold of attestations from distinct endpoints.

evm/test/IntegrationRelayer.t.sol

+24-8
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,9 @@ contract TestEndToEndRelayer is
169169
wormholeTransceiverChain2.setWormholePeer(
170170
chainId1, bytes32(uint256(uint160(address(wormholeTransceiverChain1))))
171171
);
172-
nttManagerChain2.setPeer(chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 9);
172+
nttManagerChain2.setPeer(
173+
chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 9, type(uint64).max
174+
);
173175
DummyToken token2 = DummyTokenMintAndBurn(nttManagerChain2.token());
174176
wormholeTransceiverChain2.setIsWormholeRelayingEnabled(chainId1, true);
175177
wormholeTransceiverChain2.setIsWormholeEvmChain(chainId1);
@@ -180,7 +182,9 @@ contract TestEndToEndRelayer is
180182
wormholeTransceiverChain1.setWormholePeer(
181183
chainId2, bytes32(uint256(uint160((address(wormholeTransceiverChain2)))))
182184
);
183-
nttManagerChain1.setPeer(chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 7);
185+
nttManagerChain1.setPeer(
186+
chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 7, type(uint64).max
187+
);
184188

185189
// Enable general relaying on the chain to transfer for the funds.
186190
wormholeTransceiverChain1.setIsWormholeRelayingEnabled(chainId2, true);
@@ -267,14 +271,18 @@ contract TestEndToEndRelayer is
267271
wormholeTransceiverChain2.setWormholePeer(
268272
chainId1, bytes32(uint256(uint160(address(wormholeTransceiverChain1))))
269273
);
270-
nttManagerChain2.setPeer(chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 9);
274+
nttManagerChain2.setPeer(
275+
chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 9, type(uint64).max
276+
);
271277
DummyToken token2 = DummyTokenMintAndBurn(nttManagerChain2.token());
272278
wormholeTransceiverChain2.setIsWormholeRelayingEnabled(chainId1, true);
273279
wormholeTransceiverChain2.setIsWormholeEvmChain(chainId1);
274280

275281
// Register peer contracts for the nttManager and transceiver. Transceivers and nttManager each have the concept of peers here.
276282
vm.selectFork(sourceFork);
277-
nttManagerChain1.setPeer(chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 7);
283+
nttManagerChain1.setPeer(
284+
chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 7, type(uint64).max
285+
);
278286
wormholeTransceiverChain1.setWormholePeer(
279287
chainId2, bytes32(uint256(uint160((address(wormholeTransceiverChain2)))))
280288
);
@@ -499,8 +507,12 @@ contract TestRelayerEndToEndManual is
499507
nttManagerChain2.setInboundLimit(type(uint64).max, chainId1);
500508

501509
// Register peer contracts for the nttManager and transceiver. Transceivers and nttManager each have the concept of peers here.
502-
nttManagerChain1.setPeer(chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 9);
503-
nttManagerChain2.setPeer(chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 7);
510+
nttManagerChain1.setPeer(
511+
chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 9, type(uint64).max
512+
);
513+
nttManagerChain2.setPeer(
514+
chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 7, type(uint64).max
515+
);
504516
}
505517

506518
function test_relayerTransceiverAuth() public {
@@ -555,7 +567,9 @@ contract TestRelayerEndToEndManual is
555567

556568
bytes[] memory a;
557569

558-
nttManagerChain2.setPeer(chainId1, bytes32(uint256(uint160(address(0x1)))), 9);
570+
nttManagerChain2.setPeer(
571+
chainId1, bytes32(uint256(uint160(address(0x1)))), 9, type(uint64).max
572+
);
559573
vm.startPrank(relayer);
560574
vm.expectRevert(); // bad nttManager peer
561575
wormholeTransceiverChain2.receiveWormholeMessages(
@@ -568,7 +582,9 @@ contract TestRelayerEndToEndManual is
568582
vm.stopPrank();
569583

570584
// Wrong caller - aka not relayer contract
571-
nttManagerChain2.setPeer(chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 9);
585+
nttManagerChain2.setPeer(
586+
chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 9, type(uint64).max
587+
);
572588
vm.prank(userD);
573589
vm.expectRevert(
574590
abi.encodeWithSelector(IWormholeTransceiverState.CallerNotRelayer.selector, userD)

evm/test/IntegrationStandalone.t.sol

+6-2
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,12 @@ contract TestEndToEndBase is Test, INttManagerEvents, IRateLimiterEvents {
126126
nttManagerChain2.setInboundLimit(type(uint64).max, chainId1);
127127

128128
// Register peer contracts for the nttManager and transceiver. Transceivers and nttManager each have the concept of peers here.
129-
nttManagerChain1.setPeer(chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 9);
130-
nttManagerChain2.setPeer(chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 7);
129+
nttManagerChain1.setPeer(
130+
chainId2, bytes32(uint256(uint160(address(nttManagerChain2)))), 9, type(uint64).max
131+
);
132+
nttManagerChain2.setPeer(
133+
chainId1, bytes32(uint256(uint160(address(nttManagerChain1)))), 7, type(uint64).max
134+
);
131135

132136
// Set peers for the transceivers
133137
wormholeTransceiverChain1.setWormholePeer(

evm/test/NttManager.t.sol

+29-8
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
8989

9090
uint8 decimals = t.decimals();
9191

92-
nttManagerZeroRateLimiter.setPeer(chainId, toWormholeFormat(address(0x1)), 9);
92+
nttManagerZeroRateLimiter.setPeer(
93+
chainId, toWormholeFormat(address(0x1)), 9, type(uint64).max
94+
);
9395

9496
t.mintDummy(address(user_A), 5 * 10 ** decimals);
9597

@@ -118,7 +120,9 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
118120

119121
// register nttManager peer
120122
bytes32 peer = toWormholeFormat(address(nttManager));
121-
nttManagerZeroRateLimiter.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9);
123+
nttManagerZeroRateLimiter.setPeer(
124+
TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9, type(uint64).max
125+
);
122126

123127
TransceiverStructs.NttManagerMessage memory nttManagerMessage;
124128
bytes memory transceiverMessage;
@@ -283,13 +287,30 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
283287
nttManager.setThreshold(1);
284288
}
285289

290+
// == threshold
291+
292+
function test_peerRegistrationLimitsCanBeUpdated() public {
293+
bytes32 peer = toWormholeFormat(address(nttManager));
294+
nttManager.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9, 0);
295+
296+
IRateLimiter.RateLimitParams memory params =
297+
nttManager.getInboundLimitParams(TransceiverHelpersLib.SENDING_CHAIN_ID);
298+
assertEq(params.limit.getAmount(), 0);
299+
assertEq(params.limit.getDecimals(), 8);
300+
301+
nttManager.setInboundLimit(type(uint64).max, TransceiverHelpersLib.SENDING_CHAIN_ID);
302+
params = nttManager.getInboundLimitParams(TransceiverHelpersLib.SENDING_CHAIN_ID);
303+
assertEq(params.limit.getAmount(), type(uint64).max / 10 ** (18 - 8));
304+
assertEq(params.limit.getDecimals(), 8);
305+
}
306+
286307
// === attestation
287308

288309
function test_onlyEnabledTransceiversCanAttest() public {
289310
(DummyTransceiver e1,) = TransceiverHelpersLib.setup_transceivers(nttManagerOther);
290311
nttManagerOther.removeTransceiver(address(e1));
291312
bytes32 peer = toWormholeFormat(address(nttManager));
292-
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9);
313+
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9, type(uint64).max);
293314

294315
bytes memory transceiverMessage;
295316
(, transceiverMessage) = TransceiverHelpersLib.buildTransceiverMessageWithNttManagerPayload(
@@ -327,7 +348,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
327348

328349
// register nttManager peer
329350
bytes32 peer = toWormholeFormat(address(nttManager));
330-
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9);
351+
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9, type(uint64).max);
331352

332353
TransceiverStructs.NttManagerMessage memory nttManagerMessage;
333354
bytes memory transceiverMessage;
@@ -350,7 +371,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
350371

351372
// register nttManager peer
352373
bytes32 peer = toWormholeFormat(address(nttManager));
353-
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9);
374+
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9, type(uint64).max);
354375

355376
TransceiverStructs.NttManagerMessage memory nttManagerMessage;
356377
bytes memory transceiverMessage;
@@ -378,7 +399,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
378399
nttManagerOther.setThreshold(2);
379400

380401
bytes32 peer = toWormholeFormat(address(nttManager));
381-
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9);
402+
nttManagerOther.setPeer(TransceiverHelpersLib.SENDING_CHAIN_ID, peer, 9, type(uint64).max);
382403

383404
ITransceiverReceiver[] memory transceivers = new ITransceiverReceiver[](1);
384405
transceivers[0] = e1;
@@ -415,7 +436,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
415436

416437
uint8 decimals = token.decimals();
417438

418-
nttManager.setPeer(chainId, toWormholeFormat(address(0x1)), 9);
439+
nttManager.setPeer(chainId, toWormholeFormat(address(0x1)), 9, type(uint64).max);
419440
nttManager.setOutboundLimit(packTrimmedAmount(type(uint64).max, 8).untrim(decimals));
420441

421442
token.mintDummy(address(user_A), 5 * 10 ** decimals);
@@ -528,7 +549,7 @@ contract TestNttManager is Test, INttManagerEvents, IRateLimiterEvents {
528549

529550
uint256 maxAmount = 5 * 10 ** decimals;
530551
token.mintDummy(from, maxAmount);
531-
nttManager.setPeer(chainId, toWormholeFormat(address(0x1)), 9);
552+
nttManager.setPeer(chainId, toWormholeFormat(address(0x1)), 9, type(uint64).max);
532553
nttManager.setOutboundLimit(packTrimmedAmount(type(uint64).max, 8).untrim(decimals));
533554
nttManager.setInboundLimit(
534555
packTrimmedAmount(type(uint64).max, 8).untrim(decimals),

evm/test/RateLimit.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ contract TestRateLimit is Test, IRateLimiterEvents {
4141
nttManager = MockNttManagerContract(address(new ERC1967Proxy(address(implementation), "")));
4242
nttManager.initialize();
4343

44-
nttManager.setPeer(chainId, toWormholeFormat(address(0x1)), 9);
44+
nttManager.setPeer(chainId, toWormholeFormat(address(0x1)), 9, type(uint64).max);
4545
}
4646

4747
function test_outboundRateLimit_setLimitSimple() public {

evm/test/Upgrades.t.sol

+4-2
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,14 @@ contract TestUpgrades is Test, INttManagerEvents, IRateLimiterEvents {
119119
nttManagerChain1.setPeer(
120120
chainId2,
121121
bytes32(uint256(uint160(address(nttManagerChain2)))),
122-
DummyToken(nttManagerChain2.token()).decimals()
122+
DummyToken(nttManagerChain2.token()).decimals(),
123+
type(uint64).max
123124
);
124125
nttManagerChain2.setPeer(
125126
chainId1,
126127
bytes32(uint256(uint160(address(nttManagerChain1)))),
127-
DummyToken(nttManagerChain1.token()).decimals()
128+
DummyToken(nttManagerChain1.token()).decimals(),
129+
type(uint64).max
128130
);
129131

130132
wormholeTransceiverChain1.setWormholePeer(

evm/test/libraries/NttManagerHelpers.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ library NttManagerHelpersLib {
2020
address(nttManager.token()).staticcall(abi.encodeWithSignature("decimals()"));
2121
uint8 tokenDecimals = abi.decode(queriedDecimals, (uint8));
2222
recipientNttManager.setPeer(
23-
SENDING_CHAIN_ID, toWormholeFormat(address(nttManager)), tokenDecimals
23+
SENDING_CHAIN_ID, toWormholeFormat(address(nttManager)), tokenDecimals, type(uint64).max
2424
);
2525
recipientNttManager.setInboundLimit(inboundLimit.untrim(decimals), SENDING_CHAIN_ID);
2626
}

0 commit comments

Comments
 (0)