Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 46 additions & 4 deletions contracts/Streamonomics.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

}
}