diff --git a/core/appmodule/module.go b/core/appmodule/module.go new file mode 100644 index 000000000000..220dbb06fb32 --- /dev/null +++ b/core/appmodule/module.go @@ -0,0 +1,59 @@ +package appmodule + +import ( + "context" + + "cosmossdk.io/depinject" + "google.golang.org/grpc" +) + +// AppModule is a tag interface for app module implementations to use as a basis +// for extension interfaces. It provides no functionality itself, but is the +// type that all valid app modules should provide so that they can be identified +// by other modules (usually via depinject) as app modules. +type AppModule interface { + depinject.OnePerModuleType + + // IsAppModule is a dummy method to tag a struct as implementing an AppModule. + IsAppModule() +} + +// HasServices is the extension interface that modules should implement to register +// implementations of services defined in .proto files. +type HasServices interface { + AppModule + + // RegisterServices registers the module's services with the app's service + // registrar. + // + // Two types of services are currently supported: + // - read-only gRPC query services, which are the default. + // - transaction message services, which must have the protobuf service + // option "cosmos.msg.v1.service" (defined in "cosmos/msg/v1/service.proto") + // set to true. + // + // The service registrar will figure out which type of service you are + // implementing based on the presence (or absence) of protobuf options. You + // do not need to specify this in golang code. + RegisterServices(grpc.ServiceRegistrar) +} + +// HasBeginBlocker is the extension interface that modules should implement to run +// custom logic before transaction processing in a block. +type HasBeginBlocker interface { + AppModule + + // BeginBlock is a method that will be run before transactions are processed in + // a block. + BeginBlock(context.Context) error +} + +// HasEndBlocker is the extension interface that modules should implement to run +// custom logic after transaction processing in a block. +type HasEndBlocker interface { + AppModule + + // EndBlock is a method that will be run after transactions are processed in + // a block. + EndBlock(context.Context) error +}