-
Notifications
You must be signed in to change notification settings - Fork 41
/
reward_delegate.go
78 lines (73 loc) · 2.21 KB
/
reward_delegate.go
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
package event
import (
"0chain.net/smartcontract/common"
"0chain.net/smartcontract/dbs"
"0chain.net/smartcontract/dbs/model"
"0chain.net/smartcontract/stakepool/spenum"
"github.com/0chain/common/core/currency"
"gorm.io/gorm/clause"
)
// swagger:model RewardDelegate
type RewardDelegate struct {
model.UpdatableModel
Amount currency.Coin `json:"amount"`
BlockNumber int64 `json:"block_number" gorm:"index:idx_rew_del_prov,priority:1"`
PoolID string `json:"pool_id" gorm:"index:idx_rew_del_prov,priority:2"`
ProviderID string `json:"provider_id"`
RewardType spenum.Reward `json:"reward_type"`
ChallengeID string `json:"challenge_id"`
}
func (edb *EventDb) insertDelegateReward(inserts []dbs.StakePoolReward, round int64) error {
var drs []RewardDelegate
for _, sp := range inserts {
for poolId, amount := range sp.DelegateRewards {
dr := RewardDelegate{
Amount: amount,
BlockNumber: round,
PoolID: poolId,
ProviderID: sp.ID,
RewardType: sp.RewardType,
ChallengeID: sp.ChallengeID,
}
drs = append(drs, dr)
}
for poolId, amount := range sp.DelegatePenalties {
dp := RewardDelegate{
Amount: amount,
BlockNumber: round,
PoolID: poolId,
ProviderID: sp.ID,
RewardType: sp.RewardType,
ChallengeID: sp.ChallengeID,
}
drs = append(drs, dp)
}
}
if len(drs) == 0 {
return nil
}
return edb.Get().Create(&drs).Error
}
func (edb *EventDb) GetDelegateRewards(limit common.Pagination, PoolId string, start, end int64) ([]RewardDelegate, error) {
var rds []RewardDelegate
query := edb.Get().Model(&RewardDelegate{})
if PoolId == "" {
if start == end {
query = query.Where("block_number = ?", start)
} else {
query = query.Where("block_number >= ? AND block_number < ?", start, end)
}
} else {
if start == end {
query = query.Where("pool_id = ? AND block_number = ?", PoolId, start)
} else {
query = query.Where("pool_id = ? AND block_number >= ? AND block_number < ?", PoolId, start, end)
}
}
return rds, query.Offset(limit.Offset).
Limit(limit.Limit).
Order(clause.OrderByColumn{
Column: clause.Column{Name: "block_number"},
Desc: limit.IsDescending,
}).Scan(&rds).Error
}