Commit ac9be2d
committed
fix: Winner backward compat + O(1) claim_prize lookup
Two findings from Almanax review:
1. Winner deserialization on upgrade (High): reputation_bump was
added as a non-optional u32, which would brick reads of old on-chain
Winner entries after upgrade. Changed to Option<u32> — old entries
deserialize as None (treated as 0), new entries store Some(x).
2. Linear winner scan in claim_prize (Medium): claim_prize scanned all
winners to find the anchor row, approaching budget limits at higher
winner counts. Added DataKey::WinnerIndex stored at selection time
for O(1) lookup in claim_prize.
- Winner.reputation_bump: u32 → Option<u32>
- DataKey::WinnerIndex variant + storage get/set helpers
- select_winners stores index + Some() reputation_bump
- claim_prize uses index lookup, falls back to PrizeAlreadyClaimed
if paid_at.is_some() (canonical guard)
- claim_milestone uses .unwrap_or(0) on read, Some() on write1 parent cfce78f commit ac9be2d
4 files changed
Lines changed: 48 additions & 26 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
152 | 152 | | |
153 | 153 | | |
154 | 154 | | |
155 | | - | |
| 155 | + | |
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
| |||
632 | 632 | | |
633 | 633 | | |
634 | 634 | | |
635 | | - | |
| 635 | + | |
636 | 636 | | |
637 | 637 | | |
638 | 638 | | |
639 | 639 | | |
640 | 640 | | |
641 | 641 | | |
| 642 | + | |
642 | 643 | | |
643 | 644 | | |
644 | 645 | | |
| |||
648 | 649 | | |
649 | 650 | | |
650 | 651 | | |
651 | | - | |
| 652 | + | |
652 | 653 | | |
653 | 654 | | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
654 | 662 | | |
655 | 663 | | |
656 | 664 | | |
| |||
664 | 672 | | |
665 | 673 | | |
666 | 674 | | |
667 | | - | |
| 675 | + | |
668 | 676 | | |
669 | 677 | | |
670 | 678 | | |
| |||
723 | 731 | | |
724 | 732 | | |
725 | 733 | | |
726 | | - | |
727 | | - | |
728 | | - | |
729 | | - | |
730 | | - | |
731 | | - | |
732 | | - | |
733 | | - | |
734 | | - | |
735 | | - | |
736 | | - | |
737 | | - | |
738 | | - | |
739 | | - | |
740 | | - | |
741 | | - | |
742 | | - | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
743 | 746 | | |
744 | | - | |
| 747 | + | |
| 748 | + | |
745 | 749 | | |
746 | 750 | | |
747 | 751 | | |
| |||
782 | 786 | | |
783 | 787 | | |
784 | 788 | | |
785 | | - | |
| 789 | + | |
786 | 790 | | |
787 | 791 | | |
788 | 792 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
73 | | - | |
| 73 | + | |
74 | 74 | | |
75 | 75 | | |
76 | 76 | | |
| |||
150 | 150 | | |
151 | 151 | | |
152 | 152 | | |
153 | | - | |
| 153 | + | |
154 | 154 | | |
155 | 155 | | |
156 | 156 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
451 | 451 | | |
452 | 452 | | |
453 | 453 | | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
454 | 469 | | |
455 | 470 | | |
456 | 471 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
132 | | - | |
| 132 | + | |
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
| |||
199 | 199 | | |
200 | 200 | | |
201 | 201 | | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
202 | 205 | | |
203 | 206 | | |
204 | 207 | | |
| |||
0 commit comments