package ibc import ( sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" ) // ------------------------------ // IBCPacket // IBCPacket defines a piece of data that can be send between two separate // blockchains. type IBCPacket struct { SrcAddr sdk.Address DestAddr sdk.Address Coins sdk.Coins SrcChain string DestChain string } func NewIBCPacket(srcAddr sdk.Address, destAddr sdk.Address, coins sdk.Coins, srcChain string, destChain string) IBCPacket { return IBCPacket{ SrcAddr: srcAddr, DestAddr: destAddr, Coins: coins, SrcChain: srcChain, DestChain: destChain, } } func (ibcp IBCPacket) ValidateBasic() sdk.Error { if ibcp.SrcChain == ibcp.DestChain { return ErrIdenticalChains().Trace("") } if !ibcp.Coins.IsValid() { return sdk.ErrInvalidCoins("") } return nil } // ---------------------------------- // IBCTransferMsg // IBCTransferMsg defines how another module can send an IBCPacket. type IBCTransferMsg struct { IBCPacket } func (msg IBCTransferMsg) Type() string { return "ibc" } func (msg IBCTransferMsg) Get(key interface{}) interface{} { return nil } func (msg IBCTransferMsg) GetSignBytes() []byte { cdc := wire.NewCodec() bz, err := cdc.MarshalBinary(msg) if err != nil { panic(err) } return bz } func (msg IBCTransferMsg) ValidateBasic() sdk.Error { return msg.IBCPacket.ValidateBasic() } // x/bank/tx.go SendMsg.GetSigners() func (msg IBCTransferMsg) GetSigners() []sdk.Address { return []sdk.Address{msg.SrcAddr} } // ---------------------------------- // IBCReceiveMsg // IBCReceiveMsg defines the message that a relayer uses to post an IBCPacket // to the destination chain. type IBCReceiveMsg struct { IBCPacket Relayer sdk.Address Sequence int64 } func (msg IBCReceiveMsg) Type() string { return "ibc" } func (msg IBCReceiveMsg) Get(key interface{}) interface{} { return nil } func (msg IBCReceiveMsg) GetSignBytes() []byte { cdc := wire.NewCodec() bz, err := cdc.MarshalBinary(msg) if err != nil { panic(err) } return bz } func (msg IBCReceiveMsg) ValidateBasic() sdk.Error { return msg.IBCPacket.ValidateBasic() } // x/bank/tx.go SendMsg.GetSigners() func (msg IBCReceiveMsg) GetSigners() []sdk.Address { return []sdk.Address{msg.Relayer} }