Разбираем смарт-контракт Binance Coin

Binance

В этой статье рассмотрим код токена Binance Coin (BNB), принадлежащий популярной бирже Binance.

Биржа Binance создала в свое время токен Binance Coin, который со временем обрел большую популярность. Токен BNB создан в блокчейне Ethereum на Solidity версии 0.4.8. Токен соответствует стандарту ERC20, плюс имеет дополнительные функции: функции заморозки и разморозки токенов, функцию сжигания токенов, а также может хранить на своем адресе токены и эфиры и позволяет создателю выводить их. Состоит из двух контрактов-классов. Код токена можно посмотреть на Etherscan.io или ниже с комментариями.

Контракт SafeMath содержит безопасные математические операции от OpenZeppelin. Так как тип uint не умеет работать с отрицательными и дробными числами, в этих внутренних функций идет проверка на соответствие.

Контракт BNB наследует функции из контракта SafeMath. В современной реализации контракт SafeMath стал библиотекой и подключается как библиотека.

Здесь все понятно. Определяются переменные
name — имя токена;
symbol — символ;
decimals — кол-во нулей;
totalSupply — общее кол-во токенов;
owner — адрес создателя (владельца) токена.

Далее создаются стандартные ERC20-мэппинги balanceOf и allowance, а также дополнительный мэппинг freezeOf для хранения баланса замороженных токенов в виде адрес=> количество.

Далее определяются 4 события:
Transfer — запускается в случае успешного выполнения функции transfer;
Burn — запускается при сжигании токенов;
Freeze — запускается при заморозке токенов;
Unfreeze — запускается при разморозке токенов.

Конструктор BNB присваивает все создаваемые токены адресу создателя, устанавливает общее количество выпускаемых токенов, устанавливает имя, символ, кол-во нулей токена. А также присваивает переменной owner адрес создателя. Имя, символ, кол-во нулей и количество токенов не прописаны явно, а указываются при деплое как параметры конструктора.

Функцию transfer подробно описывал в статье про стандарт erc20. В современных версиях Solidity конструкция if() throw упразднена, вместо нее используется require(), применительно к проверке адреса это будет выглядеть так:

require(_to != address(0));

Про функцию делегирования токенов approve также подробно писал в статье Что такое токены стандарта ERC20, здесь повторяться не буду.

Пользователь может уничтожить часть или все токены на балансе своего адреса с помощью функции Burn. Регулярно можно слышать что Binance сжигает часть своих токенов, делает она это как раз с помощью этой функции. Раньше для сжигания токенов их просто отправляли на адрес 0x0000000000000000000000000000000000000000, при проверке этого адреса в Etherscan.io можно увидеть огромное количество токенов и эфиров на балансе, которые будут лежать там мертвым грузом вечно, так как ни у кого нет возможности списать их оттуда.

Функция берет параметром количество сжигаемых токенов, останавливается если баланс меньше указанного кол-ва сжигаемых токенов, останавливается если количество меньше равно нулю. Далее с помощью математической функции safeSub из контракта SafeMath уменьшает баланс токенов на указанное количество сжигаемых токенов, потом обновляет общее количество токенов в переменной totalSupply. После запускает событие Burn и возвращает true.

Функции freeze и unfreeze позволяют заморозить и разморозить часть или все токены.  Замороженные токены вычитаются из баланса пользователя balanceOf и записываются в мэппинг freezeOf. Замороженные токены нельзя переводить и сжигать. Разморозить токены можно с помощью функции unfreeze.

Наличие безымянной функции с модификатором payable позволяет хранить на адресе контракта эфиры и другие токены. С помощью функции withdrawEther создатель может перечислить на свой адрес эфиры и токены.

Читайте также:

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *