/
liquidation_position_logic.go
91 lines (70 loc) · 2.4 KB
/
liquidation_position_logic.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
89
90
91
package keeper
import (
"github.com/QuadrateOrg/core/x/grow/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
func (k Keeper) ExecuteCreateLiqPosition(ctx sdk.Context, msg *types.MsgOpenLiquidationPosition, Asset types.Asset) (error, string) {
amountInCoins, err := sdk.ParseCoinsNormalized(msg.AmountIn)
if err != nil {
return err, ""
}
if k.AddressEmptyCheck(ctx) {
return types.ErrReserveAddressEmpty, ""
}
creator, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return err, ""
}
DenomIn := amountInCoins.GetDenomByIndex(0)
asset, found := k.GetAssetByAssetId(ctx, k.GenerateAssetIdHash(DenomIn))
if !found {
return types.ErrAssetNotFound, ""
}
premium, err := k.ParseAndCheckPremium(msg.Premium)
if err != nil {
return err, ""
}
err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, creator, types.ModuleName, amountInCoins)
if err != nil {
return err, ""
}
liquidatorPositionId := k.GenerateLiquidatorPositionId(creator.String(), DenomIn, Asset.OracleAssetId, amountInCoins.String(), msg.Premium)
liqPosition := types.LiquidatorPosition{
LiquidatorPositionId: liquidatorPositionId,
ProvidedAssetId: asset.OracleAssetId,
WantAssetId: Asset.OracleAssetId,
Liquidator: creator.String(),
Amount: amountInCoins.String(),
Premium: premium.Uint64(),
}
k.AppendLiquidatorPosition(ctx, liqPosition)
return nil, liquidatorPositionId
}
func (k Keeper) ExecuteCloseLiqPosition(ctx sdk.Context, msg *types.MsgCloseLiquidationPosition) (error, sdk.Coin) {
creator, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return err, sdk.Coin{}
}
if k.AddressEmptyCheck(ctx) {
return types.ErrReserveAddressEmpty, sdk.Coin{}
}
liqPosition, found := k.GetLiquidatorPositionByLiquidatorPositionId(ctx, msg.LiquidatorPositionId)
if !found {
return types.ErrLiqPositionNotFound, sdk.Coin{}
}
err = k.CheckLiquidator(creator, liqPosition)
if err != nil {
return err, sdk.Coin{}
}
amountCoins, err := sdk.ParseCoinsNormalized(liqPosition.Amount)
if err != nil {
return err, sdk.Coin{}
}
amountInt := amountCoins.AmountOf(amountCoins.GetDenomByIndex(0))
err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, creator, amountCoins)
if err != nil {
return err, sdk.Coin{}
}
k.RemoveLiquidatorPosition(ctx, liqPosition.Id)
return nil, sdk.NewCoin(amountCoins.GetDenomByIndex(0), amountInt)
}