/
msg.go
183 lines (157 loc) · 5.03 KB
/
msg.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
package types
import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx"
"github.com/ethereum/go-ethereum/common"
)
// ensure Msg interface compliance at compile time
var (
_ sdk.Msg = &MsgBridgeEthereumToFury{}
_ sdk.Msg = &MsgConvertCoinToERC20{}
_ sdk.Msg = &MsgConvertERC20ToCoin{}
_ legacytx.LegacyMsg = &MsgConvertERC20ToCoin{}
)
// NewMsgBridgeEthereumToFury returns a new MsgBridgeEthereumToFury
func NewMsgBridgeEthereumToFury(
relayer string,
ethereumERC20Address string,
amount sdk.Int,
receiver string,
sequence sdk.Int,
) MsgBridgeEthereumToFury {
return MsgBridgeEthereumToFury{
Relayer: relayer,
EthereumERC20Address: ethereumERC20Address,
Amount: amount,
Receiver: receiver,
Sequence: sequence,
}
}
// GetSigners returns the addresses of signers that must sign.
func (msg MsgBridgeEthereumToFury) GetSigners() []sdk.AccAddress {
sender, err := sdk.AccAddressFromBech32(msg.Relayer)
if err != nil {
panic(err)
}
return []sdk.AccAddress{sender}
}
// ValidateBasic does a simple validation check that doesn't require access to any other information.
func (msg MsgBridgeEthereumToFury) ValidateBasic() error {
_, err := sdk.AccAddressFromBech32(msg.Relayer)
if err != nil {
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, err.Error())
}
if !common.IsHexAddress(msg.EthereumERC20Address) {
return sdkerrors.Wrap(
sdkerrors.ErrInvalidAddress,
"ethereum ERC20 address is not a valid hex address",
)
}
if msg.Amount.IsZero() || msg.Amount.IsNegative() {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "amount must be positive non-zero %s", msg.Amount)
}
if !common.IsHexAddress(msg.Receiver) {
return sdkerrors.Wrap(
sdkerrors.ErrInvalidAddress,
"receiver address is not a valid hex address",
)
}
if msg.Sequence.IsNegative() {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidSequence, "sequence is negative %s", msg.Sequence)
}
return nil
}
// NewMsgConvertCoinToERC20 returns a new MsgConvertCoinToERC20
func NewMsgConvertCoinToERC20(
initiator string,
receiver string,
amount sdk.Coin,
) MsgConvertCoinToERC20 {
return MsgConvertCoinToERC20{
Initiator: initiator,
Receiver: receiver,
Amount: &amount,
}
}
// GetSigners returns the addresses of signers that must sign.
func (msg MsgConvertCoinToERC20) GetSigners() []sdk.AccAddress {
sender, err := sdk.AccAddressFromBech32(msg.Initiator)
if err != nil {
panic(err)
}
return []sdk.AccAddress{sender}
}
// ValidateBasic does a simple validation check that doesn't require access to any other information.
func (msg MsgConvertCoinToERC20) ValidateBasic() error {
_, err := sdk.AccAddressFromBech32(msg.Initiator)
if err != nil {
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, err.Error())
}
if !common.IsHexAddress(msg.Receiver) {
return sdkerrors.Wrap(
sdkerrors.ErrInvalidAddress,
"Receiver is not a valid hex address",
)
}
if msg.Amount.IsZero() {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "amount cannot be zero")
}
// Checks for negative
return msg.Amount.Validate()
}
// NewMsgConvertERC20ToCoin returns a new MsgConvertERC20ToCoin
func NewMsgConvertERC20ToCoin(
initiator InternalEVMAddress,
receiver sdk.AccAddress,
contractAddr InternalEVMAddress,
amount sdk.Int,
) MsgConvertERC20ToCoin {
return MsgConvertERC20ToCoin{
Initiator: initiator.String(),
Receiver: receiver.String(),
FuryERC20Address: contractAddr.String(),
Amount: amount,
}
}
// GetSigners returns the addresses of signers that must sign.
func (msg MsgConvertERC20ToCoin) GetSigners() []sdk.AccAddress {
addr := common.HexToAddress(msg.Initiator)
sender := sdk.AccAddress(addr.Bytes())
return []sdk.AccAddress{sender}
}
// ValidateBasic does a simple validation check that doesn't require access to any other information.
func (msg MsgConvertERC20ToCoin) ValidateBasic() error {
if !common.IsHexAddress(msg.Initiator) {
return sdkerrors.Wrap(
sdkerrors.ErrInvalidAddress,
"initiator is not a valid hex address",
)
}
if !common.IsHexAddress(msg.FuryERC20Address) {
return sdkerrors.Wrap(
sdkerrors.ErrInvalidAddress,
"erc20 contract address is not a valid hex address",
)
}
_, err := sdk.AccAddressFromBech32(msg.Receiver)
if err != nil {
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "receiver is not a valid bech32 address")
}
if msg.Amount.LTE(sdk.ZeroInt()) {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "amount cannot be zero or less")
}
return nil
}
// GetSignBytes implements the LegacyMsg.GetSignBytes method.
func (msg MsgConvertERC20ToCoin) GetSignBytes() []byte {
return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg))
}
// Route implements the LegacyMsg.Route method.
func (msg MsgConvertERC20ToCoin) Route() string {
return RouterKey
}
// Type implements the LegacyMsg.Type method.
func (msg MsgConvertERC20ToCoin) Type() string {
return "bridge_convert_erc20_to_coin"
}