/
share.go
91 lines (73 loc) · 2.6 KB
/
share.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 (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/percosis-labs/percosis/x/gamm/types"
"github.com/percosis-labs/percosis/x/poolmanager/events"
poolmanagertypes "github.com/percosis-labs/percosis/x/poolmanager/types"
)
func (k Keeper) applyJoinPoolStateChange(ctx sdk.Context, pool poolmanagertypes.PoolI, joiner sdk.AccAddress, numShares sdk.Int, joinCoins sdk.Coins) error {
err := k.bankKeeper.SendCoins(ctx, joiner, pool.GetAddress(), joinCoins)
if err != nil {
return err
}
err = k.MintPoolShareToAccount(ctx, pool, joiner, numShares)
if err != nil {
return err
}
err = k.setPool(ctx, pool)
if err != nil {
return err
}
events.EmitAddLiquidityEvent(ctx, joiner, pool.GetId(), joinCoins)
k.hooks.AfterJoinPool(ctx, joiner, pool.GetId(), joinCoins, numShares)
k.RecordTotalLiquidityIncrease(ctx, joinCoins)
return nil
}
func (k Keeper) applyExitPoolStateChange(ctx sdk.Context, pool poolmanagertypes.PoolI, exiter sdk.AccAddress, numShares sdk.Int, exitCoins sdk.Coins) error {
err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), exiter, exitCoins)
if err != nil {
return err
}
err = k.BurnPoolShareFromAccount(ctx, pool, exiter, numShares)
if err != nil {
return err
}
err = k.setPool(ctx, pool)
if err != nil {
return err
}
events.EmitRemoveLiquidityEvent(ctx, exiter, pool.GetId(), exitCoins)
k.hooks.AfterExitPool(ctx, exiter, pool.GetId(), numShares, exitCoins)
k.RecordTotalLiquidityDecrease(ctx, exitCoins)
return nil
}
// MintPoolShareToAccount attempts to mint shares of a GAMM denomination to the
// specified address returning an error upon failure. Shares are minted using
// the x/gamm module account.
func (k Keeper) MintPoolShareToAccount(ctx sdk.Context, pool poolmanagertypes.PoolI, addr sdk.AccAddress, amount sdk.Int) error {
amt := sdk.NewCoins(sdk.NewCoin(types.GetPoolShareDenom(pool.GetId()), amount))
err := k.bankKeeper.MintCoins(ctx, types.ModuleName, amt)
if err != nil {
return err
}
err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, addr, amt)
if err != nil {
return err
}
return nil
}
// BurnPoolShareFromAccount burns `amount` of the given pools shares held by `addr`.
func (k Keeper) BurnPoolShareFromAccount(ctx sdk.Context, pool poolmanagertypes.PoolI, addr sdk.AccAddress, amount sdk.Int) error {
amt := sdk.Coins{
sdk.NewCoin(types.GetPoolShareDenom(pool.GetId()), amount),
}
err := k.bankKeeper.SendCoinsFromAccountToModule(ctx, addr, types.ModuleName, amt)
if err != nil {
return err
}
err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, amt)
if err != nil {
return err
}
return nil
}