Production du DU

Je déterre ce sujet à l’intention des développeurs de clients v2s au cas où, car j’ai l’impression que le sujet est passé un peu sous le tapis des discutions récentes.
ping @vit @Moul @kimamila @vjrj entre autre :slight_smile:

Pour rappel, dans Duniter le balance free ne représente pas toujours le solde réel d’un compte membre.
Il faut y ajouter l’estimation (précise) des DU non réclamés.

Pour donner plus de corps à cette phrase, je vous montre ici les implémentation Dart et TypeScript que j’ai fais respectivement pour Ğecko et pour Duniter portal, si vous voulez vous en inspirer pour l’adapter à votre propre logique. L’important étant les appels storages nécessaires, ainsi que le _computeUnclaimUds en lui même (un peu tricky).

Dart

https://git.duniter.org/clients/gecko/-/blob/5db0c5f3948bb200c2f0bcbbb3d5d397292849b2/lib/providers/substrate_sdk.dart#L299-356

Ici le solde réel est donc transferableBalance.

TypeScript (React)

https://git.duniter.org/clients/duniter-portal/-/blob/6b2f9a26bee95e10106852229194ff0a0bb69b9e/packages/react-components/src/AddressInfo.tsx#L540-585

La balance totale étant donc utilisé plus loin:

SOMME(freeBalance, unclaimedUds, reservedBalance)

value={balancesAll ? (balancesAll.freeBalance || BN_ZERO).add(unclaimedUds || BN_ZERO).add(balancesAll.reservedBalance || BN_ZERO) : 1}

En pseudo code simplifié ça donne:

// Required storage calls
account = api.query.system.account(address)
idtyIndex = api.query.identity.identityIndexOf(address)
idtyData = api.query.identity.identities(idtyIndex)
pastReevals = api.query.universalDividend.pastReevals()
currentUdIndex = api.query.universalDividend.currentUdIndex()

// Get first eligible UD from identity
firstEligibleUd = idtyData.data.firstEligibleUd

// Compute unclaimed UDs
function computeUnclaimedUds(firstEligibleUd, pastReevals, currentUdIndex):
    IF firstEligibleUd == 0:
        RETURN 0
        
    total = 0
    index = currentUdIndex
    
    FOR [revalNbr, revalValue] IN reverse(pastReevals):
        IF revalNbr <= firstEligibleUd:
            count = index - firstEligibleUd
            total += count * revalValue
            BREAK
        ELSE:
            count = index - revalNbr
            total += count * revalValue
            index = revalNbr
            
    RETURN total

totalBalance = account.free + unclaimedUds


Je partage ça aussi dans l’idée de challenger mon algo, qu’il sorte de l’obscurité, j’ai hâte que d’autres clients implémentes ce calcul pour nous assurer de tomber sur les mêmes résultats, et voir si vous trouver un autre algo meilleur ou plus élégant.

6 Likes