-
Notifications
You must be signed in to change notification settings - Fork 0
/
token.sol
128 lines (93 loc) · 3.32 KB
/
token.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
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
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.4;
contract Energy{
// should have total supply
// transferrable
// name
// symbol
// decimal
// user balance
// burnable - burn function
uint constant totalSupply = 10000;
uint circulatingSuppy;
string constant name = "Energy";
string constant symbol = "ERG";
uint constant decimal = 1e18;
address owner;
mapping(address => uint) public _balance;
mapping (address => mapping(address => uint)) _allowance;
event tokenMint(address _to, uint amount);
event _transfer(address from, address to, uint amount);
modifier onlyOwner() {
require(owner == msg.sender, "No permission except to owner");
_;
}
modifier checkBalance(address _owner, uint amount) {
uint balance = balanceOfAddress(_owner);
require(balance >= amount, "Insufficient funds");
_;
}
constructor() {
owner = msg.sender;
}
function _name() pure public returns(string memory){
return name;
}
function _symbol() pure public returns(string memory){
return symbol;
}
function _decimal() pure public returns(uint){
return decimal;
}
function _totalSupply() pure public returns(uint){
return totalSupply;
}
function mint(uint amount, address _to) public onlyOwner returns(uint){
circulatingSuppy += amount;
require(circulatingSuppy <= totalSupply, "Total supply of token exceeded");
require(_to != address(0), "mint to address zero");
uint value = amount * decimal;
_balance[_to] += value;
emit tokenMint(_to, value);
return value;
}
function transfer(address _to, uint amount) external {
require(_to != address(0), "mint to address zero");
uint userBalance = _balance[msg.sender];
require(userBalance >= amount, "Insufficient fund");
uint burnableToken = _burn(amount);
uint transferrable = amount - burnableToken;
_balance[msg.sender] -= amount;
_balance[_to] += transferrable;
emit _transfer(msg.sender, _to, amount);
}
function _burn(uint amount) private returns(uint burnableToken){
burnableToken = calculateBurn(amount);
circulatingSuppy -= burnableToken/ decimal;
}
function calculateBurn(uint amount) public pure returns(uint burn){
burn = (amount * 10)/100;
}
function balanceOfAddress(address who) public view returns(uint) {
return _balance[who];
}
function approve(address spender, uint amount) external checkBalance(msg.sender, amount) {
require(spender != address(0));
uint allow = _allowance[msg.sender][spender];
if(allow == 0){
_allowance[msg.sender] [spender]= amount;
} else {
_allowance[msg.sender][spender] += amount;
}
}
function transferFrom(address from, address _to, uint amount) external checkBalance(from, amount){
require(_to == msg.sender, "Not an approved spender");
uint allowanceBalance = _allowance[from][_to];
require(allowanceBalance >= amount, "no allowance for you");
uint burnableToken = _burn(amount);
uint transferrable = amount - burnableToken;
_allowance[from][_to] -= transferrable;
_balance[from] -= amount;
_balance[_to] += amount;
}
}