-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathReferralSystem.sol
More file actions
85 lines (64 loc) · 2.54 KB
/
Copy pathReferralSystem.sol
File metadata and controls
85 lines (64 loc) · 2.54 KB
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
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract ReferralSystem {
address public owner;
uint public rewardRate;
mapping(address => address) public referrerOf;
mapping(address => uint) public rewards;
event RewardRateUpdated(uint oldRate, uint newRate);
event UserReferred(address indexed user, address indexed referrer);
event RewardEarned(address indexed referrer, address indexed referee, uint amount);
event RewardWithdrawn(address indexed referrer, uint amount);
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Only owner can call this function");
_;
}
function setRewardRate(uint newRate) public onlyOwner {
uint oldRate = rewardRate;
rewardRate = newRate;
emit RewardRateUpdated(oldRate, newRate);
}
function register(address referrer) public{
require(referrer != address(0), "Invalid referrer");
require( referrer != msg.sender, "Cannot refer yourself");
require( referrerOf[msg.sender] == address(0), "Referrer already set");
referrerOf[msg.sender] = referrer;
emit UserReferred(msg.sender, referrer);
}
function makePurchase() public payable{
require(msg.value > 0, "Purchase amount must be greater than zero");
address referrer = referrerOf[msg.sender];
if(referrer !=address(0)){
uint reward = (msg.value * rewardRate) / 10000;
rewards[referrer] += reward;
emit RewardEarned(referrer, msg.sender, reward);
}
}
function withdrawRewards() public {
uint amount = rewards[msg.sender];
require(amount > 0, "No rewards to withdraw");
rewards[msg.sender] = 0;
payable(msg.sender).transfer(amount); // ✅ Send Ether
emit RewardWithdrawn(msg.sender, amount);
}
function deposit() public payable onlyOwner {
require(msg.value > 0, "Deposit amount must be greater than zero");
}
function withdrawAll() public onlyOwner {
uint balance = address(this).balance;
require(balance > 0, "No funds to withdraw");
payable(owner).transfer(balance);
}
function getContractBalance() public view returns (uint) {
return address(this).balance;
}
function getReferrer(address user) public view returns(address){
return referrerOf[user];
}
function getRewardBalance(address referrer) public view returns(uint){
return rewards[referrer];
}
}