github.com/Finschia/finschia-sdk@v0.48.1/x/gov/keeper/invariants.go (about)

     1  package keeper
     2  
     3  // DONTCOVER
     4  
     5  import (
     6  	"fmt"
     7  
     8  	sdk "github.com/Finschia/finschia-sdk/types"
     9  	"github.com/Finschia/finschia-sdk/x/gov/types"
    10  )
    11  
    12  // RegisterInvariants registers all governance invariants
    13  func RegisterInvariants(ir sdk.InvariantRegistry, keeper Keeper, bk types.BankKeeper) {
    14  	ir.RegisterRoute(types.ModuleName, "module-account", ModuleAccountInvariant(keeper, bk))
    15  }
    16  
    17  // AllInvariants runs all invariants of the governance module
    18  func AllInvariants(keeper Keeper, bk types.BankKeeper) sdk.Invariant {
    19  	return func(ctx sdk.Context) (string, bool) {
    20  		return ModuleAccountInvariant(keeper, bk)(ctx)
    21  	}
    22  }
    23  
    24  // ModuleAccountInvariant checks that the module account coins reflects the sum of
    25  // deposit amounts held on store
    26  func ModuleAccountInvariant(keeper Keeper, bk types.BankKeeper) sdk.Invariant {
    27  	return func(ctx sdk.Context) (string, bool) {
    28  		var expectedDeposits sdk.Coins
    29  
    30  		keeper.IterateAllDeposits(ctx, func(deposit types.Deposit) bool {
    31  			expectedDeposits = expectedDeposits.Add(deposit.Amount...)
    32  			return false
    33  		})
    34  
    35  		macc := keeper.GetGovernanceAccount(ctx)
    36  		balances := bk.GetAllBalances(ctx, macc.GetAddress())
    37  		broken := !balances.IsEqual(expectedDeposits)
    38  
    39  		return sdk.FormatInvariant(types.ModuleName, "deposits",
    40  			fmt.Sprintf("\tgov ModuleAccount coins: %s\n\tsum of deposit amounts:  %s\n",
    41  				balances, expectedDeposits)), broken
    42  	}
    43  }