2018-03-14 05:11:33 -07:00
|
|
|
package ibc
|
|
|
|
|
|
|
|
import (
|
2018-06-07 16:49:37 -07:00
|
|
|
"encoding/json"
|
2018-03-15 05:49:18 -07:00
|
|
|
|
2018-09-13 11:17:32 -07:00
|
|
|
codec "github.com/cosmos/cosmos-sdk/codec"
|
2018-06-07 16:49:37 -07:00
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2018-03-14 05:11:33 -07:00
|
|
|
)
|
|
|
|
|
2018-06-07 16:49:37 -07:00
|
|
|
var (
|
2018-09-13 11:17:32 -07:00
|
|
|
msgCdc *codec.Codec
|
2018-06-07 16:49:37 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2018-09-13 11:17:32 -07:00
|
|
|
msgCdc = codec.New()
|
2018-06-07 16:49:37 -07:00
|
|
|
}
|
|
|
|
|
2018-03-15 06:54:44 -07:00
|
|
|
// ------------------------------
|
|
|
|
// IBCPacket
|
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// nolint - TODO rename to Packet as IBCPacket stutters (golint)
|
2018-03-15 06:54:44 -07:00
|
|
|
// IBCPacket defines a piece of data that can be send between two separate
|
|
|
|
// blockchains.
|
2018-03-14 05:11:33 -07:00
|
|
|
type IBCPacket struct {
|
2018-09-02 11:20:14 -07:00
|
|
|
SrcAddr sdk.AccAddress `json:"src_addr"`
|
|
|
|
DestAddr sdk.AccAddress `json:"dest_addr"`
|
|
|
|
Coins sdk.Coins `json:"coins"`
|
|
|
|
SrcChain string `json:"src_chain"`
|
|
|
|
DestChain string `json:"dest_chain"`
|
2018-03-14 05:11:33 -07:00
|
|
|
}
|
|
|
|
|
2018-07-06 00:06:53 -07:00
|
|
|
func NewIBCPacket(srcAddr sdk.AccAddress, destAddr sdk.AccAddress, coins sdk.Coins,
|
2018-03-15 09:26:21 -07:00
|
|
|
srcChain string, destChain string) IBCPacket {
|
|
|
|
|
|
|
|
return IBCPacket{
|
|
|
|
SrcAddr: srcAddr,
|
|
|
|
DestAddr: destAddr,
|
|
|
|
Coins: coins,
|
|
|
|
SrcChain: srcChain,
|
|
|
|
DestChain: destChain,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-07 18:28:40 -07:00
|
|
|
//nolint
|
2018-06-07 16:49:37 -07:00
|
|
|
func (p IBCPacket) GetSignBytes() []byte {
|
2018-07-05 13:36:51 -07:00
|
|
|
b, err := msgCdc.MarshalJSON(p)
|
2018-06-07 16:49:37 -07:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2018-07-05 17:09:23 -07:00
|
|
|
return sdk.MustSortJSON(b)
|
2018-06-07 16:49:37 -07:00
|
|
|
}
|
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// validator the ibc packey
|
2018-06-07 18:28:40 -07:00
|
|
|
func (p IBCPacket) ValidateBasic() sdk.Error {
|
|
|
|
if p.SrcChain == p.DestChain {
|
2018-06-28 17:54:47 -07:00
|
|
|
return ErrIdenticalChains(DefaultCodespace).TraceSDK("")
|
2018-03-18 06:51:08 -07:00
|
|
|
}
|
2018-06-07 18:28:40 -07:00
|
|
|
if !p.Coins.IsValid() {
|
2018-03-19 16:22:49 -07:00
|
|
|
return sdk.ErrInvalidCoins("")
|
|
|
|
}
|
2018-03-18 06:51:08 -07:00
|
|
|
return nil
|
2018-03-16 13:39:42 -07:00
|
|
|
}
|
|
|
|
|
2018-03-15 06:54:44 -07:00
|
|
|
// ----------------------------------
|
|
|
|
// IBCTransferMsg
|
2018-03-15 05:49:18 -07:00
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// nolint - TODO rename to TransferMsg as folks will reference with ibc.TransferMsg
|
2018-03-15 06:54:44 -07:00
|
|
|
// IBCTransferMsg defines how another module can send an IBCPacket.
|
2018-03-14 05:11:33 -07:00
|
|
|
type IBCTransferMsg struct {
|
|
|
|
IBCPacket
|
|
|
|
}
|
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// nolint
|
2018-10-23 12:23:55 -07:00
|
|
|
func (msg IBCTransferMsg) Route() string { return "ibc" }
|
|
|
|
func (msg IBCTransferMsg) Type() string { return "transfer" }
|
2018-03-14 05:11:33 -07:00
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// x/bank/tx.go MsgSend.GetSigners()
|
2018-07-06 00:06:53 -07:00
|
|
|
func (msg IBCTransferMsg) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{msg.SrcAddr} }
|
2018-03-14 05:11:33 -07:00
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// get the sign bytes for ibc transfer message
|
2018-03-14 05:11:33 -07:00
|
|
|
func (msg IBCTransferMsg) GetSignBytes() []byte {
|
2018-06-07 16:49:37 -07:00
|
|
|
return msg.IBCPacket.GetSignBytes()
|
2018-03-14 05:11:33 -07:00
|
|
|
}
|
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// validate ibc transfer message
|
2018-03-14 05:11:33 -07:00
|
|
|
func (msg IBCTransferMsg) ValidateBasic() sdk.Error {
|
2018-03-18 06:51:08 -07:00
|
|
|
return msg.IBCPacket.ValidateBasic()
|
2018-03-14 05:11:33 -07:00
|
|
|
}
|
|
|
|
|
2018-03-15 06:54:44 -07:00
|
|
|
// ----------------------------------
|
|
|
|
// IBCReceiveMsg
|
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// nolint - TODO rename to ReceiveMsg as folks will reference with ibc.ReceiveMsg
|
2018-03-15 06:54:44 -07:00
|
|
|
// IBCReceiveMsg defines the message that a relayer uses to post an IBCPacket
|
|
|
|
// to the destination chain.
|
2018-03-14 05:11:33 -07:00
|
|
|
type IBCReceiveMsg struct {
|
|
|
|
IBCPacket
|
2018-07-06 00:06:53 -07:00
|
|
|
Relayer sdk.AccAddress
|
2018-11-26 03:29:21 -08:00
|
|
|
Sequence uint64
|
2018-03-14 05:53:26 -07:00
|
|
|
}
|
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// nolint
|
2018-10-23 12:23:55 -07:00
|
|
|
func (msg IBCReceiveMsg) Route() string { return "ibc" }
|
|
|
|
func (msg IBCReceiveMsg) Type() string { return "receive" }
|
2018-04-22 15:05:28 -07:00
|
|
|
func (msg IBCReceiveMsg) ValidateBasic() sdk.Error { return msg.IBCPacket.ValidateBasic() }
|
2018-03-14 05:53:26 -07:00
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// x/bank/tx.go MsgSend.GetSigners()
|
2018-07-06 00:06:53 -07:00
|
|
|
func (msg IBCReceiveMsg) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{msg.Relayer} }
|
2018-03-14 05:53:26 -07:00
|
|
|
|
2018-04-18 21:49:24 -07:00
|
|
|
// get the sign bytes for ibc receive message
|
2018-03-14 05:53:26 -07:00
|
|
|
func (msg IBCReceiveMsg) GetSignBytes() []byte {
|
2018-06-07 16:49:37 -07:00
|
|
|
b, err := msgCdc.MarshalJSON(struct {
|
|
|
|
IBCPacket json.RawMessage
|
2018-07-06 00:06:53 -07:00
|
|
|
Relayer sdk.AccAddress
|
2018-11-26 03:29:21 -08:00
|
|
|
Sequence uint64
|
2018-06-07 16:49:37 -07:00
|
|
|
}{
|
|
|
|
IBCPacket: json.RawMessage(msg.IBCPacket.GetSignBytes()),
|
2018-07-05 13:36:51 -07:00
|
|
|
Relayer: msg.Relayer,
|
2018-06-07 16:49:37 -07:00
|
|
|
Sequence: msg.Sequence,
|
|
|
|
})
|
2018-03-14 05:53:26 -07:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2018-07-05 17:09:23 -07:00
|
|
|
return sdk.MustSortJSON(b)
|
2018-03-14 05:53:26 -07:00
|
|
|
}
|