-
Notifications
You must be signed in to change notification settings - Fork 119
/
admin_msg_server.go
80 lines (67 loc) · 2.44 KB
/
admin_msg_server.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
package keeper
import (
"context"
"fmt"
admintypes "github.com/Sifchain/sifnode/x/admin/types"
clptypes "github.com/Sifchain/sifnode/x/clp/types"
"github.com/Sifchain/sifnode/x/margin/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
func (k msgServer) AdminClose(goCtx context.Context, msg *types.MsgAdminClose) (*types.MsgAdminCloseResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
signer, err := sdk.AccAddressFromBech32(msg.Signer)
if err != nil {
return nil, err
}
if !k.AdminKeeper().IsAdminAccount(ctx, admintypes.AdminType_MARGIN, signer) {
return nil, sdkerrors.Wrap(admintypes.ErrPermissionDenied, fmt.Sprintf("signer not authorised: %s", msg.Signer))
}
mtpToClose, err := k.GetMTP(ctx, msg.MtpAddress, msg.Id)
if err != nil {
return nil, err
}
var repayAmount sdk.Uint
switch mtpToClose.Position {
case types.Position_LONG:
var pool clptypes.Pool
nativeAsset := types.GetSettlementAsset()
if types.StringCompare(mtpToClose.CollateralAsset, nativeAsset) {
pool, err = k.ClpKeeper().GetPool(ctx, mtpToClose.CustodyAsset)
if err != nil {
return nil, sdkerrors.Wrap(clptypes.ErrPoolDoesNotExist, mtpToClose.CustodyAsset)
}
} else {
pool, err = k.ClpKeeper().GetPool(ctx, mtpToClose.CollateralAsset)
if err != nil {
return nil, sdkerrors.Wrap(clptypes.ErrPoolDoesNotExist, mtpToClose.CollateralAsset)
}
}
repayAmount, err = k.ForceCloseLong(ctx, &mtpToClose, &pool, true, msg.TakeMarginFund)
if err != nil {
return nil, err
}
default:
return nil, sdkerrors.Wrap(types.ErrInvalidPosition, mtpToClose.Position.String())
}
k.EmitAdminClose(ctx, &mtpToClose, repayAmount, msg.Signer)
return &types.MsgAdminCloseResponse{}, nil
}
func (k msgServer) AdminCloseAll(goCtx context.Context, msg *types.MsgAdminCloseAll) (*types.MsgAdminCloseAllResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
signer, err := sdk.AccAddressFromBech32(msg.Signer)
if err != nil {
return nil, err
}
if !k.AdminKeeper().IsAdminAccount(ctx, admintypes.AdminType_MARGIN, signer) {
return nil, sdkerrors.Wrap(admintypes.ErrPermissionDenied, fmt.Sprintf("signer not authorised: %s", msg.Signer))
}
params := k.GetParams(ctx)
params.SafetyFactor = sdk.NewDec(100)
if !msg.TakeMarginFund {
params.ForceCloseFundPercentage = sdk.ZeroDec()
}
k.SetParams(ctx, ¶ms)
k.EmitAdminCloseAll(ctx, msg.TakeMarginFund)
return &types.MsgAdminCloseAllResponse{}, nil
}