Commit 61b41ae
jadonamite
fix(indexer): make handleTokensWithdrawn idempotent under replay (#802)
handleTokensWithdrawn incremented withdrawnAmount before the dedup guard,
which only protected the StreamEvent insert. The admin POST
/v1/admin/indexer/replay resets the cursor and re-polls processed ledgers,
so every replay re-added `amount` even though the event row was skipped —
inflating withdrawnAmount and shrinking the recipient's claimable balance.
- check the (txHash, WITHDRAWN) dedup guard first and return early on replay,
so the financial field is only mutated for a newly-seen event
- insert the StreamEvent before the stream.update inside the same transaction;
the unique (transactionHash, eventType) constraint makes a concurrent replay
roll back the whole transaction, so withdrawnAmount can't be double-applied
- add a worker test that processes the same tokens_withdrawn event twice and
asserts withdrawnAmount changes only once
handleStreamCancelled/handleStreamCompleted audited: both set withdrawnAmount
to an absolute value, so they remain idempotent under replay.1 parent ed02dc6 commit 61b41ae
2 files changed
Lines changed: 88 additions & 22 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
623 | 623 | | |
624 | 624 | | |
625 | 625 | | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
626 | 640 | | |
627 | 641 | | |
628 | 642 | | |
| |||
632 | 646 | | |
633 | 647 | | |
634 | 648 | | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
635 | 664 | | |
636 | 665 | | |
637 | 666 | | |
638 | 667 | | |
639 | 668 | | |
640 | 669 | | |
641 | 670 | | |
642 | | - | |
643 | | - | |
644 | | - | |
645 | | - | |
646 | | - | |
647 | | - | |
648 | | - | |
649 | | - | |
650 | | - | |
651 | | - | |
652 | | - | |
653 | | - | |
654 | | - | |
655 | | - | |
656 | | - | |
657 | | - | |
658 | | - | |
659 | | - | |
660 | | - | |
661 | | - | |
662 | | - | |
663 | | - | |
664 | 671 | | |
665 | 672 | | |
666 | 673 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
159 | 159 | | |
160 | 160 | | |
161 | 161 | | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
162 | 221 | | |
163 | 222 | | |
164 | 223 | | |
| |||
0 commit comments