-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Expand file tree
/
Copy pathpermanent_locking_account.go
More file actions
110 lines (92 loc) · 3.43 KB
/
Copy pathpermanent_locking_account.go
File metadata and controls
110 lines (92 loc) · 3.43 KB
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
package lockup
import (
"context"
"time"
"cosmossdk.io/math"
"cosmossdk.io/x/accounts/accountstd"
lockuptypes "cosmossdk.io/x/accounts/defaults/lockup/v1"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// Compile-time type assertions
var (
_ accountstd.Interface = (*PermanentLockingAccount)(nil)
)
// NewPermanentLockingAccount creates a new PermanentLockingAccount object.
func NewPermanentLockingAccount(d accountstd.Dependencies) (*PermanentLockingAccount, error) {
baseLockup := newBaseLockup(d)
return &PermanentLockingAccount{baseLockup}, nil
}
type PermanentLockingAccount struct {
*BaseLockup
}
func (plva PermanentLockingAccount) Init(ctx context.Context, msg *lockuptypes.MsgInitLockupAccount) (*lockuptypes.MsgInitLockupAccountResponse, error) {
resp, err := plva.BaseLockup.Init(ctx, msg)
if err != nil {
return nil, err
}
err = plva.EndTime.Set(ctx, time.Time{})
if err != nil {
return nil, err
}
return resp, err
}
// GetlockedCoinsWithDenoms returns the total number of locked coins. If no coins are
// locked, nil is returned.
func (plva PermanentLockingAccount) GetlockedCoinsWithDenoms(ctx context.Context, blockTime time.Time, denoms ...string) (sdk.Coins, error) {
vestingCoins := sdk.Coins{}
for _, denom := range denoms {
originalVestingAmt, err := plva.OriginalLocking.Get(ctx, denom)
if err != nil {
return nil, err
}
vestingCoins = append(vestingCoins, sdk.NewCoin(denom, originalVestingAmt))
}
return vestingCoins, nil
}
func (plva *PermanentLockingAccount) Delegate(ctx context.Context, msg *lockuptypes.MsgDelegate) (
*lockuptypes.MsgExecuteMessagesResponse, error,
) {
return plva.BaseLockup.Delegate(ctx, msg, plva.GetlockedCoinsWithDenoms)
}
func (plva *PermanentLockingAccount) Undelegate(ctx context.Context, msg *lockuptypes.MsgUndelegate) (
*lockuptypes.MsgExecuteMessagesResponse, error,
) {
return plva.BaseLockup.Undelegate(ctx, msg)
}
func (plva *PermanentLockingAccount) SendCoins(ctx context.Context, msg *lockuptypes.MsgSend) (
*lockuptypes.MsgExecuteMessagesResponse, error,
) {
return plva.BaseLockup.SendCoins(ctx, msg, plva.GetlockedCoinsWithDenoms)
}
func (plva PermanentLockingAccount) QueryLockupAccountInfo(ctx context.Context, req *lockuptypes.QueryLockupAccountInfoRequest) (
*lockuptypes.QueryLockupAccountInfoResponse, error,
) {
resp, err := plva.BaseLockup.QueryLockupAccountBaseInfo(ctx, req)
if err != nil {
return nil, err
}
originalLocking := sdk.Coins{}
err = plva.IterateCoinEntries(ctx, plva.OriginalLocking, func(key string, value math.Int) (stop bool, err error) {
originalLocking = append(originalLocking, sdk.NewCoin(key, value))
return false, nil
})
if err != nil {
return nil, err
}
resp.LockedCoins = originalLocking
resp.UnlockedCoins = sdk.Coins{}
return resp, nil
}
// Implement smart account interface
func (plva PermanentLockingAccount) RegisterInitHandler(builder *accountstd.InitBuilder) {
accountstd.RegisterInitHandler(builder, plva.Init)
}
func (plva PermanentLockingAccount) RegisterExecuteHandlers(builder *accountstd.ExecuteBuilder) {
accountstd.RegisterExecuteHandler(builder, plva.Delegate)
accountstd.RegisterExecuteHandler(builder, plva.Undelegate)
accountstd.RegisterExecuteHandler(builder, plva.SendCoins)
accountstd.RegisterExecuteHandler(builder, plva.WithdrawReward)
}
func (plva PermanentLockingAccount) RegisterQueryHandlers(builder *accountstd.QueryBuilder) {
accountstd.RegisterQueryHandler(builder, plva.QueryLockupAccountInfo)
}