# Bug transferUd bad value

**URL:** https://forum.duniter.org/t/bug-transferud-bad-value/13157
**Category:** ĞDev
**Created:** [30 June 2025 20:38 UTC](https://forum.duniter.org/t/bug-transferud-bad-value/13157 "2025-06-30T20:38:03Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [30 June 2025 20:38 UTC](https://forum.duniter.org/t/bug-transferud-bad-value/13157/1 "2025-06-30T20:38:03Z")

</div>

Je pense qu’il y a un bug avec l’extrinsic `universalDividend.transferUd` sur la Gdev.

Lorsque je transfer 1 DU, je transfer bien 1 DU.  
Mais si je transfer 5 DU, je transfer 2.027 DU.

Je ne vois aucun pattern qui pourrait expliquer une erreur dû aux milli-tokens, ou de conversion.  
Je vous laisse essayer de votre côté pour confirmer le problème.

Exemple:

![image](https://forum.duniter.org/uploads/default/original/2X/4/416d723f587926119adfab665c7979fec9caca82.png)

 ![image](https://forum.duniter.org/uploads/default/original/2X/4/41c80a6bf17a9093036980be32de2d7fee8352ec.png)

 ![image](https://forum.duniter.org/uploads/default/original/2X/0/082240cc2bdad7266d49583b91b9dcdec6c877a3.png)

→

[https://duniter-portal.axiom-team.fr/#/explorer/query/0x4044c82a969782b5423941bf04d2aec9bd3c9d2b3707cc6114a32cf30c15b3e8](https://duniter-portal.axiom-team.fr/#/explorer/query/0x4044c82a969782b5423941bf04d2aec9bd3c9d2b3707cc6114a32cf30c15b3e8)

 ![image](https://forum.duniter.org/uploads/default/original/2X/f/fb19d990961c508e08d5e6154415f1c0284f19ef.png)

`18446744073709551 / 9099406734269001 = 2,0272469`

Je n’ai pas encore investigué Duniter sur une chaine locale.  
Préférez-vous que j’ouvre un ticket ?

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [30 June 2025 20:54 UTC](https://forum.duniter.org/t/bug-transferud-bad-value/13157/2 "2025-06-30T20:54:37Z")

</div>

C’est encore un coup de la saturation&nbsp;:

`do_transfer_ud` fait `value.saturating_mul(ud_amount) / 1_000u32.into()`

or `(5000*9099406734269001).bit_length() == 66` donc la valeur est tronquée avant la division.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [30 June 2025 21:24 UTC](https://forum.duniter.org/t/bug-transferud-bad-value/13157/3 "2025-06-30T21:24:36Z")

</div>

Ne serait il pas possible de throw une erreur lors d’un débordement comme ça ? Même dans la pratique on ne devrait pas déborder, ça me parait bancale de tronquer silencieusement au lieux de throw quelque chose comme `DispatchError::Arithmetic(Overflow)`.

Je ne connais pas assez bien l’archi pour savoir où placer ce check exactement, mais je pense qu’il faudrait.

> **[EnsureMul in polkadot\_sdk\_frame::traits - Rust](https://docs.rs/polkadot-sdk-frame/latest/polkadot_sdk_frame/traits/trait.EnsureMul.html)**
>
> Performs multiplication that returns \`ArithmeticError\` instead of wrapping around on overflow.

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [1 July 2025 11:39 UTC](https://forum.duniter.org/t/bug-transferud-bad-value/13157/4 "2025-07-01T11:39:47Z")

</div>

Merci @poka pour ce rapport d’erreur et pour la suggestion. En effet, on peut utiliser `ensure_mul` ici car l’appel est faillible.

Je viens de créer un ticket : [transfer\_ud: use checked\_mul instead of saturating\_mul (#304) · Issues · nodes / rust / Duniter v2S · GitLab](https://git.duniter.org/nodes/rust/duniter-v2s/-/issues/304)

Nous (les développeurs qui travaillent avec Substrate) avons l’habitude d’utiliser `saturating_*` au lieu de `ensure_*` pour deux raisons :

- Certains aspects du runtime doivent être infaillibles (tout ce qui concerne l’exécution obligatoire).
- Dans la pratique, tous les projets Substrate utilisent `u128` comme type de solde, donc la saturation n’est jamais déclenchée.

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [11 July 2025 11:31 UTC](https://forum.duniter.org/t/bug-transferud-bad-value/13157/5 "2025-07-11T11:31:21Z")

</div>

Bug corrigé dans le runtime gtest-1000: [Resolve "transfer\_ud: use ensure\_mul instead of saturating\_mul" (!329) · Merge requests · nodes / rust / Duniter v2S · GitLab](https://git.duniter.org/nodes/rust/duniter-v2s/-/merge_requests/329)
