forked from paco0x/bodhi-subgraph
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathschema.graphql
263 lines (213 loc) · 5.87 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
# ===============================
# Core Entities
# ===============================
enum AppSource {
BODHI # fundamental protocol assets
SPACE # space app assets
WISHPOOL # wishpool app assets
}
enum AssetType {
ORIGINAL # original Bodhi assets
SPACE # space contract
SPACE_POST # post in space
WISH # wishpool wish
SUBMISSION # wishpool submission
}
type Asset @entity {
# Identity
id: ID!
assetId: BigInt!
arTxId: String
# Creator Info
creator: User # who created the asset (in Bodhi)
realCreator: Bytes # who is real author of content (in apps)
createdAt: BigInt!
# State
removed: Boolean!
lastTradeDirection: Int! # 1 for up/buy, -1 for down/sell, 0 for initial
# App and Asset Type
app: AppSource!
assetType: AssetType!
# Statistics
totalSupply: BigDecimal!
totalTrades: BigInt!
totalFees: BigDecimal!
totalVolume: BigDecimal!
totalHolders: BigInt!
# Relations
spacePost: SpacePost
holders: [UserAsset!]! @derivedFrom(field: "asset")
}
type User @entity {
# Identity
id: ID!
address: Bytes! # address
# Statistics
creatorProfit: BigDecimal!
tradingPnl: BigDecimal!
totalTrades: BigInt!
# Relations
assets: [UserAsset!]! @derivedFrom(field: "user")
trades: [Trade!]! @derivedFrom(field: "user")
}
type UserAsset @entity {
# Identity
id: ID! # `user.id.concat(asset.id)`
assetId: BigInt!
# Position Info
amount: BigDecimal!
avgPrice: BigDecimal!
# Relations
user: User!
asset: Asset!
}
# ===============================
# Core Events
# ===============================
type Create @entity(immutable: true) {
# Identity
id: Bytes!
assetId: BigInt! # uint256
# Info
sender: Bytes! # address
arTxId: String! # string
# Metadata
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
type Remove @entity(immutable: true) {
# Identity
id: Bytes!
assetId: BigInt! # uint256
# Info
sender: Bytes! # address
# Metadata
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
type Trade @entity(immutable: true) {
# Identity
id: Bytes!
assetId: BigInt! # uint256
# Trade Info
tradeType: Int! # uint8
tokenAmount: BigDecimal!
ethAmount: BigDecimal!
creatorFee: BigDecimal!
price: BigDecimal!
proxy: Int! # uint8 (0: none, 1: space.create, 2: helper.safeBuy)
supplyAfterTrade: BigDecimal! # total supply after this trade (for price calculation)
# Participants
user: User! # address
realSender: Bytes # address
# Relations
asset: Asset!
# Metadata
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
type Transfer @entity(immutable: true) {
# Identity
id: Bytes!
assetId: BigInt! # uint256
amount: BigInt! # uint256
# Participants
operator: Bytes! # address
from: Bytes! # address
to: Bytes! # address
# Metadata
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
# ===============================
# Trade Helper
# ===============================
type SafeBuy @entity(immutable: true) {
# Identity
id: Bytes!
assetId: BigInt! # uint256
# Trade Info
sender: Bytes!
tokenAmount: BigDecimal!
ethAmount: BigDecimal!
# Metadata
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
type ProxyTrade @entity {
id: Bytes! # tx hash
realSender: Bytes! # address
proxy: Int! # uint8 (0 none, 1 space.create, 2 helper.safeBuy)
}
# ===============================
# Space App
# ===============================
type Space @entity {
# Identity
id: ID! # space contract address
spaceId: BigInt! # can be used for sorting
spaceName: String!
spaceAddress: Bytes! # address
# Statistics
totalPosts: BigInt!
# Relations
creator: User!
asset: Asset!
user: User! # space as user (for revenue)
}
type SpacePost @entity {
# Identity
id: ID! # asset id
assetId: BigInt! # for sorting (latest)
spaceId: BigInt!
# Post Structure
isRoot: Boolean!
parentId: BigInt!
rootId: BigInt!
removedFromSpace: Boolean!
# Statistics
totalReplies: BigInt!
# Relations
asset: Asset!
creator: User!
parent: SpacePost
children: [SpacePost!]! @derivedFrom(field: "parent")
}
# ===============================
# Wishpool App
# ===============================
type Wish @entity {
# Identity
id: ID!
# Wish Info
createdAt: BigInt!
ethAmount: BigDecimal! # total rewarded ETH
tokenAmount: BigDecimal! # total rewarded token
totalSubmissions: BigInt! # total number of submissions
totalRewarded: BigInt! # total number of submissions rewarded
# Participants
creator: Bytes!
solver: Bytes! # designated solver
# Relations
asset: Asset!
submissions: [Submission!]! @derivedFrom(field: "wish")
}
type Submission @entity {
# Identity
id: ID!
# Info
createdAt: BigInt!
isRewarded: Boolean!
rewardedAt: BigInt # null if not rewarded
ethAmount: BigDecimal # null if not rewarded
tokenAmount: BigDecimal # null if not rewarded
# Relations
wish: Wish!
creator: Bytes!
asset: Asset!
}