134 lines
4.9 KiB
Solidity
134 lines
4.9 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.19;
|
|
|
|
import "forge-std/Test.sol";
|
|
import "../contracts/interfaces/IVerifier.sol";
|
|
import "../contracts/Verifier.sol";
|
|
|
|
contract IVerifierTest is Test {
|
|
Verifier public verifier;
|
|
address public owner;
|
|
address public submitter;
|
|
address public challenger;
|
|
|
|
function setUp() public {
|
|
owner = makeAddr("owner");
|
|
submitter = makeAddr("submitter");
|
|
challenger = makeAddr("challenger");
|
|
|
|
vm.prank(owner);
|
|
verifier = new Verifier();
|
|
}
|
|
|
|
function test_SubmitVerification() public {
|
|
vm.startPrank(submitter);
|
|
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
|
|
bytes32[] memory proofData = new bytes32[](1);
|
|
proofData[0] = keccak256(abi.encodePacked("proof"));
|
|
|
|
uint256 challengePeriod = 1 days;
|
|
uint256 requiredStake = verifier.calculateRequiredStake(contentHash);
|
|
|
|
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
|
|
contentHash,
|
|
proofData,
|
|
challengePeriod
|
|
);
|
|
|
|
IVerifier.VerificationSubmission memory submission = verifier.getSubmissionDetails(submissionId);
|
|
|
|
assertEq(submission.submitter, submitter, "Incorrect submitter");
|
|
assertEq(submission.contentHash, contentHash, "Incorrect content hash");
|
|
assertEq(submission.status, IVerifier.VerificationStatus.Pending, "Incorrect initial status");
|
|
vm.stopPrank();
|
|
}
|
|
|
|
function testFuzz_SubmitVerification(bytes32 randomContent) public {
|
|
vm.startPrank(submitter);
|
|
bytes32[] memory proofData = new bytes32[](1);
|
|
proofData[0] = keccak256(abi.encodePacked("proof"));
|
|
|
|
uint256 challengePeriod = 1 days;
|
|
uint256 requiredStake = verifier.calculateRequiredStake(randomContent);
|
|
|
|
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
|
|
randomContent,
|
|
proofData,
|
|
challengePeriod
|
|
);
|
|
|
|
IVerifier.VerificationSubmission memory submission = verifier.getSubmissionDetails(submissionId);
|
|
|
|
assertEq(submission.submitter, submitter, "Incorrect submitter");
|
|
assertEq(submission.contentHash, randomContent, "Incorrect content hash");
|
|
vm.stopPrank();
|
|
}
|
|
|
|
function testRevert_SubmitVerificationInsufficientStake() public {
|
|
vm.startPrank(submitter);
|
|
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
|
|
bytes32[] memory proofData = new bytes32[](1);
|
|
proofData[0] = keccak256(abi.encodePacked("proof"));
|
|
|
|
uint256 challengePeriod = 1 days;
|
|
|
|
vm.expectRevert("Insufficient stake");
|
|
verifier.submitVerification(contentHash, proofData, challengePeriod);
|
|
vm.stopPrank();
|
|
}
|
|
|
|
function test_ChallengeSubmission() public {
|
|
vm.startPrank(submitter);
|
|
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
|
|
bytes32[] memory proofData = new bytes32[](1);
|
|
proofData[0] = keccak256(abi.encodePacked("proof"));
|
|
|
|
uint256 challengePeriod = 1 days;
|
|
uint256 requiredStake = verifier.calculateRequiredStake(contentHash);
|
|
|
|
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
|
|
contentHash,
|
|
proofData,
|
|
challengePeriod
|
|
);
|
|
vm.stopPrank();
|
|
|
|
vm.startPrank(challenger);
|
|
bytes32[] memory challengeProof = new bytes32[](1);
|
|
challengeProof[0] = keccak256(abi.encodePacked("challenge"));
|
|
|
|
bool challengeResult = verifier.challengeSubmission(submissionId, challengeProof);
|
|
|
|
assertTrue(challengeResult, "Challenge should be accepted");
|
|
assertEq(
|
|
uint256(verifier.getSubmissionStatus(submissionId)),
|
|
uint256(IVerifier.VerificationStatus.Challenged),
|
|
"Submission status not updated after challenge"
|
|
);
|
|
vm.stopPrank();
|
|
}
|
|
|
|
function test_FinalizeSubmission() public {
|
|
vm.startPrank(submitter);
|
|
bytes32 contentHash = keccak256(abi.encodePacked("test content"));
|
|
bytes32[] memory proofData = new bytes32[](1);
|
|
proofData[0] = keccak256(abi.encodePacked("proof"));
|
|
|
|
uint256 challengePeriod = 1 days;
|
|
uint256 requiredStake = verifier.calculateRequiredStake(contentHash);
|
|
|
|
bytes32 submissionId = verifier.submitVerification{value: requiredStake}(
|
|
contentHash,
|
|
proofData,
|
|
challengePeriod
|
|
);
|
|
vm.stopPrank();
|
|
|
|
vm.warp(block.timestamp + challengePeriod + 1);
|
|
|
|
bool finalizeResult = verifier.finalizeSubmission(submissionId);
|
|
|
|
assertTrue(finalizeResult, "Submission should be finalized");
|
|
assertEq(
|
|
uint256(verifier.getSubmissionStatus(submissionId)),
|
|
uint256(IVerifier.VerificationStatus.Verified), |