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  }