This commit is contained in:
mossid 2018-03-15 16:34:24 +01:00
parent cd79574927
commit 5c2805dbec
3 changed files with 108 additions and 6 deletions

13
x/ibc/errors.go Normal file
View File

@ -0,0 +1,13 @@
package ibc
import (
sdk "github.com/cosmos/cosmos-sdk/types"
)
const (
CodeInvalidSequence sdk.CodeType = 201
)
func ErrInvalidSequence() sdk.Error {
return sdk.NewError(CodeInvalidSequence, "")
}

View File

@ -4,15 +4,17 @@ import (
"reflect"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/bank"
)
func NewHandler(ibcm IBCMapper) sdk.Handler {
func NewHandler(ibcm IBCMapper, ck bank.CoinKeeper) sdk.Handler {
return func(ctx sdk.Context, msg sdk.Msg) sdk.Result {
switch msg := msg.(type) {
case IBCTransferMsg:
return handleIBCTransferMsg(ctx, ibcm, msg)
return handleIBCTransferMsg(ctx, ibcm, ck, msg)
case IBCReceiveMsg:
return handleIBCReceiveMsg(ctx, ibcm, msg)
return handleIBCReceiveMsg(ctx, ibcm, ck, msg)
default:
errMsg := "Unrecognized IBC Msg type: " + reflect.TypeOf(msg).Name()
return sdk.ErrUnknownRequest(errMsg).Result()
@ -20,16 +22,16 @@ func NewHandler(ibcm IBCMapper) sdk.Handler {
}
}
func handleIBCTransferMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCTransferMsg) sdk.Result {
func handleIBCTransferMsg(ctx sdk.Context, ibcm IBCMapper, ck bank.CoinKeeper, msg IBCTransferMsg) sdk.Result {
ibcm.PushPacket(ctx, msg.IBCPacket)
return sdk.Result{}
}
func handleIBCReceiveMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCReceiveMsg) sdk.Result {
func handleIBCReceiveMsg(ctx sdk.Context, ibcm IBCMapper, ck bank.CoinKeeper, msg IBCReceiveMsg) sdk.Result {
packet := msg.IBCPacket
seq := ibcm.GetIngressSequence(ctx, packet.SrcChain)
if msg.Sequence != seq {
return sdk.Result{} // error
return ErrInvalidSequence().Result()
}
ibcm.SetIngressSequence(ctx, packet.SrcChain, seq+1)

87
x/ibc/ibc_test.go Normal file
View File

@ -0,0 +1,87 @@
package ibc
import (
"testing"
"github.com/stretchr/testify/assert"
abci "github.com/tendermint/abci/types"
"github.com/tendermint/go-crypto"
dbm "github.com/tendermint/tmlibs/db"
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types"
)
func defaultContext(key sdk.StoreKey) sdk.Context {
db := dbm.NewMemDB()
cms := store.NewCommitMultiStore(db)
cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db)
cms.LoadLatestVersion()
ctx := sdk.NewContext(cms, abci.Header{}, false, nil)
return ctx
}
func newAddress() crypto.Address {
return crypto.GenPrivKeyEd25519().PubKey().Address()
}
func TestHandler(t *testing.T) {
key := sdk.NewKVStoreKey("ibc")
ctx := defaultContext(key)
ibcm := NewIBCMapper(key)
h := NewHandler(ibcm)
src := newAddress()
dest := newAddress()
chainid := "ibcchain"
coin := sdk.Coin{Denom: "neutron", Amount: 10000}
packet := IBCPacket{
SrcAddr: src,
DestAddr: dest,
Coins: sdk.Coins{coin},
SrcChain: chainid,
DestChain: chainid,
}
store := ctx.KVStore(key)
var msg sdk.Msg
var res sdk.Result
var egl int64
var igs int64
egl = ibcm.getEgressLength(store, chainid)
assert.Equal(t, egl, int64(0))
msg = IBCTransferMsg{
IBCPacket: packet,
}
res = h(ctx, msg)
assert.True(t, res.IsOK())
egl = ibcm.getEgressLength(store, chainid)
assert.Equal(t, egl, int64(1))
igs = ibcm.GetIngressSequence(ctx, chainid)
assert.Equal(t, igs, int64(0))
msg = IBCReceiveMsg{
IBCPacket: packet,
Relayer: src,
Sequence: 0,
}
res = h(ctx, msg)
assert.True(t, res.IsOK())
igs = ibcm.GetIngressSequence(ctx, chainid)
assert.Equal(t, igs, int64(1))
res = h(ctx, msg)
assert.False(t, res.IsOK())
igs = ibcm.GetIngressSequence(ctx, chainid)
assert.Equal(t, igs, int64(1))
}