2018-03-14 05:11:33 -07:00
|
|
|
package ibc
|
|
|
|
|
|
|
|
import (
|
2018-03-15 03:36:17 -07:00
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2018-03-15 05:49:18 -07:00
|
|
|
|
|
|
|
wire "github.com/cosmos/cosmos-sdk/wire"
|
2018-03-16 13:39:42 -07:00
|
|
|
|
|
|
|
// temporal
|
|
|
|
"github.com/cosmos/cosmos-sdk/examples/basecoin/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/examples/basecoin/x/cool"
|
|
|
|
"github.com/cosmos/cosmos-sdk/x/bank"
|
|
|
|
oldwire "github.com/tendermint/go-wire"
|
2018-03-14 05:11:33 -07:00
|
|
|
)
|
|
|
|
|
2018-03-15 06:54:44 -07:00
|
|
|
// ------------------------------
|
|
|
|
// IBCPacket
|
|
|
|
|
|
|
|
// 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 {
|
|
|
|
SrcAddr sdk.Address
|
|
|
|
DestAddr sdk.Address
|
|
|
|
Coins sdk.Coins
|
|
|
|
SrcChain string
|
|
|
|
DestChain string
|
|
|
|
}
|
|
|
|
|
2018-03-15 09:26:21 -07:00
|
|
|
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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-18 06:51:08 -07:00
|
|
|
func (ibcp IBCPacket) ValidateBasic() sdk.Error {
|
|
|
|
if ibcp.SrcChain == ibcp.DestChain {
|
|
|
|
return ErrIdenticalChains().Trace("")
|
|
|
|
}
|
|
|
|
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-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
|
|
|
|
}
|
|
|
|
|
|
|
|
func (msg IBCTransferMsg) Type() string {
|
2018-03-15 07:07:01 -07:00
|
|
|
return "ibc"
|
2018-03-14 05:11:33 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func (msg IBCTransferMsg) Get(key interface{}) interface{} {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (msg IBCTransferMsg) GetSignBytes() []byte {
|
2018-03-16 13:39:42 -07:00
|
|
|
cdc := makeCodec()
|
2018-03-15 05:49:18 -07:00
|
|
|
bz, err := cdc.MarshalBinary(msg.IBCPacket)
|
2018-03-14 05:11:33 -07:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2018-03-15 05:49:18 -07:00
|
|
|
return bz
|
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
|
|
|
}
|
|
|
|
|
|
|
|
// x/bank/tx.go SendMsg.GetSigners()
|
|
|
|
func (msg IBCTransferMsg) GetSigners() []sdk.Address {
|
2018-03-14 05:53:26 -07:00
|
|
|
return []sdk.Address{msg.SrcAddr}
|
2018-03-14 05:11:33 -07:00
|
|
|
}
|
|
|
|
|
2018-03-15 06:54:44 -07:00
|
|
|
// ----------------------------------
|
|
|
|
// IBCReceiveMsg
|
|
|
|
|
|
|
|
// 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-03-14 05:53:26 -07:00
|
|
|
Relayer sdk.Address
|
|
|
|
Sequence int64
|
|
|
|
}
|
|
|
|
|
|
|
|
func (msg IBCReceiveMsg) Type() string {
|
2018-03-15 07:07:01 -07:00
|
|
|
return "ibc"
|
2018-03-14 05:53:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func (msg IBCReceiveMsg) Get(key interface{}) interface{} {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (msg IBCReceiveMsg) GetSignBytes() []byte {
|
2018-03-15 05:49:18 -07:00
|
|
|
cdc := newCodec()
|
2018-03-14 05:53:26 -07:00
|
|
|
bz, err := cdc.MarshalBinary(msg.IBCPacket)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2018-03-15 05:49:18 -07:00
|
|
|
return bz
|
2018-03-14 05:53:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func (msg IBCReceiveMsg) ValidateBasic() sdk.Error {
|
2018-03-18 06:51:08 -07:00
|
|
|
return msg.IBCPacket.ValidateBasic()
|
2018-03-14 05:53:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// x/bank/tx.go SendMsg.GetSigners()
|
|
|
|
func (msg IBCReceiveMsg) GetSigners() []sdk.Address {
|
|
|
|
return []sdk.Address{msg.Relayer}
|
2018-03-14 05:11:33 -07:00
|
|
|
}
|
2018-03-15 06:54:44 -07:00
|
|
|
|
|
|
|
// -------------------------
|
|
|
|
// Helpers
|
|
|
|
|
|
|
|
func newCodec() *wire.Codec {
|
|
|
|
return wire.NewCodec()
|
|
|
|
}
|
2018-03-18 06:51:08 -07:00
|
|
|
|
|
|
|
func makeCodec() *wire.Codec { // basecoin/app.MakeCodec()
|
|
|
|
const (
|
|
|
|
msgTypeSend = 0x1
|
|
|
|
msgTypeIssue = 0x2
|
|
|
|
msgTypeQuiz = 0x3
|
|
|
|
msgTypeSetTrend = 0x4
|
|
|
|
msgTypeIBCTransfer = 0x5
|
|
|
|
msgTypeIBCReceive = 0x6
|
|
|
|
)
|
|
|
|
|
|
|
|
var _ = oldwire.RegisterInterface(
|
|
|
|
struct{ sdk.Msg }{},
|
|
|
|
oldwire.ConcreteType{bank.SendMsg{}, msgTypeSend},
|
|
|
|
oldwire.ConcreteType{bank.IssueMsg{}, msgTypeIssue},
|
|
|
|
oldwire.ConcreteType{cool.QuizMsg{}, msgTypeQuiz},
|
|
|
|
oldwire.ConcreteType{cool.SetTrendMsg{}, msgTypeSetTrend},
|
|
|
|
oldwire.ConcreteType{IBCTransferMsg{}, msgTypeIBCTransfer},
|
|
|
|
oldwire.ConcreteType{IBCReceiveMsg{}, msgTypeIBCReceive},
|
|
|
|
)
|
|
|
|
|
|
|
|
const accTypeApp = 0x1
|
|
|
|
var _ = oldwire.RegisterInterface(
|
|
|
|
struct{ sdk.Account }{},
|
|
|
|
oldwire.ConcreteType{&types.AppAccount{}, accTypeApp},
|
|
|
|
)
|
|
|
|
|
|
|
|
cdc := wire.NewCodec()
|
|
|
|
return cdc
|
|
|
|
}
|