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 ![]()
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
Ici le solde réel est donc transferableBalance.
TypeScript (React)
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.