// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; import '../interfaces/ICandidateRegistry.sol'; /// @dev Candidate registry contract /// @author Alexandas contract CandidateRegistry is ICandidateRegistry { mapping(address => Types.CandidateInfo) internal candidates; /// @dev return a candidate address for a specific node manifest mapping(string => address) public override manifestMap; /// @dev register a candidate with node manifest /// @param manifest node manifest function register(string memory manifest) external override { _register(msg.sender, manifest); } function _register(address candidate, string memory manifest) internal { require(candidates[candidate].grade == Types.Grade.Null, 'CandidateRegistry: candidate exists'); require(manifestMap[manifest] == address(0), 'CandidateRegistry: manifest exists'); manifestMap[manifest] = candidate; candidates[candidate].grade = Types.Grade.Secondary; candidates[candidate].manifest = manifest; emit Register(candidate); } /// @dev return a candidate /// @param candidate candidate address /// @return candidate information function candidateInfo(address candidate) public view override returns (Types.CandidateInfo memory) { return candidates[candidate]; } /// @dev return whether a candidate is registered /// @param candidate candidate address /// @return whether the candidate is registered function isCandidateRegistered(address candidate) public view override returns (bool) { return candidates[candidate].grade != Types.Grade.Null; } /// @dev return grade of a candidate /// @param candidate candidate address /// @return candidate grade function gradeOf(address candidate) public view override returns (Types.Grade) { return candidates[candidate].grade; } }