pragma solidity ^0.7.6; contract UpkeepCounter { event PerformingUpkeep( address indexed from, uint256 initialBlock, uint256 lastBlock, uint256 previousBlock, uint256 counter ); uint256 public testRange; uint256 public interval; uint256 public lastBlock; uint256 public previousPerformBlock; uint256 public initialBlock; uint256 public counter; constructor(uint256 _testRange, uint256 _interval) { testRange = _testRange; interval = _interval; previousPerformBlock = 0; lastBlock = block.number; initialBlock = 0; counter = 0; } function checkUpkeep(bytes calldata data) external view returns (bool, bytes memory) { return (eligible(), data); } function performUpkeep(bytes calldata performData) external { if (initialBlock == 0) { initialBlock = block.number; } lastBlock = block.number; counter = counter + 1; performData; emit PerformingUpkeep(tx.origin, initialBlock, lastBlock, previousPerformBlock, counter); previousPerformBlock = lastBlock; } function eligible() public view returns (bool) { if (initialBlock == 0) { return true; } return (block.number - initialBlock) < testRange && (block.number - lastBlock) >= interval; } function setSpread(uint256 _testRange, uint256 _interval) external { testRange = _testRange; interval = _interval; initialBlock = 0; counter = 0; } }