-
Notifications
You must be signed in to change notification settings - Fork 7
/
ERC20.sol
146 lines (130 loc) · 7.33 KB
/
ERC20.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
138
139
140
141
142
143
144
145
146
pragma solidity ^0.4.18;
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }
contract TokenERC20 {
// Общедоступные переменные маркера
string public name;
string public symbol;
//uint8 public decimals = 18;
uint8 public decimals;
// 18 десятичных знаков-настоятельно рекомендуется использовать по умолчанию, избегая его изменения
uint256 public totalSupply;
// Здесь создается массив со всеми балансами
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
// Это создает публичное событя на blockchain, которые будут уведомлять клиентов
event Transfer(address indexed from, address indexed to, uint256 value);
// Это уведомляет клиентов о сожженной сумме
event Burn(address indexed from, uint256 value);
/**
* Функция конструктора
*
* Инициализирует контракт с начальными маркерами поставок для создателя договора
*/
function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol, uint8 tokendecimals) public {
totalSupply = initialSupply * 10 ** uint256(decimals); // Обновить общее предложение с десятичной суммой
balanceOf[msg.sender] = totalSupply; // Отдаем создателю все начальные маркеры
name = tokenName; // Задайте имя для отображения
symbol = tokenSymbol; // Установить символ для отображения
decimals = tokendecimals;
}
/**
* Внутренняя передача, только может быть вызвана этим контрактом
*/
function _transfer(address _from, address _to, uint _value) internal {
require(_to != 0x0); // Предотвращение передачи по адресу 0x0. Вместо этого используйте burn()
require(balanceOf[_from] >= _value); // Проверка, достаточно ли у отправителя
require(balanceOf[_to] + _value > balanceOf[_to]); // Проверка на переполнение
uint previousBalances = balanceOf[_from] + balanceOf[_to]; // Сохранить для утверждения в будущем
balanceOf[_from] -= _value; // Вычитать из отправителя
balanceOf[_to] += _value; // Добавить то же самое к получателю
Transfer(_from, _to, _value);
assert(balanceOf[_from] + balanceOf[_to] == previousBalances); // Утверждает используются на использование статического анализа для поиска ошибок в коде. Они никогда не должны терпеть неудачу
}
/**
* Перенос маркеров
*
* Отправить маркеры "_value` на" _to` с вашего счета
*
* @param _to адрес получателя
* @param _value сумма для отправки
*/
function transfer(address _to, uint256 _value) public {
_transfer(msg.sender, _to, _value);
}
/**
* Перенос маркеров с другого адреса
*
* Отправьте маркеры ' _value` в `_to` от имени `_from`
*
* @param _from адрес отправителя
* @param _to адрес получателя
* @param _value сумма для отправки
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(_value <= allowance[_from][msg.sender]); // Check allowance
allowance[_from][msg.sender] -= _value;
_transfer(_from, _to, _value);
return true;
}
/**
* Установите норму для другого адреса
*
* Позволяет "_spender" тратить не более чем "_value" маркеры в вашем имени
*
* @param _spender адрес уполномоченного проводить
* @param _value максимальная сумма, которую они могут потратить
*/
function approve(address _spender, uint256 _value) public
returns (bool success) {
allowance[msg.sender][_spender] = _value;
return true;
}
/**
* Установить разрешение на другой адрес и уведомить
*
* Позволяет _spender тратить не более `пределах _value` маркеры в вашем имени, а потом пинг договор об этом
*
* @param _spender адрес уполномоченного проводить
* @param _value максимальная сумма, которую они могут потратить
* @param _extraData некоторую дополнительную информацию, чтобы отправить утвержденному договору
*/
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
public
returns (bool success) {
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
/**
* Уничтожение токенов
*
* Удалить мдокенов " _value` из системы необратимо
*
* @param _value количество токенов, чтобы сжечь
*/
function burn(uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value); // Проверьте, достаточно ли у отправителя
balanceOf[msg.sender] -= _value; // Вычитать из отправителя
totalSupply -= _value; // Обновления totalSupply
Burn(msg.sender, _value);
return true;
}
/**
* Уничтожение Токенов из другого аккаунта
*
* Удалить маркеры "_value" из системы необратимо от имени "_from".
*
* @param _from адрес отправителя * @парам пределах _value количество денег, чтобы сжечь
*/
function burnFrom(address _from, uint256 _value) public returns (bool success) {
require(balanceOf[_from] >= _value); // Проверьте, достаточно ли целевого баланса
require(_value <= allowance[_from][msg.sender]); // Check allowance
balanceOf[_from] -= _value; // Вычитать из основного баланса
allowance[_from][msg.sender] -= _value; // Вычитать из резерва отправителя
totalSupply -= _value; // Обновление totalSupply
Burn(_from, _value);
return true;
}
}