/* Package CDP manages the storage of Collateralized Debt Positions. It handles their creation, modification, and stores the global state of all CDPs. Notes - sdk.Int is used for all the number types to maintain compatibility with internal type of sdk.Coin - saves type conversion when doing maths. Also it allows for changes to a CDP to be expressed as a +ve or -ve number. - Only allowing one CDP per account-collateralDenom pair for now to keep things simple. - Genesis forces the global debt to start at zero, ie no stable coins in existence. This could be changed. - The cdp module fulfills the bank keeper interface and keeps track of the liquidator module's coins. This won't be needed with module accounts. - GetCDPs does not return an iterator, but instead reads out (potentially) all CDPs from the store. This isn't a huge performance concern as it is never used during a block, only for querying. An iterator could be created, following the queue style construct in gov and auction, where CDP IDs are stored under ordered keys. These keys could be a collateral-denom:collateral-ratio so that it is efficient to obtain the undercollateralized CDP for a given price and liquidation ratio. However creating a byte sortable representation of a collateral ratio wasn't very easy so the simpler approach was chosen. TODO - A shorter name for an under-collateralized CDP would shorten a lot of function names - remove fake bank keeper and setup a proper liquidator module account - what happens if a collateral type is removed from the list of allowed ones? - Should the values used to generate a key for a stored struct be in the struct? - Add constants for the module and route names - Many more TODOs in the code - add more aggressive test cases - tags - custom error types, codespace */ package cdp