citizen: implement Implement: The main contract that aggregates data from various repositories
Some checks are pending
CI / build-and-test (push) Waiting to run
CI / slither (push) Waiting to run

This commit is contained in:
evidence_scout 2026-04-19 09:09:42 +00:00
parent 94d0b92890
commit 13675b9688

136
contracts/EvidenceScout.sol Normal file
View File

@ -0,0 +1,136 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./interfaces/RepositoryInterface.sol";
import "./helpers/RepositoryHelper.sol";
contract EvidenceScout {
struct RepositoryRecord {
address repositoryAddress;
string repositoryName;
bytes32 repositoryHash;
uint256 lastUpdatedTimestamp;
bool isActive;
}
mapping(bytes32 => RepositoryRecord) public repositories;
mapping(address => bool) public authorizedAgents;
address public owner;
uint256 public constant MAX_REPOSITORIES = 100;
uint256 public totalRepositories;
event RepositoryRegistered(
bytes32 indexed repositoryId,
address indexed repositoryAddress,
string repositoryName
);
event RepositoryUpdated(
bytes32 indexed repositoryId,
address indexed repositoryAddress
);
modifier onlyOwner() {
require(msg.sender == owner, "EvidenceScout: Unauthorized access");
_;
}
modifier onlyAuthorizedAgent() {
require(
authorizedAgents[msg.sender] || msg.sender == owner,
"EvidenceScout: Agent not authorized"
);
_;
}
constructor() {
owner = msg.sender;
authorizedAgents[msg.sender] = true;
}
function registerRepository(
address _repositoryAddress,
string memory _repositoryName
) external onlyAuthorizedAgent {
require(
_repositoryAddress != address(0),
"EvidenceScout: Invalid repository address"
);
require(
totalRepositories < MAX_REPOSITORIES,
"EvidenceScout: Maximum repositories reached"
);
bytes32 repositoryId = keccak256(
abi.encodePacked(_repositoryAddress, _repositoryName)
);
require(
repositories[repositoryId].repositoryAddress == address(0),
"EvidenceScout: Repository already exists"
);
RepositoryInterface repositoryContract = RepositoryInterface(_repositoryAddress);
try repositoryContract.validateRepository() returns (bool isValid) {
require(isValid, "EvidenceScout: Repository validation failed");
} catch {
revert("EvidenceScout: Repository validation error");
}
repositories[repositoryId] = RepositoryRecord({
repositoryAddress: _repositoryAddress,
repositoryName: _repositoryName,
repositoryHash: keccak256(abi.encodePacked(_repositoryAddress)),
lastUpdatedTimestamp: block.timestamp,
isActive: true
});
totalRepositories++;
emit RepositoryRegistered(repositoryId, _repositoryAddress, _repositoryName);
}
function updateRepositoryStatus(
bytes32 _repositoryId,
bool _isActive
) external onlyAuthorizedAgent {
require(
repositories[_repositoryId].repositoryAddress != address(0),
"EvidenceScout: Repository not found"
);
repositories[_repositoryId].isActive = _isActive;
repositories[_repositoryId].lastUpdatedTimestamp = block.timestamp;
emit RepositoryUpdated(
_repositoryId,
repositories[_repositoryId].repositoryAddress
);
}
function getRepositoryDetails(
bytes32 _repositoryId
) external view returns (RepositoryRecord memory) {
require(
repositories[_repositoryId].repositoryAddress != address(0),
"EvidenceScout: Repository not found"
);
return repositories[_repositoryId];
}
function addAuthorizedAgent(
address _agent
) external onlyOwner {
require(_agent != address(0), "EvidenceScout: Invalid agent address");
authorizedAgents[_agent] = true;
}
function removeAuthorizedAgent(
address _agent
) external onlyOwner {
require(_agent != owner, "EvidenceScout: Cannot remove owner");
authorizedAgents[_agent] = false;
}
}