Создание контракта ERC20: пример Solidity и объяснение кода

Вот пример того, как создать контракт ERC20 в Solidity — языке программирования, используемом для смарт-контрактов Ethereum:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ERC20 {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalSupply
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalSupply;
        balanceOf[msg.sender] = _totalSupply;
    }
    function transfer(address _to, uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value, "Insufficient balance");
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
        return true;
    }
    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) public returns (bool success) {
        require(balanceOf[_from] >= _value, "Insufficient balance");
        require(allowance[_from][msg.sender] >= _value, "Not allowed to transfer");
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        allowance[_from][msg.sender] -= _value;
        emit Transfer(_from, _to, _value);
        return true;
    }
}

Это базовая реализация контракта ERC20, которая включает в себя основные функции для обработки передачи токенов. Контракт включает переменные name, symbol, decimalsи totalSupply, представляющие основные свойства токена. Он также включает сопоставление balanceOfдля отслеживания баланса каждого адреса и сопоставление allowanceдля отслеживания утвержденных сумм перевода.

Контракт обеспечивает три основные функции:

  1. перенос: позволяет пользователям передавать токены со своего адреса на другой адрес.
  2. approve: позволяет пользователям одобрить другой адрес для траты токенов от их имени.
  3. transferFrom: позволяет утвержденному адресу передавать токены от имени владельца токена.

Эти функции создают события (Transferи Approval) для уведомления внешних приложений о передаче и утверждении токенов.