-
Notifications
You must be signed in to change notification settings - Fork 66
/
keeper.go
89 lines (75 loc) · 2.35 KB
/
keeper.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
package keeper
import (
"fmt"
"github.com/bitsongofficial/go-bitsong/x/merkledrop/types"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/tendermint/tendermint/libs/log"
)
type Keeper struct {
storeKey sdk.StoreKey
cdc codec.Codec
accountKeeper types.AccountKeeper
bankKeeper types.BankKeeper
distrKeeper types.DistrKeeper
paramSpace types.ParamSubspace
}
func NewKeeper(
cdc codec.Codec,
key sdk.StoreKey,
ak types.AccountKeeper,
bk types.BankKeeper,
dk types.DistrKeeper,
paramSpace paramstypes.Subspace,
) Keeper {
if addr := ak.GetModuleAddress(types.ModuleName); addr == nil {
panic("the " + types.ModuleName + " module account has not been set")
}
// set KeyTable if it has not already been set
if !paramSpace.HasKeyTable() {
paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable())
}
return Keeper{
storeKey: key,
cdc: cdc,
accountKeeper: ak,
bankKeeper: bk,
distrKeeper: dk,
paramSpace: paramSpace,
}
}
// Logger returns a module-specific logger.
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
return ctx.Logger().With("module", fmt.Sprintf("go-bitsong/%s", types.ModuleName))
}
func (k Keeper) Withdraw(ctx sdk.Context, merkledropID uint64) error {
// get merkledrop
merkledrop, err := k.getMerkleDropById(ctx, merkledropID)
if err != nil {
return sdkerrors.Wrapf(types.ErrMerkledropNotExist, "merkledrop: %d does not exist", merkledropID)
}
// check if total amount < claimed amount (who knows?)
if merkledrop.Amount.LT(merkledrop.Claimed) {
panic(fmt.Errorf("merkledrop-id: %d, total_amount (%s) < claimed_amount (%s)", merkledrop.Id, merkledrop.Amount, merkledrop.Claimed))
}
// get balance
balance := merkledrop.Amount.Sub(merkledrop.Claimed)
// send coins
coin := sdk.NewCoin(merkledrop.Denom, balance)
owner, err := sdk.AccAddressFromBech32(merkledrop.Owner)
if err != nil {
return err
}
err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, owner, sdk.Coins{coin})
if err != nil {
return sdkerrors.Wrapf(types.ErrTransferCoins, "%s", coin)
}
// emit event
ctx.EventManager().EmitTypedEvent(&types.EventWithdraw{
MerkledropId: merkledrop.Id,
Coin: coin,
})
return nil
}