Газ-токен DuskEVM — это DUSK с 18 знаками после запятой. Не используйте привычку с USDC на 6 знаков.
В день деплоя контракта в testnet я, следуя мышечной памяти DeFi, передал параметры как transfer(addr, 1000000), чтобы перевести 1 DUSK. Но нода вернула ошибку insufficient balance — хотя в кошельке было 15 test DUSK. Лишь посмотрев на Blockscout, я понял: и в основной сети DUSK, и в DuskEVM используется 18-значная дробная часть (как у ETH), а не 6 у USDC и не 8 у некоторых BEP-20. 1 DUSK = 1000000000000000000 (минимальная единица).
На этом очень легко споткнуться при написании кода в разных окружениях: в Solidity строка uint amount = 1 * 10**18 — верная, но если в фронтенде JS сделать ethers.parseUnits("1", 6), то будет ошибка. Скрипт на Node читает цену DUSK из REST Binance (единица котировки 1 DUSK = x U) — тут всё нормально, но при сборке транзакции DuskEVM значение value, если принять 1e6 за 1 DUSK, сожжётся как gas и фактически обнулится — транзакция уйдёт, но базовую комиссию всё равно спишут.
Ещё сложнее с оценкой комиссии DuskEVM: она состоит из двух частей — L2 exec fee считается в DUSK с 18 знаками, и L1(DA) fee тоже в DUSK с 18 знаками, выплачивается продюсерам DuskDS. Когда в Remix я впервые заполнял gas limit, поле value я ошибочно указал 2000000 (как 2 DUSK). В реальности это было 0.000002 DUSK — меньше base fee, поэтому транзакцию отклонили. Только после замены на 2000000000000000000 (2e18) всё прошло.
То же самое и с отмеченными Hedger секретными переменными: вы @hedged uint256 shares, которые означают 1000 долей облигаций. Нужно хранить 1000 * 10**18. Пока key не будет раскрыт, фронтенд форматирует и отображает 1000, но нельзя считать, что это formatUnits(6) и увидеть 0.001.
Вы из ERC-20 переходили — первая транзакция тоже не была укушена дробными разрядами?
@Dusk $DUSK #dusk
В день деплоя контракта в testnet я, следуя мышечной памяти DeFi, передал параметры как transfer(addr, 1000000), чтобы перевести 1 DUSK. Но нода вернула ошибку insufficient balance — хотя в кошельке было 15 test DUSK. Лишь посмотрев на Blockscout, я понял: и в основной сети DUSK, и в DuskEVM используется 18-значная дробная часть (как у ETH), а не 6 у USDC и не 8 у некоторых BEP-20. 1 DUSK = 1000000000000000000 (минимальная единица).
На этом очень легко споткнуться при написании кода в разных окружениях: в Solidity строка uint amount = 1 * 10**18 — верная, но если в фронтенде JS сделать ethers.parseUnits("1", 6), то будет ошибка. Скрипт на Node читает цену DUSK из REST Binance (единица котировки 1 DUSK = x U) — тут всё нормально, но при сборке транзакции DuskEVM значение value, если принять 1e6 за 1 DUSK, сожжётся как gas и фактически обнулится — транзакция уйдёт, но базовую комиссию всё равно спишут.
Ещё сложнее с оценкой комиссии DuskEVM: она состоит из двух частей — L2 exec fee считается в DUSK с 18 знаками, и L1(DA) fee тоже в DUSK с 18 знаками, выплачивается продюсерам DuskDS. Когда в Remix я впервые заполнял gas limit, поле value я ошибочно указал 2000000 (как 2 DUSK). В реальности это было 0.000002 DUSK — меньше base fee, поэтому транзакцию отклонили. Только после замены на 2000000000000000000 (2e18) всё прошло.
То же самое и с отмеченными Hedger секретными переменными: вы @hedged uint256 shares, которые означают 1000 долей облигаций. Нужно хранить 1000 * 10**18. Пока key не будет раскрыт, фронтенд форматирует и отображает 1000, но нельзя считать, что это formatUnits(6) и увидеть 0.001.
Вы из ERC-20 переходили — первая транзакция тоже не была укушена дробными разрядами?
@Dusk $DUSK #dusk