What it does:
Facilitates secure, on-chain payments between students and peer tutors for tutoring sessions.
Why it matters:
Ensures tutors get paid promptly, provides transparent payment tracking, and reduces disputes over fees or attendance.
How it works:
Student books a tutoring session and deposits payment into the smart contract
Tutor confirms session completion on-chain
Smart contract releases payment to tutor automatically
If session is canceled or not completed, funds can be refunded to the student according to predefined rules
All bookings, confirmations, and payments are recorded immutably
Supports multiple tutors, sessions, and variable pricing
Dispute resolution can be handled via DAO or admin override
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title PeerTutoringPayment
* @author Nam
* @notice Secure P2P tutoring payments with automated release
*/
contract PeerTutoringPayment {
uint256 public sessionCount;
struct Session {
address student;
address payable tutor;
uint256 amount;
bool completed;
bool paid;
bool active;
}
mapping(uint256 => Session) public sessions;
// -------------------- EVENTS --------------------
event SessionBooked(uint256 indexed sessionId, address indexed student, address indexed tutor, uint256 amount);
event SessionCompleted(uint256 indexed sessionId, address indexed tutor);
event PaymentReleased(uint256 indexed sessionId, address indexed tutor, uint256 amount);
event SessionCancelled(uint256 indexed sessionId, address indexed student);
// -------------------- SESSION MANAGEMENT --------------------
function bookSession(address payable _tutor) external payable {
require(_tutor != address(0), "Invalid tutor");
require(msg.value > 0, "Payment required");
sessionCount += 1;
sessions[sessionCount] = Session({
student: msg.sender,
tutor: _tutor,
amount: msg.value,
completed: false,
paid: false,
active: true
});
emit SessionBooked(sessionCount, msg.sender, _tutor, msg.value);
}
function completeSession(uint256 _sessionId) external {
Session storage s = sessions[_sessionId];
require(msg.sender == s.tutor, "Not tutor");
require(s.active, "Session inactive");
require(!s.completed, "Already completed");
s.completed = true;
emit SessionCompleted(_sessionId, msg.sender);
}
function releasePayment(uint256 _sessionId) external {
Session storage s = sessions[_sessionId];
require(s.completed, "Session not completed");
require(!s.paid, "Already paid");
s.paid = true;
s.active = false;
s.tutor.transfer(s.amount);
emit PaymentReleased(_sessionId, s.tutor, s.amount);
}
function cancelSession(uint256 _sessionId) external {
Session storage s = sessions[_sessionId];
require(msg.sender == s.student, "Not student");
require(!s.paid, "Already paid");
require(s.active, "Session inactive");
s.active = false;
payable(s.student).transfer(s.amount);
emit SessionCancelled(_sessionId, msg.sender);
}
// -------------------- FUNDING RECEIVED --------------------
receive() external payable {}
}
Build and Grow By Nam Le Thanh