Desimal token ERC-20: ubah saldo mentah menjadi jumlah yang terbaca
Bilangan bulat besar dari kontrak bisa berarti jumlah token yang kecil. Periksa satuannya sebelum membandingkan saldo dompet.
Untuk mengubah saldo mentah ERC-20 menjadi jumlah token yang terbaca, bagi bilangan bulat dengan 10 pangkat jumlah desimal token yang terverifikasi. Lakukan hanya jika nilai masih berupa satuan dasar mentah. Dompet atau explorer mungkin sudah mengonversinya.
Misalnya, saldo mentah 1234567 dengan 6 desimal berarti 1.234567 token. Bilangan bulat mentah yang sama dengan 18 desimal berarti 0.000000000001234567 token. Kedua hasil itu tidak menyatakan nilai dolar. Ini contoh hitungan hipotetis, bukan saldo yang diambil dari dompet.
Apa yang diubah desimal saat membaca saldo
Metode balanceOf kontrak ERC-20 mengembalikan bilangan bulat. Spesifikasi ERC-20 menjelaskan decimals sebagai skala untuk menyajikan jumlah token kepada pengguna. Anggap bilangan bulat sebagai hitungan satuan pencatatan terkecil token, sementara desimal menentukan letak titik desimal pada tampilan.
Perhitungannya:
Jumlah token yang terbaca = bilangan bulat mentah dibagi (10 pangkat jumlah desimal).
Dalam artikel ini, semua bilangan bulat mentah ditulis dalam basis 10 tanpa pemisah ribuan. Nilai heksadesimal yang diawali 0x harus didekode menjadi bilangan bulat dahulu. Huruf dan angka dalam pengodean tersebut bukan jumlah token desimal yang dapat langsung disalin ke pembagian ini.
Berikut bilangan bulat hipotetis yang sama dengan tiga skala berbeda:
| Bilangan bulat mentah | Desimal | Jumlah token |
|---|---|---|
1234567 |
6 | 1.234567 |
1234567 |
18 | 0.000000000001234567 |
1234567 |
0 | 1234567 |
Dengan 0 desimal, pembaginya 1. Dengan 6 desimal, satu token utuh setara dengan 1000000 satuan mentah. Dengan 18, setara dengan 1000000000000000000 satuan mentah. Besar bilangan bulat saja tidak memberi tahu skala mana yang berlaku.
Pastikan skala sebelum menghitung
Mulai dari jaringan dan alamat lengkap kontrak token. Simbol adalah label, bukan pengenal unik. Jika Anda belum yakin mana alamat token dan mana alamat pemegangnya, baca dahulu panduan alamat dompet dan kontrak token.
Gunakan informasi deployment resmi proyek untuk jaringan itu guna memastikan identitas kontrak. Lalu periksa hasil decimals yang hanya membaca data melalui explorer atau pembaca kontrak tepercaya. Catat hasil bersama kontrak dan jaringannya. Metadata dari deployment lain tidak memastikan skala untuk kepemilikan Anda.
Jangan mengisi nilai desimal yang hilang dengan 18. ERC-20 menjadikan metode ini opsional. Referensi ERC20 OpenZeppelin mendokumentasikan nilai bawaan 18 pada implementasinya, yang dapat diganti. Nilai bawaan implementasi bukan aturan universal token. Referensi yang sama menjelaskan bahwa desimal digunakan untuk format tampilan; desimal tidak mengubah perhitungan saldo dan transfer bilangan bulat pada kontrak.
Jika pembacaan gagal, bedakan sumber yang tidak tersedia dari kontrak yang tidak menyediakan metadata yang bisa digunakan. Coba sumber tepercaya untuk deployment yang sama atau periksa dokumentasi implementasinya. Jika skala tetap belum dapat dipastikan, simpan bilangan bulat mentah dan tandai jumlah terbaca sebagai belum terselesaikan. Angka yang terlihat masuk akal bukan konversi terverifikasi.
Periksa apakah angka sudah diformat
Sebelum memakai rumus, baca label kolom dan dokumentasi sumber. Hasil kontrak mentah, jumlah yang dinormalisasi API, dan tampilan dompet yang dibulatkan dapat menggambarkan kepemilikan yang sama secara berbeda. Titik desimal mengisyaratkan pemformatan, tetapi ketiadaannya tidak membuktikan nilai masih mentah: jumlah yang diformat bisa tepat 2 token.
Untuk token hipotetis dengan 6 desimal, nilai mentah 2500000 menjadi 2.5 token. Jika dompet sudah menampilkan 2.5 token, membagi angka tampilan itu dengan 1000000 menghasilkan 0.0000025, konversi kedua yang salah.
Setelah memperoleh jumlah token yang tepat, terapkan pembulatan tampilan secara terpisah. Nilai mentah 1 dengan 6 desimal adalah 0.000001 token. Antarmuka yang dibatasi 4 angka di belakang titik dapat menampilkan 0.0000. Label yang dibulatkan itu tidak memastikan saldo kosong. Simpan hasil presisi agar dapat diperiksa saat menelusuri selisih, tanpa menciptakan angka signifikan tambahan melampaui presisi sumber.
Untuk skrip atau spreadsheet, pertahankan bilangan bulat mentah sebagai teks atau bilangan bulat eksak sampai tahap pemformatan. Bilangan bulat besar dapat kehilangan presisi dalam Number JavaScript biasa, sebagaimana dijelaskan referensi bilangan bulat aman MDN; pembagian tidak bisa mengembalikan presisi yang sudah hilang. Dokumentasi ethers v6 menyediakan formatUnits, yang mengembalikan string desimal. Masukkan desimal terverifikasi secara eksplisit dan pertahankan string itu alih-alih mengubahnya menjadi angka yang tidak presisi demi kemudahan.
Cocokkan dua pembacaan tanpa memindahkan token
Gunakan satu kepemilikan untuk pemeriksaan. Membaca data kontrak publik tidak membutuhkan transfer, persetujuan, frasa pemulihan, atau tanda tangan dompet.
- Tetapkan identitas. Catat jaringan, alamat publik pemegang, dan kontrak token yang terverifikasi. Jangan mengganti alamat pemegang dengan alamat kontrak saat membaca saldo.
- Catat pengamatan. Simpan waktu dan nomor blok jika tersedia. Utamakan pembacaan dari blok yang sama; jika tidak, transfer di antara pengamatan bisa membuat keduanya tidak cocok persis.
- Beri label masukan. Simpan nilai asli, apakah mentah atau sudah diformat, dan bukti desimal kontrak. Jika sumber tidak menjelaskan satuannya, hentikan konversi di sana.
- Skalakan sekali. Konversikan bilangan bulat mentah memakai desimal tersebut, dengan mempertahankan digit eksak sebelum pembulatan tampilan. Biarkan jumlah yang sudah diberikan dalam satuan token apa adanya.
- Bandingkan satuan yang sama. Bandingkan jumlah token itu dengan jumlah token di layar lain pada presisi yang sebanding. Untuk nol hasil pembulatan, minta rincian sebelum menyimpulkan saldo mentahnya nol.
- Tangani selisih yang tersisa. Jika identitas, cuplikan pengamatan, dan satuan cocok tetapi jumlah masih berbeda, catat kedua pembacaan dan sumbernya. Jika sumber gagal, tandai pembacaan tidak tersedia alih-alih memasukkan nol. Panduan selisih portofolio membahas respons sumber yang hilang, harga, dan cakupan posisi.
Hasil yang berguna adalah catatan yang dapat direproduksi orang lain: kontrak mana, saldo siapa, pengamatan mana, berapa nilai mentahnya, berapa desimalnya, dan berapa jumlah hasil konversinya. Transaksi bukan bagian dari pembuktian konversi.
Pisahkan jumlah token dari nilai
Pemformatan memberi Anda hitungan token ini. Perkiraan dolar juga membutuhkan harga untuk aset yang tepat itu, dengan mata uang dan waktu yang dinyatakan. Desimal tidak memastikan harga, likuiditas perdagangan, atau keamanan kontrak. Token yang tidak dikenal dapat mengembalikan nilai desimal yang sepenuhnya biasa.
Token tanda terima atau token pembungkus menambahkan pertanyaan lain: berapa banyak aset dasar yang diwakili setiap token? Mengonversi saldo mentahnya menghasilkan jumlah token tanda terima atau token pembungkus. Nilai setara aset dasar membutuhkan metode konversi dan satuan dari protokol terkait. Desimal token tidak dapat menggantikan rasio pertukaran tersebut, dan rasio protokol seperti faktor kesehatan membutuhkan skala tersendiri yang didokumentasikan.
Jika angka masih terlihat salah, pertahankan hal yang memang belum diketahui. Desimal yang tidak diketahui membuat jumlah terbaca belum terselesaikan. Jumlah yang diketahui dengan harga yang tidak diketahui membuat penilaian belum terselesaikan. Menyatakan celah ini secara jelas memberi pemeriksaan berikutnya yang berguna tanpa mengubah kepemilikan yang sedang ingin Anda pahami.
Pertanyaan umum
Apakah semua token ERC-20 menggunakan 18 desimal?
Tidak. Implementasi ERC20 OpenZeppelin memakai nilai bawaan 18, tetapi standar ERC-20 tidak mewajibkannya. Metode decimals juga opsional. Pastikan jumlah desimal untuk kontrak dan jaringan yang tepat sebelum mengonversi saldo mentah.
Haruskah jumlah yang ditampilkan dompet dibagi lagi sesuai desimal token?
Hanya nilai yang didokumentasikan sebagai satuan dasar mentah yang perlu diskalakan. Dompet mungkin sudah menampilkan jumlah token yang terbaca. Membagi lagi jumlah yang sudah diformat membuatnya salah; pastikan dahulu satuan kolom yang Anda baca.
Apakah tampilan nol membuktikan saldo token saya kosong?
Tidak. Tampilan dapat membulatkan jumlah positif yang kecil menjadi nol. Periksa jumlah yang lebih presisi atau saldo mentah dengan desimal terverifikasi. Pembacaan saldo mentah yang berhasil dan bernilai nol berbeda dari pembacaan yang tidak tersedia.