@@ -541,6 +541,134 @@ contract SchedulerTest is Test, SchedulerEvents, PulseSchedulerTestUtils {
541
541
"Balance should match initial balance plus added funds "
542
542
);
543
543
}
544
+
545
+
546
+
547
+ function testAddFundsEnforcesMinimumBalance () public {
548
+ // First add a subscription with minimum balance
549
+ uint256 subscriptionId = addTestSubscription (
550
+ scheduler,
551
+ address (reader)
552
+ );
553
+
554
+ // Get subscription parameters and initial balance
555
+ (SchedulerState.SubscriptionParams memory params , SchedulerState.SubscriptionStatus memory status ) = scheduler
556
+ .getSubscription (subscriptionId);
557
+
558
+ // Calculate minimum balance
559
+ uint256 minimumBalance = scheduler.getMinimumBalance (
560
+ uint8 (params.priceIds.length )
561
+ );
562
+
563
+ // Verify initial balance is at minimum
564
+ assertEq (
565
+ status.balanceInWei,
566
+ minimumBalance,
567
+ "Initial balance should equal minimum balance "
568
+ );
569
+
570
+ // Add some funds to the subscription
571
+ uint256 additionalFunds = 0.1 ether ;
572
+ scheduler.addFunds {value: additionalFunds}(subscriptionId);
573
+
574
+ // Verify funds were added
575
+ (, SchedulerState.SubscriptionStatus memory statusAfterAdd ) = scheduler
576
+ .getSubscription (subscriptionId);
577
+ assertEq (
578
+ statusAfterAdd.balanceInWei,
579
+ minimumBalance + additionalFunds,
580
+ "Balance should be increased by the added funds "
581
+ );
582
+
583
+ // Now create a new subscription but don't fund it fully
584
+ SchedulerState.SubscriptionParams memory newParams = createDefaultSubscriptionParams (
585
+ 2 ,
586
+ address (reader)
587
+ );
588
+
589
+ // Calculate minimum balance for this new subscription
590
+ uint256 newMinimumBalance = scheduler.getMinimumBalance (
591
+ uint8 (newParams.priceIds.length )
592
+ );
593
+
594
+ // Try to create with insufficient funds
595
+ uint256 insufficientFunds = newMinimumBalance - 1 wei ;
596
+ vm.expectRevert (abi.encodeWithSelector (InsufficientBalance.selector ));
597
+ scheduler.createSubscription {value: insufficientFunds}(newParams);
598
+
599
+ // Create with sufficient funds
600
+ uint256 newSubscriptionId = scheduler.createSubscription {value: newMinimumBalance}(newParams);
601
+
602
+ // Verify subscription was created with minimum balance
603
+ (, SchedulerState.SubscriptionStatus memory newStatus ) = scheduler
604
+ .getSubscription (newSubscriptionId);
605
+ assertEq (
606
+ newStatus.balanceInWei,
607
+ newMinimumBalance,
608
+ "New subscription balance should equal minimum balance "
609
+ );
610
+ }
611
+
612
+ function testAddFundsEnforcesMinimumBalanceForPermanentSubscription () public {
613
+ // Create a non-permanent subscription first
614
+ uint256 subscriptionId = addTestSubscription (
615
+ scheduler,
616
+ address (reader)
617
+ );
618
+
619
+ // Get subscription parameters and initial balance
620
+ (SchedulerState.SubscriptionParams memory params , SchedulerState.SubscriptionStatus memory status ) = scheduler
621
+ .getSubscription (subscriptionId);
622
+
623
+ // Calculate minimum balance
624
+ uint256 minimumBalance = scheduler.getMinimumBalance (
625
+ uint8 (params.priceIds.length )
626
+ );
627
+
628
+ // Verify initial balance is at minimum
629
+ assertEq (
630
+ status.balanceInWei,
631
+ minimumBalance,
632
+ "Initial balance should equal minimum balance "
633
+ );
634
+
635
+ // Make it permanent
636
+ params.isPermanent = true ;
637
+ scheduler.updateSubscription (subscriptionId, params);
638
+
639
+ // Try to add funds - this should succeed since we're adding to a permanent subscription
640
+ uint256 additionalFunds = 0.1 ether ;
641
+ scheduler.addFunds {value: additionalFunds}(subscriptionId);
642
+
643
+ // Verify funds were added
644
+ (, SchedulerState.SubscriptionStatus memory statusAfter ) = scheduler
645
+ .getSubscription (subscriptionId);
646
+ assertEq (
647
+ statusAfter.balanceInWei,
648
+ minimumBalance + additionalFunds,
649
+ "Balance should be increased by the added funds "
650
+ );
651
+
652
+ // Now test the deposit limit for permanent subscriptions
653
+ uint256 maxDepositLimit = 100 ether ; // MAX_DEPOSIT_LIMIT from SchedulerState
654
+
655
+ // Try to add funds exceeding the deposit limit
656
+ vm.expectRevert (abi.encodeWithSelector (MaxDepositLimitExceeded.selector ));
657
+ scheduler.addFunds {value: maxDepositLimit + 1 }(subscriptionId);
658
+
659
+ // Add funds within the deposit limit
660
+ uint256 validDeposit = 1 ether ;
661
+ scheduler.addFunds {value: validDeposit}(subscriptionId);
662
+
663
+ // Verify funds were added
664
+ (, SchedulerState.SubscriptionStatus memory statusAfterValidDeposit ) = scheduler
665
+ .getSubscription (subscriptionId);
666
+ assertEq (
667
+ statusAfterValidDeposit.balanceInWei,
668
+ minimumBalance + additionalFunds + validDeposit,
669
+ "Balance should be increased by the valid deposit "
670
+ );
671
+ }
544
672
545
673
function testWithdrawFunds () public {
546
674
// Add a subscription and get the parameters
0 commit comments