@@ -22,7 +22,7 @@ abstract contract Scheduler is IScheduler, SchedulerState {
2222
2323 function addSubscription (
2424 SubscriptionParams memory subscriptionParams
25- ) external override returns (uint256 subscriptionId ) {
25+ ) external payable override returns (uint256 subscriptionId ) {
2626 if (subscriptionParams.priceIds.length > MAX_PRICE_IDS) {
2727 revert TooManyPriceIds (
2828 subscriptionParams.priceIds.length ,
@@ -51,6 +51,17 @@ abstract contract Scheduler is IScheduler, SchedulerState {
5151 .maxGasMultiplierCapPct = DEFAULT_MAX_GAS_MULTIPLIER_CAP_PCT;
5252 }
5353
54+ // Calculate minimum balance required for this subscription
55+ uint256 minimumBalance = this .getMinimumBalance (uint8 (subscriptionParams.priceIds.length ));
56+
57+ // Ensure enough funds were provided
58+ if (msg .value < minimumBalance) {
59+ revert InsufficientBalance ();
60+ }
61+
62+ // Set subscription to active
63+ subscriptionParams.isActive = true ;
64+
5465 subscriptionId = _state.subscriptionNumber++ ;
5566
5667 // Store the subscription parameters
@@ -61,7 +72,7 @@ abstract contract Scheduler is IScheduler, SchedulerState {
6172 subscriptionId
6273 ];
6374 status.priceLastUpdatedAt = 0 ;
64- status.balanceInWei = 0 ;
75+ status.balanceInWei = msg . value ;
6576 status.totalUpdates = 0 ;
6677 status.totalSpent = 0 ;
6778 status.isActive = true ;
@@ -93,11 +104,20 @@ abstract contract Scheduler is IScheduler, SchedulerState {
93104 function updateSubscription (
94105 uint256 subscriptionId ,
95106 SubscriptionParams memory newSubscriptionParams
96- ) external override onlyManager (subscriptionId) {
97- if (! _state.subscriptionStatuses[subscriptionId].isActive) {
98- revert InactiveSubscription ();
107+ ) external payable override onlyManager (subscriptionId) {
108+ SubscriptionStatus storage status = _state.subscriptionStatuses[subscriptionId];
109+ bool wasActive = status.isActive;
110+ bool willBeActive = newSubscriptionParams.isActive;
111+
112+ // If subscription is inactive and will remain inactive, no need to validate parameters
113+ if (! wasActive && ! willBeActive) {
114+ // Update subscription parameters
115+ _state.subscriptionParams[subscriptionId] = newSubscriptionParams;
116+ emit SubscriptionUpdated (subscriptionId);
117+ return ;
99118 }
100-
119+
120+ // Validate parameters for active or to-be-activated subscriptions
101121 if (newSubscriptionParams.priceIds.length > MAX_PRICE_IDS) {
102122 revert TooManyPriceIds (
103123 newSubscriptionParams.priceIds.length ,
@@ -125,24 +145,35 @@ abstract contract Scheduler is IScheduler, SchedulerState {
125145 .gasConfig
126146 .maxGasMultiplierCapPct = DEFAULT_MAX_GAS_MULTIPLIER_CAP_PCT;
127147 }
148+
149+ // Handle activation/deactivation
150+ if (! wasActive && willBeActive) {
151+ // Reactivating a subscription - ensure minimum balance
152+ uint256 minimumBalance = this .getMinimumBalance (uint8 (newSubscriptionParams.priceIds.length ));
153+
154+ // Add any funds sent with this transaction
155+ status.balanceInWei += msg .value ;
156+
157+ // Check if balance meets minimum requirement
158+ if (status.balanceInWei < minimumBalance) {
159+ revert InsufficientBalance ();
160+ }
161+
162+ status.isActive = true ;
163+ emit SubscriptionActivated (subscriptionId);
164+ } else if (wasActive && ! willBeActive) {
165+ // Deactivating a subscription
166+ status.isActive = false ;
167+ emit SubscriptionDeactivated (subscriptionId);
168+ }
128169
129170 // Update subscription parameters
130171 _state.subscriptionParams[subscriptionId] = newSubscriptionParams;
131172
132173 emit SubscriptionUpdated (subscriptionId);
133174 }
134175
135- function deactivateSubscription (
136- uint256 subscriptionId
137- ) external override onlyManager (subscriptionId) {
138- if (! _state.subscriptionStatuses[subscriptionId].isActive) {
139- revert InactiveSubscription ();
140- }
141-
142- _state.subscriptionStatuses[subscriptionId].isActive = false ;
143-
144- emit SubscriptionDeactivated (subscriptionId);
145- }
176+ // Removed standalone deactivateSubscription function as it's now handled in updateSubscription
146177
147178 function updatePriceFeeds (
148179 uint256 subscriptionId ,
@@ -439,11 +470,22 @@ abstract contract Scheduler is IScheduler, SchedulerState {
439470 SubscriptionStatus storage status = _state.subscriptionStatuses[
440471 subscriptionId
441472 ];
473+ SubscriptionParams storage params = _state.subscriptionParams[
474+ subscriptionId
475+ ];
442476
443477 if (status.balanceInWei < amount) {
444478 revert InsufficientBalance ();
445479 }
446480
481+ // If subscription is active, ensure minimum balance is maintained
482+ if (status.isActive) {
483+ uint256 minimumBalance = this .getMinimumBalance (uint8 (params.priceIds.length ));
484+ if (status.balanceInWei - amount < minimumBalance) {
485+ revert InsufficientBalance ();
486+ }
487+ }
488+
447489 status.balanceInWei -= amount;
448490
449491 (bool sent , ) = msg .sender .call {value: amount}("" );
0 commit comments