Lompat ke konten utama

Transfer dan persetujuan token ERC-20 dari kontrak pintar solidity

kontrak pintar
token
Solidity
erc-20
Menengah
jdourlens
7 April 2020
7 menit baca

Pada tutorial sebelumnya kita telah mempelajari anatomi token ERC-20 di Solidity pada blockchain Ethereum. Dalam artikel ini kita akan melihat bagaimana kita dapat menggunakan kontrak pintar untuk berinteraksi dengan token menggunakan bahasa Solidity.

Untuk kontrak pintar ini, kita akan membuat pertukaran terdesentralisasi tiruan yang nyata di mana pengguna dapat menukar ether dengan token ERC-20 kita yang baru saja disebarkan.

Untuk tutorial ini kita akan menggunakan kode yang kita tulis pada tutorial sebelumnya sebagai dasar. DEX kita akan membuat instansiasi kontrak di konstruktornya dan melakukan operasi:

  • menukar token menjadi ether
  • menukar ether menjadi token

Kita akan memulai kode pertukaran terdesentralisasi kita dengan menambahkan basis kode ERC20 sederhana kita:

Kontrak pintar DEX baru kita akan menyebarkan ERC-20 dan mendapatkan semua pasokan:

Jadi sekarang kita memiliki DEX kita dan ia memiliki semua cadangan token yang tersedia. Kontrak tersebut memiliki dua fungsi:

  • buy: Pengguna dapat mengirim ether dan mendapatkan token sebagai gantinya
  • sell: Pengguna dapat memutuskan untuk mengirim token untuk mendapatkan ether kembali

Fungsi buy

Mari kita kodekan fungsi buy. Pertama-tama kita perlu memeriksa jumlah ether yang terkandung dalam pesan dan memverifikasi bahwa kontrak memiliki cukup token dan bahwa pesan tersebut memiliki sejumlah ether di dalamnya. Jika kontrak memiliki cukup token, ia akan mengirimkan sejumlah token kepada pengguna dan memancarkan event Bought.

Perhatikan bahwa jika kita memanggil fungsi require jika terjadi kesalahan, ether yang dikirim akan langsung dibatalkan (revert) dan diberikan kembali kepada pengguna.

Agar tetap sederhana, kita hanya menukar 1 token dengan 1 Wei.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "You need to send some ether");
    require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

Jika pembelian berhasil, kita akan melihat dua event dalam transaksi: Transfer token dan event Bought.

Dua event dalam transaksi: Transfer dan Bought

Fungsi sell

Fungsi yang bertanggung jawab untuk penjualan pertama-tama akan mengharuskan pengguna untuk menyetujui jumlah tersebut dengan memanggil fungsi approve sebelumnya. Menyetujui transfer mengharuskan token ERC20Basic yang diinstansiasi oleh DEX dipanggil oleh pengguna. Hal ini dapat dicapai dengan terlebih dahulu memanggil fungsi token() dari kontrak DEX untuk mengambil alamat di mana DEX menyebarkan kontrak ERC20Basic yang disebut token. Kemudian kita membuat instansiasi dari kontrak tersebut di sesi kita dan memanggil fungsi approve-nya. Kemudian kita dapat memanggil fungsi sell dari DEX dan menukar token kita kembali menjadi ether. Sebagai contoh, seperti inilah tampilannya dalam sesi brownie interaktif:

Kemudian ketika fungsi sell dipanggil, kita akan memeriksa apakah transfer dari alamat pemanggil ke alamat kontrak berhasil dan kemudian mengirimkan Ether kembali ke alamat pemanggil.

function sell(uint256 amount) public {
    require(amount > 0, "You need to sell at least some tokens");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Check the token allowance");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

Jika semuanya berfungsi, Anda akan melihat 2 event (Transfer dan Sold) dalam transaksi dan saldo token serta saldo ether Anda diperbarui.

Dua event dalam transaksi: Transfer dan Sold

Dari tutorial ini kita melihat cara memeriksa saldo dan izin (allowance) dari token ERC-20 dan juga cara memanggil Transfer dan TransferFrom dari kontrak pintar ERC20 menggunakan antarmuka.

Setelah Anda melakukan transaksi, kami memiliki tutorial JavaScript untuk menunggu dan mendapatkan detail tentang transaksi (opens in a new tab) yang dilakukan ke kontrak Anda dan tutorial untuk memecahkan kode event yang dihasilkan oleh transfer token atau event lainnya (opens in a new tab) selama Anda memiliki ABI.

Berikut adalah kode lengkap untuk tutorial ini:

Pembaruan terakhir halaman: 3 Maret 2026

Apakah tutorial ini bermanfaat?