-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtutoring.sol
93 lines (74 loc) · 3.3 KB
/
tutoring.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract TuitionSystem {
address public owner;
uint256 public constant MAX_STUDENTS = 1000;
uint256 public constant MAX_CLASSES_PER_WEEK = 20;
uint256 public constant MIN_CLASSES_PER_WEEK = 5;
uint256 public constant MIN_CLASSES_ATTENDED = 3;
uint256 public constant MAX_SUBJECTS = 5;
uint256 public constant TUITION_FEE = 600;
uint256 public constant TUTOR_PAYMENT = 500;
uint256 public constant BATCH_DURATION = 12 weeks;
enum Subject { Mathematics, Physics, ComputerScience, Economics, Management }
struct Student {
address payable studentAddress;
uint256[] subjects;
uint256 classesAttended;
}
struct Tutor {
address payable tutorAddress;
uint256[] subjects;
uint256 classesTaught;
}
mapping(address => Student) public students;
mapping(address => Tutor) public tutors;
mapping(uint256 => address[]) public studentBatch;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Only the owner can call this function");
_;
}
function enrollStudent(uint256[] memory _subjects) external payable {
require(studentBatch[getCurrentBatch()].length < MAX_STUDENTS, "Batch is full");
require(_subjects.length <= MAX_SUBJECTS, "Too many subjects");
require(_subjects.length > 0, "Please select at least one subject");
require(msg.value >= TUITION_FEE * MIN_CLASSES_ATTENDED, "Insufficient payment");
Student storage student = students[msg.sender];
student.studentAddress = payable(msg.sender);
student.subjects = _subjects;
student.classesAttended = 0;
studentBatch[getCurrentBatch()].push(msg.sender);
}
function becomeTutor(uint256[] memory _subjects) external {
require(_subjects.length <= MAX_SUBJECTS, "Too many subjects");
require(_subjects.length > 0, "Please select at least one subject");
Tutor storage tutor = tutors[msg.sender];
tutor.tutorAddress = payable(msg.sender);
tutor.subjects = _subjects;
tutor.classesTaught = 0;
}
function startClass(address _student, uint256 _subject) external onlyOwner {
require(students[_student].studentAddress != address(0), "Student not found");
require(studentBatch[getCurrentBatch()].length > 0, "No students in the batch");
require(_subject < MAX_SUBJECTS, "Invalid subject index");
students[_student].classesAttended++;
}
function endClass(address _tutor, uint256 _subject) external onlyOwner {
require(tutors[_tutor].tutorAddress != address(0), "Tutor not found");
require(_subject < MAX_SUBJECTS, "Invalid subject index");
tutors[_tutor].classesTaught++;
}
function payTutor(address _tutor) external onlyOwner {
require(tutors[_tutor].tutorAddress != address(0), "Tutor not found");
require(tutors[_tutor].classesTaught > 0, "No classes taught");
payable(_tutor).transfer(TUTOR_PAYMENT * tutors[_tutor].classesTaught);
tutors[_tutor].classesTaught = 0;
}
function getCurrentBatch() public view returns (uint256) {
return block.timestamp / BATCH_DURATION;
}
receive() external payable {}
}