-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
138 lines (121 loc) · 4.29 KB
/
main.cpp
File metadata and controls
138 lines (121 loc) · 4.29 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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include "Blockchain.h"
#include "User.h"
#include <queue>
void registerUser() {
std::string username, password;
double initialBalance;
std::cout << "Enter new username: ";
std::cin >> username;
if (User::userExists(username)) {
std::cout << "User already exists.\n";
return;
}
std::cout << "Enter password: ";
std::cin >> password;
std::cout << "Enter initial balance: ";
std::cin >> initialBalance;
if (initialBalance < 0) {
std::cout << "Invalid Initial Balance!\n";
return;
}
User newUser(username, password, initialBalance);
newUser.saveToFile();
std::cout << "Registration successful!\n";
}
bool loginUser(std::string& loggedInUser) {
std::string username, password;
std::cout << "Enter username: ";
std::cin >> username;
std::cout << "Enter password: ";
std::cin >> password;
if (User::userExists(username)) {
User user = User::loadUser(username);
if (user.authenticate(password)) {
std::cout << "Login successful!\n";
loggedInUser = username;
return true;
}
}
std::cout << "Login failed. Incorrect username or password.\n";
return false;
}
void userAccount(Blockchain& blockchain, const std::string& sender) {
bool loggedIn = true;
while (loggedIn) {
int choice;
std::cout << "\n--- User Menu ---\n";
std::cout << "1. Check Balance\n";
std::cout << "2. Make a Transaction\n";
std::cout << "3. Logout\n";
std::cout << "Enter your choice: ";
std::cin >> choice;
if (choice == 1) {
User user = User::loadUser(sender);
std::cout << "Your balance is: " << user.getBalance() << "\n";
} else if (choice == 2) {
std::string receiver;
double amount;
std::cout << "Enter receiver username: ";
std::cin >> receiver;
std::cout << "Enter amount: ";
std::cin >> amount;
if(amount <= 0){
std::cout<<"Invalid amount!"<<std::endl;
}
else{
if (!User::userExists(receiver)) {
std::cout << "Receiver does not exist.\n";
} else {
User senderUser = User::loadUser(sender);
if(senderUser.getUsername() == User::loadUser(receiver).getUsername()){
std::cout<< "Invalid Transaction!"<<std::endl;
}
else{
if (senderUser.getBalance() >= amount) {
User receiverUser = User::loadUser(receiver);
blockchain.addBlock(sender, receiver, amount);
std::cout << "Transaction added and block mined!\n";
senderUser.updateBalance(-amount); // Deduct from sender
receiverUser.updateBalance(amount); // Credit to receiver
User::updateUserFile(senderUser); // Update both users in file
User::updateUserFile(receiverUser);
} else {
std::cout << "Insufficient balance.\n";
}
}
}
}
} else if (choice == 3) {
loggedIn = false;
}
}
}
int main() {
Blockchain blockchain;
std::string loggedInUser;
while (true) {
int choice;
std::cout << "\n--- Main Menu ---\n";
std::cout << "1. Register\n";
std::cout << "2. Login\n";
std::cout << "3. Print Blockchain\n";
std::cout << "4. Exit\n";
std::cout << "Enter your choice: ";
std::cin >> choice;
if (choice == 1) {
registerUser();
} else if (choice == 2) {
if (loginUser(loggedInUser)) {
userAccount(blockchain, loggedInUser);
}
} else if (choice == 3) {
blockchain.printBlockchain();
} else if (choice == 4) {
break;
} else {
std::cout << "Invalid choice, please try again.\n";
}
}
return 0;
}