/
payment.go
79 lines (64 loc) · 2.03 KB
/
payment.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
package keeper
import (
sdk "github.com/cosmos/cosmos-sdk/types"
hubtypes "github.com/sentinel-official/hub/types"
"github.com/sentinel-official/hub/x/session/types"
)
func (k *Keeper) ProcessPaymentAndUpdateQuota(ctx sdk.Context, session types.Session) error {
from, err := sdk.AccAddressFromBech32(session.Address)
if err != nil {
return err
}
subscription, found := k.GetSubscription(ctx, session.Subscription)
if !found {
return types.ErrorSubscriptionDoesNotExit
}
if subscription.Status.Equal(hubtypes.StatusInactive) {
return nil
}
quota, found := k.GetQuota(ctx, session.Subscription, from)
if !found {
return types.ErrorQuotaDoesNotExist
}
available := quota.Allocated.Sub(quota.Consumed)
if !available.IsPositive() {
return nil
}
if subscription.Plan == 0 {
bandwidth := hubtypes.NewBandwidth(
session.Bandwidth.Sum(), sdk.ZeroInt(),
).CeilTo(
hubtypes.Gigabyte.Quo(subscription.Price.Amount),
).Sum()
if bandwidth.GT(available) {
bandwidth = available
}
quota.Consumed = quota.Consumed.Add(bandwidth)
k.SetQuota(ctx, session.Subscription, quota)
var (
amount = subscription.Amount(bandwidth)
sessionNode = session.GetNode()
)
ctx.Logger().Info("calculated payment for session", "id", session.Id,
"price", subscription.Price, "deposit", subscription.Deposit, "amount", amount,
"consumed", session.Bandwidth.Sum(), "rounded", bandwidth)
ctx.EventManager().EmitTypedEvent(
&types.EventPay{
Id: session.Id,
Node: session.Node,
Subscription: session.Subscription,
Amount: amount,
},
)
return k.SendCoinFromDepositToAccount(ctx, from, sessionNode.Bytes(), amount)
}
bandwidth := session.Bandwidth.Sum()
if bandwidth.GT(available) {
bandwidth = available
}
quota.Consumed = quota.Consumed.Add(bandwidth)
k.SetQuota(ctx, session.Subscription, quota)
ctx.Logger().Info("calculated bandwidth for session", "id", session.Id,
"plan", subscription.Plan, "consumed", session.Bandwidth.Sum(), "rounded", bandwidth)
return nil
}