-
Notifications
You must be signed in to change notification settings - Fork 80
/
message_deposit.go
103 lines (88 loc) · 2.35 KB
/
message_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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package types
import (
"fmt"
sdkerrors "cosmossdk.io/errors"
"cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
)
const TypeMsgDeposit = "deposit"
var _ sdk.Msg = &MsgDeposit{}
func NewMsgDeposit(
creator,
receiver,
tokenA,
tokenB string,
amountsA,
amountsB []math.Int,
tickIndexes []int64,
fees []uint64,
depositOptions []*DepositOptions,
) *MsgDeposit {
return &MsgDeposit{
Creator: creator,
Receiver: receiver,
TokenA: tokenA,
TokenB: tokenB,
AmountsA: amountsA,
AmountsB: amountsB,
TickIndexesAToB: tickIndexes,
Fees: fees,
Options: depositOptions,
}
}
func (msg *MsgDeposit) Route() string {
return RouterKey
}
func (msg *MsgDeposit) Type() string {
return TypeMsgDeposit
}
func (msg *MsgDeposit) GetSigners() []sdk.AccAddress {
creator, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
panic(err)
}
return []sdk.AccAddress{creator}
}
func (msg *MsgDeposit) GetSignBytes() []byte {
bz := ModuleCdc.MustMarshalJSON(msg)
return sdk.MustSortJSON(bz)
}
func (msg *MsgDeposit) ValidateBasic() error {
_, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return sdkerrors.Wrapf(ErrInvalidAddress, "invalid creator address (%s)", err)
}
_, err = sdk.AccAddressFromBech32(msg.Receiver)
if err != nil {
return sdkerrors.Wrapf(ErrInvalidAddress, "invalid receiver address (%s)", err)
}
// Verify that the lengths of TickIndexes, Fees, AmountsA, AmountsB are all equal
numDeposits := len(msg.AmountsA)
if numDeposits != len(msg.Fees) ||
numDeposits != len(msg.TickIndexesAToB) ||
numDeposits != len(msg.AmountsB) ||
numDeposits != len(msg.Options) {
return ErrUnbalancedTxArray
}
if numDeposits == 0 {
return ErrZeroDeposit
}
poolsDeposited := make(map[string]bool)
for i := 0; i < numDeposits; i++ {
poolStr := fmt.Sprintf("%d-%d", msg.TickIndexesAToB[i], msg.Fees[i])
if _, ok := poolsDeposited[poolStr]; ok {
return ErrDuplicatePoolDeposit
}
poolsDeposited[poolStr] = true
if msg.AmountsA[i].LT(math.ZeroInt()) || msg.AmountsB[i].LT(math.ZeroInt()) {
return ErrZeroDeposit
}
if msg.AmountsA[i].Equal(math.ZeroInt()) && msg.AmountsB[i].Equal(math.ZeroInt()) {
return ErrZeroDeposit
}
if err := ValidateTickFee(msg.TickIndexesAToB[i], msg.Fees[i]); err != nil {
return err
}
}
return nil
}