/
ante.go
65 lines (57 loc) · 1.68 KB
/
ante.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
package keeper
import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/irisnet/irismod/modules/token/types"
)
type ValidateTokenFeeDecorator struct {
k Keeper
bk types.BankKeeper
}
func NewValidateTokenFeeDecorator(k Keeper, bk types.BankKeeper) ValidateTokenFeeDecorator {
return ValidateTokenFeeDecorator{
k: k,
bk: bk,
}
}
// AnteHandle returns an AnteHandler that checks if the balance of
// the fee payer is sufficient for token related fee
func (dtf ValidateTokenFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) {
// total fee
feeMap := make(map[string]sdk.Coin)
for _, msg := range tx.GetMsgs() {
switch msg := msg.(type) {
case *types.MsgIssueToken:
fee, err := dtf.k.GetTokenIssueFee(ctx, msg.Symbol)
if err != nil {
return ctx, sdkerrors.Wrap(types.ErrInvalidBaseFee, err.Error())
}
if fe, ok := feeMap[msg.Owner]; ok {
feeMap[msg.Owner] = fe.Add(fee)
} else {
feeMap[msg.Owner] = fee
}
case *types.MsgMintToken:
fee, err := dtf.k.GetTokenMintFee(ctx, msg.Symbol)
if err != nil {
return ctx, sdkerrors.Wrap(types.ErrInvalidBaseFee, err.Error())
}
if fe, ok := feeMap[msg.Owner]; ok {
feeMap[msg.Owner] = fe.Add(fee)
} else {
feeMap[msg.Owner] = fee
}
}
}
for addr, fee := range feeMap {
owner, _ := sdk.AccAddressFromBech32(addr)
balance := dtf.bk.GetBalance(ctx, owner, fee.Denom)
if balance.IsLT(fee) {
return ctx, sdkerrors.Wrapf(
sdkerrors.ErrInsufficientFunds, "insufficient coins for token fee; %s < %s", balance, fee,
)
}
}
// continue
return next(ctx, tx, simulate)
}