Gas token của DuskEVM là DUSK với 18 chữ số thập phân, đừng quen kiểu dùng USDC 6 chữ số

tối ngày triển khai hợp đồng trên testnet, tôi làm theo trí nhớ “cơ bắp” của DeFi, truyền tham số transfer(addr, 1000000), định chuyển 1 DUSK nhưng node lại báo insufficient balance—trong khi ví rõ ràng có 15 DUSK test. Lục Blockscout mới giật mình: cả mainnet của DUSK lẫn DuskEVM đều dùng 18 chữ số thập phân (giống ETH), không phải 6 chữ số của USDC, cũng không phải 8 chữ số của một số token BEP-20. 1 DUSK = 1000000000000000000 đơn vị nhỏ nhất.

Cái bẫy này đặc biệt dễ dính khi viết code cho nhiều môi trường: trong Solidity, bạn đặt uint amount = 1 * 10**18 là đúng; nhưng ở frontend JavaScript nếu lấy theo ethers.parseUnits("1", 6) thì sẽ sai. Script Node đọc giá DUSK từ Binance REST (với quy ước báo giá 1 DUSK = x U) thì không sao, nhưng khi dựng giao dịch DuskEVM mà dùng 1e6 coi như 1 DUSK để đốt gas, kết quả là giao dịch bị về 0 và bạn vẫn trả base fee.

Rắc rối hơn là phần ước tính fee của DuskEVM chia thành hai khoản: L2 exec fee tính theo DUSK với 18 chữ số thập phân, và L1(DA) fee cũng trả bằng DUSK với 18 chữ số thập phân cho các nhà sản xuất DuskDS. Tôi deploy lần đầu trong Remix: sau khi điền gas limit xong, ở cột value lại nhầm điền 2000000 (coi như 2 DUSK). Thực tế chỉ là 0.000002 DUSK, thấp hơn base fee nên bị từ chối. Chuyển sang 2000000000000000000 (2e18) mới qua.

Biến bí mật được Hedger đánh dấu cũng tương tự: bạn @hedged uint256 shares thể hiện 1000 phần đại diện cho trái phiếu; vậy phải lưu 1000 * 10**18. Trước khi view key được giải mã, frontend formatUnits(18) sẽ hiển thị 1000—đừng dùng formatUnits(6) rồi nhìn nhầm thành 0.001.

Các bạn từ ERC-20 cắt sang, lô giao dịch đầu tiên có cũng bị “cắn” bởi chữ số thập phân như vậy không?
@Dusk $DUSK #dusk