Перейти до основного вмісту

Перекази та схвалення токенів ERC-20 зі смарт-контракту Solidity

Смарт-контракти
токени, лексеми
мова програмування
erc-20
Середнячок
jdourlens
7 квітня 2020 р.
6 читається за хвилину

У попередньому посібнику ми вивчили анатомію токена ERC-20 на Solidity на блокчейні Ethereum. У цій статті ми розглянемо, як можна використовувати смарт-контракт для взаємодії з токеном за допомогою мови Solidity.

Для цього смарт-контракту ми створимо просту демонстраційну децентралізовану біржу, де користувач зможе обмінювати ефір на наш щойно розгорнутий токен ERC-20.

Для цього посібника ми використаємо код, який ми написали в попередньому посібнику, як основу. Наша DEX створить екземпляр контракту у своєму конструкторі та виконуватиме такі операції:

  • обмін токенів на ефір
  • обмін ефіру на токени

Розпочнемо код нашої децентралізованої біржі, додавши нашу просту кодову базу ERC20:

Наш новий смарт-контракт DEX розгорне ERC-20 і отримає всю пропозицію токенів:

Отже, тепер у нас є наша DEX, і вона має в наявності весь резерв токенів. Контракт має дві функції:

  • buy: користувач може надсилати ефір і отримувати токени в обмін
  • sell: користувач може надіслати токени, щоб отримати ефір назад

Функція buy

Напишемо код для функції buy. Спочатку нам потрібно буде перевірити кількість ефіру, яку містить повідомлення, і переконатися, що контракт володіє достатньою кількістю токенів, а також що повідомлення містить певну кількість ефіру. Якщо контракт володіє достатньою кількістю токенів, він надішле відповідну кількість токенів користувачеві та ініціює подію Bought.

Зверніть увагу, що якщо ми викликаємо функцію require, у разі помилки надісланий ефір буде негайно скасовано, а кошти повернуто користувачеві.

Для простоти ми просто обмінюємо 1 токен на 1 Wei.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "Ви повинні надіслати трохи ефіру");
    require(amountTobuy <= dexBalance, "Недостатньо токенів у резерві");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

У разі успішної купівлі ми повинні побачити дві події в транзакції: Transfer токена та подію Bought.

Дві події в транзакції: Transfer і Bought

Функція sell

Функція, що відповідає за продаж, спершу вимагатиме, щоб користувач схвалив суму, викликавши заздалегідь функцію approve. Схвалення переказу вимагає, щоб користувач викликав функцію на токені ERC20Basic, екземпляр якого було створено за допомогою DEX. Цього можна досягти, спершу викликавши функцію token() контракту DEX, щоб отримати адресу, за якою DEX розгорнув контракт ERC20Basic під назвою token. Потім ми створюємо екземпляр цього контракту в нашій сесії та викликаємо його функцію approve. Після цього ми зможемо викликати функцію sell контракту DEX і обміняти наші токени назад на ефір. Наприклад, ось як це виглядає в інтерактивній сесії brownie:

Потім, коли викликається функція sell, ми перевіримо, чи успішним був переказ з адреси викликаючого на адресу контракту, і після цього надішлемо ефір назад на адресу викликаючого.

function sell(uint256 amount) public {
    require(amount > 0, "Ви повинні продати хоча б кілька токенів");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Перевірте дозвіл на використання токенів");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

Якщо все спрацює, ви повинні побачити 2 події (Transfer і Sold) у транзакції, а також оновлення вашого балансу токенів та ефіру.

Дві події в транзакції: Transfer і Sold

З цього посібника ми дізналися, як перевіряти баланс і дозвіл токена ERC-20, а також як викликати Transfer і TransferFrom смарт-контракту ERC20 за допомогою інтерфейсу.

Після того, як ви здійсните транзакцію, у нас є посібник з JavaScript про те, як очікувати та отримувати відомості про транзакції (opens in a new tab), які були зроблені з вашим контрактом, а також посібник із декодування подій, згенерованих передачами токенів або будь-якими іншими подіями (opens in a new tab), за умови, що у вас є ABI.

Ось повний код для цього посібника:

Останнє оновлення сторінки: 3 березня 2026 р.

Цей посібник був корисним?