Skip to content

Commit 2b71433

Browse files
committed
fix: staking legacy contract call when slashing
1 parent 8a08240 commit 2b71433

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

src/mappings/staking.ts

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,21 +161,41 @@ 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+
// Now reduce the staked tokens (this happens at the end in the contract)
191+
indexer.stakedTokens = indexer.stakedTokens.minus(slashedTokens)
165192

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
173193
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
174194
indexer = calculateCapacities(indexer as Indexer)
175195
indexer.save()
176196

177197
// Update graph network
178-
graphNetwork.totalTokensStaked = graphNetwork.totalTokensStaked.minus(event.params.tokens)
198+
graphNetwork.totalTokensStaked = graphNetwork.totalTokensStaked.minus(slashedTokens)
179199
graphNetwork.save()
180200
}
181201

0 commit comments

Comments
 (0)