github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/bank/internal/keeper/invariants.go (about)

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  
     6  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     7  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank/internal/types"
     8  )
     9  
    10  // RegisterInvariants registers the bank module invariants
    11  func RegisterInvariants(ir sdk.InvariantRegistry, ak types.AccountKeeper) {
    12  	ir.RegisterRoute(types.ModuleName, "nonnegative-outstanding",
    13  		NonnegativeBalanceInvariant(ak))
    14  }
    15  
    16  // NonnegativeBalanceInvariant checks that all accounts in the application have non-negative balances
    17  func NonnegativeBalanceInvariant(ak types.AccountKeeper) sdk.Invariant {
    18  	return func(ctx sdk.Context) (string, bool) {
    19  		var msg string
    20  		var count int
    21  
    22  		accts := ak.GetAllAccounts(ctx)
    23  		for _, acc := range accts {
    24  			coins := acc.GetCoins()
    25  			if coins.IsAnyNegative() {
    26  				count++
    27  				msg += fmt.Sprintf("\t%s has a negative denomination of %s\n",
    28  					acc.GetAddress().String(),
    29  					coins.String())
    30  			}
    31  		}
    32  		broken := count != 0
    33  
    34  		return sdk.FormatInvariant(types.ModuleName, "nonnegative-outstanding",
    35  			fmt.Sprintf("amount of negative accounts found %d\n%s", count, msg)), broken
    36  	}
    37  }