dossinstitute / sidequest

Apache License 2.0
0 stars 0 forks source link

Content Creator Quest #4

Open Fr0z0n3 opened 2 weeks ago

Fr0z0n3 commented 2 weeks ago

Content Creator Quest

Title: Solidity Contract for Content Creator Quest on "Vibe to Earn" Platform

Description: Develop a Solidity contract to handle the Content Creator Quest, where users can submit blog posts, videos, or social media threads about a Web3 topic or their event experience. The contract will manage content submissions, a review process by admins for quality control, and distribution of token rewards and featured placement for selected content.

Acceptance Criteria

  1. Contract Deployment
    • The contract should be deployable on the Ethereum blockchain.
    • The contract should initialize with zero content submissions and a set reward amount.
  2. Content Submission
    • Users should be able to submit content with a title, description, and content URL.
    • Each submission should have a unique identifier.
    • A mapping should store submissions with their associated submitter’s address.
  3. Content Review Process
    • Admins should be able to review and approve or reject submissions.
    • Submissions should have a status indicating whether they are pending, approved, or rejected.
  4. Reward Distribution
    • The contract should allow the admin to distribute rewards to approved submissions.
    • Token rewards should be transferred to the address of the approved content submitter.
    • Approved content should be flagged for featured placement.
  5. Admin Functions
    • Only the admin should be able to review submissions, change their status, and distribute rewards.
    • The admin should be able to set the reward amount.
  6. Events
    • Events should be emitted for content submission, approval, rejection, and reward distribution.

Solidity Contract

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ContentCreatorQuest {
    struct Submission {
        uint id;
        address submitter;
        string title;
        string description;
        string contentURL;
        SubmissionStatus status;
    }

    enum SubmissionStatus { Pending, Approved, Rejected }

    address public admin;
    uint public rewardAmount;
    uint public submissionCount;
    mapping(uint => Submission) public submissions;

    event SubmissionReceived(uint id, address submitter, string title, string description, string contentURL);
    event SubmissionReviewed(uint id, SubmissionStatus status);
    event RewardDistributed(uint id, address submitter, uint rewardAmount);

    modifier onlyAdmin() {
        require(msg.sender == admin, "Only admin can perform this action");
        _;
    }

    constructor(uint _rewardAmount) {
        admin = msg.sender;
        rewardAmount = _rewardAmount;
        submissionCount = 0;
    }

    function submitContent(string memory _title, string memory _description, string memory _contentURL) public {
        submissionCount++;
        submissions[submissionCount] = Submission({
            id: submissionCount,
            submitter: msg.sender,
            title: _title,
            description: _description,
            contentURL: _contentURL,
            status: SubmissionStatus.Pending
        });

        emit SubmissionReceived(submissionCount, msg.sender, _title, _description, _contentURL);
    }

    function reviewSubmission(uint _submissionId, SubmissionStatus _status) public onlyAdmin {
        require(submissions[_submissionId].id != 0, "Submission does not exist");
        submissions[_submissionId].status = _status;

        emit SubmissionReviewed(_submissionId, _status);

        if (_status == SubmissionStatus.Approved) {
            address submitter = submissions[_submissionId].submitter;
            payable(submitter).transfer(rewardAmount);

            emit RewardDistributed(_submissionId, submitter, rewardAmount);
        }
    }

    function setRewardAmount(uint _rewardAmount) public onlyAdmin {
        rewardAmount = _rewardAmount;
    }

    // Function to receive Ether
    receive() external payable {}
}

Test Cases

  1. Deployment:
    • Deploy the contract and verify the admin, rewardAmount, submissionCount, and initial state of submissions.
  2. Content Submission:
    • Submit content and verify the submission is stored with correct details and a unique identifier.
    • Emit SubmissionReceived event.
  3. Review Process:
    • Admin reviews a submission and changes its status to Approved or Rejected.
    • Emit SubmissionReviewed event.
    • If Approved, distribute reward and emit RewardDistributed event.
  4. Reward Distribution:
    • Ensure rewards are transferred to the submitter's address upon approval.
    • Verify the submitter receives the correct reward amount.
  5. Admin Functions:
    • Set a new reward amount.
    • Ensure only the admin can perform review and reward distribution actions.
  6. Edge Cases:
    • Test behavior when attempting to review a non-existent submission.
    • Ensure the contract handles multiple submissions and reviews correctly.
    • Verify no rewards are distributed for rejected or pending submissions.

This contract will enable the "Vibe to Earn" platform to incentivize content creators, ensuring a fair review process and proper reward distribution for high-quality contributions.

wvwatson commented 2 weeks ago

points: 1, 2, 3, 5, 8, 13, 21

@russlive215 5 @Fr0z0n3 3 @noireconnect2024 2 @wvwatson 5 @tierra-d 8

points: 5

Fr0z0n3 commented 1 week ago

-The contract must capture Instagram posts, X Tweet, or Threads. -Make Admin approval optional

@russlive215