From 52f62e223423899afb9a79b6782431c179c41055 Mon Sep 17 00:00:00 2001 From: Syed Ghufran Hassan Date: Tue, 13 Jan 2026 13:41:09 +0500 Subject: [PATCH] Update Streamonomics.sol feat(Streamonomics): enhance input validation with range and duplicate checks - Validate percentage values (0-100) - Ensure start <= limit - Validate step values - Prevent overlapping ranges - Check for duplicate entries - Add overflow protection --- contracts/Streamonomics.sol | 50 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/contracts/Streamonomics.sol b/contracts/Streamonomics.sol index 3728c22..07e723c 100644 --- a/contracts/Streamonomics.sol +++ b/contracts/Streamonomics.sol @@ -28,19 +28,61 @@ contract Streamonomics is Ownable { require(percentage.length == start.length, "!len"); require(start.length == step.length, "!len"); require(step.length == limit.length, "!len"); + + // Prevent setting too many streamonomics that could cause gas issues + require(percentage.length <= 100, "Too many streamonomics"); + + emit StreamonomicsDeleted(streamonomics.length); delete streamonomics; - uint256 total; + + uint256 totalPercentage; + uint256 previousLimit; + for(uint i = 0; i < percentage.length; i++) { + // Validate percentage is reasonable (0-100) + require(percentage[i] <= 100, "Percentage exceeds 100"); + + // Validate start <= limit + require(start[i] <= limit[i], "Start must be <= limit"); + + // Validate step is not zero (unless start == limit) + if (start[i] < limit[i]) { + require(step[i] > 0, "Step must be > 0 when start < limit"); + } + + // Check for non-overlapping ranges in ascending order + // This assumes streamonomics should be in ascending order of ranges + if (i > 0) { + require(start[i] > previousLimit, "Ranges overlap or not in order"); + } + + // Check for duplicate entries + for (uint j = 0; j < i; j++) { + require( + percentage[i] != percentage[j] || + start[i] != start[j] || + step[i] != step[j] || + limit[i] != limit[j], + "Duplicate streamonomic entry" + ); + } + streamonomics.push(Streamonomic(percentage[i], start[i], step[i], limit[i])); emit StreamonomicAdded(percentage[i], start[i], step[i], limit[i]); - total += percentage[i]; + + totalPercentage += percentage[i]; + previousLimit = limit[i]; + + // Check for overflow (very unlikely with percentages, but good practice) + require(totalPercentage >= percentage[i], "Percentage addition overflow"); } - require(total <= 100, "!>100"); + + require(totalPercentage <= 100, "Total percentage exceeds 100"); } function getStreamonomics() external view returns(Streamonomic[] memory) { return streamonomics; } -} \ No newline at end of file +}