github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/keeper/invariants.go (about) 1 package keeper 2 3 import ( 4 "fmt" 5 6 "cosmossdk.io/collections" 7 8 sdk "github.com/cosmos/cosmos-sdk/types" 9 "github.com/cosmos/cosmos-sdk/x/gov/types" 10 v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 11 ) 12 13 // RegisterInvariants registers all governance invariants 14 func RegisterInvariants(ir sdk.InvariantRegistry, keeper *Keeper, bk types.BankKeeper) { 15 ir.RegisterRoute(types.ModuleName, "module-account", ModuleAccountInvariant(keeper, bk)) 16 } 17 18 // ModuleAccountInvariant checks that the module account coins reflects the sum of 19 // deposit amounts held on store. 20 func ModuleAccountInvariant(keeper *Keeper, bk types.BankKeeper) sdk.Invariant { 21 return func(ctx sdk.Context) (string, bool) { 22 var expectedDeposits sdk.Coins 23 24 err := keeper.Deposits.Walk(ctx, nil, func(key collections.Pair[uint64, sdk.AccAddress], value v1.Deposit) (stop bool, err error) { 25 expectedDeposits = expectedDeposits.Add(value.Amount...) 26 return false, nil 27 }) 28 if err != nil { 29 panic(err) 30 } 31 32 macc := keeper.GetGovernanceAccount(ctx) 33 balances := bk.GetAllBalances(ctx, macc.GetAddress()) 34 35 // Require that the deposit balances are <= than the x/gov module's total 36 // balances. We use the <= operator since external funds can be sent to x/gov 37 // module's account and so the balance can be larger. 38 broken := !balances.IsAllGTE(expectedDeposits) 39 40 return sdk.FormatInvariant(types.ModuleName, "deposits", 41 fmt.Sprintf("\tgov ModuleAccount coins: %s\n\tsum of deposit amounts: %s\n", 42 balances, expectedDeposits)), broken 43 } 44 }