-
Notifications
You must be signed in to change notification settings - Fork 3
/
schema.graphql
449 lines (401 loc) · 9.84 KB
/
schema.graphql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
enum SnapshotType {
DEFAULT
HOUR
DAY
MONTH
BLOCK
}
enum PayeeType {
STAKED
STASH
CONTROLLER
ACCOUNT
NONE
}
enum HistoryElementType {
CALL
EVENT
}
interface ISnapshot {
id: ID!
timestamp: Int!
type: SnapshotType!
}
type NetworkStats @entity {
id: ID!
totalFees: BigInt!
totalAccounts: Int!
totalTransactions: Int!
totalBridgeIncomingTransactions: Int!
totalBridgeOutgoingTransactions: Int!
}
type NetworkSnapshot implements ISnapshot @entity {
id: ID!
type: SnapshotType!
timestamp: Int!
accounts: Int!
transactions: Int!
fees: BigInt!
liquidityUSD: String!
volumeUSD: String!
bridgeIncomingTransactions: Int!
bridgeOutgoingTransactions: Int!
}
type AssetOwner @entity {
id: ID! # accountId-sbtAssetId (of issuer)
sbtAccesses: [AssetOwnerAccount!]!
}
type AssetOwnerAccount @jsonField {
accountAddress: String! # address that has been given access to
expiresAt: Int!
}
type UpdatesStream @entity {
id: ID!
block: Int!
data: String! # stringified JSON
}
type AssetPrice @jsonField {
open: String!
close: String!
high: String!
low: String!
}
type AssetVolume @jsonField {
amount: String!
amountUSD: String!
}
type Asset @entity {
id: ID!
priceUSD: String!
supply: BigInt!
liquidity: BigInt # locked in pools (in tokens)
liquidityBooks: BigInt # locked in order books (in tokens)
priceChangeDay: Float
priceChangeWeek: Float
volumeDayUSD: Float
volumeWeekUSD: Float
velocity: Float # calculated in week
data: [AssetSnapshot!]! @derivedFrom(field: "asset")
# poolXYK: [PoolXYK] @derivedFrom(field: "targetAsset")
}
type AssetSnapshot implements ISnapshot @entity @compositeIndexes(fields: [["asset", "type"]]) {
id: ID!
asset: Asset! @index #relation to Asset
timestamp: Int!
type: SnapshotType!
priceUSD: AssetPrice
volume: AssetVolume
supply: BigInt!
mint: BigInt!
burn: BigInt!
}
type PoolXYK @entity {
id: ID!
baseAssetId: String!
targetAssetId: String!
# baseAsset: Asset! @index
# targetAsset: Asset! @index
baseAssetReserves: BigInt! # (base + chameleon) reserves
targetAssetReserves: BigInt! # target reserves
chameleonAssetReserves: BigInt # chameleon reserves only
multiplier: Int!
priceUSD: String
strategicBonusApy: String
poolTokenSupply: BigInt
poolTokenPriceUSD: String
liquidityUSD: String
data: [PoolSnapshot!]! @derivedFrom(field: "pool")
# accountLiquidities: [AccountLiquidity] @derivedFrom(field: "pool")
}
type PoolSnapshot implements ISnapshot @entity @compositeIndexes(fields: [["pool", "type"]]) {
id: ID!
pool: PoolXYK! @index #relation to PoolXYK
timestamp: Int!
type: SnapshotType!
priceUSD: AssetPrice! # price of target asset
baseAssetReserves: BigInt! # (base + chameleon) reserves
targetAssetReserves: BigInt! # target reserves
chameleonAssetReserves: BigInt! # chameleon reserves only
baseAssetVolume: String!
targetAssetVolume: String!
chameleonAssetVolume: String!
poolTokenSupply: BigInt!
poolTokenPriceUSD: String!
liquidityUSD: String!
volumeUSD: String!
}
type AccountLiquidity @entity {
id: ID! # account id - pool id
accountId: String!
poolId: String!
# account: Account! @index #relation to Account
# pool: PoolXYK! @index #relation to PoolXYK
poolTokens: BigInt! # pool tokens
liquidityUSD: String!
data: [AccountLiquiditySnapshot!]! @derivedFrom(field: "accountLiquidity")
}
type AccountLiquiditySnapshot implements ISnapshot @entity {
id: ID!
timestamp: Int!
type: SnapshotType!
accountLiquidity: AccountLiquidity! @index #relation to AccountLiquidity
poolTokens: BigInt! # pool tokens
liquidityUSD: String!
}
type Account @entity {
id: ID!
latestHistoryElement: HistoryElement # for subscription support
lastLiquidation: VaultEvent # for subscription support
# liquidities: [AccountLiquidity] @derivedFrom(field: "account")
}
type AccountPointSystem @entity {
id: ID! # accountId - version
accountId: String!
version: Int! # 1 or 2
startedAtBlock: Int! # block
# points
xorFees: AssetVolume!
xorBurned: AssetVolume!
xorStakingValRewards: AssetVolume!
orderBook: AccountMetaEventCounter!
vault: AccountMetaEventCounter!
governance: AccountMetaGovernance!
deposit: AccountMetaDeposit!
}
type AccountMeta @entity {
id: ID!
# account: Account! @index #relation to Account
createdAtTimestamp: Int! # timestamp
createdAtBlock: Int! # block
xorFees: AssetVolume!
xorBurned: AssetVolume!
xorStakingValRewards: AssetVolume!
orderBook: AccountMetaEventCounter!
vault: AccountMetaEventCounter!
governance: AccountMetaGovernance!
deposit: AccountMetaDeposit!
}
type AccountMetaEventCounter @jsonField {
created: Int!
closed: Int!
amountUSD: String!
}
type AccountMetaGovernance @jsonField {
votes: Int!
amount: String!
amountUSD: String!
}
type AccountMetaDeposit @jsonField {
incomingUSD: String!
outgoingUSD: String!
}
type HistoryElement @entity {
id: ID!
type: HistoryElementType!
blockHeight: Int!
blockHash: String! @index
module: String! @index
method: String! @index
address: String! @index
networkFee: String!
execution: ExecutionResult!
timestamp: Int!
data: HistoryElementDetails
dataTo: String @index
dataFrom: String @index
dataAssets: [String]
calls: [HistoryElementCall!]! @derivedFrom(field: "historyElement")
callNames: [String]!
updatedAtBlock: Int!
}
type HistoryElementDetails @jsonField {
data: String # API is implemented by bypassing the scheme - `data` in all mappings is an object, not a String. See https://github.com/subquery/subql/issues/522.
}
type HistoryElementCall @entity {
id: ID!
historyElement: HistoryElement! @index
module: String!
method: String!
hash: String! @index
data: HistoryElementCallDetails
updatedAtBlock: Int!
}
type HistoryElementCallDetails @jsonField {
data: String # API is implemented by bypassing the scheme - `data` in all mappings is an object, not a String. See https://github.com/subquery/subql/issues/522.
}
type ExecutionResult @jsonField {
success: Boolean!
error: Error
}
type Error @jsonField {
moduleErrorId: Int
moduleErrorIndex: Int
nonModuleErrorMessage: String
}
type ReferrerReward @entity {
id: ID!
referral: String! @index
referrer: String!
updated: Int!
amount: BigInt!
}
type StakingStaker @entity {
id: ID!
eraValidators: [StakingEraValidator!]! @derivedFrom(field: "staker")
eraNominators: [StakingEraNominator!]! @derivedFrom(field: "staker")
payeeType: PayeeType!
payee: String
controller: String
}
type StakingValidator @entity {
id: ID!
bond: BigInt!
}
type StakingEraNominator @entity {
id: ID!
era: StakingEra!
bond: BigInt!
staker: StakingStaker!
nominations: [StakingEraNomination!]! @derivedFrom(field: "nominator")
}
type StakingEraNomination @entity {
id: ID!
era: StakingEra!
amount: BigInt!
validator: StakingEraValidator!
nominator: StakingEraNominator!
}
type StakingEraValidator @entity {
id: ID!
era: StakingEra!
validator: StakingValidator!
nominations: [StakingEraNomination!]! @derivedFrom(field: "validator")
ownBond: BigInt!
totalBond: BigInt!
rewardAmount: BigInt!
staker: StakingStaker!
}
type StakingEra @entity {
id: ID!
index: Int! @index
start: BigInt! @index
validators: [StakingEraValidator!]! @derivedFrom(field: "era")
nominators: [StakingEraNominator!]! @derivedFrom(field: "era")
nominations: [StakingEraNomination!]! @derivedFrom(field: "era")
}
enum OrderBookStatus {
Trade
PlaceAndCancel
OnlyCancel
Stop
}
enum OrderStatus {
Active
Aligned
Canceled
Expired
Filled
}
enum OrderType {
Limit
Market
}
interface IOrderBookDeal {
timestamp: Int! # created (and could be executed) at block timestamp
isBuy: Boolean! # buy or sell
amount: String! # number like formatted
price: String! # number like formatted
}
type OrderBookDeal implements IOrderBookDeal @jsonField {
orderId: Int!
timestamp: Int!
isBuy: Boolean!
amount: String!
price: String!
}
type OrderBook @entity {
id: ID!
dexId: Int! @index
baseAssetId: String!
quoteAssetId: String!
# baseAsset: Asset! @index
# quoteAsset: Asset! @index
baseAssetReserves: BigInt!
quoteAssetReserves: BigInt!
status: OrderBookStatus!
price: String
priceChangeDay: Float
volumeDayUSD: String
lastDeals: String
updatedAtBlock: Int!
data: [OrderBookSnapshot!]! @derivedFrom(field: "orderBook")
orders: [OrderBookOrder!]! @derivedFrom(field: "orderBook")
}
type OrderBookSnapshot @entity @compositeIndexes(fields: [["orderBook", "type"]]) {
id: ID!
orderBook: OrderBook! @index
timestamp: Int!
type: SnapshotType!
price: AssetPrice!
baseAssetVolume: String!
quoteAssetVolume: String!
volumeUSD: String!
liquidityUSD: String!
}
type OrderBookOrder implements IOrderBookDeal @entity {
id: ID!
type: OrderType!
orderId: Int
orderBook: OrderBook! @index
account: Account! @index
createdAtBlock: Int!
timestamp: Int!
isBuy: Boolean!
amount: String!
price: String!
lifetime: Int!
expiresAt: Int!
amountFilled: String!
status: OrderStatus!
updatedAtBlock: Int!
}
# CdpType
enum VaultType {
# Pays stability fee in underlying collateral, cannot be liquidated.
Type1
# Pays stability fee in stable coins, can be liquidated. (by default ??)
Type2
}
enum VaultStatus {
Opened
Closed
Liquidated # returned collateral amount === 0
}
type Vault @entity {
id: ID!
type: VaultType!
status: VaultStatus!
owner: Account! @index
collateralAsset: Asset! @index
debtAsset: Asset! @index
collateralAmountReturned: String
createdAtBlock: Int!
updatedAtBlock: Int! # updated or closed
events: [VaultEvent!]! @derivedFrom(field: "vault")
}
enum VaultEventType {
Created
Closed
CollateralDeposit
DebtIncreased
DebtPayment
Liquidated
}
type VaultEvent @entity {
id: ID!
type: VaultEventType!
vault: Vault! @index # relation to Vault
timestamp: Int!
block: Int!
amount: String
}