// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
import "./INT1.sol";
import "./IStaking.sol";
contract Evaluator {
Staking public stakingContract; // Reference to the staking contract
INTToken public INT;
uint totalTimechains=50 weeks;
uint public timechainDuration = 1 weeks;
uint public nextTimechainStart;
uint public selectedEvaluators;
address public owner;
struct _Evaluator {
address addr;
uint stake;
bool selected;
}
modifier onlyOwner(){
require(owner==msg.sender);
_;
}
mapping(address => _Evaluator) public evaluators;
address[] public selectedEvaluatorsQueue;
constructor(address _owner, address _INT, address _stakingContract) {
owner = _owner;
INT =INTToken(_INT);
stakingContract = Staking(_stakingContract); // Initialize the staking contract address
nextTimechainStart = block.timestamp + timechainDuration;
totalTimechains=50 weeks;
}
function takeEvaluatorRole(uint _stake) public {
uint _minStake = stakingContract.minStake(); // Get the minimum stake from the staking contract
require(!evaluators[msg.sender].selected, "evaluator not selected");
require(_stake >= _minStake, "Minimum stake not met");
require(block.timestamp <= nextTimechainStart, "Timechain ended");
require(selectedEvaluators <= 4, "Must not be more or less");
require(INT.transferFrom(msg.sender, address(this), _stake));
evaluators[msg.sender] = _Evaluator({
addr: msg.sender,
stake: _stake,
selected: true
});
}
function addEvaluator(address evaluator) public onlyOwner{
require(msg.sender == owner, "Only owner has access");
require(evaluators[msg.sender].selected, "evaluator not selected");
selectedEvaluatorsQueue.push(evaluator);
selectedEvaluators++;
}
// Function to trigger the start of a new timechain
function startNewTimechain() public onlyOwner {
require(block.timestamp >= nextTimechainStart, "Timechain not ended yet");
totalTimechains-=1; // decrease the total timechains count
nextTimechainStart = block.timestamp + timechainDuration;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
import "./INT1.sol";
import "./IStaking.sol";
contract Evaluator {
Staking public stakingContract; // Reference to the staking contract
INTToken public INT;
uint totalTimechains=50 weeks;
uint public timechainDuration = 1 weeks;
uint public nextTimechainStart;
uint public selectedEvaluators;
address public owner;
struct _Evaluator {
address addr;
uint stake;
bool selected;
}
modifier onlyOwner(){
require(owner==msg.sender);
_;
}
mapping(address => _Evaluator) public evaluators;
address[] public selectedEvaluatorsQueue;
constructor(address _owner, address _INT, address _stakingContract) {
owner = _owner;
INT =INTToken(_INT);
stakingContract = Staking(_stakingContract); // Initialize the staking contract address
nextTimechainStart = block.timestamp + timechainDuration;
totalTimechains=50 weeks;
}
function takeEvaluatorRole(uint _stake) public {
uint _minStake = stakingContract.minStake(); // Get the minimum stake from the staking contract
require(!evaluators[msg.sender].selected, "evaluator not selected");
require(_stake >= _minStake, "Minimum stake not met");
require(selectedEvaluators <= 4, "Must not be more or less");
require(INT.transferFrom(msg.sender, address(this), _stake));
}
function addEvaluator(address evaluator) public onlyOwner{
require(msg.sender == owner, "Only owner has access");
require(evaluators[msg.sender].selected, "evaluator not selected");
selectedEvaluatorsQueue.push(evaluator);
selectedEvaluators++;
}
// Function to trigger the start of a new timechain
function startNewTimechain() public onlyOwner {
require(block.timestamp >= nextTimechainStart, "Timechain not ended yet");
totalTimechains-=1; // decrease the total timechains count
nextTimechainStart = block.timestamp + timechainDuration;
}
}