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 }