ibc-go icon indicating copy to clipboard operation
ibc-go copied to clipboard

Make BroadcastMessages function generic and return the msg response type

Open chatton opened this issue 7 months ago • 0 comments

Summary

We currently have BroadcastMessages which returns an sdk.Response and also a UnmarshalMsgResponses function to unmarshal concrete types.

It would be nice to have a function which returned a concrete type. I think this could look something like

package broadcast

type Broadcaster interface {
	BroadcastMessages(ctx context.Context, chain ibc.Chain, user ibc.Wallet, msgs ...sdk.Msg) sdk.TxResponse
}

func Messages[T codec.ProtoMarshaler](ctx context.Context, broadcaster Broadcaster, chain ibc.Chain, user ibc.Wallet, msgs ...sdk.Msg) (T, sdk.TxResponse) {
	txResp := broadcaster.BroadcastMessages(ctx, chain, user, msgs...)

	var marshaller T
	if err := testsuite.UnmarshalMsgResponses(txResp, marshaller); err != nil {
		return marshaller, txResp
	}

	return marshaller, txResp
}

And usage could be like

		resp, sdkResp := broadcast.Messages[*controllertypes.MsgRegisterInterchainAccountResponse](ctx, s, chainA, controllerAccount, msgRegisterAccount)
		s.AssertTxSuccess(sdkResp)
		s.Require().NotNil(resp)
		s.Require().NotEmpty(resp.ChannelId)
		s.Require().NotEmpty(resp.PortId)

There may be some additional quirks to getting the unmarshalling working correctly, but this could be a nice QoL improvement for dealing with concrete response types.


For Admin Use

  • [ ] Not duplicate issue
  • [ ] Appropriate labels applied
  • [ ] Appropriate contributors tagged/assigned

chatton avatar Jul 29 '24 09:07 chatton