diff --git a/x/fbridge/module/abci.go b/x/fbridge/module/abci.go index ed98b5d579..8af018af32 100644 --- a/x/fbridge/module/abci.go +++ b/x/fbridge/module/abci.go @@ -1,6 +1,7 @@ package module import ( + "fmt" sdk "github.com/Finschia/finschia-sdk/types" "github.com/Finschia/finschia-sdk/x/fbridge/keeper" "github.com/Finschia/finschia-sdk/x/fbridge/types" @@ -39,3 +40,29 @@ func EndBlocker(ctx sdk.Context, k keeper.Keeper) { } } } + +// RegisterInvariants registers the fbridge module invariants +func RegisterInvariants(ir sdk.InvariantRegistry, k keeper.Keeper) { + ir.RegisterRoute(types.ModuleName, "guardian-invariant", GuardianInvariant(k)) +} + +func GuardianInvariant(k keeper.Keeper) sdk.Invariant { + return func(ctx sdk.Context) (string, bool) { + + numGuardian := 0 + for _, p := range k.GetRolePairs(ctx) { + if p.Role == types.RoleGuardian { + numGuardian++ + } + } + + numBridgeSw := len(k.GetBridgeSwitches(ctx)) + + broken := numGuardian != numBridgeSw + + return sdk.FormatInvariant( + types.ModuleName, "guardian-invariant", + fmt.Sprintf("number of guardians(%d) != number of bridge switches(%d)", numGuardian, numBridgeSw), + ), broken + } +} diff --git a/x/fbridge/module/module.go b/x/fbridge/module/module.go index 0aa135ca74..2f5464557e 100644 --- a/x/fbridge/module/module.go +++ b/x/fbridge/module/module.go @@ -136,7 +136,9 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val } // RegisterInvariants does nothing, there are no invariants to enforce -func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} +func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { + RegisterInvariants(ir, am.keeper) +} // Deprecated: Route does nothing. func (am AppModule) Route() sdk.Route { return sdk.NewRoute("", nil) }