@@ -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,19 @@ 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 (
56+ uint8 (subscriptionParams.priceIds.length )
57+ );
58+
59+ // Ensure enough funds were provided
60+ if (msg .value < minimumBalance) {
61+ revert InsufficientBalance ();
62+ }
63+
64+ // Set subscription to active
65+ subscriptionParams.isActive = true ;
66+
5467 subscriptionId = _state.subscriptionNumber++ ;
5568
5669 // Store the subscription parameters
@@ -61,7 +74,7 @@ abstract contract Scheduler is IScheduler, SchedulerState {
6174 subscriptionId
6275 ];
6376 status.priceLastUpdatedAt = 0 ;
64- status.balanceInWei = 0 ;
77+ status.balanceInWei = msg . value ;
6578 status.totalUpdates = 0 ;
6679 status.totalSpent = 0 ;
6780 status.isActive = true ;
@@ -93,11 +106,22 @@ abstract contract Scheduler is IScheduler, SchedulerState {
93106 function updateSubscription (
94107 uint256 subscriptionId ,
95108 SubscriptionParams memory newSubscriptionParams
96- ) external override onlyManager (subscriptionId) {
97- if (! _state.subscriptionStatuses[subscriptionId].isActive) {
98- revert InactiveSubscription ();
109+ ) external payable override onlyManager (subscriptionId) {
110+ SubscriptionStatus storage status = _state.subscriptionStatuses[
111+ subscriptionId
112+ ];
113+ bool wasActive = status.isActive;
114+ bool willBeActive = newSubscriptionParams.isActive;
115+
116+ // If subscription is inactive and will remain inactive, no need to validate parameters
117+ if (! wasActive && ! willBeActive) {
118+ // Update subscription parameters
119+ _state.subscriptionParams[subscriptionId] = newSubscriptionParams;
120+ emit SubscriptionUpdated (subscriptionId);
121+ return ;
99122 }
100123
124+ // Validate parameters for active or to-be-activated subscriptions
101125 if (newSubscriptionParams.priceIds.length > MAX_PRICE_IDS) {
102126 revert TooManyPriceIds (
103127 newSubscriptionParams.priceIds.length ,
@@ -126,24 +150,37 @@ abstract contract Scheduler is IScheduler, SchedulerState {
126150 .maxGasMultiplierCapPct = DEFAULT_MAX_GAS_MULTIPLIER_CAP_PCT;
127151 }
128152
129- // Update subscription parameters
130- _state.subscriptionParams[subscriptionId] = newSubscriptionParams;
153+ // Handle activation/deactivation
154+ if (! wasActive && willBeActive) {
155+ // Reactivating a subscription - ensure minimum balance
156+ uint256 minimumBalance = this .getMinimumBalance (
157+ uint8 (newSubscriptionParams.priceIds.length )
158+ );
131159
132- emit SubscriptionUpdated (subscriptionId);
133- }
160+ // Add any funds sent with this transaction
161+ status.balanceInWei += msg . value ;
134162
135- function deactivateSubscription (
136- uint256 subscriptionId
137- ) external override onlyManager (subscriptionId) {
138- if (! _state.subscriptionStatuses[subscriptionId].isActive) {
139- revert InactiveSubscription ();
163+ // Check if balance meets minimum requirement
164+ if (status.balanceInWei < minimumBalance) {
165+ revert InsufficientBalance ();
166+ }
167+
168+ status.isActive = true ;
169+ emit SubscriptionActivated (subscriptionId);
170+ } else if (wasActive && ! willBeActive) {
171+ // Deactivating a subscription
172+ status.isActive = false ;
173+ emit SubscriptionDeactivated (subscriptionId);
140174 }
141175
142- _state.subscriptionStatuses[subscriptionId].isActive = false ;
176+ // Update subscription parameters
177+ _state.subscriptionParams[subscriptionId] = newSubscriptionParams;
143178
144- emit SubscriptionDeactivated (subscriptionId);
179+ emit SubscriptionUpdated (subscriptionId);
145180 }
146181
182+ // Removed standalone deactivateSubscription function as it's now handled in updateSubscription
183+
147184 function updatePriceFeeds (
148185 uint256 subscriptionId ,
149186 bytes [] calldata updateData ,
@@ -439,11 +476,24 @@ abstract contract Scheduler is IScheduler, SchedulerState {
439476 SubscriptionStatus storage status = _state.subscriptionStatuses[
440477 subscriptionId
441478 ];
479+ SubscriptionParams storage params = _state.subscriptionParams[
480+ subscriptionId
481+ ];
442482
443483 if (status.balanceInWei < amount) {
444484 revert InsufficientBalance ();
445485 }
446486
487+ // If subscription is active, ensure minimum balance is maintained
488+ if (status.isActive) {
489+ uint256 minimumBalance = this .getMinimumBalance (
490+ uint8 (params.priceIds.length )
491+ );
492+ if (status.balanceInWei - amount < minimumBalance) {
493+ revert InsufficientBalance ();
494+ }
495+ }
496+
447497 status.balanceInWei -= amount;
448498
449499 (bool sent , ) = msg .sender .call {value: amount}("" );
0 commit comments