-
Notifications
You must be signed in to change notification settings - Fork 44
/
msg_server_bond.go
88 lines (74 loc) · 2.53 KB
/
msg_server_bond.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
package keeper
import (
"context"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
assetprofiletypes "github.com/elys-network/elys/x/assetprofile/types"
ptypes "github.com/elys-network/elys/x/parameter/types"
"github.com/elys-network/elys/x/stablestake/types"
)
func (k msgServer) Bond(goCtx context.Context, msg *types.MsgBond) (*types.MsgBondResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
params := k.GetParams(ctx)
sender := sdk.MustAccAddressFromBech32(msg.Creator)
depositDenom := k.GetDepositDenom(ctx)
depositCoin := sdk.NewCoin(depositDenom, msg.Amount)
err := k.bk.SendCoinsFromAccountToModule(ctx, sender, types.ModuleName, sdk.Coins{depositCoin})
if err != nil {
return nil, err
}
shareDenom := types.GetShareDenom()
if params.RedemptionRate.IsZero() {
return nil, types.ErrRedemptionRateIsZero
}
shareAmount := sdk.NewDecFromInt(depositCoin.Amount).Quo(params.RedemptionRate).RoundInt()
shareCoins := sdk.NewCoins(sdk.NewCoin(shareDenom, shareAmount))
err = k.bk.MintCoins(ctx, types.ModuleName, shareCoins)
if err != nil {
return nil, err
}
err = k.bk.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sender, shareCoins)
if err != nil {
return nil, err
}
_, found := k.assetProfileKeeper.GetEntry(ctx, shareDenom)
if !found {
// Set an entity to assetprofile
entry := assetprofiletypes.Entry{
Authority: authtypes.NewModuleAddress(types.ModuleName).String(),
BaseDenom: shareDenom,
Decimals: ptypes.BASE_DECIMAL,
Denom: shareDenom,
Path: "",
IbcChannelId: "",
IbcCounterpartyChannelId: "",
DisplayName: shareDenom,
DisplaySymbol: "",
Network: "",
Address: "",
ExternalSymbol: "",
TransferLimit: "",
Permissions: make([]string, 0),
UnitDenom: "",
IbcCounterpartyDenom: "",
IbcCounterpartyChainId: "",
CommitEnabled: true,
WithdrawEnabled: true,
}
k.assetProfileKeeper.SetEntry(ctx, entry)
}
// Commit LP token
err = k.commitmentKeeper.CommitLiquidTokens(ctx, sender, shareDenom, shareAmount, 0)
if err != nil {
return nil, err
}
params.TotalValue = params.TotalValue.Add(msg.Amount)
k.SetParams(ctx, params)
if k.hooks != nil {
err := k.hooks.AfterBond(ctx, msg.Creator, shareAmount)
if err != nil {
return nil, err
}
}
return &types.MsgBondResponse{}, nil
}