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  }