Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 54 additions & 1 deletion src/academic-learning/TaskBounty.sol
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,10 @@ contract TaskBounty {
* @param _taskId ID of the task to submit solution for
* @param _solution The proposed solution
*/
function submitSolution(uint256 _taskId, string calldata _solution)
function submitSolution(
uint256 _taskId,
string calldata _solution
)
external
taskExists(_taskId)
taskActive(_taskId)
Expand All @@ -128,4 +131,54 @@ contract TaskBounty {

emit SolutionSubmitted(_taskId, submissionId, msg.sender, _solution);
}

/**
* @dev Accept a solution and award the bounty
* @param _submissionId ID of the submission to accept
*/
function acceptSolution(uint256 _submissionId) external submissionExists(_submissionId) {
Submission storage submission = submissions[_submissionId];
uint256 taskId = submission.taskId;
Task storage task = tasks[taskId];

require(msg.sender == task.creator, "Only task creator can accept solutions");
require(task.isActive, "Task is not active");
require(!task.isCompleted, "Task is already completed");
require(!submission.isAccepted, "Submission already accepted");

// Update task
task.isCompleted = true;
task.solver = submission.submitter;
task.solution = submission.solution;
task.solvedAt = block.timestamp;

// Update submission
submission.isAccepted = true;

// Transfer reward to solver
if (task.reward > 0) {
payable(submission.submitter).transfer(task.reward);
}

emit BountyClaimed(taskId, _submissionId, submission.submitter, task.reward);
}

/**
* @dev Deactivate a task (only creator can do this)
* @param _taskId ID of the task to deactivate
*/
function deactivateTask(uint256 _taskId) external taskExists(_taskId) onlyTaskCreator(_taskId) {
Task storage task = tasks[_taskId];
require(task.isActive, "Task is already inactive");
require(!task.isCompleted, "Cannot deactivate completed task");

task.isActive = false;

// Refund reward to creator
if (task.reward > 0) {
payable(task.creator).transfer(task.reward);
}

emit TaskDeactivated(_taskId, msg.sender);
}
}