-
Notifications
You must be signed in to change notification settings - Fork 0
/
gauge.go
129 lines (104 loc) · 3.62 KB
/
gauge.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
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
package keeper
import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/fanfury-sports/blackfury/x/gauge/types"
vetypes "github.com/fanfury-sports/blackfury/x/ve/types"
)
type FeeClaimee interface {
ClaimFees(ctx sdk.Context, claimant sdk.AccAddress) sdk.Coins
}
type Gauge struct {
Base
bribe Bribe
}
func (k Keeper) CreateGauge(ctx sdk.Context, depoistDenom string) {
// TODO: whitelists
if k.HasGauge(ctx, depoistDenom) {
panic("gauge exists")
}
k.SetGauge(ctx, depoistDenom)
}
func (k Keeper) Gauge(ctx sdk.Context, depoistDenom string) Gauge {
if !k.HasGauge(ctx, depoistDenom) {
panic("gauge not found")
}
return Gauge{
Base: NewBase(k, depoistDenom, types.GaugeKey(depoistDenom), true),
}
}
func (g Gauge) ClaimReward(ctx sdk.Context, veID uint64, voterKeeper types.VoterKeeper) (err error) {
voterKeeper.DistributeReward(ctx, g.PoolDenom())
return g.claimReward(ctx, veID)
}
func (g Gauge) Deposit(ctx sdk.Context, veID uint64, amount sdk.Int) (err error) {
owner := g.keeper.nftKeeper.GetOwner(ctx, vetypes.VeNftClass.Id, vetypes.VeIDFromUint64(veID))
coin := sdk.NewCoin(g.depoistDenom, amount)
err = g.keeper.bankKeeper.SendCoins(ctx, owner, g.EscrowPool(ctx).GetAddress(), sdk.NewCoins(coin))
if err != nil {
return err
}
totalDeposited := g.GetTotalDepositedAmount(ctx)
deposited := g.GetDepositedAmountByUser(ctx, veID)
totalDeposited = totalDeposited.Add(amount)
deposited = deposited.Add(amount)
g.SetTotalDepositedAmount(ctx, totalDeposited)
g.SetDepositedAmountByUser(ctx, veID, deposited)
// if first-time deposit
if g.GetUserVeIDByAddress(ctx, owner) == vetypes.EmptyVeID {
g.SetUserVeIDByAddress(ctx, owner, veID)
g.keeper.veKeeper.IncVeAttached(ctx, veID)
}
g.deriveAmountForUser(ctx, veID)
// TODO: voter emit deposit
return nil
}
func (g Gauge) Withdraw(ctx sdk.Context, veID uint64, amount sdk.Int) (err error) {
owner := g.keeper.nftKeeper.GetOwner(ctx, vetypes.VeNftClass.Id, vetypes.VeIDFromUint64(veID))
totalDeposited := g.GetTotalDepositedAmount(ctx)
deposited := g.GetDepositedAmountByUser(ctx, veID)
if amount.GT(deposited) {
return types.ErrTooLargeAmount
}
totalDeposited = totalDeposited.Sub(amount)
deposited = deposited.Sub(amount)
g.SetTotalDepositedAmount(ctx, totalDeposited)
if deposited.IsPositive() {
g.SetDepositedAmountByUser(ctx, veID, deposited)
} else {
g.DeleteDepositedAmountByUser(ctx, veID)
g.DeleteUserVeIDByAddress(ctx, owner)
g.keeper.veKeeper.DecVeAttached(ctx, veID)
}
coin := sdk.NewCoin(g.depoistDenom, amount)
err = g.keeper.bankKeeper.SendCoins(ctx, g.EscrowPool(ctx).GetAddress(), owner, sdk.NewCoins(coin))
if err != nil {
return err
}
g.deriveAmountForUser(ctx, veID)
// TODO: voter emit withdraw
return nil
}
func (g Gauge) DepositReward(ctx sdk.Context, sender sdk.AccAddress, rewardDenom string, amount sdk.Int) error {
return g.depositReward(ctx, sender, rewardDenom, amount)
}
func (g Gauge) DepositFees(ctx sdk.Context, feeClaimee FeeClaimee) (err error) {
claimed := feeClaimee.ClaimFees(ctx, g.EscrowPool(ctx).GetAddress())
acc := g.EscrowPool(ctx).GetAddress()
for _, fee := range claimed {
reward := g.GetReward(ctx, fee.Denom)
feeAmount := reward.AccruedAmount.Add(fee.Amount)
if feeAmount.GT(g.bribe.RemainingReward(ctx, fee.Denom)) && feeAmount.QuoRaw(vetypes.RegulatedPeriod).IsPositive() {
err = g.bribe.depositReward(ctx, acc, fee.Denom, feeAmount)
if err != nil {
return err
}
// clear accrued undistributed amount
reward.AccruedAmount = sdk.ZeroInt()
} else {
// accrue undistributed amount
reward.AccruedAmount = feeAmount
}
g.SetReward(ctx, fee.Denom, reward)
}
return nil
}