@@ -161,21 +161,40 @@ export function handleStakeSlashed(event: StakeSlashed): void {
161161 let id = event . params . indexer . toHexString ( )
162162 let indexer = Indexer . load ( id ) !
163163
164- indexer . stakedTokens = indexer . stakedTokens . minus ( event . params . tokens )
164+ let slashedTokens = event . params . tokens
165+
166+ // When tokens are slashed, locked tokens might need to be unlocked if indexer overallocated
167+ if ( slashedTokens . gt ( BigInt . fromI32 ( 0 ) ) ) {
168+ let tokensUsed = indexer . allocatedTokens . plus ( indexer . legacyLockedTokens )
169+ let tokensAvailable = tokensUsed . gt ( indexer . stakedTokens )
170+ ? BigInt . fromI32 ( 0 )
171+ : indexer . stakedTokens . minus ( tokensUsed )
172+
173+ if ( slashedTokens . gt ( tokensAvailable ) && indexer . legacyLockedTokens . gt ( BigInt . fromI32 ( 0 ) ) ) {
174+ let tokensOverAllocated = slashedTokens . minus ( tokensAvailable )
175+ // Calculate min(tokensOverAllocated, lockedTokens)
176+ let tokensToUnlock = tokensOverAllocated . lt ( indexer . legacyLockedTokens )
177+ ? tokensOverAllocated
178+ : indexer . legacyLockedTokens
179+
180+ indexer . legacyLockedTokens = indexer . legacyLockedTokens . minus ( tokensToUnlock )
181+ indexer . lockedTokens = indexer . lockedTokens . minus ( tokensToUnlock )
182+
183+ if ( indexer . legacyLockedTokens . equals ( BigInt . fromI32 ( 0 ) ) ) {
184+ indexer . legacyTokensLockedUntil = 0
185+ indexer . tokensLockedUntil = 0
186+ }
187+ }
188+ }
189+
190+ indexer . stakedTokens = indexer . stakedTokens . minus ( slashedTokens )
165191
166- // We need to call into stakes mapping, because locked tokens might have been
167- // decremented, and this is not released in the event
168- // To fix this we would need to indicate in the event how many locked tokens were released
169- let staking = Staking . bind ( event . address )
170- let indexerStored = staking . stakes ( event . params . indexer )
171- indexer . lockedTokens = indexerStored . tokensLocked
172- indexer . legacyLockedTokens = indexerStored . tokensLocked
173192 indexer = updateLegacyAdvancedIndexerMetrics ( indexer as Indexer )
174193 indexer = calculateCapacities ( indexer as Indexer )
175194 indexer . save ( )
176195
177196 // Update graph network
178- graphNetwork . totalTokensStaked = graphNetwork . totalTokensStaked . minus ( event . params . tokens )
197+ graphNetwork . totalTokensStaked = graphNetwork . totalTokensStaked . minus ( slashedTokens )
179198 graphNetwork . save ( )
180199}
181200
0 commit comments