@@ -598,6 +598,7 @@ contract TestRateLimit is Test, IRateLimiterEvents {
598
598
599
599
TrimmedAmount memory transferAmount = TrimmedAmount (10 , 8 );
600
600
token.approve (address (nttManager), type (uint256 ).max);
601
+ // transfer 10 tokens from user_A -> user_B via the nttManager
601
602
nttManager.transfer (
602
603
transferAmount.untrim (decimals), chainId, toWormholeFormat (user_B), false , new bytes (1 )
603
604
);
@@ -609,7 +610,8 @@ contract TestRateLimit is Test, IRateLimiterEvents {
609
610
assertEq (token.balanceOf (user_A), mintAmount.sub (transferAmount).untrim (decimals));
610
611
611
612
{
612
- // assert outbound rate limit decreased
613
+ // consumed capacity on the outbound side
614
+ // assert outbound capacity decreased
613
615
IRateLimiter.RateLimitParams memory outboundLimitParams =
614
616
nttManager.getOutboundLimitParams ();
615
617
assertEq (
@@ -639,7 +641,8 @@ contract TestRateLimit is Test, IRateLimiterEvents {
639
641
assertEq (token.balanceOf (user_A), mintAmount.untrim (decimals));
640
642
641
643
{
642
- // assert that the inbound limits decreased
644
+ // consume capacity on the inbound side
645
+ // assert that the inbound capacity decreased
643
646
IRateLimiter.RateLimitParams memory inboundLimitParams =
644
647
nttManager.getInboundLimitParams (TransceiverHelpersLib.SENDING_CHAIN_ID);
645
648
assertEq (
@@ -699,6 +702,104 @@ contract TestRateLimit is Test, IRateLimiterEvents {
699
702
}
700
703
}
701
704
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
+
702
803
function testFuzz_outboundRateLimitShouldQueue (uint256 limitAmt , uint256 transferAmt ) public {
703
804
// setup
704
805
address user_A = address (0x123 );
0 commit comments