Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 35 additions & 10 deletions src/mappings/helpers/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1010,9 +1010,21 @@ function max(a: BigDecimal, b: BigDecimal): BigDecimal {
return a > b ? a : b
}

// Own stake that still backs the indexer: excludes legacy locked (unstaking) tokens and
// Horizon provision tokens that are thawing. Both are zero when they don't apply.
export function getActiveIndexerStake(indexer: Indexer): BigInt {
return indexer.stakedTokens.minus(indexer.lockedTokens).minus(indexer.thawingTokens)
}

// Delegation that still earns rewards and fees. Horizon keeps undelegated tokens in the pool
// (tracked in delegatedThawingTokens) until withdrawn, but new rewards only go to active shares.
export function getActiveIndexerDelegation(indexer: Indexer): BigInt {
return indexer.delegatedTokens.minus(indexer.delegatedThawingTokens)
}

export function calculateOwnStakeRatio(indexer: Indexer): BigDecimal {
let stakedTokensBD = indexer.stakedTokens.minus(indexer.lockedTokens).toBigDecimal()
let delegatedTokensBD = indexer.delegatedTokens.toBigDecimal()
let stakedTokensBD = getActiveIndexerStake(indexer).toBigDecimal()
let delegatedTokensBD = getActiveIndexerDelegation(indexer).toBigDecimal()
let graphNetwork = loadGraphNetwork()
let delegationRatioBD = BigInt.fromI32(graphNetwork.delegationRatio).toBigDecimal()
let maxPossibleTotalUsable = stakedTokensBD + stakedTokensBD * delegationRatioBD
Expand Down Expand Up @@ -1077,8 +1089,8 @@ export function calculateLegacyIndexerRewardOwnGenerationRatio(indexer: Indexer)
}

export function calculateOverdelegationDilution(indexer: Indexer): BigDecimal {
let stakedTokensBD = indexer.stakedTokens.toBigDecimal()
let delegatedTokensBD = indexer.delegatedTokens.toBigDecimal()
let stakedTokensBD = getActiveIndexerStake(indexer).toBigDecimal()
let delegatedTokensBD = getActiveIndexerDelegation(indexer).toBigDecimal()
let graphNetwork = loadGraphNetwork()
let delegationRatioBD = BigInt.fromI32(graphNetwork.delegationRatio).toBigDecimal()
let maxDelegatedStake = stakedTokensBD * delegationRatioBD
Expand Down Expand Up @@ -1112,18 +1124,31 @@ export function updateLegacyAdvancedIndexerMetrics(indexer: Indexer): Indexer {
return indexer as Indexer
}

// Provisioned tokens that are not thawing.
export function getActiveProvisionTokens(provision: Provision): BigInt {
return provision.tokensProvisioned.minus(provision.tokensThawing)
}

// Delegated tokens that are not thawing. Thawing delegation stays in the pool until withdrawn,
// but rewards and query fees added to the pool only accrue to active shares.
export function getActiveProvisionDelegation(provision: Provision): BigInt {
return provision.delegatedTokens.minus(provision.delegatedThawingTokens)
}

export function calculateOwnStakeRatioForProvision(provision: Provision): BigDecimal {
let totalTokens = provision.tokensProvisioned.plus(provision.delegatedTokens)
let ownTokens = getActiveProvisionTokens(provision)
let totalTokens = ownTokens.plus(getActiveProvisionDelegation(provision))
return totalTokens == BigInt.fromI32(0)
? BigDecimal.fromString('0')
: provision.tokensProvisioned.toBigDecimal().div(totalTokens.toBigDecimal())
: ownTokens.toBigDecimal().div(totalTokens.toBigDecimal())
}

export function calculateDelegatedStakeRatioForProvision(provision: Provision): BigDecimal {
let totalTokens = provision.tokensProvisioned.plus(provision.delegatedTokens)
let delegatedTokens = getActiveProvisionDelegation(provision)
let totalTokens = getActiveProvisionTokens(provision).plus(delegatedTokens)
return totalTokens == BigInt.fromI32(0)
? BigDecimal.fromString('0')
: provision.delegatedTokens.toBigDecimal().div(totalTokens.toBigDecimal())
: delegatedTokens.toBigDecimal().div(totalTokens.toBigDecimal())
}

export function calculateIndexingRewardEffectiveCutForProvision(provision: Provision): BigDecimal {
Expand Down Expand Up @@ -1154,8 +1179,8 @@ export function calculateIndexerRewardOwnGenerationRatioForProvision(provision:
}

export function calculateOverdelegationDilutionForProvision(provision: Provision): BigDecimal {
let provisionedTokensBD = provision.tokensProvisioned.toBigDecimal()
let delegatedTokensBD = provision.delegatedTokens.toBigDecimal()
let provisionedTokensBD = getActiveProvisionTokens(provision).toBigDecimal()
let delegatedTokensBD = getActiveProvisionDelegation(provision).toBigDecimal()
let dataService = DataService.load(provision.dataService)!
if (dataService.delegationRatio == null) {
return BigDecimal.fromString('0')
Expand Down
16 changes: 16 additions & 0 deletions src/mappings/horizonStaking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export function handleHorizonStakeDeposited(event: HorizonStakeDeposited): void
let indexer = createOrLoadIndexer(event.params.serviceProvider, event.block.timestamp, graphNetwork)
let previousStake = indexer.stakedTokens
indexer.stakedTokens = indexer.stakedTokens.plus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer.save()

// Update graph network
Expand All @@ -45,6 +46,7 @@ export function handleHorizonStakeLocked(event: HorizonStakeLocked): void {
let indexer = Indexer.load(id)!
indexer.lockedTokens = event.params.tokens
indexer.tokensLockedUntil = event.params.until.toI32()
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer.save()

// update graph network
Expand All @@ -62,6 +64,7 @@ export function handleHorizonStakeWithdrawn(event: HorizonStakeWithdrawn): void
indexer.stakedTokens = indexer.stakedTokens.minus(event.params.tokens)
indexer.lockedTokens = BigInt.fromI32(0) // set to 0 to prevent issues when Stage 2 comes
indexer.tokensLockedUntil = 0 // always set to 0 when withdrawn
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer.save()

// Update graph network
Expand All @@ -84,6 +87,7 @@ export function handleProvisionCreated(event: ProvisionCreated): void {
let provision = createOrLoadProvision(event.params.serviceProvider, event.params.verifier, event.block.timestamp)

indexer.provisionedTokens = indexer.provisionedTokens.plus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer = calculateCapacities(indexer as Indexer)
indexer.save()

Expand All @@ -98,6 +102,7 @@ export function handleProvisionCreated(event: ProvisionCreated): void {
provision.maxVerifierCutPending = event.params.maxVerifierCut
provision.thawingPeriod = event.params.thawingPeriod
provision.thawingPeriodPending = event.params.thawingPeriod
provision = updateAdvancedProvisionMetrics(provision as Provision)
provision.save()
}

Expand All @@ -108,6 +113,7 @@ export function handleProvisionIncreased(event: ProvisionIncreased): void {
let provision = createOrLoadProvision(event.params.serviceProvider, event.params.verifier, event.block.timestamp)

indexer.provisionedTokens = indexer.provisionedTokens.plus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer = calculateCapacities(indexer as Indexer)
indexer.save()

Expand All @@ -118,6 +124,7 @@ export function handleProvisionIncreased(event: ProvisionIncreased): void {
graphNetwork.save()

provision.tokensProvisioned = provision.tokensProvisioned.plus(event.params.tokens)
provision = updateAdvancedProvisionMetrics(provision as Provision)
provision.save()
}

Expand All @@ -128,6 +135,7 @@ export function handleProvisionThawed(event: ProvisionThawed): void {
let provision = createOrLoadProvision(event.params.serviceProvider, event.params.verifier, event.block.timestamp)

indexer.thawingTokens = indexer.thawingTokens.plus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer = calculateCapacities(indexer as Indexer)
indexer.save()

Expand All @@ -138,6 +146,7 @@ export function handleProvisionThawed(event: ProvisionThawed): void {
graphNetwork.save()

provision.tokensThawing = provision.tokensThawing.plus(event.params.tokens)
provision = updateAdvancedProvisionMetrics(provision as Provision)
provision.save()
}

Expand All @@ -149,6 +158,7 @@ export function handleTokensDeprovisioned(event: TokensDeprovisioned): void {

indexer.provisionedTokens = indexer.provisionedTokens.minus(event.params.tokens)
indexer.thawingTokens = indexer.thawingTokens.minus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer = calculateCapacities(indexer as Indexer)
indexer.save()

Expand All @@ -162,6 +172,7 @@ export function handleTokensDeprovisioned(event: TokensDeprovisioned): void {

provision.tokensProvisioned = provision.tokensProvisioned.minus(event.params.tokens)
provision.tokensThawing = provision.tokensThawing.minus(event.params.tokens)
provision = updateAdvancedProvisionMetrics(provision as Provision)
provision.save()
}

Expand Down Expand Up @@ -250,6 +261,7 @@ export function handleProvisionSlashed(event: ProvisionSlashed): void {
// Due to thawing tokens potentially getting cancelled, we will need to figure the thawing situation
indexer.provisionedTokens = indexer.provisionedTokens.minus(event.params.tokens)
indexer.stakedTokens = indexer.stakedTokens.minus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer = calculateCapacities(indexer as Indexer)
indexer.save()

Expand All @@ -263,6 +275,7 @@ export function handleProvisionSlashed(event: ProvisionSlashed): void {
provision.tokensProvisioned = provision.tokensProvisioned.minus(event.params.tokens)
// To DO, update thawing tokens according to the accounting calculation from the contract
provision.tokensSlashedServiceProvider = provision.tokensSlashedServiceProvider.plus(event.params.tokens)
provision = updateAdvancedProvisionMetrics(provision as Provision)
provision.save()
}

Expand Down Expand Up @@ -464,6 +477,7 @@ export function handleDelegationSlashed(event: DelegationSlashed): void {
let indexerID = event.params.serviceProvider.toHexString()
let indexer = Indexer.load(indexerID)!
indexer.delegatedTokens = indexer.delegatedTokens.minus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer = calculateCapacities(indexer as Indexer)
indexer.save()

Expand Down Expand Up @@ -553,13 +567,15 @@ export function handleDelegatedTokensWithdrawn(event: DelegatedTokensWithdrawn):
// might want to track locked/thawing tokens in provision too
provision.delegatedTokens = provision.delegatedTokens.minus(event.params.tokens)
provision.delegatedThawingTokens = provision.delegatedThawingTokens.minus(event.params.tokens)
provision = updateAdvancedProvisionMetrics(provision as Provision)
provision.save()

let indexerID = event.params.serviceProvider.toHexString()
let indexer = Indexer.load(indexerID)!

indexer.delegatedTokens = indexer.delegatedTokens.minus(event.params.tokens)
indexer.delegatedThawingTokens = indexer.delegatedThawingTokens.minus(event.params.tokens)
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
indexer = calculateCapacities(indexer as Indexer)
indexer.save()

Expand Down
Loading
Loading