From 997329a92f5380edab586f4186a2092ce361dcde Mon Sep 17 00:00:00 2001 From: Michael FIG Date: Fri, 20 Aug 2021 22:58:51 -0600 Subject: [PATCH] fix(cosmos): ensure simulated transactions can't trigger SwingSet The former pattern of `vm.IsSimulation` was too brittle to handle our migration to the GRPC-based transaction handlers. Instead, intercept the actual invocation of CallToController and prevent it from running anything in SwingSet if in simulation mode. Also, make sure our InfiniteGasMeter is only assigned once, so that if we ever do Cosmos-level metering of SwingSet downcalls, there is only one place to adjust. --- golang/cosmos/app/app.go | 9 +- golang/cosmos/vm/controller.go | 2 + golang/cosmos/x/swingset/abci.go | 6 +- golang/cosmos/x/swingset/genesis.go | 2 +- golang/cosmos/x/swingset/handler.go | 9 -- golang/cosmos/x/swingset/keeper/keeper.go | 4 +- golang/cosmos/x/swingset/keeper/msg_server.go | 4 +- golang/cosmos/x/swingset/storage.go | 22 ++--- golang/cosmos/x/vbank/handler.go | 9 -- golang/cosmos/x/vbank/keeper/keeper.go | 4 +- golang/cosmos/x/vbank/module.go | 2 +- golang/cosmos/x/vbank/vbank.go | 4 +- golang/cosmos/x/vbank/vbank_test.go | 12 +-- golang/cosmos/x/vibc/handler.go | 11 +-- golang/cosmos/x/vibc/ibc.go | 96 +++---------------- golang/cosmos/x/vibc/keeper/keeper.go | 4 +- 16 files changed, 53 insertions(+), 147 deletions(-) diff --git a/golang/cosmos/app/app.go b/golang/cosmos/app/app.go index b80fff91c53..51205c13dee 100644 --- a/golang/cosmos/app/app.go +++ b/golang/cosmos/app/app.go @@ -358,7 +358,12 @@ func NewAgoricApp( ) // This function is tricky to get right, so we build it ourselves. - callToController := func(ctx sdk.Context, str string) (string, error) { + callToController := func(ctx sdk.Context, str, simReturn string) (string, error) { + if vm.IsSimulation(ctx) { + // Just return the simReturn, since the message is being simulated. + return simReturn, nil + } + // We use SwingSet-level metering to charge the user for the call. app.MustInitController(ctx) defer vm.SetControllerContext(ctx)() return sendToController(true, str) @@ -565,7 +570,7 @@ func (app *GaiaApp) MustInitController(ctx sdk.Context) { } bz, err := json.Marshal(action) if err == nil { - _, err = app.SwingSetKeeper.CallToController(ctx, string(bz)) + _, err = app.SwingSetKeeper.CallToController(ctx, string(bz), "") } if err != nil { fmt.Fprintln(os.Stderr, "Cannot initialize Controller", err) diff --git a/golang/cosmos/vm/controller.go b/golang/cosmos/vm/controller.go index f73a3765c7f..ece940a7060 100644 --- a/golang/cosmos/vm/controller.go +++ b/golang/cosmos/vm/controller.go @@ -25,6 +25,8 @@ var nameToPort = make(map[string]int) var lastPort = 0 func SetControllerContext(ctx sdk.Context) func() { + // We are only called by the controller, so we assume that it is billing its + // own meter usage. controllerContext.Context = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) return func() { controllerContext.Context = sdk.Context{} diff --git a/golang/cosmos/x/swingset/abci.go b/golang/cosmos/x/swingset/abci.go index 3802b2d1c04..f4310e3f563 100644 --- a/golang/cosmos/x/swingset/abci.go +++ b/golang/cosmos/x/swingset/abci.go @@ -49,7 +49,7 @@ func BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock, keeper Keeper) erro return sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) } - _, err = keeper.CallToController(ctx, string(b)) + _, err = keeper.CallToController(ctx, string(b), "") // fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err) return err @@ -71,7 +71,7 @@ func EndBlock(ctx sdk.Context, req abci.RequestEndBlock, keeper Keeper) ([]abci. return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) } - _, err = keeper.CallToController(ctx, string(b)) + _, err = keeper.CallToController(ctx, string(b), "") // fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err) if err != nil { @@ -102,7 +102,7 @@ func CommitBlock(keeper Keeper) error { return sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) } - _, err = keeper.CallToController(sdk.Context{}, string(b)) + _, err = keeper.CallToController(sdk.Context{}, string(b), "") // fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err) if err != nil { diff --git a/golang/cosmos/x/swingset/genesis.go b/golang/cosmos/x/swingset/genesis.go index 8aab1e848e2..787df9265e5 100644 --- a/golang/cosmos/x/swingset/genesis.go +++ b/golang/cosmos/x/swingset/genesis.go @@ -53,7 +53,7 @@ func InitGenesis(ctx sdk.Context, keeper Keeper, data *types.GenesisState) []abc panic(err) } - _, err = keeper.CallToController(ctx, string(b)) + _, err = keeper.CallToController(ctx, string(b), "") if err != nil { // NOTE: A failed BOOTSTRAP_BLOCK means that the SwingSet state is inconsistent. diff --git a/golang/cosmos/x/swingset/handler.go b/golang/cosmos/x/swingset/handler.go index 8baac4b5731..96a184b901b 100644 --- a/golang/cosmos/x/swingset/handler.go +++ b/golang/cosmos/x/swingset/handler.go @@ -5,7 +5,6 @@ import ( "fmt" "strings" - "github.com/Agoric/agoric-sdk/golang/cosmos/vm" "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/keeper" sdk "github.com/cosmos/cosmos-sdk/types" @@ -17,14 +16,6 @@ func NewHandler(k Keeper) sdk.Handler { msgServer := keeper.NewMsgServerImpl(k) return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return &sdk.Result{}, nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - ctx = ctx.WithEventManager(sdk.NewEventManager()) switch msg := msg.(type) { diff --git a/golang/cosmos/x/swingset/keeper/keeper.go b/golang/cosmos/x/swingset/keeper/keeper.go index c68500ab92b..58cc1fb34f5 100644 --- a/golang/cosmos/x/swingset/keeper/keeper.go +++ b/golang/cosmos/x/swingset/keeper/keeper.go @@ -26,7 +26,7 @@ type Keeper struct { bankKeeper bankkeeper.Keeper // CallToController dispatches a message to the controlling process - CallToController func(ctx sdk.Context, str string) (string, error) + CallToController func(ctx sdk.Context, str, simReturn string) (string, error) } // A prefix of bytes, since KVStores can't handle empty slices as keys. @@ -48,7 +48,7 @@ func stringToKey(keyStr string) []byte { func NewKeeper( cdc codec.Codec, key sdk.StoreKey, accountKeeper authkeeper.AccountKeeper, bankKeeper bankkeeper.Keeper, - callToController func(ctx sdk.Context, str string) (string, error), + callToController func(ctx sdk.Context, str, simReturn string) (string, error), ) Keeper { return Keeper{ diff --git a/golang/cosmos/x/swingset/keeper/msg_server.go b/golang/cosmos/x/swingset/keeper/msg_server.go index c787919234d..8578f7061bc 100644 --- a/golang/cosmos/x/swingset/keeper/msg_server.go +++ b/golang/cosmos/x/swingset/keeper/msg_server.go @@ -58,7 +58,7 @@ func (keeper msgServer) DeliverInbound(goCtx context.Context, msg *types.MsgDeli return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) } - _, err = keeper.CallToController(ctx, string(b)) + _, err = keeper.CallToController(ctx, string(b), "") // fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err) if err != nil { return nil, err @@ -104,7 +104,7 @@ func (keeper msgServer) Provision(goCtx context.Context, msg *types.MsgProvision return nil, err } - _, err = keeper.CallToController(ctx, string(b)) + _, err = keeper.CallToController(ctx, string(b), "") // fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err) if err != nil { return nil, err diff --git a/golang/cosmos/x/swingset/storage.go b/golang/cosmos/x/swingset/storage.go index 60630005ff7..6bfa8d831e0 100644 --- a/golang/cosmos/x/swingset/storage.go +++ b/golang/cosmos/x/swingset/storage.go @@ -23,7 +23,7 @@ func NewStorageHandler(keeper Keeper) storageHandler { return storageHandler{keeper: keeper} } -func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret string, err error) { +func (sh storageHandler) Receive(cctx *vm.ControllerContext, str string) (ret string, err error) { keeper := sh.keeper msg := new(storageMessage) err = json.Unmarshal([]byte(str), &msg) @@ -38,7 +38,7 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str case sdk.ErrorOutOfGas: err = fmt.Errorf( "out of gas in location: %v; gasUsed: %d", - rType.Descriptor, ctx.Context.GasMeter().GasConsumed(), + rType.Descriptor, cctx.Context.GasMeter().GasConsumed(), ) default: // Not ErrorOutOfGas, so panic again. @@ -53,11 +53,11 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str storage := NewStorage() storage.Value = msg.Value //fmt.Printf("giving Keeper.SetStorage(%s) %s\n", msg.Key, storage.Value) - keeper.SetStorage(ctx.Context, msg.Key, storage) + keeper.SetStorage(cctx.Context, msg.Key, storage) return "true", nil case "get": - storage := keeper.GetStorage(ctx.Context, msg.Key) + storage := keeper.GetStorage(cctx.Context, msg.Key) if storage.Value == "" { return "null", nil } @@ -69,14 +69,14 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str return string(s), nil case "has": - storage := keeper.GetStorage(ctx.Context, msg.Key) + storage := keeper.GetStorage(cctx.Context, msg.Key) if storage.Value == "" { return "false", nil } return "true", nil case "keys": - keys := keeper.GetKeys(ctx.Context, msg.Key) + keys := keeper.GetKeys(cctx.Context, msg.Key) if keys.Keys == nil { return "[]", nil } @@ -87,12 +87,12 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str return string(bytes), nil case "entries": - keys := keeper.GetKeys(ctx.Context, msg.Key) + keys := keeper.GetKeys(cctx.Context, msg.Key) ents := make([][]string, len(keys.Keys)) for i, key := range keys.Keys { ents[i] = make([]string, 2) ents[i][0] = key - storage := keeper.GetStorage(ctx.Context, fmt.Sprintf("%s.%s", msg.Key, key)) + storage := keeper.GetStorage(cctx.Context, fmt.Sprintf("%s.%s", msg.Key, key)) ents[i][1] = storage.Value } bytes, err := json.Marshal(ents) @@ -102,10 +102,10 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str return string(bytes), nil case "values": - keys := keeper.GetKeys(ctx.Context, msg.Key) + keys := keeper.GetKeys(cctx.Context, msg.Key) vals := make([]string, len(keys.Keys)) for i, key := range keys.Keys { - storage := keeper.GetStorage(ctx.Context, fmt.Sprintf("%s.%s", msg.Key, key)) + storage := keeper.GetStorage(cctx.Context, fmt.Sprintf("%s.%s", msg.Key, key)) vals[i] = storage.Value } bytes, err := json.Marshal(vals) @@ -115,7 +115,7 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str return string(bytes), nil case "size": - keys := keeper.GetKeys(ctx.Context, msg.Key) + keys := keeper.GetKeys(cctx.Context, msg.Key) if keys.Keys == nil { return "0", nil } diff --git a/golang/cosmos/x/vbank/handler.go b/golang/cosmos/x/vbank/handler.go index 9613e404b7d..2b8ac529765 100644 --- a/golang/cosmos/x/vbank/handler.go +++ b/golang/cosmos/x/vbank/handler.go @@ -3,7 +3,6 @@ package vbank import ( "fmt" - "github.com/Agoric/agoric-sdk/golang/cosmos/vm" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -11,14 +10,6 @@ import ( // NewHandler returns a handler for "vbank" type messages. func NewHandler(keeper Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return &sdk.Result{}, nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - switch msg := msg.(type) { default: errMsg := fmt.Sprintf("Unrecognized vbank Msg type: %T", msg) diff --git a/golang/cosmos/x/vbank/keeper/keeper.go b/golang/cosmos/x/vbank/keeper/keeper.go index 7e33c38cced..806a860bd04 100644 --- a/golang/cosmos/x/vbank/keeper/keeper.go +++ b/golang/cosmos/x/vbank/keeper/keeper.go @@ -20,7 +20,7 @@ type Keeper struct { bankKeeper types.BankKeeper feeCollectorName string // CallToController dispatches a message to the controlling process - CallToController func(ctx sdk.Context, str string) (string, error) + CallToController func(ctx sdk.Context, str, simReturn string) (string, error) } // NewKeeper creates a new vbank Keeper instance @@ -28,7 +28,7 @@ func NewKeeper( cdc codec.Codec, key sdk.StoreKey, paramSpace paramtypes.Subspace, bankKeeper types.BankKeeper, feeCollectorName string, - callToController func(ctx sdk.Context, str string) (string, error), + callToController func(ctx sdk.Context, str, simReturn string) (string, error), ) Keeper { // set KeyTable if it has not already been set diff --git a/golang/cosmos/x/vbank/module.go b/golang/cosmos/x/vbank/module.go index a28570ca960..9cc054a6341 100644 --- a/golang/cosmos/x/vbank/module.go +++ b/golang/cosmos/x/vbank/module.go @@ -192,7 +192,7 @@ func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.V panic(err) } if bz != nil { - _, err := am.CallToController(ctx, string(bz)) + _, err := am.CallToController(ctx, string(bz), "") if err != nil { panic(err) } diff --git a/golang/cosmos/x/vbank/vbank.go b/golang/cosmos/x/vbank/vbank.go index b01638f73d7..34b066766a1 100644 --- a/golang/cosmos/x/vbank/vbank.go +++ b/golang/cosmos/x/vbank/vbank.go @@ -227,9 +227,9 @@ func (ch portHandler) Receive(ctx *vm.ControllerContext, str string) (ret string return } -func (am AppModule) CallToController(ctx sdk.Context, send string) (string, error) { +func (am AppModule) CallToController(ctx sdk.Context, send, simReturn string) (string, error) { // fmt.Println("vbank.go upcall", send) - reply, err := am.keeper.CallToController(ctx, send) + reply, err := am.keeper.CallToController(ctx, send, simReturn) // fmt.Println("vbank.go upcall reply", reply, err) return reply, err } diff --git a/golang/cosmos/x/vbank/vbank_test.go b/golang/cosmos/x/vbank/vbank_test.go index 4dfa79bbb93..64d9568c138 100644 --- a/golang/cosmos/x/vbank/vbank_test.go +++ b/golang/cosmos/x/vbank/vbank_test.go @@ -229,8 +229,8 @@ func (b *mockBank) SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, re func makeTestKit(bank types.BankKeeper) (Keeper, sdk.Context) { encodingConfig := params.MakeEncodingConfig() cdc := encodingConfig.Marshaller - callToController := func(ctx sdk.Context, str string) (string, error) { - return "", nil + callToController := func(ctx sdk.Context, str, simReturn string) (string, error) { + return simReturn, nil } paramsTStoreKey := sdk.NewTransientStoreKey(paramstypes.TStoreKey) @@ -472,9 +472,9 @@ func Test_EndBlock_Events(t *testing.T) { }} keeper, ctx := makeTestKit(bank) msgsSent := []string{} - keeper.CallToController = func(ctx sdk.Context, str string) (string, error) { + keeper.CallToController = func(ctx sdk.Context, str, simReturn string) (string, error) { msgsSent = append(msgsSent, str) - return "", nil + return simReturn, nil } am := NewAppModule(keeper) @@ -546,9 +546,9 @@ func Test_EndBlock_Rewards(t *testing.T) { } keeper, ctx := makeTestKit(bank) msgsSent := []string{} - keeper.CallToController = func(ctx sdk.Context, str string) (string, error) { + keeper.CallToController = func(ctx sdk.Context, str, simReturn string) (string, error) { msgsSent = append(msgsSent, str) - return "", nil + return simReturn, nil } am := NewAppModule(keeper) diff --git a/golang/cosmos/x/vibc/handler.go b/golang/cosmos/x/vibc/handler.go index 17b7ae7d5df..371ef7616d8 100644 --- a/golang/cosmos/x/vibc/handler.go +++ b/golang/cosmos/x/vibc/handler.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" - "github.com/Agoric/agoric-sdk/golang/cosmos/vm" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -12,14 +11,6 @@ import ( // NewHandler returns a handler for "vibc" type messages. func NewHandler(keeper Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return &sdk.Result{}, nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - switch msg := msg.(type) { case *MsgSendPacket: return handleMsgSendPacket(ctx, keeper, msg) @@ -62,7 +53,7 @@ func handleMsgSendPacket(ctx sdk.Context, keeper Keeper, msg *MsgSendPacket) (*s return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) } - _, err = keeper.CallToController(ctx, string(b)) + _, err = keeper.CallToController(ctx, string(b), "") // fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err) if err != nil { return nil, err diff --git a/golang/cosmos/x/vibc/ibc.go b/golang/cosmos/x/vibc/ibc.go index cb3cdb9baeb..2a77e97ccbc 100644 --- a/golang/cosmos/x/vibc/ibc.go +++ b/golang/cosmos/x/vibc/ibc.go @@ -172,9 +172,9 @@ func (ch portHandler) Receive(ctx *vm.ControllerContext, str string) (ret string return } -func (am AppModule) CallToController(ctx sdk.Context, send string) (string, error) { +func (am AppModule) CallToController(ctx sdk.Context, send, simReturn string) (string, error) { // fmt.Println("ibc.go upcall", send) - reply, err := am.keeper.CallToController(ctx, send) + reply, err := am.keeper.CallToController(ctx, send, simReturn) // fmt.Println("ibc.go upcall reply", reply, err) return reply, err } @@ -203,14 +203,6 @@ func (am AppModule) OnChanOpenInit( counterparty channeltypes.Counterparty, version string, ) error { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - event := channelOpenInitEvent{ Type: "IBC_EVENT", Event: "channelOpenInit", @@ -229,7 +221,7 @@ func (am AppModule) OnChanOpenInit( return err } - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") if err != nil { return err } @@ -267,14 +259,6 @@ func (am AppModule) OnChanOpenTry( version, counterpartyVersion string, ) error { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - event := channelOpenTryEvent{ Type: "IBC_EVENT", Event: "channelOpenTry", @@ -294,7 +278,7 @@ func (am AppModule) OnChanOpenTry( return err } - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") if err != nil { return err } @@ -324,14 +308,6 @@ func (am AppModule) OnChanOpenAck( channelID string, counterpartyVersion string, ) error { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - // We don't care if the channel was found. If it wasn't then GetChannel // returns an empty channel object that we can still use without crashing. channel, _ := am.keeper.GetChannel(ctx, portID, channelID) @@ -352,7 +328,7 @@ func (am AppModule) OnChanOpenAck( return err } - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") return err } @@ -370,14 +346,6 @@ func (am AppModule) OnChanOpenConfirm( portID, channelID string, ) error { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - event := channelOpenConfirmEvent{ Type: "IBC_EVENT", Event: "channelOpenConfirm", @@ -392,8 +360,7 @@ func (am AppModule) OnChanOpenConfirm( return err } - _, err = am.CallToController(ctx, string(bytes)) - + _, err = am.CallToController(ctx, string(bytes), "") return err } @@ -411,14 +378,6 @@ func (am AppModule) OnChanCloseInit( portID, channelID string, ) error { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - event := channelCloseInitEvent{ Type: "IBC_EVENT", Event: "channelCloseInit", @@ -433,7 +392,7 @@ func (am AppModule) OnChanCloseInit( return err } - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") return err } @@ -451,14 +410,6 @@ func (am AppModule) OnChanCloseConfirm( portID, channelID string, ) error { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - event := channelCloseConfirmEvent{ Type: "IBC_EVENT", Event: "channelCloseConfirm", @@ -473,7 +424,7 @@ func (am AppModule) OnChanCloseConfirm( return err } - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") return err } @@ -489,14 +440,6 @@ func (am AppModule) OnRecvPacket( ctx sdk.Context, packet channeltypes.Packet, ) exported.Acknowledgement { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - // Sometimes we receive duplicate packets, just with a // missing packet.TimeoutTimestamp. This causes duplicate // acks, with one of them being rejected. @@ -518,8 +461,7 @@ func (am AppModule) OnRecvPacket( return channeltypes.NewErrorAcknowledgement(err.Error()) } - // FIXME: Get acknowledgement data from this call. - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") if err != nil { return channeltypes.NewErrorAcknowledgement(err.Error()) } @@ -541,14 +483,6 @@ func (am AppModule) OnAcknowledgementPacket( packet channeltypes.Packet, acknowledgement []byte, ) (*sdk.Result, error) { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return &sdk.Result{}, nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - event := acknowledgementPacketEvent{ Type: "IBC_EVENT", Event: "acknowledgementPacket", @@ -563,7 +497,7 @@ func (am AppModule) OnAcknowledgementPacket( return nil, err } - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") if err != nil { return nil, err } @@ -585,14 +519,6 @@ func (am AppModule) OnTimeoutPacket( ctx sdk.Context, packet channeltypes.Packet, ) (*sdk.Result, error) { - if vm.IsSimulation(ctx) { - // We don't support simulation. - return &sdk.Result{}, nil - } else { - // The simulation was done, so now allow infinite gas. - ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter()) - } - event := timeoutPacketEvent{ Type: "IBC_EVENT", Event: "timeoutPacket", @@ -606,7 +532,7 @@ func (am AppModule) OnTimeoutPacket( return nil, err } - _, err = am.CallToController(ctx, string(bytes)) + _, err = am.CallToController(ctx, string(bytes), "") if err != nil { return nil, err } diff --git a/golang/cosmos/x/vibc/keeper/keeper.go b/golang/cosmos/x/vibc/keeper/keeper.go index 9fa5e5dd758..44f7bdfcccf 100644 --- a/golang/cosmos/x/vibc/keeper/keeper.go +++ b/golang/cosmos/x/vibc/keeper/keeper.go @@ -28,7 +28,7 @@ type Keeper struct { bankKeeper bankkeeper.Keeper // CallToController dispatches a message to the controlling process - CallToController func(ctx sdk.Context, str string) (string, error) + CallToController func(ctx sdk.Context, str, simReturn string) (string, error) } // NewKeeper creates a new dIBC Keeper instance @@ -37,7 +37,7 @@ func NewKeeper( channelKeeper types.ChannelKeeper, portKeeper types.PortKeeper, bankKeeper bankkeeper.Keeper, scopedKeeper capabilitykeeper.ScopedKeeper, - callToController func(ctx sdk.Context, str string) (string, error), + callToController func(ctx sdk.Context, str, simReturn string) (string, error), ) Keeper { return Keeper{