github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/invariants.go (about)

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