Skip to content

Commit

Permalink
feat(batcher): batch message request
Browse files Browse the repository at this point in the history
  • Loading branch information
haiyizxx committed Mar 5, 2024
1 parent a30eae9 commit ae8738c
Show file tree
Hide file tree
Showing 20 changed files with 2,470 additions and 6 deletions.
3 changes: 3 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ import (
axelarnetKeeper "github.com/axelarnetwork/axelar-core/x/axelarnet/keeper"
axelarnetTypes "github.com/axelarnetwork/axelar-core/x/axelarnet/types"
axelarbankkeeper "github.com/axelarnetwork/axelar-core/x/bank/keeper"
"github.com/axelarnetwork/axelar-core/x/batcher"
"github.com/axelarnetwork/axelar-core/x/evm"
evmKeeper "github.com/axelarnetwork/axelar-core/x/evm/keeper"
evmTypes "github.com/axelarnetwork/axelar-core/x/evm/types"
Expand Down Expand Up @@ -607,7 +608,9 @@ func initAppModules(keepers *KeeperCache, bApp *bam.BaseApp, encodingConfig axel
bApp.Router(),
),
permission.NewAppModule(*getKeeper[permissionKeeper.Keeper](keepers)),
batcher.NewAppModule(bApp.MsgServiceRouter(), initMessageAnteDecorators(encodingConfig, keepers)),
)

return appModules
}

Expand Down
156 changes: 156 additions & 0 deletions docs/proto/proto-docs.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions proto/axelar/batcher/v1beta1/events.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
syntax = "proto3";
package axelar.batcher.v1beta1;

option go_package = "github.com/axelarnetwork/axelar-core/x/batcher/types";
option (gogoproto.messagename_all) = true;

import "gogoproto/gogo.proto";

message FailedMessages {
message FailedMessage {
int32 index = 1;
string error = 2;
}
repeated FailedMessage messages = 1 [ (gogoproto.nullable) = false ];
}
11 changes: 11 additions & 0 deletions proto/axelar/batcher/v1beta1/genesis.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
syntax = "proto3";
package axelar.batcher.v1beta1;

option go_package = "github.com/axelarnetwork/axelar-core/x/batcher/types";

import "gogoproto/gogo.proto";

option (gogoproto.goproto_getters_all) = false;

// GenesisState represents the genesis state
message GenesisState {}
20 changes: 20 additions & 0 deletions proto/axelar/batcher/v1beta1/service.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
syntax = "proto3";
package axelar.batcher.v1beta1;

option go_package = "github.com/axelarnetwork/axelar-core/x/batcher/types";

import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "axelar/batcher/v1beta1/tx.proto";

option (gogoproto.goproto_registration) = true;

// Msg defines the nexus Msg service.
service MsgService {
rpc Batch(BatchRequest) returns (BatchResponse) {
option (google.api.http) = {
post : "/axelar/batcher/batch"
body : "*"
};
}
}
22 changes: 22 additions & 0 deletions proto/axelar/batcher/v1beta1/tx.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
syntax = "proto3";
package axelar.batcher.v1beta1;

import "google/protobuf/any.proto";
import "gogoproto/gogo.proto";

import "axelar/permission/exported/v1beta1/types.proto";

option go_package = "github.com/axelarnetwork/axelar-core/x/batcher/types";

message BatchRequest {
option (permission.exported.v1beta1.permission_role) = ROLE_UNRESTRICTED;

bytes sender = 1 [ (gogoproto.casttype) =
"github.com/cosmos/cosmos-sdk/types.AccAddress" ];
repeated google.protobuf.Any must_succeed_messages = 2
[ (gogoproto.nullable) = false ];
repeated google.protobuf.Any can_fail_messages = 3
[ (gogoproto.nullable) = false ];
}

message BatchResponse {}
12 changes: 6 additions & 6 deletions third_party/proto/ibc/applications/transfer/v1/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,24 @@ option go_package = "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types";

// Query provides defines the gRPC querier service.
service Query {
// DenomTrace queries a denomination trace information.
rpc DenomTrace(QueryDenomTraceRequest) returns (QueryDenomTraceResponse) {
option (google.api.http).get = "/ibc/apps/transfer/v1/denom_traces/{hash}";
}

// DenomTraces queries all denomination traces.
rpc DenomTraces(QueryDenomTracesRequest) returns (QueryDenomTracesResponse) {
option (google.api.http).get = "/ibc/apps/transfer/v1/denom_traces";
}

// DenomTrace queries a denomination trace information.
rpc DenomTrace(QueryDenomTraceRequest) returns (QueryDenomTraceResponse) {
option (google.api.http).get = "/ibc/apps/transfer/v1/denom_traces/{hash=**}";
}

// Params queries all parameters of the ibc-transfer module.
rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
option (google.api.http).get = "/ibc/apps/transfer/v1/params";
}

// DenomHash queries a denomination hash information.
rpc DenomHash(QueryDenomHashRequest) returns (QueryDenomHashResponse) {
option (google.api.http).get = "/ibc/apps/transfer/v1/denom_hashes/{trace}";
option (google.api.http).get = "/ibc/apps/transfer/v1/denom_hashes/{trace=**}";
}

// EscrowAddress returns the escrow address for a particular port and channel id.
Expand Down
80 changes: 80 additions & 0 deletions x/batcher/keeper/msg_server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package keeper

import (
"context"
"fmt"
"github.com/axelarnetwork/axelar-core/x/ante"
"github.com/axelarnetwork/axelar-core/x/batcher/types"
"github.com/axelarnetwork/utils/funcs"
baseapp "github.com/cosmos/cosmos-sdk/baseapp"
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)

var _ types.MsgServiceServer = msgServer{}

type msgServer struct {
router *baseapp.MsgServiceRouter
anteHandle ante.MessageAnteHandler
}

func NewMsgServer(msgServiceRouter *baseapp.MsgServiceRouter, anteHandle ante.MessageAnteHandler) types.MsgServiceServer {
return msgServer{
msgServiceRouter,
anteHandle,
}
}

func (s msgServer) Batch(c context.Context, req *types.BatchRequest) (*types.BatchResponse, error) {
ctx := sdk.UnwrapSDKContext(c)

processMessage := func(ctx sdk.Context, i int, message *cdctypes.Any) (*sdk.Result, error) {
sdkMsg := message.GetCachedValue().(sdk.Msg)

handler := s.router.Handler(sdkMsg)
if handler == nil {
return nil, fmt.Errorf("unrecognized message type at index %d: %T", i, sdkMsg)
}

ctx, err := s.anteHandle(ctx, []sdk.Msg{sdkMsg}, false)
if err != nil {
return nil, fmt.Errorf("antehandler failed for message at index %d: %s", i, err)
}

res, err := handler(ctx, sdkMsg)
if err != nil {
return nil, fmt.Errorf("execution failed for message at index %d: %s", i, err)
}

return res, nil
}

for i, message := range req.MustSucceedMessages {
if _, err := processMessage(ctx, i, &message); err != nil {
return nil, err
}
}

var failedMsgs []types.FailedMessages_FailedMessage
for i, message := range req.CanFailMessages {
cacheCtx, writeCache := ctx.CacheContext()
res, err := processMessage(cacheCtx, i, &message)
if err != nil {
failedMsgs = append(failedMsgs, types.FailedMessages_FailedMessage{
Index: int32(i),
Error: err.Error(),
})
} else {
writeCache()
ctx.EventManager().EmitEvents(res.GetEvents())
}
}

if len(failedMsgs) > 0 {
funcs.MustNoErr(ctx.EventManager().EmitTypedEvent(&types.FailedMessages{
Messages: failedMsgs,
}))
}

return &types.BatchResponse{}, nil
}
Loading

0 comments on commit ae8738c

Please sign in to comment.