-
Notifications
You must be signed in to change notification settings - Fork 41
/
close.go
52 lines (45 loc) · 1.45 KB
/
close.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
package keeper
import (
errorsmod "cosmossdk.io/errors"
"cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/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/perpetual/types"
)
func (k Keeper) Close(ctx sdk.Context, msg *types.MsgClose) (*types.MsgCloseResponse, error) {
mtp, err := k.GetMTP(ctx, msg.Creator, msg.Id)
if err != nil {
return nil, err
}
entry, found := k.assetProfileKeeper.GetEntry(ctx, ptypes.BaseCurrency)
if !found {
return nil, errorsmod.Wrapf(assetprofiletypes.ErrAssetProfileNotFound, "asset %s not found", ptypes.BaseCurrency)
}
baseCurrency := entry.Denom
var closedMtp *types.MTP
var repayAmount math.Int
switch mtp.Position {
case types.Position_LONG:
closedMtp, repayAmount, err = k.CloseLong(ctx, msg, baseCurrency)
if err != nil {
return nil, err
}
case types.Position_SHORT:
closedMtp, repayAmount, err = k.CloseShort(ctx, msg, baseCurrency)
if err != nil {
return nil, err
}
default:
return nil, errorsmod.Wrap(types.ErrInvalidPosition, mtp.Position.String())
}
// Emit close event
k.EmitCloseEvent(ctx, closedMtp, repayAmount)
return &types.MsgCloseResponse{
Id: closedMtp.Id,
Amount: repayAmount,
}, nil
}
func (k Keeper) EmitCloseEvent(ctx sdk.Context, mtp *types.MTP, repayAmount math.Int) {
ctx.EventManager().EmitEvent(types.GenerateCloseEvent(mtp, repayAmount))
}