Skip to content

Commit c0484e4

Browse files
author
Rahul Maganti
committed
rate_limit: add fuzz test for outbound backflow
1 parent aff27ad commit c0484e4

File tree

1 file changed

+103
-2
lines changed

1 file changed

+103
-2
lines changed

evm/test/RateLimit.t.sol

+103-2
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ contract TestRateLimit is Test, IRateLimiterEvents {
598598

599599
TrimmedAmount memory transferAmount = TrimmedAmount(10, 8);
600600
token.approve(address(nttManager), type(uint256).max);
601+
// transfer 10 tokens from user_A -> user_B via the nttManager
601602
nttManager.transfer(
602603
transferAmount.untrim(decimals), chainId, toWormholeFormat(user_B), false, new bytes(1)
603604
);
@@ -609,7 +610,8 @@ contract TestRateLimit is Test, IRateLimiterEvents {
609610
assertEq(token.balanceOf(user_A), mintAmount.sub(transferAmount).untrim(decimals));
610611

611612
{
612-
// assert outbound rate limit decreased
613+
// consumed capacity on the outbound side
614+
// assert outbound capacity decreased
613615
IRateLimiter.RateLimitParams memory outboundLimitParams =
614616
nttManager.getOutboundLimitParams();
615617
assertEq(
@@ -639,7 +641,8 @@ contract TestRateLimit is Test, IRateLimiterEvents {
639641
assertEq(token.balanceOf(user_A), mintAmount.untrim(decimals));
640642

641643
{
642-
// assert that the inbound limits decreased
644+
// consume capacity on the inbound side
645+
// assert that the inbound capacity decreased
643646
IRateLimiter.RateLimitParams memory inboundLimitParams =
644647
nttManager.getInboundLimitParams(TransceiverHelpersLib.SENDING_CHAIN_ID);
645648
assertEq(
@@ -699,6 +702,104 @@ contract TestRateLimit is Test, IRateLimiterEvents {
699702
}
700703
}
701704

705+
// helper functions
706+
function setupToken() public returns (address, address, DummyToken, uint8) {
707+
address user_A = address(0x123);
708+
address user_B = address(0x456);
709+
710+
DummyToken token = DummyToken(nttManager.token());
711+
712+
uint8 decimals = token.decimals();
713+
assertEq(decimals, 18);
714+
715+
return (user_A, user_B, token, decimals);
716+
}
717+
718+
function initializeTransceivers() public returns (ITransceiverReceiver[] memory) {
719+
(DummyTransceiver e1, DummyTransceiver e2) =
720+
TransceiverHelpersLib.setup_transceivers(nttManager);
721+
722+
ITransceiverReceiver[] memory transceivers = new ITransceiverReceiver[](2);
723+
transceivers[0] = e1;
724+
transceivers[1] = e2;
725+
726+
return transceivers;
727+
}
728+
729+
function testFuzz_backfillOutbound(uint64 mintAmt, uint64 transferAmt) public {
730+
vm.assume(transferAmt > 0 && transferAmt < mintAmt);
731+
732+
(address user_A, address user_B, DummyToken token, uint8 decimals) = setupToken();
733+
734+
TrimmedAmount memory mintAmount = TrimmedAmount(mintAmt, 8);
735+
token.mintDummy(address(user_A), mintAmount.untrim(decimals));
736+
nttManager.setOutboundLimit(mintAmount.untrim(decimals));
737+
738+
// transfer 10 tokens
739+
vm.startPrank(user_A);
740+
741+
TrimmedAmount memory transferAmount = TrimmedAmount(transferAmt, 8);
742+
token.approve(address(nttManager), type(uint256).max);
743+
// transfer tokens from user_A -> user_B via the nttManager
744+
nttManager.transfer(
745+
transferAmount.untrim(decimals), chainId, toWormholeFormat(user_B), false, new bytes(1)
746+
);
747+
748+
vm.stopPrank();
749+
750+
// assert nttManager has 10 tokens and user_A has 10 fewer tokens
751+
assertEq(token.balanceOf(address(nttManager)), transferAmount.untrim(decimals));
752+
assertEq(token.balanceOf(user_A), mintAmount.sub(transferAmount).untrim(decimals));
753+
754+
{
755+
// consumed capacity on the outbound side
756+
// assert outbound capacity decreased
757+
IRateLimiter.RateLimitParams memory outboundLimitParams =
758+
nttManager.getOutboundLimitParams();
759+
assertEq(
760+
outboundLimitParams.currentCapacity.getAmount(),
761+
outboundLimitParams.limit.sub(transferAmount).getAmount()
762+
);
763+
assertEq(outboundLimitParams.lastTxTimestamp, initialBlockTimestamp);
764+
}
765+
766+
// go 1 second into the future
767+
uint256 receiveTime = initialBlockTimestamp + 1;
768+
vm.warp(receiveTime);
769+
770+
ITransceiverReceiver[] memory transceivers = initializeTransceivers();
771+
// now receive tokens from user_B -> user_A
772+
TransceiverHelpersLib.attestTransceiversHelper(
773+
user_A, 0, chainId, nttManager, nttManager, transferAmount, mintAmount, transceivers
774+
);
775+
776+
// assert that user_A has original amount
777+
assertEq(token.balanceOf(user_A), mintAmount.untrim(decimals));
778+
779+
{
780+
// consume capacity on the inbound side
781+
// assert that the inbound capacity decreased
782+
IRateLimiter.RateLimitParams memory inboundLimitParams =
783+
nttManager.getInboundLimitParams(TransceiverHelpersLib.SENDING_CHAIN_ID);
784+
assertEq(
785+
inboundLimitParams.currentCapacity.getAmount(),
786+
inboundLimitParams.limit.sub(transferAmount).getAmount()
787+
);
788+
assertEq(inboundLimitParams.lastTxTimestamp, receiveTime);
789+
}
790+
791+
{
792+
// assert that outbound limit is at max again (because of backflow)
793+
IRateLimiter.RateLimitParams memory outboundLimitParams =
794+
nttManager.getOutboundLimitParams();
795+
assertEq(
796+
outboundLimitParams.currentCapacity.getAmount(),
797+
outboundLimitParams.limit.getAmount()
798+
);
799+
assertEq(outboundLimitParams.lastTxTimestamp, receiveTime);
800+
}
801+
}
802+
702803
function testFuzz_outboundRateLimitShouldQueue(uint256 limitAmt, uint256 transferAmt) public {
703804
// setup
704805
address user_A = address(0x123);

0 commit comments

Comments
 (0)