github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/order/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/order/types" 8 "github.com/fibonacci-chain/fbc/x/token" 9 ) 10 11 // RegisterInvariants registers all order invariants 12 func RegisterInvariants(ir sdk.InvariantRegistry, keeper Keeper) { 13 ir.RegisterRoute(types.ModuleName, "module-account", ModuleAccountInvariant(keeper)) 14 } 15 16 // ModuleAccountInvariant checks that the module account coins reflects the sum of 17 // locks amounts held on store 18 func ModuleAccountInvariant(keeper Keeper) sdk.Invariant { 19 return func(ctx sdk.Context) (string, bool) { 20 var lockedCoins, lockedFees, orderLockedFees sdk.SysCoins 21 22 for _, accCoins := range keeper.tokenKeeper.GetAllLockedCoins(ctx) { 23 lockedCoins = lockedCoins.Add2(accCoins.Coins) 24 } 25 26 // lock fee 27 keeper.tokenKeeper.IterateLockedFees(ctx, func(acc sdk.AccAddress, coins sdk.SysCoins) bool { 28 lockedFees = lockedFees.Add2(coins) 29 return false 30 }) 31 32 // get open orders lock fee 33 products := keeper.GetProductsFromDepthBookMap() 34 for _, product := range products { 35 depthBook := keeper.GetDepthBookCopy(product) 36 for _, item := range depthBook.Items { 37 buyKey := types.FormatOrderIDsKey(product, item.Price, types.BuyOrder) 38 orderIDList := keeper.GetProductPriceOrderIDs(buyKey) 39 sellKey := types.FormatOrderIDsKey(product, item.Price, types.SellOrder) 40 orderIDList = append(orderIDList, keeper.GetProductPriceOrderIDs(sellKey)...) 41 for _, orderID := range orderIDList { 42 order := keeper.GetOrder(ctx, orderID) 43 orderLockedFees = orderLockedFees.Add2(GetOrderNewFee(order)) 44 } 45 } 46 } 47 48 if !lockedFees.IsEqual(orderLockedFees) { 49 return sdk.FormatInvariant(types.ModuleName, "locks", 50 fmt.Sprintf("\ttoken LockedFee coins: %s\n\tsum of order locked fee amounts: %s\n", 51 lockedFees, orderLockedFees)), true 52 } 53 54 macc := keeper.supplyKeeper.GetModuleAccount(ctx, token.ModuleName) 55 broken := !macc.GetCoins().IsEqual(lockedCoins.Add2(lockedFees)) 56 return sdk.FormatInvariant(types.ModuleName, "locks", 57 fmt.Sprintf("\ttoken ModuleAccount coins: %s\n\tsum of locks amounts: %s\n", 58 macc.GetCoins(), lockedCoins.Add2(lockedFees))), broken 59 } 60 }