2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
Practical - 7
Aim: Consider a scenario of developing a smart contract between a teacher and a student
for
     assignment submission. Implement important functions that you would include in your
      smart contract.
Code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract TeacherStudentAssignment {
  address public teacher;
  struct Assignment {
     uint id;
     string title;
     string description;
     uint deadline;
     bool isActive;
  }
  struct Submission {
     string content;
     uint submitTime;
     uint grade;
     bool isGraded;
  }
  // Assignments storage
  uint public Total_assignments;
  mapping(uint => Assignment) public assignments;
  // Submissions: assignmentId => studentAddress => Submission
  mapping(uint => mapping(address => Submission)) public submissions;
  // Track which assignments have been submitted by which students
  mapping(uint => address[]) private assignmentStudents;
  // Constructor
  constructor() {
     teacher = msg.sender;
     Total_assignments = 0;
  }
  modifier onlyTeacher() {
    require(msg.sender == teacher, "Only teacher can perform this action");
    _;
  }
22012011052                   U.V.Patel College of Engineering                Karan Yadav
2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
  // Create a new assignment
  function createAssignment(string memory _title, string memory _description, uint
_daysToSubmit)
     public
     onlyTeacher
  {
     uint deadline = block.timestamp + (_daysToSubmit * 1 days);
      assignments[Total_assignments] = Assignment({
         id: Total_assignments,
         title: _title,
         description: _description,
         deadline: deadline,
         isActive: true
      });
      Total_assignments++;
  }
  // Get all available assignments (that haven't been submitted by the calling student)
  function S_Available_Assignments() public view returns (
     uint[] memory ids,
     string[] memory titles,
     uint[] memory deadlines
  ){
     // Count active assignments that haven't been submitted by this student
     uint availableCount = 0;
     for (uint i = 0; i < Total_assignments; i++) {
        if (assignments[i].isActive &&
           submissions[i][msg.sender].submitTime == 0) {
           availableCount++;
        }
     }
      // Create result arrays
      ids = new uint[](availableCount);
      titles = new string[](availableCount);
      deadlines = new uint[](availableCount);
      // Fill result arrays
      uint index = 0;
      for (uint i = 0; i < Total_assignments; i++) {
         if (assignments[i].isActive &&
            submissions[i][msg.sender].submitTime == 0) {
            ids[index] = assignments[i].id;
            titles[index] = assignments[i].title;
            deadlines[index] = assignments[i].deadline;
            index++;
         }
      }
22012011052                    U.V.Patel College of Engineering                           Karan Yadav
2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
      return (ids, titles, deadlines);
  }
  // Teacher views all assignments (active and inactive)
  function T_AllAssignments() public view onlyTeacher returns (
     uint[] memory ids,
     string[] memory titles,
     uint[] memory deadlines,
     bool[] memory active
  ){
     ids = new uint[](Total_assignments);
     titles = new string[](Total_assignments);
     deadlines = new uint[](Total_assignments);
     active = new bool[](Total_assignments);
      for (uint i = 0; i < Total_assignments; i++) {
         ids[i] = assignments[i].id;
         titles[i] = assignments[i].title;
         deadlines[i] = assignments[i].deadline;
         active[i] = assignments[i].isActive;
      }
      return (ids, titles, deadlines, active);
  }
  // Student submits an assignment
  function submitAssignment(uint _assignmentId, string memory _content) public {
     require(_assignmentId < Total_assignments, "Assignment does not exist");
     require(assignments[_assignmentId].isActive, "Assignment is not active");
     require(block.timestamp <= assignments[_assignmentId].deadline, "Deadline has passed");
     require(submissions[_assignmentId][msg.sender].submitTime == 0, "You have already
submitted this assignment");
      // Add student to the list of submitters for this assignment
      assignmentStudents[_assignmentId].push(msg.sender);
      submissions[_assignmentId][msg.sender] = Submission({
         content: _content,
         submitTime: block.timestamp,
         grade: 0,
         isGraded: false
      });
  }
  // Teacher views pending submissions that need grading
  function T_PendingSubmissionsforGrade() public view onlyTeacher returns (
     uint[] memory assignmentIds,
     address[] memory students,
     string[] memory assignmentTitles
  ){
     // Count all ungraded submissions
     uint totalPending = 0;
22012011052                       U.V.Patel College of Engineering                Karan Yadav
2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
      for (uint i = 0; i < Total_assignments; i++) {
         for (uint j = 0; j < assignmentStudents[i].length; j++) {
            address student = assignmentStudents[i][j];
            if (!submissions[i][student].isGraded) {
               totalPending++;
            }
         }
      }
      // Create result arrays
      assignmentIds = new uint[](totalPending);
      students = new address[](totalPending);
      assignmentTitles = new string[](totalPending);
      // fill result
      uint index = 0;
      for (uint i = 0; i < Total_assignments; i++) {
          for (uint j = 0; j < assignmentStudents[i].length; j++) {
             address student = assignmentStudents[i][j];
             if (!submissions[i][student].isGraded) {
                assignmentIds[index] = i;
                students[index] = student;
                assignmentTitles[index] = assignments[i].title;
                index++;
             }
          }
      }
      return (assignmentIds, students, assignmentTitles);
  }
  // Teacher grades a submission
  function gradeAssignment(uint _assignmentId, address _student, uint _grade) public
onlyTeacher {
     require(_assignmentId < Total_assignments, "Assignment does not exist");
     require(_grade <= 100, "Grade must be between 0 and 100");
      Submission storage submission = submissions[_assignmentId][_student];
      require(submission.submitTime > 0, "No submission found for this student");
      require(!submission.isGraded, "Submission already graded");
      submission.grade = _grade;
      submission.isGraded = true;
  }
  // Student views for their own submissions (both graded and ungraded)
  function S_MySubmissions() public view returns (
     uint[] memory assignmentIds,
     string[] memory assignmentTitles,
     bool[] memory isGraded,
     uint[] memory grades
22012011052                      U.V.Patel College of Engineering                   Karan Yadav
2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
    ){
      uint submissionCount = 0;
      for (uint i = 0; i < Total_assignments; i++) {
         if (submissions[i][msg.sender].submitTime > 0) {
            submissionCount++;
         }
      }
        assignmentIds = new uint[](submissionCount);
        assignmentTitles = new string[](submissionCount);
        isGraded = new bool[](submissionCount);
        grades = new uint[](submissionCount);
        uint index = 0;
        for (uint i = 0; i < Total_assignments; i++) {
           if (submissions[i][msg.sender].submitTime > 0) {
              assignmentIds[index] = i;
              assignmentTitles[index] = assignments[i].title;
              isGraded[index] = submissions[i][msg.sender].isGraded;
              grades[index] = submissions[i][msg.sender].grade;
              index++;
           }
        }
        return (assignmentIds, assignmentTitles, isGraded, grades);
    }
}
Output:
Creating Assignment by Teacher:
22012011052                      U.V.Patel College of Engineering      Karan Yadav
2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
Submitting Assignment by Student:
Grading Submitted Assignments by Teacher:
22012011052               U.V.Patel College of Engineering   Karan Yadav
2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
Conclusion:
This smart contract creates a transparent and efficient system for managing academic assignments.
Teachers can create and grade assignments while tracking student submissions, and students can
view available tasks and their graded work. The blockchain-based approach ensures submission
timestamps are accurate and grades remain tamper-proof. This demonstrates how smart contracts
can streamline educational workflows while maintaining accountability for both teachers and
students.
22012011052                   U.V.Patel College of Engineering                      Karan Yadav