add basic components
This commit is contained in:
parent
1cb795ba73
commit
7049025f87
|
@ -1,6 +1,8 @@
|
|||
package ibc
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
|
@ -11,6 +13,9 @@ func NewHandler(ibcm IBCMapper) sdk.Handler {
|
|||
return handleIBCTransferMsg(ctx, ibcm, msg)
|
||||
case IBCReceiveMsg:
|
||||
return handleIBCReceiveMsg(ctx, ibcm, msg)
|
||||
default:
|
||||
errMsg := "Unrecognized IBC Msg type: " + reflect.TypeOf(msg).Name()
|
||||
return sdk.ErrUnknownRequest(errMsg).Result()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,5 +26,15 @@ func handleIBCTransferMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCTransferMsg) s
|
|||
}
|
||||
|
||||
func handleIBCReceiveMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCReceiveMsg) sdk.Result {
|
||||
seq := ibc.IngressSequence(packet.SrcChain)
|
||||
packet := msg.IBCPacket
|
||||
seq := ibcm.GetIngressSequence(ctx, packet.SrcChain)
|
||||
if msg.Sequence != seq {
|
||||
return sdk.Result{} // error
|
||||
}
|
||||
ibcm.SetIngressSequence(ctx, packet.SrcChain, seq+1)
|
||||
|
||||
// handle packet
|
||||
// packet.Handle(ctx)...
|
||||
|
||||
return sdk.Result{}
|
||||
}
|
||||
|
|
|
@ -4,22 +4,92 @@ import (
|
|||
"fmt"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
|
||||
wire "github.com/cosmos/cosmos-sdk/wire"
|
||||
)
|
||||
|
||||
type IBCMapper struct {
|
||||
ibcKey sdk.StoreKey
|
||||
|
||||
cdc *wire.Codec
|
||||
}
|
||||
|
||||
func NewIBCMapper(ibcKey sdk.StoreKey) IBCMapper {
|
||||
cdc := wire.NewCodec()
|
||||
|
||||
return IBCMapper{
|
||||
ibcKey: ibcKey,
|
||||
cdc: cdc,
|
||||
}
|
||||
}
|
||||
|
||||
func GetIngressKey(srcChain string) []byte {
|
||||
return []byte(fmt.Sprintf("%s", srcChain))
|
||||
func IngressKey(srcChain string) []byte {
|
||||
return []byte(fmt.Sprintf("ingress/%s", srcChain))
|
||||
}
|
||||
|
||||
func GetEgressKey(destChain string, index int64) []byte {
|
||||
return []byte(fmt.Sprintf("%s/%d", destChain, index))
|
||||
func EgressKey(destChain string, index int64) []byte {
|
||||
return []byte(fmt.Sprintf("egress/%s/%d", destChain, index))
|
||||
}
|
||||
|
||||
func EgressLengthKey(destChain string) []byte {
|
||||
return []byte(fmt.Sprintf("egress/%s", destChain))
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
store.Set(EgressLengthKey(destChain), zero)
|
||||
return 0
|
||||
}
|
||||
var res int64
|
||||
if err := ibcm.cdc.UnmarshalBinary(bz, &res); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (ibcm IBCMapper) GetIngressSequence(ctx sdk.Context, srcChain string) int64 {
|
||||
store := ctx.KVStore(ibcm.ibcKey)
|
||||
bz := store.Get(IngressKey(srcChain))
|
||||
if bz == nil {
|
||||
zero, err := ibcm.cdc.MarshalBinary(int64(0))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
store.Set(IngressKey(srcChain), zero)
|
||||
return 0
|
||||
}
|
||||
var res int64
|
||||
if err := ibcm.cdc.UnmarshalBinary(bz, &res); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (ibcm IBCMapper) SetIngressSequence(ctx sdk.Context, srcChain string, sequence int64) {
|
||||
store := ctx.KVStore(ibcm.ibcKey)
|
||||
bz, err := ibcm.cdc.MarshalBinary(sequence)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
store.Set(IngressKey(srcChain), bz)
|
||||
}
|
||||
|
||||
func (ibcm IBCMapper) PushPacket(ctx sdk.Context, packet IBCPacket) {
|
||||
store := ctx.KVStore(ibcm.ibcKey)
|
||||
len := ibcm.getEgressLength(store, packet.DestChain)
|
||||
packetbz, err := ibcm.cdc.MarshalBinary(packet)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
store.Set(EgressKey(packet.DestChain, len), packetbz)
|
||||
lenbz, err := ibcm.cdc.MarshalBinary(int64(len + 1))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
store.Set(EgressLengthKey(packet.DestChain), lenbz)
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ func (msg IBCTransferMsg) Get(key interface{}) interface{} {
|
|||
|
||||
func (msg IBCTransferMsg) GetSignBytes() []byte {
|
||||
cdc := newCodec()
|
||||
bz, err := cdc.MarshalBinary(msg)
|
||||
bz, err := cdc.MarshalBinary(msg.IBCPacket)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -40,15 +40,42 @@ func (msg IBCTransferMsg) GetSignBytes() []byte {
|
|||
}
|
||||
|
||||
func (msg IBCTransferMsg) ValidateBasic() sdk.Error {
|
||||
return msg.Coins.ValidateBasic()
|
||||
return nil
|
||||
}
|
||||
|
||||
// x/bank/tx.go SendMsg.GetSigners()
|
||||
func (msg IBCTransferMsg) GetSigners() []sdk.Address {
|
||||
addrs := []sdk.Address{msg.SrcAddr}
|
||||
return []sdk.Address{msg.SrcAddr}
|
||||
}
|
||||
|
||||
type IBCReceiveMsg struct {
|
||||
IBCPacket
|
||||
Relayer sdk.Address
|
||||
Relayer sdk.Address
|
||||
Sequence int64
|
||||
}
|
||||
|
||||
func (msg IBCReceiveMsg) Type() string {
|
||||
return "ibcreceive"
|
||||
}
|
||||
|
||||
func (msg IBCReceiveMsg) Get(key interface{}) interface{} {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (msg IBCReceiveMsg) GetSignBytes() []byte {
|
||||
cdc := newCodec()
|
||||
bz, err := cdc.MarshalBinary(msg.IBCPacket)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return bz
|
||||
}
|
||||
|
||||
func (msg IBCReceiveMsg) ValidateBasic() sdk.Error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// x/bank/tx.go SendMsg.GetSigners()
|
||||
func (msg IBCReceiveMsg) GetSigners() []sdk.Address {
|
||||
return []sdk.Address{msg.Relayer}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue