* add overview and basic structure * add state and params * add basic messages * add state transitions * add begin block state transitions * add missing titles * add concepts * add events * update state and concepts * update for liquidator changes * update events * mention module accounts * update begin block * update params * update page numbering * add fee descriptions * add broken link linter * add broken link linter to CI * move link check to end of CI * update typo Co-Authored-By: Kevin Davis <karzak@users.noreply.github.com> * address review comments * Update x/cdp/spec/06_params.md Co-Authored-By: Kevin Davis <karzak@users.noreply.github.com> * Update x/cdp/spec/README.md Co-Authored-By: Kevin Davis <karzak@users.noreply.github.com> * Update x/cdp/spec/README.md Co-Authored-By: Kevin Davis <karzak@users.noreply.github.com> Co-authored-by: Kevin Davis <karzak@users.noreply.github.com>
		
			
				
	
	
	
		
			3.2 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	Messages
Users can submit various messages to the cdp module which trigger state changes detailed below.
CreateCDP
CreateCDP sets up and stores a new CDP, adding collateral from the sender, and drawing Principle debt.
type MsgCreateCDP struct {
    Sender     sdk.AccAddress
    Collateral sdk.Coins
    Principal  sdk.Coins
}
State changes:
- a new CDP is created, 
Senderbecomes CDP owner - collateral taken from 
Senderand sent to cdp module account, newDepositcreated Principalstable coins are minted and sent toSender- equal amount of internal debt coins created and stored in cdp module account
 
Deposit
Deposit adds collateral to a CDP in the form of a deposit. Collateral is taken from Depositor.
type MsgDeposit struct {
    Owner      sdk.AccAddress
    Depositor  sdk.AccAddress
    Collateral sdk.Coins
}
State Changes:
Collateraltaken from depositor and sent to cdp module account- the depositor's 
Depositstruct is updated or a new one created - cdp fees are updated (see below)
 
Withdraw
Withdraw removes collateral from a CDP, provided it would not put the CDP under the liquidation ratio. Collateral is removed from one deposit only.
type MsgWithdraw struct {
    Owner      sdk.AccAddress
    Depositor  sdk.AccAddress
    Collateral sdk.Coins
}
State Changes:
Collateralcoins are sent from the cdp module account toDepositorCollateralamount of coins subtracted from theDepositstruct- cdp fees are updated (see below)
 
DrawDebt
DrawDebt creates debt in a CDP, minting new stable asset which is sent to the sender.
type MsgDrawDebt struct {
    Sender    sdk.AccAddress
    CdpDenom  string
    Principal sdk.Coins
}
State Changes:
- mint 
Principalcoins and send them toSender, updating the CDP'sPrincipalfield - mint equal amount of internal debt coins and store in the module account
 - increment total principal for principal denom
 - cdp fees are updated (see below)
 
RepayDebt
RepayDebt removes some debt from a CDP and burns the corresponding amount of stable asset from the sender. If all debt is repaid, the collateral is returned to depositors and the cdp is removed from the store
type MsgRepayDebt struct {
    Sender   sdk.AccAddress
    CdpDenom string
    Payment  sdk.Coins
}
State Changes:
- burn 
Paymentcoins taken fromSender, updating the CDP by reducingPrincipalfield byPaymment - burn an equal amount of internal debt coins
 - decrement total principal for payment denom
 - cdp fees are updated (see below)
 - if fees and principal are zero, return collateral to depositors:
- For each deposit, send coins from the cdp module account to the depositor, and delete the deposit struct from store.
 
 
Fees
When CDPs are updated by the above messages the fees accumulated since the last update are calculated and added on.
feesAccumulated = (outstandingDebt * (feeRate^periods)) - outstandingDebt
where:
outstandingDebtis the CDP'sPrincipalplusAccumulatedFeesperiodsis the number of seconds since last fee updatefeeRateis the per second debt interest rate
Database Indexes
When CDPs are update by the above messages the database indexes are also updated.