494 lines
14 KiB
Go
494 lines
14 KiB
Go
package types
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"strings"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
|
commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/types"
|
|
host "github.com/cosmos/cosmos-sdk/x/ibc/24-host"
|
|
)
|
|
|
|
var _ sdk.Msg = &MsgChannelOpenInit{}
|
|
|
|
// NewMsgChannelOpenInit creates a new MsgChannelCloseInit MsgChannelOpenInit
|
|
func NewMsgChannelOpenInit(
|
|
portID, channelID string, version string, channelOrder Order, connectionHops []string,
|
|
counterpartyPortID, counterpartyChannelID string, signer sdk.AccAddress,
|
|
) *MsgChannelOpenInit {
|
|
counterparty := NewCounterparty(counterpartyPortID, counterpartyChannelID)
|
|
channel := NewChannel(INIT, channelOrder, counterparty, connectionHops, version)
|
|
return &MsgChannelOpenInit{
|
|
PortID: portID,
|
|
ChannelID: channelID,
|
|
Channel: channel,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgChannelOpenInit) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgChannelOpenInit) Type() string {
|
|
return "channel_open_init"
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgChannelOpenInit) ValidateBasic() error {
|
|
if err := host.PortIdentifierValidator(msg.PortID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid port ID")
|
|
}
|
|
if err := host.ChannelIdentifierValidator(msg.ChannelID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid channel ID")
|
|
}
|
|
// Signer can be empty
|
|
return msg.Channel.ValidateBasic()
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgChannelOpenInit) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgChannelOpenInit) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgChannelOpenTry{}
|
|
|
|
// NewMsgChannelOpenTry creates a new MsgChannelOpenTry instance
|
|
func NewMsgChannelOpenTry(
|
|
portID, channelID, version string, channelOrder Order, connectionHops []string,
|
|
counterpartyPortID, counterpartyChannelID, counterpartyVersion string,
|
|
proofInit []byte, proofHeight uint64, signer sdk.AccAddress,
|
|
) *MsgChannelOpenTry {
|
|
counterparty := NewCounterparty(counterpartyPortID, counterpartyChannelID)
|
|
channel := NewChannel(INIT, channelOrder, counterparty, connectionHops, version)
|
|
return &MsgChannelOpenTry{
|
|
PortID: portID,
|
|
ChannelID: channelID,
|
|
Channel: channel,
|
|
CounterpartyVersion: counterpartyVersion,
|
|
ProofInit: proofInit,
|
|
ProofHeight: proofHeight,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgChannelOpenTry) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgChannelOpenTry) Type() string {
|
|
return "channel_open_try"
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgChannelOpenTry) ValidateBasic() error {
|
|
if err := host.PortIdentifierValidator(msg.PortID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid port ID")
|
|
}
|
|
if err := host.ChannelIdentifierValidator(msg.ChannelID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid channel ID")
|
|
}
|
|
if strings.TrimSpace(msg.CounterpartyVersion) == "" {
|
|
return sdkerrors.Wrap(ErrInvalidCounterparty, "counterparty version cannot be blank")
|
|
}
|
|
if len(msg.ProofInit) == 0 {
|
|
return sdkerrors.Wrap(commitmenttypes.ErrInvalidProof, "cannot submit an empty proof init")
|
|
}
|
|
if msg.ProofHeight == 0 {
|
|
return sdkerrors.Wrap(sdkerrors.ErrInvalidHeight, "proof height must be > 0")
|
|
}
|
|
// Signer can be empty
|
|
return msg.Channel.ValidateBasic()
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgChannelOpenTry) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgChannelOpenTry) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgChannelOpenAck{}
|
|
|
|
// NewMsgChannelOpenAck creates a new MsgChannelOpenAck instance
|
|
func NewMsgChannelOpenAck(
|
|
portID, channelID string, cpv string, proofTry []byte, proofHeight uint64,
|
|
signer sdk.AccAddress,
|
|
) *MsgChannelOpenAck {
|
|
return &MsgChannelOpenAck{
|
|
PortID: portID,
|
|
ChannelID: channelID,
|
|
CounterpartyVersion: cpv,
|
|
ProofTry: proofTry,
|
|
ProofHeight: proofHeight,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgChannelOpenAck) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgChannelOpenAck) Type() string {
|
|
return "channel_open_ack"
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgChannelOpenAck) ValidateBasic() error {
|
|
if err := host.PortIdentifierValidator(msg.PortID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid port ID")
|
|
}
|
|
if err := host.ChannelIdentifierValidator(msg.ChannelID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid channel ID")
|
|
}
|
|
if strings.TrimSpace(msg.CounterpartyVersion) == "" {
|
|
return sdkerrors.Wrap(ErrInvalidCounterparty, "counterparty version cannot be blank")
|
|
}
|
|
if len(msg.ProofTry) == 0 {
|
|
return sdkerrors.Wrap(commitmenttypes.ErrInvalidProof, "cannot submit an empty proof try")
|
|
}
|
|
if msg.ProofHeight == 0 {
|
|
return sdkerrors.Wrap(sdkerrors.ErrInvalidHeight, "proof height must be > 0")
|
|
}
|
|
// Signer can be empty
|
|
return nil
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgChannelOpenAck) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgChannelOpenAck) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgChannelOpenConfirm{}
|
|
|
|
// NewMsgChannelOpenConfirm creates a new MsgChannelOpenConfirm instance
|
|
func NewMsgChannelOpenConfirm(
|
|
portID, channelID string, proofAck []byte, proofHeight uint64,
|
|
signer sdk.AccAddress,
|
|
) *MsgChannelOpenConfirm {
|
|
return &MsgChannelOpenConfirm{
|
|
PortID: portID,
|
|
ChannelID: channelID,
|
|
ProofAck: proofAck,
|
|
ProofHeight: proofHeight,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgChannelOpenConfirm) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgChannelOpenConfirm) Type() string {
|
|
return "channel_open_confirm"
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgChannelOpenConfirm) ValidateBasic() error {
|
|
if err := host.PortIdentifierValidator(msg.PortID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid port ID")
|
|
}
|
|
if err := host.ChannelIdentifierValidator(msg.ChannelID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid channel ID")
|
|
}
|
|
if len(msg.ProofAck) == 0 {
|
|
return sdkerrors.Wrap(commitmenttypes.ErrInvalidProof, "cannot submit an empty proof ack")
|
|
}
|
|
if msg.ProofHeight == 0 {
|
|
return sdkerrors.Wrap(sdkerrors.ErrInvalidHeight, "proof height must be > 0")
|
|
}
|
|
// Signer can be empty
|
|
return nil
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgChannelOpenConfirm) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgChannelOpenConfirm) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgChannelCloseInit{}
|
|
|
|
// NewMsgChannelCloseInit creates a new MsgChannelCloseInit instance
|
|
func NewMsgChannelCloseInit(
|
|
portID string, channelID string, signer sdk.AccAddress,
|
|
) *MsgChannelCloseInit {
|
|
return &MsgChannelCloseInit{
|
|
PortID: portID,
|
|
ChannelID: channelID,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgChannelCloseInit) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgChannelCloseInit) Type() string {
|
|
return "channel_close_init"
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgChannelCloseInit) ValidateBasic() error {
|
|
if err := host.PortIdentifierValidator(msg.PortID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid port ID")
|
|
}
|
|
if err := host.ChannelIdentifierValidator(msg.ChannelID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid channel ID")
|
|
}
|
|
// Signer can be empty
|
|
return nil
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgChannelCloseInit) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgChannelCloseInit) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgChannelCloseConfirm{}
|
|
|
|
// NewMsgChannelCloseConfirm creates a new MsgChannelCloseConfirm instance
|
|
func NewMsgChannelCloseConfirm(
|
|
portID, channelID string, proofInit []byte, proofHeight uint64,
|
|
signer sdk.AccAddress,
|
|
) *MsgChannelCloseConfirm {
|
|
return &MsgChannelCloseConfirm{
|
|
PortID: portID,
|
|
ChannelID: channelID,
|
|
ProofInit: proofInit,
|
|
ProofHeight: proofHeight,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgChannelCloseConfirm) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgChannelCloseConfirm) Type() string {
|
|
return "channel_close_confirm"
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgChannelCloseConfirm) ValidateBasic() error {
|
|
if err := host.PortIdentifierValidator(msg.PortID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid port ID")
|
|
}
|
|
if err := host.ChannelIdentifierValidator(msg.ChannelID); err != nil {
|
|
return sdkerrors.Wrap(err, "invalid channel ID")
|
|
}
|
|
if len(msg.ProofInit) == 0 {
|
|
return sdkerrors.Wrap(commitmenttypes.ErrInvalidProof, "cannot submit an empty proof init")
|
|
}
|
|
if msg.ProofHeight == 0 {
|
|
return sdkerrors.Wrap(sdkerrors.ErrInvalidHeight, "proof height must be > 0")
|
|
}
|
|
// Signer can be empty
|
|
return nil
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgChannelCloseConfirm) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgChannelCloseConfirm) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgPacket{}
|
|
|
|
// NewMsgPacket constructs new MsgPacket
|
|
func NewMsgPacket(
|
|
packet Packet, proof []byte, proofHeight uint64,
|
|
signer sdk.AccAddress,
|
|
) *MsgPacket {
|
|
return &MsgPacket{
|
|
Packet: packet,
|
|
Proof: proof,
|
|
ProofHeight: proofHeight,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgPacket) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgPacket) ValidateBasic() error {
|
|
if len(msg.Proof) == 0 {
|
|
return sdkerrors.Wrap(commitmenttypes.ErrInvalidProof, "cannot submit an empty proof")
|
|
}
|
|
if msg.ProofHeight == 0 {
|
|
return sdkerrors.Wrap(sdkerrors.ErrInvalidHeight, "proof height must be > 0")
|
|
}
|
|
if msg.Signer.Empty() {
|
|
return sdkerrors.ErrInvalidAddress
|
|
}
|
|
|
|
return msg.Packet.ValidateBasic()
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgPacket) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetDataSignBytes returns the base64-encoded bytes used for the
|
|
// data field when signing the packet.
|
|
func (msg MsgPacket) GetDataSignBytes() []byte {
|
|
s := "\"" + base64.StdEncoding.EncodeToString(msg.Packet.Data) + "\""
|
|
return []byte(s)
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgPacket) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgPacket) Type() string {
|
|
return "ics04/opaque"
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgTimeout{}
|
|
|
|
// NewMsgTimeout constructs new MsgTimeout
|
|
func NewMsgTimeout(
|
|
packet Packet, nextSequenceRecv uint64, proof []byte,
|
|
proofHeight uint64, signer sdk.AccAddress,
|
|
) *MsgTimeout {
|
|
return &MsgTimeout{
|
|
Packet: packet,
|
|
NextSequenceRecv: nextSequenceRecv,
|
|
Proof: proof,
|
|
ProofHeight: proofHeight,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgTimeout) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgTimeout) ValidateBasic() error {
|
|
if len(msg.Proof) == 0 {
|
|
return sdkerrors.Wrap(commitmenttypes.ErrInvalidProof, "cannot submit an empty proof")
|
|
}
|
|
if msg.ProofHeight == 0 {
|
|
return sdkerrors.Wrap(sdkerrors.ErrInvalidHeight, "proof height must be > 0")
|
|
}
|
|
if msg.Signer.Empty() {
|
|
return sdkerrors.ErrInvalidAddress
|
|
}
|
|
|
|
return msg.Packet.ValidateBasic()
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgTimeout) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgTimeout) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgTimeout) Type() string {
|
|
return "ics04/timeout"
|
|
}
|
|
|
|
var _ sdk.Msg = &MsgAcknowledgement{}
|
|
|
|
// NewMsgAcknowledgement constructs a new MsgAcknowledgement
|
|
func NewMsgAcknowledgement(
|
|
packet Packet, ack []byte, proof []byte, proofHeight uint64, signer sdk.AccAddress) *MsgAcknowledgement {
|
|
return &MsgAcknowledgement{
|
|
Packet: packet,
|
|
Acknowledgement: ack,
|
|
Proof: proof,
|
|
ProofHeight: proofHeight,
|
|
Signer: signer,
|
|
}
|
|
}
|
|
|
|
// Route implements sdk.Msg
|
|
func (msg MsgAcknowledgement) Route() string {
|
|
return host.RouterKey
|
|
}
|
|
|
|
// ValidateBasic implements sdk.Msg
|
|
func (msg MsgAcknowledgement) ValidateBasic() error {
|
|
if len(msg.Proof) == 0 {
|
|
return sdkerrors.Wrap(commitmenttypes.ErrInvalidProof, "cannot submit an empty proof")
|
|
}
|
|
if len(msg.Acknowledgement) > 100 {
|
|
return sdkerrors.Wrap(ErrAcknowledgementTooLong, "acknowledgement cannot exceed 100 bytes")
|
|
}
|
|
if msg.ProofHeight == 0 {
|
|
return sdkerrors.Wrap(sdkerrors.ErrInvalidHeight, "proof height must be > 0")
|
|
}
|
|
if msg.Signer.Empty() {
|
|
return sdkerrors.ErrInvalidAddress
|
|
}
|
|
|
|
return msg.Packet.ValidateBasic()
|
|
}
|
|
|
|
// GetSignBytes implements sdk.Msg
|
|
func (msg MsgAcknowledgement) GetSignBytes() []byte {
|
|
return sdk.MustSortJSON(SubModuleCdc.MustMarshalJSON(msg))
|
|
}
|
|
|
|
// GetSigners implements sdk.Msg
|
|
func (msg MsgAcknowledgement) GetSigners() []sdk.AccAddress {
|
|
return []sdk.AccAddress{msg.Signer}
|
|
}
|
|
|
|
// Type implements sdk.Msg
|
|
func (msg MsgAcknowledgement) Type() string {
|
|
return "ics04/opaque"
|
|
}
|