/
msg_server_deposit.go
87 lines (75 loc) · 2.44 KB
/
msg_server_deposit.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
package keeper
import (
"context"
"encoding/hex"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stafihub/stafihub/x/bridge/types"
)
func (k msgServer) Deposit(goCtx context.Context, msg *types.MsgDeposit) (*types.MsgDepositResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
_, err := hex.DecodeString(msg.Receiver)
if err != nil {
return nil, types.ErrReceiverFormatNotRight
}
if msg.Amount.LTE(sdk.ZeroInt()) {
return nil, types.ErrDepositAmountZero
}
chainId := uint8(msg.DestChainId)
if !k.Keeper.HasChainId(ctx, chainId) {
return nil, types.ErrChainIdNotSupport
}
if k.Keeper.HasBannedDenom(ctx, chainId, msg.Denom) {
return nil, types.ErrBannedDenom
}
resourceIdToDenom, found := k.Keeper.GetResourceIdToDenomByDenom(ctx, msg.Denom)
if !found {
return nil, types.ErrResourceIdNotFound
}
userAddress, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return nil, err
}
// relay fee
relayFeeReceiver, found := k.Keeper.GetRelayFeeReceiver(ctx)
if !found {
return nil, types.ErrRelayFeeReceiverNotSet
}
relayFee := k.Keeper.GetRelayFee(ctx, chainId)
if relayFee.Amount.GT(sdk.ZeroInt()) {
err := k.bankKeeper.SendCoins(ctx, userAddress, relayFeeReceiver, sdk.NewCoins(relayFee))
if err != nil {
return nil, err
}
}
// lock or burn token
balance := k.bankKeeper.GetBalance(ctx, userAddress, msg.Denom)
if balance.Amount.LT(msg.Amount) {
return nil, types.ErrBalanceNotEnough
}
shouldBurnedOrLockedCoins := sdk.NewCoins(sdk.NewCoin(msg.Denom, msg.Amount))
err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, userAddress, types.ModuleName, shouldBurnedOrLockedCoins)
if err != nil {
return nil, err
}
if resourceIdToDenom.DenomType == types.External {
err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, shouldBurnedOrLockedCoins)
if err != nil {
return nil, err
}
}
//update deposit count
count := k.Keeper.GetDepositCountById(ctx, chainId)
k.Keeper.SetDepositCount(ctx, chainId, count+1)
ctx.EventManager().EmitEvent(
sdk.NewEvent(
types.EventTypeDeposit,
sdk.NewAttribute(types.AttributeKeyDestChainId, fmt.Sprintf("%d", chainId)),
sdk.NewAttribute(types.AttributeKeyResourceId, resourceIdToDenom.ResourceId),
sdk.NewAttribute(types.AttributeKeyDepositNonce, fmt.Sprintf("%d", count)),
sdk.NewAttribute(types.AttributeKeyAmount, msg.Amount.String()),
sdk.NewAttribute(types.AttributeKeyReceiver, msg.Receiver),
),
)
return &types.MsgDepositResponse{}, nil
}