Мой первый смарт-контракт: создание токена ERC-20

Это четвертый пост из серии «Мой первый смарт-контракт», цель которой — научить за семь недель некоторым концепциям solidity, пока мы не создадим токен на основе ERC-20 с некоторыми модульными тестами.

В этом посте мы разберемся, что такое токены ERC-20, и создадим собственный токен ERC-20.

Инструменты

Мы продолжим использовать Remix IDE для создания наших контрактов.dd

Что такое токены ERC-20?

Это стандартная основа для разработки токенов, используемая в сети Ethereum для облегчения создания новых криптовалют.
Это один из самых используемых стандартов в мире криптоактивов, и сегодня на его основе создано несколько токенов.

ERC-20 имеет 6 обязательных функций, несколько необязательных и 2 обязательных события.

Если вы хотите узнать больше о ERC-20, нажмите здесь

В этом посте мы реализуем некоторые из этих функций и событий.

Как создать токен ERC-20?

Как и другие языки программирования, solidity имеет интерфейс, который представляет собой набор процедур и шаблонов, установленных программой для использования ее возможностей приложениями, которые не собираются использовать ее функции, а просто используют ее как базу для создания своих функций.
Существует несколько способов реализации интерфейса в Solidity, но в этом посте мы создадим наш интерфейс внутри нашего файла.

Если вы хотите узнать больше об интерфейсах в твердом теле, нажмите здесь

Создание нового файла

Давайте создадим новый файл в папке contracts под названием 03-token.sol.

Внутри файла 03-token.sol мы объявим лицензии нашего контракта, версию контракта и дадим контракту имя, как мы уже делали, но теперь мы объявим наш интерфейс ERC-20, мы создадим наш интерфейс с именем IERC20 это хорошая практика начинать наши интерфейсы с I, чтобы мы знали, что это интерфейс каждый раз, когда мы смотрим на него.

Внутри IERC20 мы объявим обязательные функции и события контракта.


interface IERC20 {
  function totalSupply() external view returns(uint256);
  function balanceOf(address account) external view returns(uint256);
  function transfer(address to, uint256 quantity) external returns(bool);

  event Transfer(address from, address to, uint256 value);
}
Войдите в полноэкранный режим Выход из полноэкранного режима
  • Функции:
  • События:

Чтобы использовать интерфейс в контракте, мы должны поставить is перед именем контракта и именем интерфейса, который мы хотим использовать.
Изначально наш контракт будет выглядеть следующим образом с интерфейсом IERC20:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

interface IERC20 {
  function totalSupply() external view returns(uint256);
  function balanceOf(address account) external view returns(uint256);
  function transfer(address to, uint256 quantity) external returns(bool);

  event Transfer(address from, address to, uint256 value);
}

contract CryptoToken is IERC20{

}
Войдите в полноэкранный режим Выход из полноэкранного режима

Если вы хотите узнать, какие внешние функции есть в solidity, нажмите здесь

Организация кода

Не существует правильного способа структурировать код наших контрактов, но для простоты понимания мы будем использовать следующий шаблон:

  1. Свойства: Здесь мы определяем наши переменные;
  2. Constructor: где мы определяем наш конструктор;
  3. Общественные функции: Здесь мы определяем наши общественные функции;

Переменные

Давайте начнем с того, что дадим имя нашему токену, его символ и сколько десятичных знаков он будет иметь.

//Properties
string public constant name = "CryptoToken";
string public constant symbol = "CRY";
uint8 public constant decimals = 18;
Войдите в полноэкранный режим Выход из полноэкранного режима

Мы определим наши переменные как constant, потому что константные переменные имеют свои значения, присвоенные во время компиляции, после компиляции изменить их невозможно.
Мы делаем это для того, чтобы невозможно было изменить имя, символ и десятичные знаки нашего токена.

Давайте создадим переменную для хранения общего количества существующих токенов и связку, которая будет хранить количество токенов для каждого адреса.

uint256 public totalSupply;

mapping (address => uint256) public addressToBalance;
Войдите в полноэкранный режим Выход из полноэкранного режима

Конструктор

Теперь создадим наш конструктор, который определит, что totalsupply получит общее количество токенов и что адрес, который выполнил развертывание, получит все эти токены изначально.

//Constructor
constructor(uint256 total) {
  totalsupply = total;
  addressToBalance[msg.sender] = totalsupply;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Общественные функции

Всего жетонов

Давайте создадим публичную функцию totalSupply, которая возвращает общее количество существующих токенов.

//Public Functions
function totalSupply() public override view returns(uint256) {
  return totalsupply;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Нам нужно объявить, что эта функция является override, потому что она переопределяет класс интерфейса IERC20, который был объявлен в начале кода.

Если вы хотите узнать, какие функции переопределения есть в solidity, нажмите здесь

Баланс адреса

Чтобы узнать баланс заданного адреса, создадим публичную функцию balanceOf, которая возвращает баланс заданного адреса.
Он ожидает параметр, который является адресом пользователя, баланс которого мы хотим узнать.

function balanceOf(address account) public override view returns(uint256) {
  return addressToBalance[account];
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Передача токенов

Для передачи токенов создадим публичную функцию transfer, которая принимает два параметра: адрес пользователя, которому мы хотим передать токены, и количество токенов, которое мы хотим передать.

function transfer(address to, uint256 quantity) public returns(bool) {
  require(addressToBalance[msg.sender] >= quantity, "Insufficient Balance to Transfer");

  addressToBalance[msg.sender] = addressToBalance[msg.sender] - quantity;
  addressToBalance[to] = addressToBalance[to] + quantity;

  emit Transfer(msg.sender, to, quantity);
  return true;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Как выглядит наш код

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

interface IERC20 {
  function totalSupply() external view returns(uint256);
  function balanceOf(address account) external view returns(uint256);
  function transfer(address to, uint256 quantity) external returns(bool);

  event Transfer(address from, address to, uint256 value);
}

contract CryptoToken is IERC20 {

  //Properties
  string public constant name = "CryptoToken";
  string public constant symbol = "CRY";
  uint8 public constant decimals = 7;  //Padrão do Ether é 18
  uint256 private totalsupply;

  mapping(address => uint256) private addressToBalance;

  //Constructor
  constructor(uint256 total) {
    totalsupply = total;
    addressToBalance[msg.sender] = totalsupply;
  }

  //Public Functions
  function totalSupply() public override view returns(uint256) {
    return totalsupply;
  }

  function balanceOf(address account) public override view returns(uint256) {
    return addressToBalance[account];
  }

  function transfer(address to, uint256 quantity) public override returns(bool) {
    require(addressToBalance[msg.sender] >= quantity, "Insufficient Balance to Transfer");


    addressToBalance[msg.sender] = addressToBalance[msg.sender] - quantity;
    addressToBalance[to] = addressToBalance[to] + quantity;

    emit Transfer(msg.sender, to, quantity);
    return true;
  }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Руки на

Теперь давайте скомпилируем и развернем наш контракт 03-token.sol.

  1. В левом боковом меню нажмите на «Solidity compiler».

  2. Нажмите на кнопку «Compile 03-token.sol».

  3. В левом боковом меню нажмите «Развернуть & запустить транзакции».

  4. Введите начальное количество токенов и нажмите кнопку «Развернуть».

  5. Нажмите на стрелку, чтобы увидеть функции нашего договора.

  6. Мы можем проверить десятичные знаки нашего токена, имя токена, символ токена и общее количество токенов.

  7. Скопируйте адрес развернутого кошелька и нажмите на «balanceOf», чтобы узнать, сколько токенов находится на этом адресе.

  8. Изменить адрес.

  9. Скопируйте адрес этого кошелька и нажмите на «balanceOf», чтобы увидеть количество токенов, которыми располагает этот адрес.

  10. Вернитесь на адрес, где вы развернули контракт, и сообщите адрес кошелька, который мы скопировали, количество токенов, которое мы хотим отправить, и нажмите на функцию «транзакция».

  11. Снова проверьте количество жетонов с адреса, с которого мы только что осуществили перевод.

Заключение

Это был четвертый пост из серии постов «Мой первый смарт-контракт».
Если вы выполнили все вышеперечисленные действия, то теперь у вас есть контракт на токен ERC-20, который может определять имя токена, символ токена, десятичные знаки токена, видеть общее количество существующих токенов, проверять баланс токена по адресу, создавать токены и передавать токены.

Если вам понравился этот материал и он вам чем-то помог, оставьте лайк, чтобы помочь контенту охватить больше людей.

Ссылки

ERC20 & EIP-20
Что такое токены ERC-20?
ERC-20: что это такое и как это работает?
Стандарты токенов


Ссылка на репозиторий

https://github.com/viniblack/meu-primeiro-smart-contract

Давайте обменяемся идеями?

Не стесняйтесь звонить мне, чтобы обменяться идеями, вот мои контакты.

https://www.linkedin.com/in/viniblack/

Оцените статью
devanswers.ru
Добавить комментарий