Skip to content

Commit 5f0f84d

Browse files
committed
feat: refactored legacy cuts and related fields
1 parent 82fbc57 commit 5f0f84d

File tree

5 files changed

+79
-46
lines changed

5 files changed

+79
-46
lines changed

schema.graphql

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -769,8 +769,10 @@ type Indexer @entity(immutable: false) {
769769
indexerIndexingRewards: BigInt!
770770
"The total amount of indexing rewards given to delegators"
771771
delegatorIndexingRewards: BigInt!
772-
"Percentage of indexers' own rewards received in relation to its own stake. 1 (100%) means that the indexer is receiving the exact amount that is generated by his own stake"
772+
"[Horizon only] Percentage of indexers' own rewards received in relation to its own stake. 1 (100%) means that the indexer is receiving the exact amount that is generated by his own stake"
773773
indexerRewardsOwnGenerationRatio: BigDecimal!
774+
"Percentage of indexers' own rewards received in relation to its own stake. 1 (100%) means that the indexer is receiving the exact amount that is generated by his own stake. This is the indexerRewardsOwnGenerationRatio before Horizon"
775+
legacyIndexerRewardsOwnGenerationRatio: BigDecimal!
774776
"Whether the indexer has been transferred from L1 to L2 partially or fully"
775777
transferredToL2: Boolean!
776778
"Timestamp for the FIRST L1 -> L2 Transfer"
@@ -817,8 +819,10 @@ type Indexer @entity(immutable: false) {
817819
indexingRewardCut: Int!
818820
"The percent of indexing rewards generated by the total stake that the Indexer keeps for itself. In parts per million. This is the indexingRewardCut before Horizon"
819821
legacyIndexingRewardCut: Int!
820-
"The percent of indexing rewards generated by the delegated stake that the Indexer keeps for itself"
822+
"[Horizon only] The percent of indexing rewards generated by the delegated stake that the Indexer keeps for itself"
821823
indexingRewardEffectiveCut: BigDecimal!
824+
"The percent of indexing rewards generated by the delegated stake that the Indexer keeps for itself. This is the indexingRewardEffectiveCut before Horizon"
825+
legacyIndexingRewardEffectiveCut: BigDecimal!
822826
"The percent of reward dilution delegators experience because of overdelegation. Overdelegated stake can't be used to generate rewards but still gets accounted while distributing the generated rewards. This causes dilution of the rewards for the rest of the pool."
823827
overDelegationDilution: BigDecimal!
824828
"The total amount of query fees given to delegators"
@@ -827,8 +831,10 @@ type Indexer @entity(immutable: false) {
827831
queryFeeCut: Int!
828832
"The percent of query rebate rewards generated by the total stake that the Indexer keeps for itself. In parts per million. This is the queryFeeCut before Horizon"
829833
legacyQueryFeeCut: Int!
830-
"The percent of query rebate rewards generated by the delegated stake that the Indexer keeps for itself"
834+
"[Horizon only] The percent of query rebate rewards generated by the delegated stake that the Indexer keeps for itself"
831835
queryFeeEffectiveCut: BigDecimal!
836+
"The percent of query rebate rewards generated by the delegated stake that the Indexer keeps for itself. This is the queryFeeEffectiveCut before Horizon"
837+
legacyQueryFeeEffectiveCut: BigDecimal!
832838
"Amount of blocks a delegator chooses for the waiting period for changing their params"
833839
delegatorParameterCooldown: Int!
834840
"Block number for the last time the delegator updated their parameters"
@@ -838,14 +844,6 @@ type Indexer @entity(immutable: false) {
838844

839845
# Provisioning
840846
provisions: [Provision!]! @derivedFrom(field: "indexer")
841-
842-
# Metrics
843-
"NOT IMPLEMENTED - Total return this indexer has earned"
844-
totalReturn: BigDecimal!
845-
"NOT IMPLEMENTED - Annualized rate of return for the indexer"
846-
annualizedReturn: BigDecimal! # You must multiple by 100 to get percentage
847-
"NOT IMPLEMENTED - Staking efficiency of the indexer"
848-
stakingEfficiency: BigDecimal!
849847
}
850848

851849
type PaymentSource @entity(immutable: false) {

src/mappings/helpers/helpers.ts

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ export function createOrLoadIndexer(indexerAddress: Bytes, timestamp: BigInt ):
153153
indexer.queryFeeRebates = BigInt.fromI32(0)
154154
indexer.rewardsEarned = BigInt.fromI32(0)
155155
indexer.indexerRewardsOwnGenerationRatio = BigDecimal.fromString('0')
156+
indexer.legacyIndexerRewardsOwnGenerationRatio = BigDecimal.fromString('0')
156157

157158
indexer.delegatedCapacity = BigInt.fromI32(0)
158159
indexer.tokenCapacity = BigInt.fromI32(0)
@@ -165,22 +166,22 @@ export function createOrLoadIndexer(indexerAddress: Bytes, timestamp: BigInt ):
165166
indexer.delegationExchangeRate = BigDecimal.fromString('1')
166167
indexer.indexingRewardCut = 1000000
167168
indexer.indexingRewardEffectiveCut = BigDecimal.fromString('0')
169+
indexer.legacyIndexingRewardCut = 0
170+
indexer.legacyIndexingRewardEffectiveCut = BigDecimal.fromString('0')
168171
indexer.overDelegationDilution = BigDecimal.fromString('0')
169172
indexer.delegatorIndexingRewards = BigInt.fromI32(0)
170173
indexer.indexerIndexingRewards = BigInt.fromI32(0)
171174
indexer.delegatorQueryFees = BigInt.fromI32(0)
172175
indexer.queryFeeCut = 1000000
173176
indexer.queryFeeEffectiveCut = BigDecimal.fromString('0')
177+
indexer.legacyQueryFeeCut = 0
178+
indexer.legacyQueryFeeEffectiveCut = BigDecimal.fromString('0')
174179
indexer.delegatorParameterCooldown = 0
175180
indexer.lastDelegationParameterUpdate = 0
176181
indexer.forcedClosures = 0
177182
indexer.allocationCount = 0
178183
indexer.totalAllocationCount = BigInt.fromI32(0)
179184

180-
indexer.totalReturn = BigDecimal.fromString('0')
181-
indexer.annualizedReturn = BigDecimal.fromString('0')
182-
indexer.stakingEfficiency = BigDecimal.fromString('0')
183-
184185
indexer.url = ''
185186
indexer.geoHash = ''
186187
indexer.rewardsDestination = Address.fromString('0x0000000000000000000000000000000000000000')
@@ -977,6 +978,28 @@ export function calculateIndexerRewardOwnGenerationRatio(indexer: Indexer): BigD
977978
: rewardCut / indexer.ownStakeRatio
978979
}
979980

981+
export function calculateLegacyIndexingRewardEffectiveCut(indexer: Indexer): BigDecimal {
982+
let delegatorCut = BigInt.fromI32(indexer.legacyIndexingRewardCut).toBigDecimal() / BigDecimal.fromString('1000000')
983+
return indexer.delegatedStakeRatio == BigDecimal.fromString('0')
984+
? BigDecimal.fromString('0')
985+
: BigDecimal.fromString('1') - delegatorCut / indexer.delegatedStakeRatio
986+
}
987+
988+
export function calculateLegacyQueryFeeEffectiveCut(indexer: Indexer): BigDecimal {
989+
let delegatorCut = BigInt.fromI32(indexer.legacyQueryFeeCut).toBigDecimal() / BigDecimal.fromString('1000000')
990+
return indexer.delegatedStakeRatio == BigDecimal.fromString('0')
991+
? BigDecimal.fromString('0')
992+
: BigDecimal.fromString('1') - delegatorCut / indexer.delegatedStakeRatio
993+
}
994+
995+
export function calculateLegacyIndexerRewardOwnGenerationRatio(indexer: Indexer): BigDecimal {
996+
let rewardCut =
997+
BigInt.fromI32(1000000 - indexer.legacyIndexingRewardCut).toBigDecimal() / BigDecimal.fromString('1000000')
998+
return indexer.ownStakeRatio == BigDecimal.fromString('0')
999+
? BigDecimal.fromString('0')
1000+
: rewardCut / indexer.ownStakeRatio
1001+
}
1002+
9801003
export function calculateOverdelegationDilution(indexer: Indexer): BigDecimal {
9811004
let stakedTokensBD = indexer.stakedTokens.toBigDecimal()
9821005
let delegatedTokensBD = indexer.delegatedTokens.toBigDecimal()
@@ -1001,6 +1024,18 @@ export function updateAdvancedIndexerMetrics(indexer: Indexer): Indexer {
10011024
return indexer as Indexer
10021025
}
10031026

1027+
export function updateLegacyAdvancedIndexerMetrics(indexer: Indexer): Indexer {
1028+
indexer.ownStakeRatio = calculateOwnStakeRatio(indexer as Indexer)
1029+
indexer.delegatedStakeRatio = calculateDelegatedStakeRatio(indexer as Indexer)
1030+
indexer.legacyIndexingRewardEffectiveCut = calculateLegacyIndexingRewardEffectiveCut(indexer as Indexer)
1031+
indexer.legacyQueryFeeEffectiveCut = calculateLegacyQueryFeeEffectiveCut(indexer as Indexer)
1032+
indexer.legacyIndexerRewardsOwnGenerationRatio = calculateLegacyIndexerRewardOwnGenerationRatio(
1033+
indexer as Indexer,
1034+
)
1035+
indexer.overDelegationDilution = calculateOverdelegationDilution(indexer as Indexer)
1036+
return indexer as Indexer
1037+
}
1038+
10041039
export function calculateOwnStakeRatioForProvision(provision: Provision): BigDecimal {
10051040
let totalTokens = provision.tokensProvisioned.plus(provision.delegatedTokens)
10061041
return totalTokens == BigInt.fromI32(0)

src/mappings/l1staking.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
} from '../types/L1Staking/L1Staking'
77

88
import { Indexer, DelegatedStake, GraphNetwork } from '../types/schema'
9-
import { calculateCapacities, createOrLoadGraphNetwork, joinID, updateAdvancedIndexerMetrics, updateDelegationExchangeRate } from './helpers/helpers'
9+
import { calculateCapacities, createOrLoadGraphNetwork, joinID, updateLegacyAdvancedIndexerMetrics, updateDelegationExchangeRate } from './helpers/helpers'
1010

1111
/*
1212
/// @dev Emitted when an indexer transfers their stake to L2.
@@ -34,7 +34,7 @@ export function handleIndexerStakeTransferredToL2(event: IndexerStakeTransferred
3434
indexer.lastTransferredToL2At = event.block.timestamp
3535
indexer.lastTransferredToL2AtBlockNumber = event.block.number
3636
indexer.lastTransferredToL2AtTx = event.transaction.hash.toHexString()
37-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
37+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
3838
indexer = calculateCapacities(indexer as Indexer)
3939
indexer.save()
4040

@@ -84,7 +84,7 @@ export function handleDelegationTransferredToL2(event: DelegationTransferredToL2
8484
if (indexer.delegatorShares != BigInt.fromI32(0)) {
8585
indexer = updateDelegationExchangeRate(indexer as Indexer)
8686
}
87-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
87+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
8888
indexer = calculateCapacities(indexer as Indexer)
8989
indexer.save()
9090

src/mappings/rewardsManager.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import {
1010
createOrLoadSubgraphDeployment,
1111
createOrLoadEpoch,
12-
updateAdvancedIndexerMetrics,
12+
updateLegacyAdvancedIndexerMetrics,
1313
updateDelegationExchangeRate,
1414
createOrLoadGraphNetwork
1515
} from './helpers/helpers'
@@ -28,7 +28,7 @@ export function handleRewardsAssigned(event: RewardsAssigned): void {
2828
indexer.delegatedTokens == BigInt.fromI32(0)
2929
? event.params.amount
3030
: event.params.amount
31-
.times(BigInt.fromI32(indexer.indexingRewardCut))
31+
.times(BigInt.fromI32(indexer.legacyIndexingRewardCut))
3232
.div(BigInt.fromI32(1000000))
3333

3434
let delegatorIndexingRewards = event.params.amount.minus(indexerIndexingRewards)
@@ -40,7 +40,7 @@ export function handleRewardsAssigned(event: RewardsAssigned): void {
4040
if (indexer.delegatorShares != BigInt.fromI32(0)) {
4141
indexer = updateDelegationExchangeRate(indexer as Indexer)
4242
}
43-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
43+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
4444
indexer.save()
4545

4646
// update allocation

src/mappings/staking.ts

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {
4040
createOrLoadDelegator,
4141
createOrLoadDelegatedStake,
4242
createOrLoadGraphAccount,
43-
updateAdvancedIndexerMetrics,
43+
updateLegacyAdvancedIndexerMetrics,
4444
updateDelegationExchangeRate,
4545
calculatePricePerShare,
4646
batchUpdateSubgraphSignalledTokens,
@@ -60,7 +60,7 @@ export function handleDelegationParametersUpdated(event: DelegationParametersUpd
6060
indexer.lastDelegationParameterUpdate = (
6161
addresses.isL1 ? event.block.number : graphNetwork.currentL1BlockNumber!
6262
).toI32()
63-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
63+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
6464
indexer.save()
6565
}
6666

@@ -76,7 +76,7 @@ export function handleStakeDeposited(event: StakeDeposited): void {
7676
let indexer = createOrLoadLegacyIndexer(event.params.indexer, event.block.timestamp)
7777
let previousStake = indexer.stakedTokens
7878
indexer.stakedTokens = indexer.stakedTokens.plus(event.params.tokens)
79-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
79+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
8080
indexer = calculateCapacities(indexer as Indexer)
8181
indexer.save()
8282

@@ -108,7 +108,7 @@ export function handleStakeLocked(event: StakeLocked): void {
108108
let indexer = Indexer.load(id)!
109109
indexer.lockedTokens = event.params.tokens
110110
indexer.tokensLockedUntil = event.params.until.toI32()
111-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
111+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
112112
indexer = calculateCapacities(indexer as Indexer)
113113
indexer.save()
114114

@@ -135,7 +135,7 @@ export function handleStakeWithdrawn(event: StakeWithdrawn): void {
135135
indexer.stakedTokens = indexer.stakedTokens.minus(event.params.tokens)
136136
indexer.lockedTokens = indexer.lockedTokens.minus(event.params.tokens)
137137
indexer.tokensLockedUntil = 0 // always set to 0 when withdrawn
138-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
138+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
139139
indexer = calculateCapacities(indexer as Indexer)
140140
indexer.save()
141141

@@ -164,7 +164,7 @@ export function handleStakeSlashed(event: StakeSlashed): void {
164164
let staking = Staking.bind(event.address)
165165
let indexerStored = staking.stakes(event.params.indexer)
166166
indexer.lockedTokens = indexerStored.tokensLocked
167-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
167+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
168168
indexer = calculateCapacities(indexer as Indexer)
169169
indexer.save()
170170

@@ -184,7 +184,7 @@ export function handleStakeDelegated(event: StakeDelegated): void {
184184
if (indexer.delegatorShares != BigInt.fromI32(0)) {
185185
indexer = updateDelegationExchangeRate(indexer as Indexer)
186186
}
187-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
187+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
188188
indexer = calculateCapacities(indexer as Indexer)
189189
indexer.save()
190190

@@ -253,7 +253,7 @@ export function handleStakeDelegatedLocked(event: StakeDelegatedLocked): void {
253253
if (indexer.delegatorShares != BigInt.fromI32(0)) {
254254
indexer = updateDelegationExchangeRate(indexer as Indexer)
255255
}
256-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
256+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
257257
indexer = calculateCapacities(indexer as Indexer)
258258
indexer.save()
259259

@@ -330,7 +330,7 @@ export function handleAllocationCreated(event: AllocationCreated): void {
330330
indexer.allocatedTokens = indexer.allocatedTokens.plus(event.params.tokens)
331331
indexer.totalAllocationCount = indexer.totalAllocationCount.plus(BigInt.fromI32(1))
332332
indexer.allocationCount = indexer.allocationCount + 1
333-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
333+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
334334
indexer = calculateCapacities(indexer as Indexer)
335335
indexer.save()
336336

@@ -370,10 +370,10 @@ export function handleAllocationCreated(event: AllocationCreated): void {
370370
allocation.totalReturn = BigDecimal.fromString('0')
371371
allocation.annualizedReturn = BigDecimal.fromString('0')
372372
allocation.createdAt = event.block.timestamp.toI32()
373-
allocation.indexingRewardCutAtStart = indexer.indexingRewardCut
374-
allocation.indexingRewardEffectiveCutAtStart = indexer.indexingRewardEffectiveCut
375-
allocation.queryFeeCutAtStart = indexer.queryFeeCut
376-
allocation.queryFeeEffectiveCutAtStart = indexer.queryFeeEffectiveCut
373+
allocation.indexingRewardCutAtStart = indexer.legacyIndexingRewardCut
374+
allocation.indexingRewardEffectiveCutAtStart = indexer.legacyIndexingRewardEffectiveCut
375+
allocation.queryFeeCutAtStart = indexer.legacyQueryFeeCut
376+
allocation.queryFeeEffectiveCutAtStart = indexer.legacyQueryFeeEffectiveCut
377377
allocation.isLegacy = true
378378
allocation.save()
379379
}
@@ -507,7 +507,7 @@ export function handleAllocationClosed(event: AllocationClosed): void {
507507
}
508508
indexer.allocatedTokens = indexer.allocatedTokens.minus(event.params.tokens)
509509
indexer.allocationCount = indexer.allocationCount - 1
510-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
510+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
511511
indexer = calculateCapacities(indexer as Indexer)
512512
indexer.save()
513513

@@ -522,10 +522,10 @@ export function handleAllocationClosed(event: AllocationClosed): void {
522522
allocation.status = 'Closed'
523523
allocation.closedAt = event.block.timestamp.toI32()
524524
allocation.poi = event.params.poi
525-
allocation.indexingRewardCutAtClose = indexer.indexingRewardCut
526-
allocation.indexingRewardEffectiveCutAtClose = indexer.indexingRewardEffectiveCut
527-
allocation.queryFeeCutAtClose = indexer.queryFeeCut
528-
allocation.queryFeeEffectiveCutAtClose = indexer.queryFeeEffectiveCut
525+
allocation.indexingRewardCutAtClose = indexer.legacyIndexingRewardCut
526+
allocation.indexingRewardEffectiveCutAtClose = indexer.legacyIndexingRewardEffectiveCut
527+
allocation.queryFeeCutAtClose = indexer.legacyQueryFeeCut
528+
allocation.queryFeeEffectiveCutAtClose = indexer.legacyQueryFeeEffectiveCut
529529
allocation.save()
530530

531531
// update epoch - We do it here to have more epochs created, instead of seeing none created
@@ -578,7 +578,7 @@ export function handleAllocationClosedCobbDouglas(event: AllocationClosed1): voi
578578
}
579579
indexer.allocatedTokens = indexer.allocatedTokens.minus(event.params.tokens)
580580
indexer.allocationCount = indexer.allocationCount - 1
581-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
581+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
582582
indexer = calculateCapacities(indexer as Indexer)
583583
indexer.save()
584584

@@ -594,10 +594,10 @@ export function handleAllocationClosedCobbDouglas(event: AllocationClosed1): voi
594594
allocation.status = 'Closed'
595595
allocation.closedAt = event.block.timestamp.toI32()
596596
allocation.poi = event.params.poi
597-
allocation.indexingRewardCutAtClose = indexer.indexingRewardCut
598-
allocation.indexingRewardEffectiveCutAtClose = indexer.indexingRewardEffectiveCut
599-
allocation.queryFeeCutAtClose = indexer.queryFeeCut
600-
allocation.queryFeeEffectiveCutAtClose = indexer.queryFeeEffectiveCut
597+
allocation.indexingRewardCutAtClose = indexer.legacyIndexingRewardCut
598+
allocation.indexingRewardEffectiveCutAtClose = indexer.legacyIndexingRewardEffectiveCut
599+
allocation.queryFeeCutAtClose = indexer.legacyQueryFeeCut
600+
allocation.queryFeeEffectiveCutAtClose = indexer.legacyQueryFeeEffectiveCut
601601
allocation.save()
602602

603603
// update epoch - We do it here to have more epochs created, instead of seeing none created
@@ -656,7 +656,7 @@ export function handleRebateClaimed(event: RebateClaimed): void {
656656
if (indexer.delegatorShares != BigInt.fromI32(0)) {
657657
indexer = updateDelegationExchangeRate(indexer as Indexer)
658658
}
659-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
659+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
660660
indexer.save()
661661
// update allocation
662662
let allocation = Allocation.load(allocationID)!
@@ -721,7 +721,7 @@ export function handleRebateCollected(event: RebateCollected): void {
721721
if (indexer.delegatorShares != BigInt.fromI32(0)) {
722722
indexer = updateDelegationExchangeRate(indexer as Indexer)
723723
}
724-
indexer = updateAdvancedIndexerMetrics(indexer as Indexer)
724+
indexer = updateLegacyAdvancedIndexerMetrics(indexer as Indexer)
725725
indexer.save()
726726

727727
// Replicate for payment source specific aggregation

0 commit comments

Comments
 (0)