-
Notifications
You must be signed in to change notification settings - Fork 0
/
erc.sol
137 lines (119 loc) · 3.3 KB
/
erc.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
129
130
131
132
133
134
135
136
137
// Compatible with version
// of compiler upto 0.7.0
pragma solidity ^0.6.6;
// Creating a Contract
contract GFGToken
{
// Table to map addresses
// to their balance
mapping(address => uint256) balances;
// Mapping owner address to
// those who are allowed to
// use the contract
mapping(address => mapping (
address => uint256)) allowed;
// totalSupply
uint256 _totalSupply = 500;
// owner address
address public owner;
// Triggered whenever
// approve(address _spender, uint256 _value)
// is called.
event Approval(address indexed _owner,
address indexed _spender,
uint256 _value);
// Event triggered when
// tokens are transferred.
event Transfer(address indexed _from,
address indexed _to,
uint256 _value);
// totalSupply function
function totalSupply()
public view returns (
uint256 theTotalSupply)
{
theTotalSupply = _totalSupply;
return theTotalSupply;
}
// balanceOf function
function balanceOf(address _owner)
public view returns (
uint256 balance)
{
return balances[_owner];
}
// function approve
function approve(address _spender,
uint256 _amount)
public returns (bool success)
{
// If the adress is allowed
// to spend from this contract
allowed[msg.sender][_spender] = _amount;
// Fire the event "Approval"
// to execute any logic that
// was listening to it
emit Approval(msg.sender,
_spender, _amount);
return true;
}
// transfer function
function transfer(address _to,
uint256 _amount)
public returns (bool success)
{
// transfers the value if
// balance of sender is
// greater than the amount
if (balances[msg.sender] >= _amount)
{
balances[msg.sender] -= _amount;
balances[_to] += _amount;
// Fire a transfer event for
// any logic that is listening
emit Transfer(msg.sender,
_to, _amount);
return true;
}
else
{
return false;
}
}
/* The transferFrom method is used for
a withdraw workflow, allowing
contracts to send tokens on
your behalf, for example to
"deposit" to a contract address
and/or to charge fees in sub-currencies;*/
function transferFrom(address _from,
address _to,
uint256 _amount)
public returns (bool success)
{
if (balances[_from] >= _amount &&
allowed[_from][msg.sender] >=
_amount && _amount > 0 &&
balances[_to] + _amount > balances[_to])
{
balances[_from] -= _amount;
balances[_to] += _amount;
// Fire a Transfer event for
// any logic that is listening
emit Transfer(_from, _to, _amount);
return true;
}
else
{
return false;
}
}
// Check if address is allowed
// to spend on the owner's behalf
function allowance(address _owner,
address _spender)
public view returns (uint256 remaining)
{
return allowed[_owner][_spender];
}
}