code.vegaprotocol.io/vega@v0.79.0/datanode/entities/teams.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package entities 17 18 import ( 19 "encoding/json" 20 "fmt" 21 "time" 22 23 "code.vegaprotocol.io/vega/libs/num" 24 v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" 25 eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" 26 ) 27 28 type ( 29 _Team struct{} 30 TeamID = ID[_Team] 31 ) 32 33 type Team struct { 34 ID TeamID 35 Referrer PartyID 36 Name string 37 TeamURL *string 38 AvatarURL *string 39 Closed bool 40 AllowList []string 41 TotalMembers uint64 42 CreatedAt time.Time 43 CreatedAtEpoch uint64 44 VegaTime time.Time 45 } 46 47 func (t Team) Cursor() *Cursor { 48 tc := TeamCursor{ 49 CreatedAt: t.CreatedAt, 50 ID: t.ID, 51 } 52 return NewCursor(tc.String()) 53 } 54 55 func (t Team) ToProto() *v2.Team { 56 return &v2.Team{ 57 TeamId: string(t.ID), 58 Referrer: string(t.Referrer), 59 Name: t.Name, 60 TeamUrl: t.TeamURL, 61 AvatarUrl: t.AvatarURL, 62 CreatedAt: t.CreatedAt.UnixNano(), 63 Closed: t.Closed, 64 AllowList: t.AllowList, 65 CreatedAtEpoch: t.CreatedAtEpoch, 66 TotalMembers: t.TotalMembers, 67 } 68 } 69 70 func (t Team) ToProtoEdge(_ ...any) (*v2.TeamEdge, error) { 71 return &v2.TeamEdge{ 72 Node: t.ToProto(), 73 Cursor: t.Cursor().Encode(), 74 }, nil 75 } 76 77 func TeamCreatedFromProto(created *eventspb.TeamCreated, vegaTime time.Time) *Team { 78 return &Team{ 79 ID: TeamID(created.TeamId), 80 Referrer: PartyID(created.Referrer), 81 Name: created.Name, 82 TeamURL: created.TeamUrl, 83 AvatarURL: created.AvatarUrl, 84 CreatedAt: time.Unix(0, created.CreatedAt), 85 CreatedAtEpoch: created.AtEpoch, 86 VegaTime: vegaTime, 87 Closed: created.Closed, 88 AllowList: created.AllowList, 89 } 90 } 91 92 type TeamUpdated struct { 93 ID TeamID 94 Name string 95 TeamURL *string 96 AvatarURL *string 97 Closed bool 98 AllowList []string 99 VegaTime time.Time 100 } 101 102 func TeamUpdatedFromProto(updated *eventspb.TeamUpdated, vegaTime time.Time) *TeamUpdated { 103 return &TeamUpdated{ 104 ID: TeamID(updated.TeamId), 105 Name: updated.Name, 106 TeamURL: updated.TeamUrl, 107 AvatarURL: updated.AvatarUrl, 108 Closed: updated.Closed, 109 AllowList: updated.AllowList, 110 VegaTime: vegaTime, 111 } 112 } 113 114 type TeamCursor struct { 115 CreatedAt time.Time 116 ID TeamID 117 } 118 119 func (tc TeamCursor) String() string { 120 bs, err := json.Marshal(tc) 121 if err != nil { 122 panic(fmt.Errorf("could not marshal team cursor: %v", err)) 123 } 124 return string(bs) 125 } 126 127 func (tc *TeamCursor) Parse(cursorString string) error { 128 if cursorString == "" { 129 return nil 130 } 131 return json.Unmarshal([]byte(cursorString), tc) 132 } 133 134 type TeamsStatistics struct { 135 TeamID TeamID 136 TotalQuantumRewards num.Decimal 137 QuantumRewards []QuantumRewardsPerEpoch 138 TotalQuantumVolumes *num.Uint 139 QuantumVolumes []QuantumVolumesPerEpoch 140 TotalGamesPlayed uint64 141 GamesPlayed []GameID 142 } 143 144 type QuantumRewardsPerEpoch struct { 145 Epoch uint64 146 Total num.Decimal 147 } 148 149 type QuantumVolumesPerEpoch struct { 150 Epoch uint64 151 Total *num.Uint 152 } 153 154 func (t TeamsStatistics) Cursor() *Cursor { 155 tc := TeamsStatisticsCursor{ 156 ID: t.TeamID, 157 } 158 return NewCursor(tc.String()) 159 } 160 161 func (t TeamsStatistics) ToProto() *v2.TeamStatistics { 162 gamesPlayed := make([]string, 0, len(t.GamesPlayed)) 163 for _, id := range t.GamesPlayed { 164 gamesPlayed = append(gamesPlayed, id.String()) 165 } 166 167 quantumRewards := make([]*v2.QuantumRewardsPerEpoch, 0, len(t.QuantumRewards)) 168 for _, r := range t.QuantumRewards { 169 quantumRewards = append(quantumRewards, &v2.QuantumRewardsPerEpoch{ 170 Epoch: r.Epoch, 171 TotalQuantumRewards: r.Total.String(), 172 }) 173 } 174 175 quantumVolumes := make([]*v2.QuantumVolumesPerEpoch, 0, len(t.QuantumVolumes)) 176 for _, r := range t.QuantumVolumes { 177 quantumVolumes = append(quantumVolumes, &v2.QuantumVolumesPerEpoch{ 178 Epoch: r.Epoch, 179 TotalQuantumVolumes: r.Total.String(), 180 }) 181 } 182 183 return &v2.TeamStatistics{ 184 TeamId: string(t.TeamID), 185 TotalQuantumVolume: t.TotalQuantumVolumes.String(), 186 TotalQuantumRewards: t.TotalQuantumRewards.String(), 187 QuantumRewards: quantumRewards, 188 QuantumVolumes: quantumVolumes, 189 TotalGamesPlayed: t.TotalGamesPlayed, 190 GamesPlayed: gamesPlayed, 191 } 192 } 193 194 func (t TeamsStatistics) ToProtoEdge(_ ...any) (*v2.TeamStatisticsEdge, error) { 195 return &v2.TeamStatisticsEdge{ 196 Node: t.ToProto(), 197 Cursor: t.Cursor().Encode(), 198 }, nil 199 } 200 201 type TeamsStatisticsCursor struct { 202 ID TeamID 203 } 204 205 func (c TeamsStatisticsCursor) String() string { 206 bs, err := json.Marshal(c) 207 if err != nil { 208 panic(fmt.Errorf("could not marshal teams stats cursor: %v", err)) 209 } 210 return string(bs) 211 } 212 213 func (c *TeamsStatisticsCursor) Parse(cursorString string) error { 214 if cursorString == "" { 215 return nil 216 } 217 return json.Unmarshal([]byte(cursorString), c) 218 } 219 220 type TeamMembersStatistics struct { 221 PartyID PartyID 222 TotalQuantumVolumes *num.Uint 223 TotalQuantumRewards num.Decimal 224 QuantumRewards []QuantumRewardsPerEpoch 225 QuantumVolumes []QuantumVolumesPerEpoch 226 TotalGamesPlayed uint64 227 GamesPlayed []GameID 228 } 229 230 func (t TeamMembersStatistics) Cursor() *Cursor { 231 tc := TeamMemberStatisticsCursor{ 232 ID: t.PartyID, 233 } 234 return NewCursor(tc.String()) 235 } 236 237 func (t TeamMembersStatistics) ToProto() *v2.TeamMemberStatistics { 238 gamesPlayed := make([]string, 0, len(t.GamesPlayed)) 239 for _, id := range t.GamesPlayed { 240 gamesPlayed = append(gamesPlayed, id.String()) 241 } 242 243 quantumRewards := make([]*v2.QuantumRewardsPerEpoch, 0, len(t.QuantumRewards)) 244 for _, r := range t.QuantumRewards { 245 quantumRewards = append(quantumRewards, &v2.QuantumRewardsPerEpoch{ 246 Epoch: r.Epoch, 247 TotalQuantumRewards: r.Total.String(), 248 }) 249 } 250 251 quantumVolumes := make([]*v2.QuantumVolumesPerEpoch, 0, len(t.QuantumVolumes)) 252 for _, r := range t.QuantumVolumes { 253 quantumVolumes = append(quantumVolumes, &v2.QuantumVolumesPerEpoch{ 254 Epoch: r.Epoch, 255 TotalQuantumVolumes: r.Total.String(), 256 }) 257 } 258 259 return &v2.TeamMemberStatistics{ 260 PartyId: string(t.PartyID), 261 TotalQuantumVolume: t.TotalQuantumVolumes.String(), 262 TotalQuantumRewards: t.TotalQuantumRewards.String(), 263 QuantumRewards: quantumRewards, 264 QuantumVolumes: quantumVolumes, 265 TotalGamesPlayed: t.TotalGamesPlayed, 266 GamesPlayed: gamesPlayed, 267 } 268 } 269 270 func (t TeamMembersStatistics) ToProtoEdge(_ ...any) (*v2.TeamMemberStatisticsEdge, error) { 271 return &v2.TeamMemberStatisticsEdge{ 272 Node: t.ToProto(), 273 Cursor: t.Cursor().Encode(), 274 }, nil 275 } 276 277 type TeamMemberStatisticsCursor struct { 278 ID PartyID 279 } 280 281 func (c TeamMemberStatisticsCursor) String() string { 282 bs, err := json.Marshal(c) 283 if err != nil { 284 panic(fmt.Errorf("could not marshal team member stats cursor: %v", err)) 285 } 286 return string(bs) 287 } 288 289 func (c *TeamMemberStatisticsCursor) Parse(cursorString string) error { 290 if cursorString == "" { 291 return nil 292 } 293 return json.Unmarshal([]byte(cursorString), c) 294 } 295 296 type TeamMember struct { 297 TeamID TeamID 298 PartyID PartyID 299 JoinedAt time.Time 300 JoinedAtEpoch uint64 301 VegaTime time.Time 302 } 303 304 func (t TeamMember) Cursor() *Cursor { 305 rc := RefereeCursor{ 306 PartyID: t.PartyID, 307 } 308 return NewCursor(rc.String()) 309 } 310 311 func (t TeamMember) ToProto() *v2.TeamReferee { 312 return &v2.TeamReferee{ 313 TeamId: string(t.TeamID), 314 Referee: string(t.PartyID), 315 JoinedAt: t.JoinedAt.UnixNano(), 316 JoinedAtEpoch: t.JoinedAtEpoch, 317 } 318 } 319 320 func (t TeamMember) ToProtoEdge(_ ...any) (*v2.TeamRefereeEdge, error) { 321 return &v2.TeamRefereeEdge{ 322 Node: t.ToProto(), 323 Cursor: t.Cursor().Encode(), 324 }, nil 325 } 326 327 func TeamRefereeFromProto(joined *eventspb.RefereeJoinedTeam, vegaTime time.Time) *TeamMember { 328 return &TeamMember{ 329 TeamID: TeamID(joined.TeamId), 330 PartyID: PartyID(joined.Referee), 331 JoinedAt: time.Unix(0, joined.JoinedAt), 332 JoinedAtEpoch: joined.AtEpoch, 333 VegaTime: vegaTime, 334 } 335 } 336 337 type RefereeCursor struct { 338 PartyID PartyID 339 } 340 341 func (rc RefereeCursor) String() string { 342 bs, err := json.Marshal(rc) 343 if err != nil { 344 panic(fmt.Errorf("could not marshal referee cursor: %v", err)) 345 } 346 return string(bs) 347 } 348 349 func (rc *RefereeCursor) Parse(cursorString string) error { 350 if cursorString == "" { 351 return nil 352 } 353 return json.Unmarshal([]byte(cursorString), rc) 354 } 355 356 type TeamMemberHistory struct { 357 TeamID TeamID 358 JoinedAt time.Time 359 JoinedAtEpoch uint64 360 } 361 362 func (t TeamMemberHistory) Cursor() *Cursor { 363 rc := RefereeHistoryCursor{ 364 JoinedAtEpoch: t.JoinedAtEpoch, 365 } 366 return NewCursor(rc.String()) 367 } 368 369 func (t TeamMemberHistory) ToProto() *v2.TeamRefereeHistory { 370 return &v2.TeamRefereeHistory{ 371 TeamId: string(t.TeamID), 372 JoinedAt: t.JoinedAt.UnixNano(), 373 JoinedAtEpoch: t.JoinedAtEpoch, 374 } 375 } 376 377 func (t TeamMemberHistory) ToProtoEdge(_ ...any) (*v2.TeamRefereeHistoryEdge, error) { 378 return &v2.TeamRefereeHistoryEdge{ 379 Node: &v2.TeamRefereeHistory{ 380 TeamId: string(t.TeamID), 381 JoinedAt: t.JoinedAt.UnixNano(), 382 JoinedAtEpoch: t.JoinedAtEpoch, 383 }, 384 Cursor: t.Cursor().Encode(), 385 }, nil 386 } 387 388 type RefereeHistoryCursor struct { 389 JoinedAtEpoch uint64 390 } 391 392 func (rh RefereeHistoryCursor) String() string { 393 bs, err := json.Marshal(rh) 394 if err != nil { 395 panic(fmt.Errorf("could not marshal referee history cursor: %v", err)) 396 } 397 return string(bs) 398 } 399 400 func (rh *RefereeHistoryCursor) Parse(cursorString string) error { 401 if cursorString == "" { 402 return nil 403 } 404 return json.Unmarshal([]byte(cursorString), rh) 405 } 406 407 type RefereeTeamSwitch struct { 408 FromTeamID TeamID 409 ToTeamID TeamID 410 PartyID PartyID 411 SwitchedAt time.Time 412 SwitchedAtEpoch uint64 413 VegaTime time.Time 414 } 415 416 func TeamRefereeHistoryFromProto(switched *eventspb.RefereeSwitchedTeam, vegaTime time.Time) *RefereeTeamSwitch { 417 return &RefereeTeamSwitch{ 418 FromTeamID: TeamID(switched.FromTeamId), 419 ToTeamID: TeamID(switched.ToTeamId), 420 PartyID: PartyID(switched.Referee), 421 SwitchedAt: time.Unix(0, switched.SwitchedAt), 422 SwitchedAtEpoch: switched.AtEpoch, 423 VegaTime: vegaTime, 424 } 425 }