github.com/Finschia/finschia-sdk@v0.48.1/x/foundation/keeper/internal/invariants.go (about) 1 package internal 2 3 import ( 4 "fmt" 5 6 sdk "github.com/Finschia/finschia-sdk/types" 7 "github.com/Finschia/finschia-sdk/x/foundation" 8 ) 9 10 const ( 11 moduleAccountInvariant = "module-accounts" 12 totalWeightInvariant = "total-weight" 13 proposalInvariant = "proposals" 14 ) 15 16 func RegisterInvariants(ir sdk.InvariantRegistry, k Keeper) { 17 for name, invariant := range map[string]func(k Keeper) sdk.Invariant{ 18 moduleAccountInvariant: ModuleAccountInvariant, 19 totalWeightInvariant: TotalWeightInvariant, 20 proposalInvariant: ProposalInvariant, 21 } { 22 ir.RegisterRoute(foundation.ModuleName, name, invariant(k)) 23 } 24 } 25 26 func ModuleAccountInvariant(k Keeper) sdk.Invariant { 27 return func(ctx sdk.Context) (string, bool) { 28 // cache, we don't want to write changes 29 ctx, _ = ctx.CacheContext() 30 31 treasuryAcc := k.authKeeper.GetModuleAccount(ctx, foundation.TreasuryName) 32 balance := k.bankKeeper.GetAllBalances(ctx, treasuryAcc.GetAddress()) 33 34 treasury := k.GetTreasury(ctx) 35 msg := fmt.Sprintf("coins in the treasury; expected %s, got %s\n", treasury, balance) 36 broken := !treasury.IsEqual(sdk.NewDecCoinsFromCoins(balance...)) 37 38 return sdk.FormatInvariant(foundation.ModuleName, moduleAccountInvariant, msg), broken 39 } 40 } 41 42 func TotalWeightInvariant(k Keeper) sdk.Invariant { 43 return func(ctx sdk.Context) (string, bool) { 44 // cache, we don't want to write changes 45 ctx, _ = ctx.CacheContext() 46 47 expected := k.GetFoundationInfo(ctx).TotalWeight 48 real := sdk.NewDec(int64(len(k.GetMembers(ctx)))) 49 50 msg := fmt.Sprintf("total weight of foundation; expected %s, got %s\n", expected, real) 51 broken := !real.Equal(expected) 52 53 return sdk.FormatInvariant(foundation.ModuleName, totalWeightInvariant, msg), broken 54 } 55 } 56 57 func ProposalInvariant(k Keeper) sdk.Invariant { 58 return func(ctx sdk.Context) (string, bool) { 59 // cache, we don't want to write changes 60 ctx, _ = ctx.CacheContext() 61 62 version := k.GetFoundationInfo(ctx).Version 63 msg := fmt.Sprintf("current foundation version; %d\n", version) 64 broken := false 65 66 k.iterateProposals(ctx, func(proposal foundation.Proposal) (stop bool) { 67 if proposal.FoundationVersion == version { 68 return true 69 } 70 71 if proposal.Status == foundation.PROPOSAL_STATUS_SUBMITTED { 72 msg += fmt.Sprintf("active old proposal %d found; version %d\n", proposal.Id, proposal.FoundationVersion) 73 broken = true 74 } 75 76 return false 77 }) 78 79 return sdk.FormatInvariant(foundation.ModuleName, proposalInvariant, msg), broken 80 } 81 }