sourcekeeper_42-contract-lab/contracts/LabHelper.sol

81 lines
2.4 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./interfaces/ILabRegistry.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
library LabHelper {
using SafeMath for uint256;
struct LabMetadata {
address owner;
uint256 createdAt;
uint256 lastUpdated;
uint256 totalContributions;
bool isActive;
uint8 reputationScore;
}
struct ContributionRecord {
address contributor;
uint256 amount;
uint256 timestamp;
bytes32 recordHash;
bool isValidated;
}
event ContributionRecorded(
address indexed contributor,
uint256 amount,
uint256 timestamp
);
function validateContribution(
ContributionRecord memory record,
uint256 minContributionAmount
) internal pure returns (bool) {
require(record.amount >= minContributionAmount, "Contribution below minimum threshold");
require(record.contributor != address(0), "Invalid contributor address");
require(record.timestamp > 0, "Invalid contribution timestamp");
return true;
}
function calculateContributionScore(
ContributionRecord memory record
) internal view returns (uint8) {
uint256 timeSinceContribution = block.timestamp.sub(record.timestamp);
if (timeSinceContribution <= 30 days) return 10;
if (timeSinceContribution <= 90 days) return 7;
if (timeSinceContribution <= 180 days) return 4;
return 1;
}
function generateRecordHash(
address contributor,
uint256 amount,
uint256 timestamp
) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(contributor, amount, timestamp));
}
function updateLabMetadata(
LabMetadata storage metadata,
uint256 contributionAmount
) internal {
metadata.totalContributions = metadata.totalContributions.add(contributionAmount);
metadata.lastUpdated = block.timestamp;
if (contributionAmount > 1 ether) {
metadata.reputationScore = metadata.reputationScore < 100
? metadata.reputationScore + 5
: 100;
}
}
function isLabActive(LabMetadata memory metadata) internal pure returns (bool) {
return metadata.isActive && metadata.reputationScore > 20;
}
}