@@ -4,18 +4,18 @@ Quick reference for all reward conditions and how they are handled across Reward
44
55## Summary Table
66
7- | Condition | Identifier | Handled By | Action | Rewards Outcome |
8- | ---------------------- | ----------------------------------- | ----------------- | ------------------------- | ------------------------------------- |
9- | ` NONE ` | ` bytes32(0) ` | — | Normal path | Claimed by indexer |
10- | ` NO_SIGNAL ` | ` keccak256("NO_SIGNAL") ` | RewardsManager | Reclaim | To reclaim address |
11- | ` SUBGRAPH_DENIED ` | ` keccak256("SUBGRAPH_DENIED") ` | Both | Reclaim (RM) / Defer (AM) | New: reclaimed; Pre-denial : preserved |
12- | ` BELOW_MINIMUM_SIGNAL ` | ` keccak256("BELOW_MINIMUM_SIGNAL") ` | RewardsManager | Reclaim | To reclaim address |
13- | ` NO_ALLOCATION ` | ` keccak256("NO_ALLOCATION ") ` | RewardsManager | Reclaim | To reclaim address |
14- | ` INDEXER_INELIGIBLE ` | ` keccak256("INDEXER_INELIGIBLE") ` | RewardsManager | Reclaim | To reclaim address |
15- | ` STALE_POI ` | ` keccak256("STALE_POI") ` | AllocationManager | Reclaim | To reclaim address |
16- | ` ZERO_POI ` | ` keccak256("ZERO_POI") ` | AllocationManager | Reclaim | To reclaim address |
17- | ` ALLOCATION_TOO_YOUNG ` | ` keccak256("ALLOCATION_TOO_YOUNG") ` | AllocationManager | Defer | Preserved for later |
18- | ` CLOSE_ALLOCATION ` | ` keccak256("CLOSE_ALLOCATION") ` | AllocationManager | Reclaim | To reclaim address |
7+ | Condition | Identifier | Handled By | Action | Rewards Outcome |
8+ | ---------------------- | ----------------------------------- | ----------------- | ------------------------- | -------------------------------------- |
9+ | ` NONE ` | ` bytes32(0) ` | — | Normal path | Claimed by indexer |
10+ | ` NO_SIGNAL ` | ` keccak256("NO_SIGNAL") ` | RewardsManager | Reclaim | To reclaim address |
11+ | ` SUBGRAPH_DENIED ` | ` keccak256("SUBGRAPH_DENIED") ` | Both | Reclaim (RM) / Defer (AM) | New: reclaimed; Uncollected : preserved |
12+ | ` BELOW_MINIMUM_SIGNAL ` | ` keccak256("BELOW_MINIMUM_SIGNAL") ` | RewardsManager | Reclaim | To reclaim address |
13+ | ` NO_ALLOCATED_TOKENS ` | ` keccak256("NO_ALLOCATED_TOKENS ") ` | RewardsManager | Reclaim | To reclaim address |
14+ | ` INDEXER_INELIGIBLE ` | ` keccak256("INDEXER_INELIGIBLE") ` | RewardsManager | Reclaim | To reclaim address |
15+ | ` STALE_POI ` | ` keccak256("STALE_POI") ` | AllocationManager | Reclaim | To reclaim address |
16+ | ` ZERO_POI ` | ` keccak256("ZERO_POI") ` | AllocationManager | Reclaim | To reclaim address |
17+ | ` ALLOCATION_TOO_YOUNG ` | ` keccak256("ALLOCATION_TOO_YOUNG") ` | AllocationManager | Defer | Preserved for later |
18+ | ` CLOSE_ALLOCATION ` | ` keccak256("CLOSE_ALLOCATION") ` | AllocationManager | Reclaim | To reclaim address |
1919
2020## Reward Distribution Levels
2121
@@ -36,7 +36,7 @@ Rewards flow through three levels, with reclaim possible at each:
3636│ ───────────────────────────────────────────────────────────────── │
3737│ onSubgraphSignalUpdate() / onSubgraphAllocationUpdate() │
3838│ │
39- │ Reclaim: SUBGRAPH_DENIED, BELOW_MINIMUM_SIGNAL, NO_ALLOCATION │
39+ │ Reclaim: SUBGRAPH_DENIED, BELOW_MINIMUM_SIGNAL, NO_ALLOCATED_TOKENS │
4040│ │
4141│ Behavior: │
4242│ - accRewardsForSubgraph only increases when claimable │
@@ -73,20 +73,20 @@ Rewards flow through three levels, with reclaim possible at each:
7373
7474- ** Trigger** : ` isDenied(subgraphDeploymentId) ` returns true
7575- ** Effect** : ` accRewardsPerAllocatedToken ` stops increasing
76- - ** Handling** : New rewards reclaimed; pre-denial rewards preserved in allocation snapshots
76+ - ** Handling** : New rewards reclaimed; accumulator frozen (uncollected rewards preserved)
7777- ** Note** : If no SUBGRAPH_DENIED reclaim address AND signal < minimum, reclaims as BELOW_MINIMUM_SIGNAL instead
7878
7979** Reward disposition by period:**
8080
8181| Period | Disposition |
8282| ------------- | -------------------------------------------------------- |
83- | Pre-denial | Claimable after undeny |
83+ | Before denial | Claimable after undeny |
8484| During denial | Reclaimed to protocol (or dropped if no reclaim address) |
8585| Post-undeny | Claimable normally |
8686
8787** Effect on allocations:**
8888
89- - _ Existing allocations_ : Pre-denial rewards preserved; cannot claim while denied; claimable after undeny
89+ - _ Existing allocations_ : Uncollected rewards preserved (accumulator frozen, snapshot unchanged) ; cannot claim while denied; claimable after undeny
9090- _ New allocations (created while denied)_ : Start with frozen baseline; only earn rewards after undeny
9191- _ POI presentation_ : Indexers should continue presenting POIs to prevent staleness (returns 0 but maintains allocation health)
9292
@@ -104,7 +104,7 @@ Rewards flow through three levels, with reclaim possible at each:
104104- ** Effect** : ` accRewardsPerAllocatedToken ` stops increasing
105105- ** Handling** : Rewards reclaimed to configured address
106106
107- #### NO_ALLOCATION
107+ #### NO_ALLOCATED_TOKENS
108108
109109- ** Trigger** : Subgraph has signal but zero allocated tokens
110110- ** Effect** : Rewards cannot be distributed to allocations
@@ -146,7 +146,7 @@ Conditions checked in order (first match wins):
146146
147147- ** Trigger** : ` isDenied(subgraphDeploymentId) ` at POI presentation
148148- ** Effect** : Cannot claim while denied
149- - ** Handling** : ** Deferred** (returns 0, no snapshot update, pre-denial rewards preserved)
149+ - ** Handling** : ** Deferred** (returns 0, no snapshot update, uncollected rewards preserved)
150150
151151#### CLOSE_ALLOCATION
152152
@@ -198,6 +198,33 @@ defaultReclaimAddress = treasuryAddress; // Catch-all
198198
199199** Important** : Changes apply retroactively to all future reclaims.
200200
201+ ## Parameter Changes: minimumSubgraphSignal
202+
203+ ### Retroactive Application Risk
204+
205+ When ` minimumSubgraphSignal ` is changed via ` setMinimumSubgraphSignal() ` , existing subgraphs are NOT automatically updated. When subgraphs are later updated (via signal/allocation changes), the ** current** threshold is applied to ALL pending rewards since their last update, regardless of historical threshold values.
206+
207+ ** Impact:**
208+
209+ | Change Direction | Effect |
210+ | ------------------- | ------------------------------------------------------------------------ |
211+ | Threshold increases | Pending rewards on previously eligible subgraphs are reclaimed |
212+ | Threshold decreases | Previously ineligible subgraphs retroactively accumulate pending rewards |
213+
214+ ### Required Mitigation Process
215+
216+ To prevent retroactive application to long historical periods:
217+
218+ 1 . ** Communicate** the planned threshold change with a specific future date
219+ 2 . ** Wait** - notice period allows participants to adjust signal if desired
220+ 3 . ** Identify** affected subgraphs off-chain (those crossing the threshold)
221+ 4 . ** Call** ` onSubgraphSignalUpdate() ` for all affected subgraphs to accumulate pending rewards under current eligibility rules
222+ 5 . ** Execute** threshold change via ` setMinimumSubgraphSignal() ` (promptly after step 4, ideally same block)
223+
224+ ** Responsibility:** Governance handles steps 3-5; participants may optionally adjust signal in step 2.
225+
226+ For implementation details, see NatSpec documentation on ` RewardsManager.setMinimumSubgraphSignal() ` .
227+
201228## Key Behaviors
202229
203230### Snapshot Updates
0 commit comments