What it does:
Allows students, educators, or institutions to raise funds for educational projects, scholarships, or course development on-chain.
Why it matters:
Enables transparent fundraising, reduces intermediaries, builds trust between backers and recipients, and ensures funds are used as intended.
How it works:
Campaign creator sets up a crowdfunding project with funding goal, deadline, and purpose
Backers contribute funds directly to the contract
Smart contract tracks contributions and ensures total does not exceed goal
Funds are released to the recipient when the funding goal is met
If funding goal is not reached by the deadline, contributors can claim refunds
Contribution and withdrawal history are fully auditable on-chain
Can integrate with scholarships, tuition, or learn-to-earn contracts for automated disbursement
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title EducationCrowdfunding
* @author Nam
* @notice Decentralized platform for funding educational projects
*/
contract EducationCrowdfunding {
struct Campaign {
address payable recipient;
string description;
uint256 goal;
uint256 pledged;
uint256 deadline;
bool completed;
bool refunded;
}
uint256 public campaignCount;
mapping(uint256 => Campaign) public campaigns;
mapping(uint256 => mapping(address => uint256)) public contributions;
// -------------------- EVENTS --------------------
event CampaignCreated(uint256 indexed campaignId, address indexed recipient, uint256 goal, uint256 deadline);
event ContributionMade(uint256 indexed campaignId, address indexed backer, uint256 amount);
event FundsReleased(uint256 indexed campaignId, uint256 amount);
event RefundIssued(uint256 indexed campaignId, address indexed backer, uint256 amount);
// -------------------- CAMPAIGN MANAGEMENT --------------------
function createCampaign(address payable _recipient, string calldata _description, uint256 _goal, uint256 _duration) external {
require(_recipient != address(0), "Invalid recipient");
require(_goal > 0, "Goal must be >0");
require(_duration > 0, "Duration must be >0");
campaignCount += 1;
campaigns[campaignCount] = Campaign({
recipient: _recipient,
description: _description,
goal: _goal,
pledged: 0,
deadline: block.timestamp + _duration,
completed: false,
refunded: false
});
emit CampaignCreated(campaignCount, _recipient, _goal, block.timestamp + _duration);
}
function contribute(uint256 _campaignId) external payable {
Campaign storage c = campaigns[_campaignId];
require(block.timestamp 0, "Contribution must be >0");
require(!c.completed, "Campaign completed");
c.pledged += msg.value;
contributions[_campaignId][msg.sender] += msg.value;
emit ContributionMade(_campaignId, msg.sender, msg.value);
if (c.pledged >= c.goal) {
c.completed = true;
c.recipient.transfer(c.pledged);
emit FundsReleased(_campaignId, c.pledged);
}
}
function claimRefund(uint256 _campaignId) external {
Campaign storage c = campaigns[_campaignId];
require(block.timestamp > c.deadline, "Campaign still active");
require(!c.completed, "Campaign successful");
uint256 amount = contributions[_campaignId][msg.sender];
require(amount > 0, "No contribution");
contributions[_campaignId][msg.sender] = 0;
payable(msg.sender).transfer(amount);
emit RefundIssued(_campaignId, msg.sender, amount);
}
receive() external payable {}
}
Build and Grow By Nam Le Thanh