@@ -98,6 +98,7 @@ export function handleStakeDeposited(event: StakeDeposited): void {
9898
9999/**
100100 * @dev handleStakeLocked
101+ * Handler for legacy stake locking
101102 * - updated the Indexers stake
102103 * - note - the contracts work by not changing the tokensStaked amount, so here, capacity does not
103104 * get changed
@@ -127,6 +128,7 @@ export function handleStakeLocked(event: StakeLocked): void {
127128
128129/**
129130 * @dev handleStakeWithdrawn
131+ * Handler for legacy stake withdrawal
130132 * - updated the Indexers stake
131133 * - updates the GraphNetwork total stake
132134 */
@@ -161,21 +163,42 @@ export function handleStakeSlashed(event: StakeSlashed): void {
161163 let id = event . params . indexer . toHexString ( )
162164 let indexer = Indexer . load ( id ) !
163165
164- indexer . stakedTokens = indexer . stakedTokens . minus ( event . params . tokens )
166+ let slashedTokens = event . params . tokens
167+
168+ // When tokens are slashed, locked tokens might need to be unlocked if indexer overallocated
169+ if ( slashedTokens . gt ( BigInt . fromI32 ( 0 ) ) ) {
170+ let tokensUsed = indexer . legacyAllocatedTokens . plus ( indexer . legacyLockedTokens )
171+ let tokensAvailable = tokensUsed . gt ( indexer . stakedTokens )
172+ ? BigInt . fromI32 ( 0 )
173+ : indexer . stakedTokens . minus ( tokensUsed )
174+
175+ if ( slashedTokens . gt ( tokensAvailable ) && indexer . legacyLockedTokens . gt ( BigInt . fromI32 ( 0 ) ) ) {
176+ let tokensOverAllocated = slashedTokens . minus ( tokensAvailable )
177+ // Calculate min(tokensOverAllocated, lockedTokens)
178+ let tokensToUnlock = tokensOverAllocated . lt ( indexer . legacyLockedTokens )
179+ ? tokensOverAllocated
180+ : indexer . legacyLockedTokens
181+
182+ indexer . legacyLockedTokens = indexer . legacyLockedTokens . minus ( tokensToUnlock )
183+ indexer . lockedTokens = indexer . lockedTokens . minus ( tokensToUnlock )
184+
185+ if ( indexer . legacyLockedTokens . equals ( BigInt . fromI32 ( 0 ) ) ) {
186+ indexer . legacyTokensLockedUntil = 0
187+ }
188+ if ( indexer . lockedTokens . equals ( BigInt . fromI32 ( 0 ) ) ) {
189+ indexer . tokensLockedUntil = 0
190+ }
191+ }
192+ }
193+
194+ indexer . stakedTokens = indexer . stakedTokens . minus ( slashedTokens )
165195
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
173196 indexer = updateLegacyAdvancedIndexerMetrics ( indexer as Indexer )
174197 indexer = calculateCapacities ( indexer as Indexer )
175198 indexer . save ( )
176199
177200 // Update graph network
178- graphNetwork . totalTokensStaked = graphNetwork . totalTokensStaked . minus ( event . params . tokens )
201+ graphNetwork . totalTokensStaked = graphNetwork . totalTokensStaked . minus ( slashedTokens )
179202 graphNetwork . save ( )
180203}
181204
@@ -337,6 +360,7 @@ export function handleAllocationCreated(event: AllocationCreated): void {
337360
338361 // update indexer
339362 let indexer = Indexer . load ( indexerID ) !
363+ indexer . legacyAllocatedTokens = indexer . legacyAllocatedTokens . plus ( event . params . tokens )
340364 indexer . allocatedTokens = indexer . allocatedTokens . plus ( event . params . tokens )
341365 indexer . totalAllocationCount = indexer . totalAllocationCount . plus ( BigInt . fromI32 ( 1 ) )
342366 indexer . allocationCount = indexer . allocationCount + 1
@@ -517,6 +541,7 @@ export function handleAllocationClosed(event: AllocationClosed): void {
517541 allocation . forceClosed = false
518542 }
519543 indexer . allocatedTokens = indexer . allocatedTokens . minus ( event . params . tokens )
544+ indexer . legacyAllocatedTokens = indexer . legacyAllocatedTokens . minus ( event . params . tokens )
520545 indexer . allocationCount = indexer . allocationCount - 1
521546 indexer = updateLegacyAdvancedIndexerMetrics ( indexer as Indexer )
522547 indexer = calculateCapacities ( indexer as Indexer )
@@ -579,6 +604,7 @@ export function handleAllocationClosedCobbDouglas(event: AllocationClosed1): voi
579604 } else {
580605 allocation . forceClosed = false
581606 }
607+ indexer . legacyAllocatedTokens = indexer . legacyAllocatedTokens . minus ( event . params . tokens )
582608 indexer . allocatedTokens = indexer . allocatedTokens . minus ( event . params . tokens )
583609 indexer . allocationCount = indexer . allocationCount - 1
584610 indexer = updateLegacyAdvancedIndexerMetrics ( indexer as Indexer )
0 commit comments