diff --git a/docs/spec/ibc/mvp2.md b/docs/spec/ibc/mvp2.md index f8ae465c3d..61590007d8 100644 --- a/docs/spec/ibc/mvp2.md +++ b/docs/spec/ibc/mvp2.md @@ -23,6 +23,7 @@ type Payload interface { } type TransferPayload struct { + SrcAddr sdk.Address DestAddr sdk.Address Coins sdk.Coins } diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 0b5c382c6d..05a659409a 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -56,7 +56,7 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // add handlers coinKeeper := bank.NewCoinKeeper(app.accountMapper) coolMapper := cool.NewMapper(app.capKeyMainStore) - ibcMapper := ibc.NewIBCMapper(app.capKeyIBCStore) + ibcMapper := ibc.NewIBCMapper(app.cdc, app.capKeyIBCStore) app.Router(). AddRoute("bank", bank.NewHandler(coinKeeper)). AddRoute("cool", cool.NewHandler(coinKeeper, coolMapper)). diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 478c5e5a9f..bec08fb564 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -74,7 +74,7 @@ func makeCodec() *wire.Codec { } func TestIBC(t *testing.T) { - var _ = makeCodec() + cdc := makeCodec() key := sdk.NewKVStoreKey("ibc") ctx := defaultContext(key) @@ -92,7 +92,7 @@ func TestIBC(t *testing.T) { assert.Nil(t, err) assert.Equal(t, mycoins, coins) - ibcm := NewIBCMapper(key) + ibcm := NewIBCMapper(cdc, key) h := NewHandler(ibcm, ck) packet := IBCPacket{ SrcAddr: src, diff --git a/x/ibc/mapper.go b/x/ibc/mapper.go index 49714ec162..1e8f9de253 100644 --- a/x/ibc/mapper.go +++ b/x/ibc/mapper.go @@ -14,10 +14,8 @@ type IBCMapper struct { // XXX: The IBCMapper should not take a CoinKeeper. Rather have the CoinKeeper // take an IBCMapper. -func NewIBCMapper(key sdk.StoreKey) IBCMapper { +func NewIBCMapper(cdc *wire.Codec, key sdk.StoreKey) IBCMapper { // XXX: How are these codecs supposed to work? - cdc := wire.NewCodec() - return IBCMapper{ key: key, cdc: cdc, @@ -59,25 +57,34 @@ func (ibcm IBCMapper) ReceiveIBCPacket(ctx sdk.Context, packet IBCPacket) sdk.Er // -------------------------- // Functions for accessing the underlying KVStore. +func marshalBinaryPanic(cdc *wire.Codec, value interface{}) []byte { + res, err := cdc.MarshalBinary(value) + if err != nil { + panic(err) + } + return res +} + +func unmarshalBinaryPanic(cdc *wire.Codec, bz []byte, ptr interface{}) { + err := cdc.UnmarshalBinary(bz, ptr) + if err != nil { + panic(err) + } +} + func (ibcm IBCMapper) GetIngressSequence(ctx sdk.Context, srcChain string) int64 { store := ctx.KVStore(ibcm.key) key := IngressSequenceKey(srcChain) bz := store.Get(key) if bz == nil { - zero, err := ibcm.cdc.MarshalBinary(int64(0)) - if err != nil { - panic(err) - } + zero := marshalBinaryPanic(ibcm.cdc, int64(0)) store.Set(key, zero) return 0 } var res int64 - err := ibcm.cdc.UnmarshalBinary(bz, &res) - if err != nil { - panic(err) - } + unmarshalBinaryPanic(ibcm.cdc, bz, &res) return res } @@ -85,10 +92,7 @@ func (ibcm IBCMapper) SetIngressSequence(ctx sdk.Context, srcChain string, seque store := ctx.KVStore(ibcm.key) key := IngressSequenceKey(srcChain) - bz, err := ibcm.cdc.MarshalBinary(sequence) - if err != nil { - panic(err) - } + bz := marshalBinaryPanic(ibcm.cdc, sequence) store.Set(key, bz) } @@ -96,17 +100,12 @@ func (ibcm IBCMapper) SetIngressSequence(ctx sdk.Context, srcChain string, seque func (ibcm IBCMapper) getEgressLength(store sdk.KVStore, destChain string) int64 { bz := store.Get(EgressLengthKey(destChain)) if bz == nil { - zero, err := ibcm.cdc.MarshalBinary(int64(0)) - if err != nil { - panic(err) - } + zero := marshalBinaryPanic(ibcm.cdc, int64(0)) store.Set(EgressLengthKey(destChain), zero) return 0 } var res int64 - if err := ibcm.cdc.UnmarshalBinary(bz, &res); err != nil { - panic(err) - } + unmarshalBinaryPanic(ibcm.cdc, bz, &res) return res } diff --git a/x/ibc/types.go b/x/ibc/types.go index 5af22220a2..495d2a9009 100644 --- a/x/ibc/types.go +++ b/x/ibc/types.go @@ -35,6 +35,9 @@ func (ibcp IBCPacket) ValidateBasic() sdk.Error { if ibcp.SrcChain == ibcp.DestChain { return ErrIdenticalChains().Trace("") } + if !ibcp.Coins.IsValid() { + return sdk.ErrInvalidCoins("") + } return nil } @@ -56,7 +59,7 @@ func (msg IBCTransferMsg) Get(key interface{}) interface{} { func (msg IBCTransferMsg) GetSignBytes() []byte { cdc := wire.NewCodec() - bz, err := cdc.MarshalBinary(msg.IBCPacket) + bz, err := cdc.MarshalBinary(msg) if err != nil { panic(err) } @@ -93,7 +96,7 @@ func (msg IBCReceiveMsg) Get(key interface{}) interface{} { func (msg IBCReceiveMsg) GetSignBytes() []byte { cdc := wire.NewCodec() - bz, err := cdc.MarshalBinary(msg.IBCPacket) + bz, err := cdc.MarshalBinary(msg) if err != nil { panic(err) }