Hanya untuk tujuan edukasi; bukan merupakan nasihat investasi atau rekomendasi investasi. Investasi dapat mengakibatkan kerugian.
Jawaban langsung
Kondisi balapan persetujuan ERC-20 dapat terjadi ketika pemilik mengganti satu allowance bukan nol dengan allowance bukan nol lainnya melalui pemanggilan approve(spender, newAmount). Pihak pembelanja dapat melihat perubahan yang masih tertunda, menggunakan allowance lama terlebih dahulu dengan transferFrom, lalu menggunakan allowance pengganti setelah perubahan tersebut dikonfirmasi.
Karena itu, spesifikasi ERC-20 menyarankan agar antarmuka klien terlebih dahulu menetapkan allowance ke 0 sebelum menetapkan nilai baru untuk pihak pembelanja yang sama. Setiap transaksi harus dikonfirmasi secara berurutan. Jika suatu token mendukungnya, pemanggilan atomik increaseAllowance atau decreaseAllowance menghindari penggantian langsung atas allowance bukan nol.
Menyelesaikan tinjauan ini tidak membuktikan suatu aset, transaksi, atau sistem aman.
Cara kerjanya
ERC-20 mendefinisikan approve sebagai penimpaan nilai: approve(spender, amount) yang berhasil akan menetapkan allowance pihak pembelanja menjadi amount. Secara terpisah, transferFrom(owner, recipient, amount) memungkinkan pihak pembelanja tersebut memindahkan token milik pemilik dan biasanya mengurangi allowance yang tersisa. Transaksi yang tertunda tidak menetapkan urutan eksekusi, sehingga pihak pembelanja dapat mengirim transfer yang dieksekusi sebelum perubahan persetujuan milik pemilik.
Transisi yang berisiko adalah N -> M, dengan N > 0 dan M > 0. Jika pihak pembelanja menghabiskan N sebelum persetujuan pengganti dieksekusi, persetujuan yang dieksekusi kemudian akan memasang allowance baru sebesar M. Karena itu, jumlah maksimum yang dibelanjakan dalam rangkaian tersebut dapat mencapai N + M, bergantung pada saldo token pemilik dan implementasi token.
Contoh
Alice telah menyetujui sebuah protokol untuk membelanjakan 100 token. Ia mengirim approve(protocol, 50) dengan tujuan menurunkan allowance yang tersisa menjadi 50. Sebelum transaksi itu dikonfirmasi, pihak pembelanja protokol mengirim transferFrom(Alice, recipient, 100) dan membuatnya dieksekusi lebih dahulu. Persetujuan Alice kemudian menetapkan allowance menjadi 50, yang dapat digunakan pihak pembelanja dalam transfer lain. Kedua transfer tersebut berjumlah 150 token.
Alur penggantian yang lebih aman adalah approve(protocol, 0), menunggu konfirmasi, memeriksa allowance dan saldo yang dihasilkan, lalu hanya mengirim approve(protocol, 50) jika persetujuan baru masih sesuai. Jika pihak pembelanja menggunakan allowance lama sebelum transaksi pengosongan dikonfirmasi, Alice dapat melihat perubahan saldo tersebut dan berhenti sebelum memberikan allowance baru sebesar 50.
Risiko
- Menetapkan allowance ke
0tidak membatalkan pembelanjaan yang sudah dieksekusi dan tidak mencegah penggunaan allowance lama sebelum transaksi pengosongan dikonfirmasi. - Mengirim persetujuan pengosongan dan penggantian secara bersamaan tanpa menunggu konfirmasi pertama akan menimbulkan kembali risiko urutan transaksi.
increaseAllowancedandecreaseAllowancebukan bagian dari standar dasar ERC-20; gunakan hanya jika kontrak token terverifikasi mendukungnya.- Allowance tanpa batas dapat mengekspos seluruh saldo token pemilik selama masih aktif. Verifikasi jaringan, kontrak token, pihak pembelanja, dan jumlah sebelum menandatangani.
- Beberapa token memiliki perilaku persetujuan yang tidak standar. Baca simulasi dompet dan calldata transaksi, lalu konfirmasikan allowance on-chain setelah setiap langkah.
Kesalahpahaman umum
- “Transaksi persetujuan terbaru langsung menggantikan yang lama.” Transaksi tersebut baru mengubah status ketika dieksekusi on-chain.
- “Menurunkan allowance membatasi total pembelanjaan mendatang sebesar nilai baru.” Pihak pembelanja dapat menggunakan allowance lama sebelum perubahan dieksekusi.
- “Mengosongkan terlebih dahulu menjamin tidak ada lagi token yang dapat keluar.” Allowance lama tetap dapat digunakan sampai transaksi pengosongan dikonfirmasi.
- “Setiap ERC-20 memiliki
increaseAllowancedandecreaseAllowance.” Keduanya merupakan ekstensi opsional, bukan persyaratan ERC-20. - “Mencabut koneksi situs web berarti mencabut persetujuan token.” Status koneksi dompet dan allowance on-chain dalam kontrak token merupakan hal yang terpisah.
Topik terkait
- Cara membedakan token kanonis dan wrapped
- Mempool
- Risiko tanda tangan Permit2
- Order reduce-only
- Persetujuan dompet
Sumber
- ERC-20: Token Standard - Ethereum Improvement Proposals (diakses: 2026-08-20)
- ERC20 | OpenZeppelin Docs - OpenZeppelin (diakses: 2026-08-20)