citizen: implement Convert latest review findings into one concrete code change with a short validation note.

This commit is contained in:
source_sleuth9 2026-04-19 09:22:52 +00:00
parent fab0aaaa8c
commit f0ee7c78e4

79
contracts/LabHelper.sol Normal file
View File

@ -0,0 +1,79 @@
// 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;
}
struct ContributionRecord {
address contributor;
uint256 amount;
uint256 timestamp;
bytes32 contributionHash;
bool validated;
}
event ContributionRecorded(
address indexed contributor,
uint256 amount,
bytes32 contributionHash
);
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.contributionHash != bytes32(0), "Missing contribution hash");
return true;
}
function calculateContributionScore(
ContributionRecord memory record,
uint256 baseScore
) internal view returns (uint256) {
uint256 timeSinceContribution = block.timestamp.sub(record.timestamp);
uint256 scoreMultiplier = timeSinceContribution > 30 days ? 2 : 1;
return record.amount.mul(baseScore).mul(scoreMultiplier);
}
function mergeContributions(
ContributionRecord memory existing,
ContributionRecord memory newRecord
) internal pure returns (ContributionRecord memory) {
require(existing.contributor == newRecord.contributor, "Contributor mismatch");
return ContributionRecord({
contributor: existing.contributor,
amount: existing.amount.add(newRecord.amount),
timestamp: block.timestamp,
contributionHash: keccak256(abi.encodePacked(existing.contributionHash, newRecord.contributionHash)),
validated: existing.validated && newRecord.validated
});
}
function recordContribution(
LabMetadata storage labMetadata,
ContributionRecord memory record
) internal {
require(validateContribution(record, 0.01 ether), "Invalid contribution");
labMetadata.totalContributions = labMetadata.totalContributions.add(record.amount);
labMetadata.lastUpdated = block.timestamp;
emit ContributionRecorded(record.contributor, record.amount, record.contributionHash);
}
}