diff --git a/x/auth/script.go b/x/auth/script.go new file mode 100644 index 000000000..d630085f7 --- /dev/null +++ b/x/auth/script.go @@ -0,0 +1,17 @@ +package auth + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type Script func(ctx sdk.Context, tx sdk.Msg) sdk.Error + +var scriptsCenter = map[string][]Script{} + +func RegisterScripts(msgType string, scripts...Script) { + scriptsCenter[msgType] = append(scriptsCenter[msgType], scripts...) +} + +func GetRegisteredScripts(msgType string) []Script { + return scriptsCenter[msgType] +} \ No newline at end of file diff --git a/x/bank/handler.go b/x/bank/handler.go index ea3ee4398..92940d4a9 100644 --- a/x/bank/handler.go +++ b/x/bank/handler.go @@ -2,6 +2,7 @@ package bank import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) // NewHandler returns a handler for "bank" type messages. @@ -20,6 +21,14 @@ func NewHandler(k Keeper) sdk.Handler { // Handle MsgSend. func handleMsgSend(ctx sdk.Context, k Keeper, msg MsgSend) sdk.Result { // NOTE: totalIn == totalOut should already have been checked + for _, script := range auth.GetRegisteredScripts(msg.Type()) { + if script == nil { + continue + } + if err := script(ctx, msg); err != nil { + return err.Result() + } + } tags, err := k.InputOutputCoins(ctx, msg.Inputs, msg.Outputs) if err != nil {