github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/dex/keeper/invariant.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/x/dex/types"
     8  )
     9  
    10  // RegisterInvariants registers all dex invariants
    11  func RegisterInvariants(ir sdk.InvariantRegistry, keeper IKeeper, supplyKeeper SupplyKeeper) {
    12  	ir.RegisterRoute(types.ModuleName, "module-account", ModuleAccountInvariant(keeper, supplyKeeper))
    13  }
    14  
    15  // ModuleAccountInvariant checks that the module account coins reflects the sum of
    16  // locks amounts held on store
    17  func ModuleAccountInvariant(keeper IKeeper, supplyKeeper SupplyKeeper) sdk.Invariant {
    18  	return func(ctx sdk.Context) (string, bool) {
    19  		var depositsCoins, withdrawCoins sdk.SysCoins
    20  
    21  		// get product deposits
    22  		for _, product := range keeper.GetTokenPairs(ctx) {
    23  			if product == nil {
    24  				panic("the nil pointer is not expected")
    25  			}
    26  			depositsCoins = depositsCoins.Add2(sdk.SysCoins{product.Deposits})
    27  		}
    28  
    29  		keeper.IterateWithdrawInfo(ctx, func(_ int64, withdrawInfo types.WithdrawInfo) (stop bool) {
    30  			withdrawCoins = withdrawCoins.Add2(sdk.SysCoins{withdrawInfo.Deposits})
    31  			return false
    32  		})
    33  
    34  		moduleAcc := supplyKeeper.GetModuleAccount(ctx, types.ModuleName)
    35  
    36  		broken := !moduleAcc.GetCoins().IsEqual(depositsCoins.Add2(withdrawCoins))
    37  
    38  		return sdk.FormatInvariant(types.ModuleName, "module coins",
    39  			fmt.Sprintf("\tdex ModuleAccount coins: %s\n\tsum of deposits coins: %s\tsum of withdraw coins: %s\n",
    40  				moduleAcc.GetCoins(), depositsCoins, withdrawCoins)), broken
    41  	}
    42  }