[Backend] handleTokensWithdrawn increments withdrawnAmount before the dedup guard - replay/reset double-counts and corrupts claimable
Les mainteneurs répondent en général sous 7 jours
Évaluation
Cette issue n'a pas encore été évaluée.
Description
Telegram (ask questions / claim the issue here first): https://t.me/+DOylgFv1jyJlNzM0
Labels: bug, backend, Stellar Wave, database, critical
The withdrawn-amount update runs before the dedup check, so replaying events under-pays recipients.
soroban-event-worker.ts:631-641 computes newWithdrawnAmount = BigInt(stream.withdrawnAmount) + BigInt(amount) and calls tx.stream.update unconditionally. The dedup check at line 643 only guards inserting the StreamEvent row, not the financial field. So when the admin POST /v1/admin/indexer/replay resets the cursor and re-polls the same ledgers, every replay adds amount again even though the StreamEvent row is skipped. withdrawnAmount inflates, claimable shrinks, and the recipient is short-changed. The replay endpoint's Swagger doc even claims it's idempotent.
What the fix has to hold to
- The stream's
withdrawnAmountonly changes when theStreamEventrow is newly created, in the same transaction - Replay/reset is genuinely idempotent
Done when
-
withdrawnAmountupdate is idempotent (mutate only on a newStreamEventinsert, same tx) - Test processes the same
tokens_withdrawnevent twice and assertswithdrawnAmountchanges once -
handleStreamCancelled/handleStreamCompletedaudited to confirm they stay idempotent - Tests + lint pass, CI green
Where to start
backend/src/workers/soroban-event-worker.ts for the ordering fix; indexerService.ts and admin.routes.ts are listed for the replay path and audit. On-chain event schema is out of scope. Medium.
- Langage dominant
- TypeScript
- Étoiles
- 18
- Forks
- 250
- Merge moyen
- 5 j 6 h
- PR mergées (30 j)
- 82
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de LabsCrypt/flowfi
-
backend points: 150 testing
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 7 jours
-
backend points: 150 testing
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 7 jours
-
backend points: 150 testing
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 7 jours
-
backend points: 150 testing
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 7 jours
-
backend points: 150 testing
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 7 jours
Toutes les issues de LabsCrypt/flowfi
Issues similaires
-
area:desktop bug documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
anthropics/claude-code#104801 ·
Les mainteneurs répondent en général sous 1 jour
-
Add: Halloween Non Stop SDOuvertecheck:passed streams:add
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
spudly/design-system#110 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: REST API URL starting with "http" but no scheme (e.g. httpbin.org/get) is not given an http:// prefixPeut-être pris @ItsDeadlyProgrammer l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
appsmithorg/appsmith#42471 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours