-
Notifications
You must be signed in to change notification settings - Fork 0
/
order.go
84 lines (70 loc) · 2.39 KB
/
order.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
package keeper
import (
sdk "github.com/ayher/anatha/types"
sdkerrors "github.com/ayher/anatha/types/errors"
"github.com/ayher/project-anatha/config"
"github.com/ayher/project-anatha/x/treasury/internal/types"
)
func (k Keeper) HandleCreateSellOrder(ctx sdk.Context, sender sdk.AccAddress, pinAmount sdk.Coins) error {
buyBackPercentage := k.BuyBackPercentage(ctx)
stagePrice := k.GetPriceForStage(
ctx,
k.GetStageFromDistribution(
ctx,
k.DistributedFromTreasury(ctx),
),
)
dinAmountInt := pinAmount.AmountOf(config.DefaultDenom).Mul(stagePrice)
dinAmountInt = dinAmountInt.ToDec().Mul(buyBackPercentage).TruncateInt()
dinAmount := sdk.NewCoins(sdk.NewCoin(config.DefaultStableDenom, dinAmountInt))
if ! dinAmount.IsZero() {
err := k.TransferToBuyBackFund(ctx, sender, pinAmount)
if err != nil {
return err
}
err = k.TransferFromBuyBackFund(ctx, sender, dinAmount)
if err != nil {
return err
}
}
ctx.EventManager().EmitEvents(sdk.Events{
sdk.NewEvent(
types.EventTypeCreateSellOrder,
sdk.NewAttribute(types.AttributeKeyPinAmount, pinAmount.String()),
sdk.NewAttribute(types.AttributeKeyDinAmount, dinAmount.String()),
),
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueModule),
sdk.NewAttribute(types.AttributeKeySender, sender.String()),
),
})
return nil
}
func (k Keeper) HandleCreateBuyOrder(ctx sdk.Context, buyer sdk.AccAddress, dinAmount sdk.Coins) error {
if ! k.BankKeeper.HasCoins(ctx, buyer, dinAmount) {
return sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, "Insufficient funds for ANATHA purchase.")
}
err := k.supplyKeeper.SendCoinsFromAccountToModule(ctx, buyer, types.DistributionProfitsModuleName, dinAmount)
if err != nil {
return err
}
_, fromBuyBack, fromTreasury := k.CalculatePinAmountExtended(ctx, dinAmount)
err = k.DisburseFunds(ctx, nil, buyer, dinAmount, fromBuyBack, fromTreasury)
if err != nil {
return err
}
ctx.EventManager().EmitEvents(sdk.Events{
sdk.NewEvent(
types.EventTypeCreateBuyOrder,
sdk.NewAttribute(types.AttributeKeyPinAmount, fromBuyBack.Add(fromTreasury...).String()),
sdk.NewAttribute(types.AttributeKeyDinAmount, dinAmount.String()),
),
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueModule),
sdk.NewAttribute(types.AttributeKeySender, buyer.String()),
),
})
return nil
}