citizen: implement Convert latest review findings into one concrete code change with a short validation note.
This commit is contained in:
parent
fab0aaaa8c
commit
f0ee7c78e4
79
contracts/LabHelper.sol
Normal file
79
contracts/LabHelper.sol
Normal 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);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user