Skip to content

Commit d020532

Browse files
committed
feat: add initial provision management, without thawing tracking
1 parent fa4fcfe commit d020532

File tree

4 files changed

+214
-5
lines changed

4 files changed

+214
-5
lines changed

schema.graphql

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ type GraphNetwork @entity {
8888
totalUnstakedTokensLocked: BigInt!
8989
"Total GRT currently in provisions"
9090
totalTokensProvisioned: BigInt!
91+
"Total GRT currently thawing from provisions"
92+
totalTokensThawing: BigInt!
9193
"Total GRT currently in allocation"
9294
totalTokensAllocated: BigInt!
9395
"Total delegated tokens in the protocol"
@@ -239,8 +241,12 @@ type DataService @entity {
239241

240242
"Total GRT currently in provisions for this DataService"
241243
totalTokensProvisioned: BigInt!
244+
"Total GRT currently thawing from provisions for this DataService"
245+
totalTokensThawing: BigInt!
242246
"Total GRT currently in allocations for this DataService"
243247
totalTokensAllocated: BigInt!
248+
249+
provisions: [Provision!]! @derivedFrom(field: "service")
244250
}
245251

246252
"""
@@ -689,6 +695,8 @@ type Indexer @entity {
689695
stakedTokens: BigInt!
690696
"CURRENT tokens provisioned to data services in the protocol. In the V1 protocol, all staked tokens were always provisioned to an implicit 'subgraph data service'"
691697
provisionedTokens: BigInt!
698+
"CURRENT tokens thawing from provisions to data services in the protocol. Only for Horizon"
699+
thawingTokens: BigInt!
692700
"CURRENT tokens allocated on all subgraphs"
693701
allocatedTokens: BigInt!
694702
"NOT IMPLEMENTED - Tokens that have been unstaked and withdrawn"
@@ -838,6 +846,27 @@ type Provision @entity {
838846
dataService: DataService!
839847

840848
tokensProvisioned: BigInt!
849+
850+
"Service provider tokens that are being thawed (and will stop being slashable soon)"
851+
tokensThawing: BigInt!
852+
853+
"Shares representing the thawing tokens"
854+
sharesThawing: BigInt!
855+
856+
"Max amount that can be taken by the verifier when slashing, expressed in parts-per-million of the amount slashed"
857+
maxVerifierCut: Int!
858+
859+
"Time, in seconds, tokens must thaw before being withdrawn"
860+
thawingPeriod: BigInt!
861+
862+
"Timestamp when the provision was created"
863+
createdAt: BigInt!
864+
865+
"Pending value for maxVerifierCut. Verifier needs to accept it before it becomes active"
866+
maxVerifierCutPending: Int!
867+
868+
"Pending value for thawingPeriod. Verifier needs to accept it before it becomes active"
869+
thawingPeriodPending: BigInt!
841870
}
842871

843872
"""

src/mappings/helpers/helpers.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import {
2626
CurrentSubgraphDeploymentRelation,
2727
PaymentSource,
2828
IndexerQueryFeePaymentAggregation,
29+
Provision,
30+
DataService,
2931
} from '../../types/schema'
3032
import {
3133
SubgraphDeploymentManifest as SubgraphDeploymentManifestTemplate
@@ -137,6 +139,7 @@ export function createOrLoadIndexer(indexerAddress: Bytes, timestamp: BigInt): I
137139
indexer.transferredToL2 = false
138140
indexer.stakedTokensTransferredToL2 = BigInt.fromI32(0)
139141
indexer.provisionedTokens = BigInt.fromI32(0)
142+
indexer.thawingTokens = BigInt.fromI32(0)
140143
indexer.allocatedTokens = BigInt.fromI32(0)
141144
indexer.lockedTokens = BigInt.fromI32(0)
142145
indexer.unstakedTokens = BigInt.fromI32(0)
@@ -188,6 +191,41 @@ export function createOrLoadIndexer(indexerAddress: Bytes, timestamp: BigInt): I
188191
return indexer as Indexer
189192
}
190193

194+
export function createOrLoadProvision(indexerAddress: Bytes, verifierAddress: Bytes, timestamp: BigInt): Provision {
195+
let id = joinID([indexerAddress.toHexString(), verifierAddress.toHexString()])
196+
let provision = Provision.load(id)
197+
if (provision == null) {
198+
provision = new Provision(id)
199+
provision.indexer = indexerAddress.toHexString()
200+
provision.service = verifierAddress.toHexString()
201+
provision.tokensProvisioned = BigInt.fromI32(0)
202+
provision.tokensThawing = BigInt.fromI32(0)
203+
provision.sharesThawing = BigInt.fromI32(0)
204+
provision.createdAt = timestamp
205+
provision.maxVerifierCut = 0
206+
provision.maxVerifierCutPending = 0
207+
provision.thawingPeriod = BigInt.fromI32(0)
208+
provision.thawingPeriodPending = BigInt.fromI32(0)
209+
provision.save()
210+
}
211+
212+
return provision as Provision
213+
}
214+
215+
export function createOrLoadDataService(verifierAddress: Bytes): DataService {
216+
let id = verifierAddress.toHexString()
217+
let service = DataService.load(id)
218+
if (service == null) {
219+
service = new DataService(id)
220+
service.totalTokensAllocated = BigInt.fromI32(0)
221+
service.totalTokensProvisioned = BigInt.fromI32(0)
222+
service.totalTokensThawing = BigInt.fromI32(0)
223+
service.save()
224+
}
225+
226+
return service as DataService
227+
}
228+
191229
export function createOrLoadPaymentSource(paymentAddress: Bytes): PaymentSource {
192230
let id = paymentAddress.toHexString()
193231
let paymentSource = PaymentSource.load(id)
@@ -554,6 +592,7 @@ export function createOrLoadGraphNetwork(
554592
graphNetwork.totalTokensClaimable = BigInt.fromI32(0)
555593
graphNetwork.totalUnstakedTokensLocked = BigInt.fromI32(0)
556594
graphNetwork.totalTokensProvisioned = BigInt.fromI32(0)
595+
graphNetwork.totalTokensThawing = BigInt.fromI32(0)
557596
graphNetwork.totalTokensAllocated = BigInt.fromI32(0)
558597
graphNetwork.totalDelegatedTokens = BigInt.fromI32(0)
559598
graphNetwork.totalTokensSignalled = BigInt.fromI32(0)

src/mappings/horizonStaking.ts

Lines changed: 124 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
1-
import { BigInt } from '@graphprotocol/graph-ts'
1+
import { BigInt, log } from '@graphprotocol/graph-ts'
22
import { addresses } from '../../config/addresses'
3-
import { HorizonStakeDeposited, HorizonStakeLocked, HorizonStakeWithdrawn } from '../types/HorizonStaking/HorizonStaking'
4-
import { Indexer } from '../types/schema'
5-
import { calculateCapacities, createOrLoadEpoch, createOrLoadGraphNetwork, createOrLoadIndexer, updateAdvancedIndexerMetrics } from './helpers/helpers'
6-
3+
import { HorizonStakeDeposited, HorizonStakeLocked, HorizonStakeWithdrawn, TokensDeprovisioned } from '../types/HorizonStaking/HorizonStaking'
4+
import { Indexer, GraphNetwork } from '../types/schema'
5+
import { calculateCapacities, createOrLoadDataService, createOrLoadEpoch, createOrLoadGraphNetwork, createOrLoadIndexer, createOrLoadProvision, updateAdvancedIndexerMetrics } from './helpers/helpers'
6+
import {
7+
ProvisionCreated,
8+
ProvisionIncreased,
9+
ProvisionParametersSet,
10+
ProvisionParametersStaged,
11+
ProvisionSlashed,
12+
ProvisionThawed,
13+
ThawRequestCreated,
14+
ThawRequestFulfilled,
15+
ThawRequestsFulfilled,
16+
ThawingPeriodCleared
17+
} from '../types/HorizonStaking/HorizonStaking'
718

819
export function handleHorizonStakeDeposited(event: HorizonStakeDeposited): void {
920
let graphNetwork = createOrLoadGraphNetwork(event.block.number, event.address)
@@ -72,3 +83,111 @@ export function handleHorizonStakeWithdrawn(event: HorizonStakeWithdrawn): void
7283
}
7384
graphNetwork.save()
7485
}
86+
87+
export function handleProvisionCreated(event: ProvisionCreated): void {
88+
let graphNetwork = createOrLoadGraphNetwork(event.block.number, event.address)
89+
let dataService = createOrLoadDataService(event.params.verifier)
90+
let indexer = Indexer.load(event.params.serviceProvider.toHexString())!
91+
let provision = createOrLoadProvision(event.params.serviceProvider, event.params.verifier, event.block.timestamp)
92+
93+
indexer.provisionedTokens = indexer.provisionedTokens.plus(event.params.tokens)
94+
indexer.save()
95+
96+
dataService.totalTokensProvisioned = dataService.totalTokensProvisioned.plus(event.params.tokens)
97+
dataService.save()
98+
99+
graphNetwork.totalTokensProvisioned = graphNetwork.totalTokensProvisioned.plus(event.params.tokens)
100+
graphNetwork.save()
101+
102+
provision.tokensProvisioned = provision.tokensProvisioned.plus(event.params.tokens)
103+
provision.maxVerifierCut = event.params.maxVerifierCut
104+
provision.maxVerifierCutPending = event.params.maxVerifierCut
105+
provision.thawingPeriod = event.params.thawingPeriod
106+
provision.thawingPeriodPending = event.params.thawingPeriod
107+
provision.save()
108+
}
109+
110+
export function handleProvisionIncreased(event: ProvisionIncreased): void {
111+
let graphNetwork = createOrLoadGraphNetwork(event.block.number, event.address)
112+
let dataService = createOrLoadDataService(event.params.verifier)
113+
let indexer = Indexer.load(event.params.serviceProvider.toHexString())!
114+
let provision = createOrLoadProvision(event.params.serviceProvider, event.params.verifier, event.block.timestamp)
115+
116+
indexer.provisionedTokens = indexer.provisionedTokens.plus(event.params.tokens)
117+
indexer.save()
118+
119+
dataService.totalTokensProvisioned = dataService.totalTokensProvisioned.plus(event.params.tokens)
120+
dataService.save()
121+
122+
graphNetwork.totalTokensProvisioned = graphNetwork.totalTokensProvisioned.plus(event.params.tokens)
123+
graphNetwork.save()
124+
125+
provision.tokensProvisioned = provision.tokensProvisioned.plus(event.params.tokens)
126+
provision.save()
127+
}
128+
129+
export function handleProvisionThawed(event: ProvisionThawed): void {
130+
let graphNetwork = createOrLoadGraphNetwork(event.block.number, event.address)
131+
let dataService = createOrLoadDataService(event.params.verifier)
132+
let indexer = Indexer.load(event.params.serviceProvider.toHexString())!
133+
let provision = createOrLoadProvision(event.params.serviceProvider, event.params.verifier, event.block.timestamp)
134+
135+
indexer.thawingTokens = indexer.thawingTokens.plus(event.params.tokens)
136+
indexer.save()
137+
138+
dataService.totalTokensThawing = dataService.totalTokensThawing.plus(event.params.tokens)
139+
dataService.save()
140+
141+
graphNetwork.totalTokensThawing = graphNetwork.totalTokensThawing.plus(event.params.tokens)
142+
graphNetwork.save()
143+
144+
provision.tokensThawing = provision.tokensThawing.plus(event.params.tokens)
145+
provision.save()
146+
}
147+
148+
export function handleTokensDeprovisioned(event: TokensDeprovisioned): void {
149+
let graphNetwork = createOrLoadGraphNetwork(event.block.number, event.address)
150+
let dataService = createOrLoadDataService(event.params.verifier)
151+
let indexer = Indexer.load(event.params.serviceProvider.toHexString())!
152+
let provision = createOrLoadProvision(event.params.serviceProvider, event.params.verifier, event.block.timestamp)
153+
154+
indexer.provisionedTokens = indexer.provisionedTokens.minus(event.params.tokens)
155+
indexer.save()
156+
157+
dataService.totalTokensProvisioned = dataService.totalTokensProvisioned.minus(event.params.tokens)
158+
dataService.save()
159+
160+
graphNetwork.totalTokensProvisioned = graphNetwork.totalTokensProvisioned.minus(event.params.tokens)
161+
graphNetwork.save()
162+
163+
provision.tokensProvisioned = provision.tokensProvisioned.minus(event.params.tokens)
164+
provision.save()
165+
}
166+
167+
export function handleProvisionParametersSet(event: ProvisionParametersSet): void {
168+
// To Do
169+
}
170+
171+
export function handleProvisionParametersStaged(event: ProvisionParametersStaged): void {
172+
// To Do
173+
}
174+
175+
export function handleProvisionSlashed(event: ProvisionSlashed): void {
176+
// To Do
177+
}
178+
179+
export function handleThawRequestCreated(event: ThawRequestCreated): void {
180+
// To Do
181+
}
182+
183+
export function handleThawRequestFulfilled(event: ThawRequestFulfilled): void {
184+
// To Do
185+
}
186+
187+
export function handleThawRequestsFulfilled(event: ThawRequestsFulfilled): void {
188+
// To Do
189+
}
190+
191+
export function handleThawingPeriodCleared(event: ThawingPeriodCleared): void {
192+
// To Do
193+
}

subgraph.template.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,28 @@ dataSources:
405405
handler: handleHorizonStakeLocked
406406
- event: HorizonStakeWithdrawn(indexed address,uint256)
407407
handler: handleHorizonStakeWithdrawn
408+
- event: ProvisionCreated(indexed address,indexed address,uint256,uint32,uint64)
409+
handler: handleProvisionCreated
410+
- event: ProvisionIncreased(indexed address,indexed address,uint256)
411+
handler: handleProvisionIncreased
412+
- event: TokensDeprovisioned(indexed address,indexed address,uint256)
413+
handler: handleTokensDeprovisioned
414+
- event: ProvisionParametersSet(indexed address,indexed address,uint32,uint64)
415+
handler: handleProvisionParametersSet
416+
- event: ProvisionParametersStaged(indexed address,indexed address,uint32,uint64)
417+
handler: handleProvisionParametersStaged
418+
- event: ProvisionSlashed(indexed address,indexed address,uint256)
419+
handler: handleProvisionSlashed
420+
- event: ProvisionThawed(indexed address,indexed address,uint256)
421+
handler: handleProvisionThawed
422+
- event: ThawRequestCreated(indexed address,indexed address,indexed address,uint256,uint64,bytes32)
423+
handler: handleThawRequestCreated
424+
- event: ThawRequestFulfilled(indexed bytes32,uint256,uint256,uint64,bool)
425+
handler: handleThawRequestFulfilled
426+
- event: ThawRequestsFulfilled(indexed address,indexed address,indexed address,uint256,uint256,uint8)
427+
handler: handleThawRequestsFulfilled
428+
- event: ThawingPeriodCleared()
429+
handler: handleThawingPeriodCleared
408430
- kind: ethereum/contract
409431
name: Curation
410432
network: {{network}}

0 commit comments

Comments
 (0)