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 +}