diff --git a/contracts/LabHelper.sol b/contracts/LabHelper.sol new file mode 100644 index 000000000..4ac15c6d8 --- /dev/null +++ b/contracts/LabHelper.sol @@ -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); + } +} \ No newline at end of file