Commit 0ec6617
committed
fix(indexer): remove duplicate soroban indexer service and make withdrawnAmount idempotent (#802)
The legacy sorobanIndexerService and SorobanEventWorker were running
concurrently, both polling STREAM_CONTRACT_ID. Since handleTokensWithdrawn
performed a READ-then-ADD on withdrawnAmount across separate transactions,
the same WITHDRAWN event could be applied twice on indexer replay, inflating
withdrawnAmount and shrinking the recipient's claimable balance.
This fix ensures idempotency via two strategies:
1. Remove the legacy soroban-indexer.service.ts and its bootstrap in index.ts
so only SorobanEventWorker polls the contract.
2. Make handleTokensWithdrawn idempotent by checking for the existing
StreamEvent (transactionHash, WITHDRAWN) *before* mutating withdrawnAmount.
If the event is a duplicate, return early without applying the balance
increment or broadcasting a duplicate SSE notification.
The StreamEvent.upsert with its unique constraint serves as the final safety
net: concurrent replays will fail the insert and roll back the transaction,
preventing double-application of the balance.
Added regression tests asserting:
- Only SorobanEventWorker remains wired into server bootstrap
- The same WITHDRAWN event is not double-incremented
- Duplicate events do not trigger duplicate SSE broadcasts1 parent 7e0cea5 commit 0ec6617
5 files changed
Lines changed: 203 additions & 318 deletions
File tree
- backend
- src
- services
- workers
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | 4 | | |
6 | 5 | | |
7 | 6 | | |
| |||
29 | 28 | | |
30 | 29 | | |
31 | 30 | | |
32 | | - | |
33 | 31 | | |
34 | 32 | | |
35 | 33 | | |
| |||
41 | 39 | | |
42 | 40 | | |
43 | 41 | | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
| 42 | + | |
50 | 43 | | |
51 | 44 | | |
52 | 45 | | |
| |||
This file was deleted.
| 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 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
640 | 645 | | |
641 | | - | |
642 | | - | |
643 | | - | |
644 | | - | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
645 | 649 | | |
646 | | - | |
647 | | - | |
648 | | - | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
649 | 657 | | |
650 | | - | |
651 | | - | |
652 | | - | |
653 | | - | |
654 | | - | |
655 | | - | |
656 | | - | |
657 | | - | |
658 | | - | |
659 | | - | |
660 | | - | |
661 | | - | |
662 | | - | |
663 | | - | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
664 | 671 | | |
665 | | - | |
666 | | - | |
667 | | - | |
668 | | - | |
669 | | - | |
670 | | - | |
671 | | - | |
672 | | - | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
673 | 678 | | |
674 | 679 | | |
675 | 680 | | |
| |||
0 commit comments