BSIP: 70
Title: Peer-to-Peer Leveraged Trading
Authors: George Harrap, Michel Santos, Peter Conrad
Status: Draft
Type: Protocol
Created: 2019-06-17
Discussion: https://github.com/bitshares/bsips/issues/170
This BSIP defines a protocol upgrade in order to support peer-to-peer lending, borrowing and margin trading markets on the BitShares DEX. Lending is defined as any user of the BitShares DEX having the ability to post an offer to lend any BitShares asset they own to a market where a borrower may take that offer (by posting collateral) and pay the lender a lender-defined amount of interest over a time period.
The Borrower may choose to take the offer or post their preferred borrowing interest rate as a Bid and when taken, execute an exchange transaction with that token for another specified by the lender. The borrower will pay the lender interest in the asset type that was borrowed. Should the value of their margin position fall by a specified amount, the borrowers' balance will be margin called and sold on the market to payback the debt to the lender. The borrower risks losing their collateral in the case of a margin call and the lender risks the orderbook depth being insufficient to pay back their loan in the specified market.
BitShares is the longest running decentralised cryptocurrency exchange and one of the pioneers of collateralised stablecoins. While the BitShares DEX makes it easy to trade in an environment where users have custody of their own keys, there are opportunities to be made to improve liquidity, onboard new users and affect great trading activity on the BitShares DEX.
The highest volume and most liquid exchanges in the world to date like Bitmex and Bitfinex who rose to dominance due to their usage of leverage in catalysing greater liquidity for their customers.
With this in mind, some of the key inhibitors to growth right now for the BitShares DEX include:
Incentive for Smartcoin creation / holding: The growth in liquidity of Smartcoins like bitUSD, BitCNY, BitEUR and others depends on users locking up BTS collateral to create these assets. For users engaged in creating these assets they must often manage exposure to a highly volatile collateral asset and are not paid for taking on the risk which could reduce potential new issuance.
Smartcoin Liquidity: The most liquid BitShares markets are often the smart coin markets, however the liquidity of Smartcoins in circulation on the orderbook is not yet comparable to larger teir centralised exchanges thereby reducing potential usage of the BitShares DEX.
Counterparty risk of crypto lending: Currently one of the only ways with market traction to earn passive income on cryptocurrency holdings is to trust a centralised counterparty and give up ownership of your money to another entity. This is highly risky with users no longer in control of their funds and at risk of hacking or confiscation.
BTS Price growth: The Bitshares token (BTS) is the underlying collateral required for committee issued assets and therefore a higher Bitshares price incentivises greater Smartcoin creation. Growing demand for BitShares assets promotes higher collateralisation of BTS which requires more BTS being removed from circulation which over time reduces supply and can increase positive price pressure.
The motivation behind this BSIP is to address these concerns and increase user demand, liquidity and passive income opportunities for users of the BitShares DEX.
This BSIP seeks to address the inhibitors to growth in the BitShares DEX by introducing P2P Lending, Borrowing and Margin trading markets on the BitShares DEX. This new functionality would address the above concerns as follows:
Passive risk adjusted income: Any user may choose to lend any BitShares asset for a user defined rate of return over a specified time period. This not only provides an added incentive to hold an asset that can return a yield but also ensures existing liquidity of BitShares assets is deployed to the trading orderbook.
On-chain lending and borrowing reduces risk: Users seeking a return would not need to trust third party intermediaries with their funds and can engage in lending and borrowing contracts on the BitShares DEX. This reduces risk compared to competing centralised non-custodial competitors.
Increased DEX liquidity: With the ability for users to lend new or existing liquidity directly to the orderbooks, it provides greater order book depth than exists currently. This reduces risk for margin traders who rely on ample orderbook depth to ensure their positions can be adequately executed at a desired price or in the case of margin calls greater depth reduces collateral losses.
Long / Short any asset on the DEX: A user could borrow or lend any asset on the DEX adding new opportunities to make money from market movements especially in bear markets. This also enables smartcoin issuers to hedge their BTS (or other) exposure which could assist these users maintain adequate MCR ratios thereby reducing global settlement risk.
Added volume and usage of BTS: Every operation on the BitShares DEX requires a fee to be paid which returns BTS to the reserve pool. Greater usage of the BitShares DEX increases fees paid, reduces supply which can result in a positive price pressure on BTS. Additionally new smartcoin issuance for committee assets and some private assets requires BTS as collateral and therefore increased issuance also requires the purchase and lock up of BTS, increasing demand of BTS.
The BitShares DAC is well situated to capture a market opportunity in this space with the core intent of this BSIP to increase the viability of the BitShares DEX as a high volume, non-custodial, transparent and liquid trading exchange.
The process flow for margin trading is depicted below. The process consists of seven stages with some stages containing parallel processes.
- Stage 1a: Prior to any loan being offered or matched, the asset issuer must authorize the loan asset for lending for margin trading against sets of tradable assets.
- Stage 1b: Prior to any loan being offered or matched, it must be possible to look up a valid reference price between the tradable asset and the the loan asset on the internal DEX market.
- Stage 2: Lenders and potential Borrowers can place offers on the Lending Order Book. The offers by lenders ("loan offers") and the offers by borrowers ("borrow offers") shall remain on the books until they are canceled by the offeror, expire, or are completely matched by counter-offers.
- Stage 3: Compatible offers are matched to create a loan.
- Stage 4a: A borrower may hold the borrowed asset and/or trade against the agreed-upon tradable asset for the duration of the loan. Stage 4b: The smart contract will transfer interest payments from the borrower's loan portfolio to the lender on a daily basis. Stage 4c The smart contract shall appraise the loan to check whether sufficient collateral backs the loan. Stage 4d: A borrower may update the amount of collateral in their loan.
- Stage 5a: A borrower may initiate a loan closure any time prior to the loan expiry. Stage 5b: The smart contract may initiate a margin call when the loan expires. Stage 5c: The smart contract may initiate a loan closure if it is unable to pay the daily interest on behalf of the borrower. Stage 5d: The smart contract may initiate a loan closure by margin call if it appraises the loan's collateral as being too low.
- Stage 6: During a margin call process the smart contract attempts to liquidate a loan portfolio to obtain a sufficient balance of the borrowed asset to repay the lender. This might require selling the balance of the tradable asset on the market.
- Stage 7a: During a loan closure, the lender is repaid what is owed and any balance of assets that remain in the loan portfolio are transferred to the borrower's regular set of balances. Stage 7b: Alternatively, if a margin call is initiated that does not complete within a certain amount of time, the entire loan portfolio shall be confiscated from the borrower and transferred to the lender as a substitute payment for what is owed.
The asset issuer of the loan asset must authorize the loan asset to be used for lending for margin trading ("leveraged trading") against a set of tradable assets. This set of authorized tradable asset may be updated by the asset issuer at any time. These restrictions shall affect the creation of new loan and borrow offers.
Knowledge of the exchange rate between the loan asset and the tradable asset is essential for the smart contract to automatically appraise a portfolio during the loan appraissal and to evaluate the need for a possible margin call. This price shall be determined by the smart contract from data on the decentralized exchange and not from any external price feeds. The reference price shall be validated under specific rules, and prohibitions shall be imposed while the reference price is invalid.
The reference price for the tradable asset that is denominated in terms of the loan asset shall be updated every block that has any activity (new orders, canceled orders, and matched orders) in that market pair's trading book. The reference price of the tradable asset shall be calculated according to the following rules.
Asset | Reference Price | Validity of Reference Price |
---|---|---|
Tradable asset is a bitAsset that is not in global settlement | The highest offer price for the tradable asset. If there are no offers, the last traded price. | Valid if (a) there any offers for the tradable asset, and (b) if there has ever been any trade activity. |
Tradable asset is a bitAsset that is in global settlement | Global settlement price | Always valid |
All other assets | The highest offer price for the tradable asset. If there are no offers, the last traded price. | Valid if (a) there any offers for the tradable asset, and (b) if there has ever been any trade activity. |
If the validity conditions are not satisfied for the asset pair, the reference price shall be considered invalid and certain activities shall be prohibited.
A valid reference price permits the tradable asset components of the portfolio (Tliquid and Torders) to be appraised in terms of the loan asset. This allows the entire loan portfolio to be appraised which further allows a check of the minimum collateral requirements for an existing loan.
Therefore with a valid reference price
- loan offers may be made,
- loan offers may be matched,
- assets within a loan portfolio may be traded,
- a borrower may deposit additional borrowed asset,
- a borrower may withdraw the tradable asset subject to collateral requirements,
- loan portfloios may be closed by the borrower,
- loan portfolios may be closed by the smart contract due to the expiration, and
- loan portfolios may be margin called subject to collateral requirements.
However an invalid reference price prevents a portfolio appraisal (except for the trivial case where the portfolio only consists of the borrowed asset components (Bliquid and Borders). Without the ability to appraise the tradable asset portion of the portfolio, collateral requirements cannot be evaluated. Therefore,
- loan offers shall not be matched to prevent the creation of new loans,
- a borrower shall not be able to sell more of the borrowed asset if the new liquid balance (Bliquidafter) shall become less than the minimum collateral value. This constraint can be expressed as MCV ≤ Bliquidafter.
- The new limit order (Btradenew) is constrained such that 0 < Btradenew ≤ Bliquidbefore - MCV
- a borrower shall not be able to sell more of the tradable asset if the new liquid balance (Bliquidafter) shall become less than the minimum collateral value. This constraint can be expressed as MCV ≤ Bliquidafter
- The new limit order with a minimum to receive of the borrowed asset (Btradereceive) is constrained such that 0 < Btradereceive ≤ Bliquidbefore - MCV
- a borrower shall not be permitted to withdraw the tradable asset unless the liquid balance of the borrowed asset (Bliquid) is greater than the maintenance collateral value (MCV). This constraint can be expressed as MCV ≤ Bliquid
- margin calls shall not be initiated because the collateral ratio (CR) of the loan portfolio cannot be calculated.
Both potential lenders and potential borrowers can place offers on the Loan Order Book. Potential lenders place "loan offers" and potential borrowers place "borrow offers". Loan offers contain the following parameters:
Lending Offer Parameter | Description |
---|---|
Asset type to lend |
The asset type that the lender is offering to lend |
Minimum amount to lend |
The minimum amount of the loan asset type that will be lent into a matched loan. |
Maximum amount to lend |
The maximum amount of the loan asset type that the lender is offering. This amount is deducted from the lender's balances when the offer is created. |
Asset type of collateral |
The asset type that the borrower must provide as collateral. For this initial version of margin trading, this shall be the same asset type as the asset type to lend. |
Maintenance collateral ratio (MCR) |
The minimum collateral ratio that the lender is expecting at the beginning of a loan. MCR ≥ MCCR ≥ 1 |
Margin call collateral ratio (MCCR) |
The minimum collateral ratio below which a margin call of the loan is initiated. MCR ≥ MCCR ≥ 1 |
Maximum duration of margin call |
The maximum duration of a margin call, if one is necessary, after which a portfolio confiscation will be triggered. |
Asset type to trade against (Tradable asset) |
The asset type that the lender permits the borrower to trade against. This restriction protects the lender from exit scam trading. |
Minimum duration of loan |
The minimum duration of the loan that the lender is willing to accept. |
Maximum duration of loan |
The maximum duration of the loan that the lender is willing to accept |
Minimum interest rate |
The minimum daily interest rate that the lender is willing to accept |
Expiration date | Expiration date of the offer |
Borrow offers contain the following parameters:
Borrowing Offer Parameter | Description |
---|---|
Asset type to borrow |
The asset type that the borrower is seeking |
Minimum amount to borrow |
The minimum amount of the loan asset type that will be borrowed into a matched loan. |
Maximum amount to borrow |
The maximum amount of the loan asset type that the borrower is willing to borrow. |
Asset type as collateral | The asset type that the borrower must provide for collateral. For this initial version of margin trading, this shall be the same asset type as the asset type to lend. |
Amount of collateral | The amount of collateral the borrower has put into the offer. This amount is deducted from the borrower's balances when the offer is created. |
Maintenance collateral ratio (MCR) |
The maximum collateral ratio that the borrower is willing to offer at the beginning of a loan. MCR ≥ MCCR ≥ 1 |
Margin call collateral ratio (MCCR) |
The maximum collateral ratio below which a margin call of the loan is initiated. MCR ≥ MCCR ≥ 1 |
Minimum duration of margin call protection |
The minimum duration of a margin call, if one is necessary, after which a portfolio confiscation will be triggered. |
Asset type to trade against (Tradable asset) |
The asset type that the borrower can trade against. |
Minimum duration of loan |
The minimum duration of the loan that the borrower is willing to accept. |
Maximum duration of loan |
The maximum duration of the loan that the borrower is willing to accept |
Maximum interest rate |
The maximum daily interest rate that the borrower is willing to accept |
Expiration date | Expiration date of the offer |
After an offer is created, all users shall be able to identify:
- which unmatched offers are on the Lending Order Book, and
- which offers are matched.
Users shall have the ability to filter offers either by type (loan offer or borrow offer), asset type to loan, tradable asset type, amounts, interest rate, loan duration, maintenance collateral ratio, and margin call collateral ratio. This capability shall either be done at the Core RPC-API node and/or at the user interface. Offers to lend and offers to borrow shall have unique identifiers which can be referenced for loan matching.
The creation of offers, their partial and complete matches, their expiration, and their closures, shall be recorded as part of the account history of the lender and the borrower.
Offers to lend and borrow shall remain on the Loan Order Book until they either are canceled by the offeror, expire, or are completely matched and filled.
New offers shall be automatically compared to existing counter-offers on the book. This matchmaking investigation shall:
This matchmaking process shall only match a loan offer (L) with a borrow offer (B) if those offers have the following compatible conditions.
Offer Parameter | Compatibility Conditions |
---|---|
Loan amount (P) | LPmin ≤ BPmax and BPmin ≤ LPmax |
Loan duration (D) | LDmin ≤ BDmax and BDmin ≤ LDmax |
Interest rate (I) | LI ≤ BI |
Minimum collateral ratio (MCR) | LMCR ≤ BMCR |
Margin call collateral ratio (MCCR) | LMCCR ≤ BMCCR |
Margin call duration (MCD) | BMCD ≤ LMCD |
Therefore when a new loan offer or borrow offer is received, it shall be checked against the existing offers. This new offer will become the "taker" to the existing "maker" offers. The outcome of this investigation may identify multiple "maker" offers to be compatible with the new "taker" offer.
If no compatible offers are found for the new offer, the new offer shall be added to the offer order book and retained until it is canceled, expires, or is completely matched and filled.
When multiple loan offers (L) are found to be compatible with multiple borrow offers (B), they shall be prioritized in a deterministic manner to identify which of the compatible offers will be matched to each other.
As the definition of most offer parameters are not exact values (e.g. a lender might offer a loan for exactly 6 months) but are rather bounded values (e.g. a lender might offer a loan for a duration between 3 months and 12 months), and the compatibility conditions permit a range of overlap between a loan offer and a borrow offer, there may mathematically be an infinite number of loan definitions that could be created from even a single loan offer and borrow offer. (Technically the number of loan offers are finite because they will only be characterized by finite-precision integer parameters.) Matches shall be made to favor the existing offers on the loan offer books (the "makers").
If the new offer (the "taker") is a borrow offer, the compatible loan offers shall be sorted in favor of the lenders (the "makers"). These compatible offers shall be sorted in favor of the lender offers as described in the following table.
Loan Parameter | Loan Parameter Selection | Loan Parameter Value | Prioritization Order |
---|---|---|---|
Interest rate (I) | Highest compatible interest rate | BI | 1 |
Loan duration (D) | Longest compatible loan duration | min(LDmax, BDmax) | 2 |
Loan amount (P) | Largest compatible amount | min(LPmax, BPmax) | 3 |
Margin call collateral ratio (MCCR) | Highest compatible MCCR | BMCCR | 4 |
Minimum collateral ratio (MCR) | Highest compatible MCR | BMCR | 5 |
Margin call duration (MCD) | Shortest MCD | BMCD | 6 |
If the new offer (the "taker") is a loan offer, the compatible offers shall be sorted in favor of the borrowers (the "makers"). These compatible offers shall be prioritized favor of the borrower offers as described in the following table.
Loan Parameter | Loan Parameter Selection | Loan Parameter Value | Prioritization Order |
---|---|---|---|
Interest rate (I) | Lowest compatible interest rate | LI | 1 |
Loan amount (P) | Largest compatible amount | min(LPmax, BPmax) | 2 |
Loan duration (D) | Longest compatible loan duration | min(LDmax, BDmax) | 3 |
Margin call collateral ratio (MCCR) | Lowest compatible MCCR | LMCCR | 4 |
Minimum collateral ratio (MCR) | Lowest compatible MCR | LMCR | 5 |
Margin call duration (MCD) | Longest MCD | LMCD | 6 |
The highest prioritized maker offer shall be paired to the new offer and a new loan shall be created in accordance with the loan parameter values in the corresponding table.
The matching of a loan offer with a borrow offer shall result in the creation of a loan.
This new loan portfolio shall receive the loan amount (P) from the lending offer and an amount of collateral asset (K) from the borrowing offer equal to
K = (MCR - 1) × P
A loan shall be created from a single lending offer and a single borrowing offer.
This loan portfolio shall then become available for margin trading by the borrower.
The start date of the loan shall be when the loan is matched. The earliest end date of the loan shall be calculated by adding the minimum loan duration, that is compatible with the matched loan offer and borrow offer, to the start date. The latest end date of the loan shall be calculated by adding the maximum loan duration, that is compatible with the matched loan offer and borrow offer, to the start date. The loan may be closed:
- by the borrower on or after the earliest end date and before the latest end date,
- by the smart contract when the latest end date arrives, or
- by the smart contract any time before the latest end date if the loan portfolio is undervalued.
The matching of a loan offer with a borrow offer will result in one or both of the offers being completely consumed. If an offer is not completely filled, the offer shall be "partially filled" by having the loan amount (P) deducted from the offer's "available balance".
The reduction to a loan offer reduces the amount that has been offered by the prospective lender.
(BPmax)new = (BPmax)old - P
If this remainder exceeds the loan offer's minimum amount (BPmin), the loan offer shall be retained on the offer books. Otherwise the offer shall be cancelled by the smart contract.
The reduction to a borrow offer reduces the amount of collateral (K) that is being offered by the prospective borrower.
Knew = Kold - P
This effectively reduces the maximum loan amount of the borrow offer.
(LPmax)new = Knew ÷ (MCR - 1) = (Kold - P) ÷ (MCR - 1)
If this remainder exceeds the borrow offer's minimum amount (LPmin), the loan offer shall be retained on the offer books. Otherwise the offer shall be cancelled by the smart contract.
If the partially-filled offer is retained and if the partially filled offer is the new offer, it shall be re-evaluated for loan matching against the remaining counter-offers.
Assets that are borrowed shall be placed into the borrower's margin trading "loan portfolio". This portfolio shall only be used for trading on the decentralized exchange in the market pair consisting of the "Asset type to lend/borrow" and the "Asset type to trade against". It shall not be possible to transfer funds to any account, nor use any of the assets as collateral to create another pegged asset on BitShares.
Any assets obtained from trading shall by placed into the loan portfolio and shall also be restricted to trading between the pair of asset types defined in the loan agreement. Conditional withdrawals of the tradable asset by the borrower shall be permitted. Deposit of the lent asset by the borrower shall also be permitted.
A borrower shall be able to use the borrowed asset type in the loan portfolio to trade against the tradable asset on the order book of the market pair. The amount of the borrowed asset type (B) that may be used for placing new orders shall be limited to ensure that the loan portfolio's balance of the borrowed asset exceeds the minimum collateral (K). Before a trade the liquid balance of the asset type is Bliquidbefore. The liquid balance of the asset type after a new order (Btradenew) can be calculated as
Bliquidafter = Bliquidbefore - Btradenew
The new liquid balance must satisfy the following condition and definition for collateral
Bliquidafter ≥ K = (MCR - 1) × B0
which can be re-arranged as
Btradenew ≤ Bliquidbefore - (MCR - 1) × B0
This expresses a maximum amount for any new limit orders where the borrowed asset is offered to trade. If this amount is negative, no new trades shall be permitted.
A borrower may have multiple outstanding loans each with their own distinct loan portfolio. Trading of assets from each loan portfolio shall be independent of other loan portfolios that are controlled by the borrower. Trade orders shall only draw from assets within a single loan portfolio.
The distinction of loan portfolios from each other are intended to segregate the risk of each loan which can have separate loan durations, margin collateral ratios, and tradable assets. This segregation should better secure the lenders than a single co-mingled loan portfolio.
User interfaces that facilitate trading for a borrower may optionally aggregate multiple loan portfolios into a single "margin trading wallet" to disguise the fact that multiple loan portfolios are being tracked.
The daily interest due (Idaily) on the prinicipal (B0) shall be calculated as
Idaily = B0 × Rdaily
where Rdaily is daily interest rate. This daily interest shall be calculated in terms of the lent asset type.
The daily interest that is due shall be deducted from the borrower's balance of the borrowed asset type in the loan portfolio and deposited into the lender's account. If the borrower's loan portfolio holds insufficient balance of the lent asset type to pay the daily interest then a margin call shall be initiated.
When a loan is closed the interest for that last day shall be paid at that time. If a margin call requires multiple days to complete in accordance with the agreed duration of the margin call's loan, no additional interest shall be owed by the lender beyond payment for the last day of interest.
The debt owed by a borrower for a particular loan is the amount lent by the lender. Interest is due on a daily basis.
A borrower may have many outstanding loans which are owed to different borrowers. Each loan portfolio will initially consist of the principal that is lent by the lender plus the initial collateral that is provided by the borrower. The borrowed asset and the collateral asset shall initially be the same asset type (B).
After the loan is initiated, the borrower may use that asset type to trade against the tradable asset type (T) that is permitted by the loan, and/or may hold the borrowed asset. Therefore this loan-related portfolio may consist of balances of two asset types: the borrowed asset type, and the tradable asset type.
PA = B + T
While a loan is outstanding the balance of the borrowed asset and tradable asset may consist as either liquid balances in the loan portfolio or as open orders on the order book. Therefore the entire loan portfolio may be decomposed into four parts:
- a balance of borrowed asset that is liquid (Bliquid)
- a balance of tradable asset that is liquid (Tliquid)
- a balance of borrowed asset that is in open order (Borders)
- a balance of tradable asset that is in open order (Torders)
PA = Bliquid + Tliquid + Borders + Tliquid
The valuation of the portfolio shall also be denominated in terms of the borrowed asset type for purposes of appraisal by the smart contract. The valuation of the borrower's loan-related portfolio shall consist of the valuation of the two assets in the portfolio at the time of interest.
- The valuation of the liquid balance and order balance of the borrowed asset shall simply be their sum.
- The valuation of the liquid balance and order of the tradable asset shall be denominated in the borrowed asset type by the smart contract with the use of reference price.
Example of Portfolio Appraisal
Bob borrowed 70 bitUSD 203.3 days ago while supplying by supplying 30.03 bitUSD as collateral. Bob has been margin trading with this loan portfolio against bitBTC and currently has a balance of 45 bitUSD and 0.025 bitBTC. The current reference price indicates that bitBTC is priced at 5000 bitUSD per bitBTC. This loan portfolio will be appraised (PA) at:
PA = (45 bitUSD) + (0.025 bitBTC × 5000 bitUSD ÷ bitBTC)
... = (45 bitUSD) + (125 bitUSD)
... = 170 bitUSD
After the calculation of a portfolio appraisal (PA) and the debt owed (B0), the collateral ratio (CR) shall be calculated as
CR = PA ÷ B0
At the beginning of the loan, the collateral ratio will satisfy the following conditions.
CR ≥ MCR ≥ MCCR ≥ 1
The maintenance collateral valuation (MCV) of the loan portfolio is denominated in the borrowed asset and equals
MCV = MCR × B0
where B0 is the debt owed.
Similarly, the margin call collateral valuation (MCCV) of the loan portfolio is denominated in the lent asset and equals
MCCV = MCCR × B0
It is desired for the appraised valuation of the portfolio (PA) to be greater than or equal this value
PA ≥ MCV ≥ MCCV ≥ B0
but it is possible for this valuation to fall below the MCV. If
PA < MCCV
a margin call shall be initiated.
Portfolio appraisals shall be triggered at multiple times. A portfolio appraisal shall be triggered:
- before any new portfolio trade is executed to calculate the current trading limit,
- after a loan portfolio is updated by the borrower,
- after a margin trade order is filled, and
- after interest is paid.
The "recent" appraisal value, debt owed, collateral ratio, and derived valuations, and of the portfolio shall be able to be queried by the lender and borrower at any time.
A borrower shall be able to deposit additional amounts of the borrowed asset into the loan portfolio. A borrower may choose to deposit additional collateral to avoid having the loan be margin called.
A borrower shall be able to withdraw only the tradable asset as long as the market valuation of the portfolio (PA) after the withdrawal is greater than or equal to the maintenance collateral valuation. The withdrawal limit (Wlimit) is defined as
Wlimit = PA - MCV
where MCV is maintenance collateral valuation and PA is portfolio appraisal.
Example of Withdrawal
Bob borrowed 70 bitUSD 203 days ago at a daily interest rate of 0.0261% while supplying by supplying 30.03 bitUSD as collateral to satisfy the offer's 142.9% maintainance collateral ratio.
The debt owed is still 70 bitUSD. The maintenance collateral valuation (MCV) of the portfolio is
MCV = MCR × B0
... = 1.429 × 73.8276 bitUSD
... = 105.4996 bitUSD
During this time Bob has been margin trading with this loan portfolio against bitBTC and currently has a balance of 45 bitUSD and 0.025 bitBTC. The current reference price indicate that bitBTC is priced at 5000 bitUSD per bitBTC. This loan portfolio will be appraised at:
PA = (45 bitUSD) + (0.025 bitBTC × 5000 bitUSD ÷ bitBTC)
... = (45 bitUSD) + (125 bitUSD)
... = 170 bitUSD
The borrower may withdraw up to the equivalent (Wlimit) of
Wlimit = PA - MCV
... = 170 bitUSD equivalent - 105.4996 bitUSD equivalent
... = 64.5004 bitUSD equivalent
The withdrawal limit denominated in bitBTC is
Wlimit = (64.5004 bitUSD ÷ (5000 bitUSD ÷ bitBTC))
... = 0.01291 bitBTC
Bob may withdraw bitBTC up to this limit because the balance of bitBTC, 0.025, exceeds this amount. If the balance of the tradable asset were, for example, only 0.1 bitBTC then Bob would only be able to withdraw 0.1 bitBTC.
A borrower may close an outstanding loan position any time between the earliest end date and the latest end date by having a sufficient balance of the borrowed asset type in the loan portfolio and then initiating a loan closure with the appropriate parameters.
Initiation of Loan Closure Parameter | Description |
---|---|
Lending Offer ID | Identifier of an existing and open loan offer |
The initiation of a loan closure shall close any and all open trade orders that are related to this loan. If the balance of the borrowed asset type is insufficient to repay what is owed then the initiation of the loan closure shall be rejected. It is the responsibility of the borrower to ensure a sufficient balance in the borrowed asset type to repay the loan.
The smart contract shall initiate a margin call if an outstanding loan expires.
A future BSIP may consider opening a new loan from any existing offers on the Loan Order Book.
A loan portfolio may categorized as consisting of four components of balances of which one is the balance of borrowed asset that is liquid (Bliquid). This balance is drawn from to pay the daily interest. If this balance is insufficient to pay the interest then a loan closure shall be initiated.
If the collateral ratio ever drops below the margin call collateral ratio,
CR < MCCR
the smart contract shall initiate a margin call.
When a margin call is initiated on a specific loan portfolio, no new market orders may be initiated that make use of any balance in the loan portfolio. Any other loan portfolios that the borrower might have shall not be affected by margin calls on other loans.
Any open market orders that are related to that specific loan portfolio shall be cancelled.
After all open orders are cancelled, the portfolio will consist of some amount in the borrowed asset type and some amount in the tradable asset type.
PA = Bliquid + Tliquid
The smart contract shall determine whether the balance of the borrowed asset (Bliquid) is sufficient to pay the necessary balance (Bclosure). The difference between the two is the excess borrowed asset (Bexcess)
Bexcess = Bliquid - Bclosure
If the balance is sufficient (Bexcess > 0), the process shall transition to a conventional loan closure.
If the balance is insufficient (Bexcess < 0), the smart contract shall create a limit order that offers the entire balance of the tradable asset (T) while asking for the difference between what is owed and the liquid balance(-Bexcess). This limit order shall have a limited lifetime defined by the maximum margin call duration that was agreed to in the original loan terms.
If the margin call's limit order is filled, then by definition of the limit order there shall be sufficient balance of the borrowed asset type to transition to a conventional loan closure.
If the margin call's limit order expires without being completely filled, a portfolio confiscation shall be automatically initiated to permit the prompt completion of the margin call. The smart contract shall confiscate the entire loan portfolio from the borrower for ultimate transfer to the lender.
It shall be possible to monitor the status of the liquidation plan associated with any margin call. An inquiry into the status of the liquidation plan shall return:
- how much of the tradable asset was originally being liquidated,
- how much of the tradable asset has been sold, and
- how much of the borrowed asset has been obtained as a result of the liquidation.
A standard loan closure is possible if and only if the loan portfolio's balance of the borrowed asset type (Bliquid) is sufficient to repay the principal plus interest for the last day of the loan.
Bclosure = B0 + Idaily
If that condition is satisfied, a standard loan closure can be:
- initiated by the borrower
- initiated by expiration of the loan
- initiated by the full completion of a margin call
Any balances that remain in the loan portfolio after repaying the lender shall be transferred to the borrower's regular set of balances and shall no longer be encumbered by any restrictions.
A future BSIP may consider re-lending a lenders balance by automatically creating a new offer on the Loan Order Book on behalf of the lender.
The loan shall be closed.
If a margin call's liquidation plan expires without obtaining a sufficient balance of the borrowed asset to repay the lender, the confiscated loan portfolio shall be transferred to the lender as a substitute payment for the debt.
The loan shall be closed.
The BitShares Committee shall be able to define parameters that can constrain new loans; changes to these values shall not affect loans that were offered before the change:
Term | Description |
---|---|
Maximum loan durations | The maximum duration for a new loan offer |
Minimum MCR | The minimum maintenance collateral ratio (MCR) that may be agreed upon |
Minimum MCCR | The minimum margin call collateral ratio (MCCR) that may be agreed upon |
Maximum interest rates | The maximum interest rate that may be agreed upon |
Maximum duration of margin call |
The duration during which a borrower's loan portfolio shall be protected from confiscation. |
Fees shall be defined for each of the operations:
- creation of a lend offer
- creation of a borrow offer
- canceling an open offer
- depositing additional collateral
- withdrawing assets from a loan portfolio
- closing a loan
- placing trade orders from the loan portfolio
- Placing orders from the margin account incurs a computational burden on the nodes because of the need to ensure adequate collateralization of each loan portfolio. This expense should be reflected in some fee related to loan portfolio operations. A natural fit is to charge a higher fee for placing fees from a margin account.
The standard fee for canceling a trade order shall apply.
Voting stake shall be calculated per account as before this proposal and with the following additions to account for any core tokens (BTS) that are associated with lending.
- Any balance of BTS in a lending offer shall be staked to the owner of the offer.
- Any balance of BTS in a borrowing offer shall be staked to the owner of the offer.
- If BTS is the tradable asset in a loan portfolio, the liquid balance (Tliquid) and the balance in open orders (Torders) shall be staked to the borrower.
- If BTS is the borrowed asset in a loan portfolio, the liquid balance (Bliquid) and the balance in open orders (Borders) shall be staked to the lender up to the principal amount that is lent (B0). Any balance in excess of the principal shall be staked to the borrower.
- The motivation for this segregation of voting stake is to prevent the renting of voting stake through this lending mechanism.
Note 1: Interest is paid every 24 hours, regardless of local calendar. E. g. Daylight Savings Time is ignored.
Note 2: Percentage-based calculations (interest, CR) are always rounded up to the next possible value (aka "satoshi").
Note 3: MCR and MCCR are expressed in the same way as in the existing price feed logic, i. e. only the part above 100%, and as a scaled percentage value. E. g. a value of 4200
would mean 142%
.
Note 4: "Implementation hints" are not to be considered part of the formal specification, but merely as a possible implementation.
Fields:
loan_offer_id_type id
- The object IDaccount_id_type owner
- The lending account IDasset_id_type loan_asset
- The asset type that the lender is offering to lendshare_type min_amount
- The minimum amount of the asset type that the borrower must borrowshare_type max_amount
- The maximum amount of the asset type that the lender is offeringunsigned_int mcr
- The minimum collateral ratio that the lender is expecting at the beginning of a loan, as a scaled percentageunsigned_int mccr
- The collateral ratio below which a margin call of the loan is initiated, as a scaled percentageunsigned_int max_call_duration
- The maximum duration of a margin call in seconds, if one is necessary, after which a portfolio confiscation will be triggeredasset_id_type tradable_asset
- The asset type that the lender permits the borrower to trade againstunsigned_int min_duration
- The minimum duration of the loan that the lender is willing to accept, in daysunsigned_int max_duration
- The maximum duration of the loan that the lender is willing to accept, in daysunsigned_int min_interest_rate
- The minimum daily interest rate that the lender is willing to accept, as a scaled percentagetime_point_sec expiration
- Expiration date of the offer
Implementation hints:
- Indexed
by_owner
,by_asset
,by_expiration
- Secondary index for tracking core per account
Fields:
borrow_offer_id_type id
- The object IDaccount_id_type owner
- The borrowing account IDasset_id_type loan_asset
- The asset type that the borrower is offering to borrowshare_type min_amount
- The minimum amount of the asset type that the lender must lendshare_type max_amount
- The maximum amount of the asset type that the borrower wants to borrowshare_type available_collateral
- The amount of collateral the borrower has put into the offerunsigned_int mcr
- The maximum collateral ratio that the borrower is willing to provide at the beginning of the loan, as a scaled percentageunsigned_int mccr
- The maximum collateral ratio the borrower will accept, below which a margin call of the loan is initiated, as a scaled percentageunsigned_int min_call_duration
- The minimum duration of a margin call in seconds, if one is necessary, after which a portfolio confiscation will be triggeredasset_id_type tradable_asset
- The asset type that the borrower wants to trade againstunsigned_int min_duration
- The minimum duration of the loan that the borrower is willing to accept, in daysunsigned_int max_duration
- The maximum duration of the loan that the borrower is willing to accept, in daysunsigned_int max_interest_rate
- The maximum daily interest rate that the borrower is willing to accept, as a scaled percentagetime_point_sec expiration
- Expiration date of the offer
Implementation hints:
- Indexed
by_owner
,by_asset
,by_expiration
- Secondary index for tracking core per account
Fields:
account_id_type owner
- The borrowing account IDaccount_id_type lender
- The lending account IDasset_id_type principal_asset
- The ID of the borrowed assetshare_type principal_borrowed
- The amount that was originally borrowedshare_type minimum_collateral
- The minimum amount of collateral that must be maintainedshare_type principal_balance
- The amount of the borrowed asset currently held in the portfolioshare_type principal_in_orders
- The amount of the borrowed asset currently held in market ordersasset_id_type trade_asset
- The ID of the asset that can be traded againstshare_type trade_balance
- The amount of the tradable asset currently held in the portfolioshare_type trade_in_orders
- The amount of the tradable asset currently held in market ordersshare_type mccv
- The portfolio value below which a margin call of the loan is initiated, in terms ofprincipal_asset
unsigned_int call_duration
- The duration of a margin call in seconds, if one is necessary, after which a portfolio confiscation will be triggeredoptional<time_point_sec> confiscation_time
- After a margin call has been initiated, this contains the time when the portfolio will be confiscatedshare_type daily_interest
- The daily interest amount to be paidtime_point_sec interest_due_at
- Date at which the next interest payment is dueshare_type cumulative_interest
- The cumulative interest paid for this loan so fartime_point_sec earliest_end
- Date after which the portfolio can be closed by the borrowertime_point_sec latest_end
- Date after which the portfolio will be closed automaticallyoptional<price> call_price
- If present, contains the price (in terms of principal/trade) below which the portfolio is margin called
Implementation hints:
- Indexed
by_owner
,by_lender
,by_interest_due
,by_expiration
(i. e.latest_end
) - Secondary index for tracking core per account
This contains entries only for asset pairs that are whitelisted for margin trading or have open loans.
Fields:
price last_price
- the most recent trade price of the pair,base.asset_id < quote.asset_id
unsigned_int loans
- the total number of open loans in either pairbool base_lending_allowed
- true if lending of base asset for trading against quote asset is allowedbool quote_lending_allowed
- true if lending of quote asset for trading against base asset is allowed
The chain_parameters
(configurable by committee) will receive a new extension field margin_lending
with these members:
unsigned_int max_duration
- maximum allowed loan duration in daysunsigned_int minimum_mcr
- minimum allowed mcr for loans, as a scaled percentageunsigned_int minimum_mccr
- minimum allowed mccr for loans, as a scaled percentageunsigned_int max_interest
- maximum allowed daily interest rate, as a scaled percentageunsigned_int max_call_duration
- maximum allowed call duration in seconds
This extension must not be present in proposals before the hardfork time.
limit_order_object
receives a new fieldoptional<loan_portfolio_id_type> loan
additional_asset_options
receives a new extensionoptional<flat_set<asset_id_type>> whitelist_margin_trading
(see below)
Implementation hints:
- Secondary index on
limit_order_object
for trackingby_loan
All new operations have a simple flat fee. New operations must not be allowed before the hardfork time, neither in proposals nor directly. New fees must not be allowed in chain parameter update proposals before the hardfork.
Fields:
account_id_type lender
- The lending account IDasset_id_type asset_to_lend
- The asset type that the lender is offering to lendshare_type min_to_lend
- The minimum amount of the asset type that the borrower must borrowshare_type max_to_lend
- The maximum amount of the asset type that the lender is offeringunsigned_int mcr
- The minimum collateral ratio that the lender is expecting at the beginning of a loan, as a scaled percentageunsigned_int mccr
- The collateral ratio below which a margin call of the loan is initiated, as a scaled percentageunsigned_int max_call_duration
- The maximum duration of a margin call in seconds, if one is necessary, after which a portfolio confiscation will be triggeredasset_id_type tradable_asset
- The asset type that the lender permits the borrower to trade againstunsigned_int min_duration
- The minimum duration of the loan that the lender is willing to accept, in daysunsigned_int max_duration
- The maximum duration of the loan that the lender is willing to accept, in daysunsigned_int min_interest_rate
- The minimum daily interest rate that the lender is willing to accept, as a scaled percentagetime_point_sec expiration
- Expiration date of the offerextension_type ext
- reserved for future extensions
Validation checks:
lender
must be a valid account ID, must exist, must authorize the operation, must pay feeasset_to_lend
andtradable_asset
must be valid asset IDs, must not be equal, and both assets must existmin_to_lend > 0
max_to_lend >= min_to_lend
mcr >= mccr
max_duration >= min_duration
expiration > head_block_time
min_duration <= chain_parameters.max_duration
mcr >= chain_parameters.min_mcr
mccr >= chain_parameters.min_mccr
min_interest_rate <= chain_parameters.max_interest_rate
max_call_duration <= chain_parameters.max_call_duration
lender
must have at leastmax_to_lend
ofasset_to_lend
in his balance- A
loan_market_dynamic_data_object
must exist for theasset_to_lend
/tradable_asset
pairasset_to_lend
must be authorized for margin lending againsttradable_asset
last_price
must be valid
asset_to_lend
must be whitelisted or not blacklisted for trading againsttradable_asset
and vice versaasset_to_lend
and thetradable_asset
must not be transfer restrictedlender
must be whitelisted or must not be blacklisted for theasset_to_lend
and thetradable_asset
due to transfer restrictions
Evaluation:
- Deduct
max_to_lend
ofasset_to_lend
fromlender
balance - Create new
loan_offer_object
and populate object fields from operation fields - Operation result is new object id
- Trigger automatic matching
Fields:
account_id_type borrower
- The borrowing account IDasset_id_type asset_to_borrow
- The asset type that the borrower is offering to borrowshare_type min_to_borrow
- The minimum amount of the asset type that the lender must lendshare_type max_to_borrow
- The maximum amount of the asset type that the borrower wants to borrowunsigned_int mcr
- The maximum collateral ratio that the borrower is willing to provide at the beginning of the loan, as a scaled percentageunsigned_int mccr
- The maximum collateral ratio the borrower will accept, below which a margin call of the loan is initiated, as a scaled percentageunsigned_int min_call_duration
- The minimum duration of a margin call in seconds, if one is necessary, after which a portfolio confiscation will be triggeredasset_id_type tradable_asset
- The asset type that the borrower wants to trade againstunsigned_int min_duration
- The minimum duration of the loan that the borrower is willing to accept, in daysunsigned_int max_duration
- The maximum duration of the loan that the borrower is willing to accept, in daysunsigned_int max_interest_rate
- The maximum daily interest rate that the borrower is willing to accept, as a scaled percentagetime_point_sec expiration
- Expiration date of the offerextension_type ext
- reserved for future extensions
Validation checks:
borrower
must be a valid account ID, must exist, must authorize the operation, must pay feeasset_to_borrow
andtradable_asset
must be valid asset IDs, must not be equal, and both assets must existmin_to_borrow > 0
max_to_borrow >= min_to_borrow
mcr >= mccr
max_duration >= min_duration
expiration > head_block_time
min_duration <= chain_parameters.max_duration
mcr >= chain_parameters.min_mcr
mccr >= chain_parameters.min_mccr
max_interest_rate <= chain_parameters.max_interest_rate
min_call_duration <= chain_parameters.max_call_duration
borrower
must have at leastmax_to_borrow * mcr
ofasset_to_borrow
in his balance-
- A
loan_market_dynamic_data_object
must exist for theasset_to_borrow
/tradable_asset
pairasset_to_borrow
must be authorized for margin lending againsttradable_asset
last_price
must be valid
- A
asset_to_borrow
must be whitelisted or not blacklisted for trading againsttradable_asset
and vice versaasset_to_borrow
and thetradable_asset
must not be transfer restrictedborrower
must be whitelisted or must not be blacklisted for theasset_to_lend
and thetradable_asset
due to transfer restrictions
Evaluation:
- Deduct
max_to_borrow * mcr
ofasset_to_borrow
fromborrower
balance - Create new
borrow_offer_object
and populate object fields from operation fields - Operation result is new object id
- Trigger automatic matching
This operation can be used to cancel lending and borrowing offers.
Fields:
account_id_type owner
- Creator of the operation (fee paying account), must equal owner of the offeroffer_id_type offer
- Either aloan_offer_id_type
or aborrow_offer_id_type
extension_type ext
- reserved for future extensions
Validation checks:
owner
must be a valid account ID, must exist, must authorize the operation, must pay feeoffer
must be a valid lending offer ID or borrowing offer ID and must existoffer.owner == owner
Evaluation:
- If
offer
is a lending offer:- Add
offer.max_amount
ofoffer.loan_asset
toowner
balance
- Add
- If
offer
is a borrowing offer:- Add
offer.available_collateral
ofoffer.loan_asset
toowner
balance
- Add
- Delete
offer
from database - Operation result is amount paid back to
owner
Fields:
account_id_type offerer
- must equal owner of the offeroffer_id_type offer
- id of the accepted offer,loan_offer_id_type
or aborrow_offer_id_type
loan_portfolio_id_type loan
- id of the resulting loan portfolio
Fields:
account_id_type lender
- the lender's account idaccount_id_type borrower
- the borrower's account idloan_id_type loan
- ID of the loan portfolio to adjustasset interest_amount
- Amount of interest paid toloan.lender
Fields:
account_id_type lender
- the lender's account idaccount_id_type borrower
- the borrower's account idloan_id_type loan
- ID of the loan portfolio to adjustasset principal_paid_back
- Amount of principal paid back to lenderasset trade_confiscated
- Amount of trade asset paid to lenderasset principal_turned_out
- Amount of principal paid out to borrowerasset trade_turned_out
- Amount of trade asset paid out to borrower
Fields:
account_id_type borrower
- the borrower's account idloan_id_type loan
- ID of the loan portfolio to adjust
Validation checks:
borrower
must be a valid account ID, must exist, must authorize the operation, must pay feeloan
must be a valid loan portfolio ID and must existloan.owner == borrower
head_block_time >= loan.earliest_end
loan.principal_in_orders == 0 && loan.trade_in_orders == 0
loan.principal_balance >= loan.principal_borrowed + loan.daily_interest
Evaluation:
- Trigger interest payment (see below)
- Pay
loan.principal_borrowed
ofloan.principal_asset
toloan.lender
- Pay
loan.principal_balance - loan.principal_borrowed
ofloan.principal_asset
toloan.borrower
- Pay
loan.trade_balance
ofloan.trade_asset
toloan.borrower
- Create a virtual
loan_closed_operation
- Delete
loan
- Decrement counter in corresponding
loan_market_dynamic_data_object
- If counter equals 0 and both flags are false, delete
loan_market_dynamic_data_object
Fields:
account_id_type owner
- Creator of the operation (fee paying account), must equal owner of the loan portfolioloan_id_type loan
- ID of the loan portfolio to adjustasset principal_delta
- Amount of principal asset to add / withdrawasset trade_delta
- Amount of trade asset to add / withdrawextension_type ext
- reserved for future extensions
Validation checks:
owner
must be a valid account ID, must exist, must authorize the operation, must pay feeloan
must be a valid loan portfolio ID and must existloan.owner == owner
principal_delta != 0 || trade_delta != 0
principal_delta >= 0
!confiscation_time.valid || trade_delta >= 0
- If
principal_delta > 0
ortrade_delta > 0
,owner
must have sufficient balance - If
trade_delta < 0
loan.trade_balance >= -trade_delta
- Let
mcv = loan.principal_borrowed + loan.minimum_collateral
- If
loan.principal_balance + loan.principal_in_orders < mcv
- Let
min_trade = reference_price * (mcv - loan.principal_balance - loan.principal_in_orders)
loan.trade_balance + loan.trade_in_orders + trade_delta >= min_trade
- Let
Evaluation:
- If
principal_delta > 0
:- Deduct
principal_delta
fromloan.owner
's balance - Add
principal_delta.amount
toloan.principal_balance
- Deduct
- If
trade_delta != 0
:- Deduct
trade_delta
fromloan.owner
's balance - Add
trade_delta.amount
toloan.trade_balance
- Re-appraise portfolio and throw if margin call is triggered
- Deduct
Note: trading from a loan portfolio happens on the same markets as trading from an account. Trading is therefore not implemented separately, but through modifications to the existing trade mechanisms.
Fields:
The existing limit_order_create_operation
and fill_order_operation
receive one optional extension field:
loan_id_type loan
- ID of the loan portfolio from which the trade is executed
The loan
field is not allowed before the hardfork time, neither directly nor in proposals.
Validation checks:
If the loan
extension is present in a limit_order_create_operation
, the following checks replace the existing checks against the seller's account balance:
loan
is valid and refers to an existingloan_portfolio_object
seller == loan.owner
!loan.confiscation_time.valid
(no trades after margin call)amount_to_sell.asset_id == loan.principal_asset || amount_to_sell.asset_id == loan.trade_asset
- If
amount_to_sell.asset_id == loan.principal_asset
:loan.principal_balance - amount_to_sell.amount >= loan.minimum_collateral
min_to_receive.asset_id == loan.trade_asset
- If
amount_to_sell.asset_id == loan.trade_asset
:loan.trade_balance >= amount_to_sell.amount
min_to_receive.asset_id == loan.principal_asset
Evaluation:
- The
loan
extension will be recorded in the newlimit_order_object
- If
loan
field is present,amount_to_sell
will be deducted from theloan
balance and recorded inloan
's..._in_order
fields, not the account'sfill_order
will be modified to pay trade proceeds intoloan
portfolio and adjustloan
's..._in_order
fieldsfill_order
must re-appraise the portfoliocancel_order
will be modified to return funds intoloan
portfolio and adjustloan
's..._in_order
fields
- For all trades, look up
loan_market_dynamic_data_object
- If it exists, update
last_price
Fields:
additional_asset_options
receives a new extensionoptional<flat_set<asset_id_type>> whitelist_margin_trading
The new field is not allowed before the hardfork time, neither directly nor in proposals.
Validation checks:
- If the new extension is present,
- all listed asset IDs must exist
- the ID of the asset to be created/updated must not be listed
Evaluation:
- If the extension is not present, the existing list (if any) is preserved.
- If the extension is present in an update and also present in the database, then for each asset A that is removed by the update
- set the flag in corresponding
loan_market_dynamic_data_object
to false - if both flags are false and counter equals 0, delete
loan_market_dynamic_data_object
- set the flag in corresponding
- For each asset A that is added by the create/update
- create
loan_market_dynamic_data_object
if no matching one exists - set appropriate flag to true
- create
The following methods will be added to the database_api
:
vector<loan_offer_object> get_loan_offers_by_asset <loan-asset> <trade-asset> <optional limit> <optional start>
vector<borrow_offer_object> get_borrow_offers_by_asset <loan-asset> <trade-asset> <optional limit> <optional start>
vector<loan_offer_object> get_loan_offers_by_account <account> <optional limit> <optional start>
vector<borrow_offer_object> get_borrow_offers_by_account <account> <optional limit> <optional start>
vector<loan_portfolio_object> get_loans_by_lender <account> <optional limit> <optional start>
vector<loan_portfolio_object> get_loans_by_borrower <account> <optional limit> <optional start>
vector<limit_order_object> get_orders_by_loan <loan-id> <optional limit> <optional start>
loan_market_dynamic_data_object get_loan_market_dynamic_data <asset-id> <asset-id>
All result lists are ordered by ascending object id. Server-side limits are configurable.
Similar to database::apply_order(). Triggered when a new offer is evaluated.
- Let
taker_offer
=new_offer
- If
new_offer
is loan offer- Let
prioritization_policy
= Favor Borrowers policy counter_offers
= existing borrow offers
- Let
- Otherwise (new offer is borrow offer)
- Let
prioritization_policy
= Favor Lenders policy counter_offers
= existing loan offers
- Let
- while true
- Let
compatible_offers
=find_compatible_offers
(new_offer
,counter_offers
,prioritization_policy
) - if no
compatible_offers
- return false
- otherwise
- Let
maker_offer
= highest-prioritized counter offer - [
loan_object_id
,taker_offer_filled
] = create_loan(taker_offer
,maker_offer
,prioritization_policy
) - If
taker_offer_filled
- return true
- Let
- Let
- Set
loan.confiscation_time = head_block_time + loan.call_duration
- Cancel open market orders of this loan, as usual
- If
loan.principal_balance >= loan.principal_borrowed + loan.daily_interest
: close loan as described above - Otherwise:
- Let
gap = loan.principal_borrowed + loan.daily_interest - loan.principal_balance
- Create and execute a virtual
limit_order_create
forloan
withamount_to_sell = loan.trade_balance
andmin_to_receive = gap
- If the order has been (partially) filled, restart margin call process (meaning
gap
is smaller or perhaps closed)
- Let
Notes:
- The new limit order will "walk the book" until the available trade balance has been spent (or there are no more orders in the book with a matching price). It is possible that this process buys up much more principal than required to close the
gap
, possibly at a price far away from the usual market price. Thus, the borrower should avoid being margin called. - Due to rounding, edge cases may exist where the limit order has been partially filled and then cancelled without buying sufficient principal to close the
gap
. It may then be impossible to create a new order for the remaining gap, because that would be considered "dust". The consequence would be that the loan stays in margin call state until it is confiscated. For practical purposes this shouldn't make much of a difference because rounding issues are a few "satoshis" only.
Similar to database::clear_expired_proposals
, in each block
- Check all
loan_portfolio_object.interest_due_at
againsthead_block_time
- If passed and if
!loan_portfolio_object.confiscation_time.valid
,- If
loan.daily_interest > loan.principal_balance
: initiate margin_call - Otherwise,
- Deduct
loan.daily_interest
fromloan.principal_balance
- Add
loan.daily_interest
ofloan.principal_asset
toloan.lender
's balance - Add
loan.daily_interest
toloan.cumulative_interest
- Create a virtual
loan_interest_operation
- Add 86400 to
loan.interest_due_at
- Re-appraise portfolio
- Deduct
- If
Similar to database::clear_expired_orders
, in each block
- Check
loan_offer_object.expiration
andborrow_offer_object.expiration
againsthead_block_time
- If expired, create a virtual
lending_cancel_operation
and execute as describe above
Similar to database::clear_expired_orders
, in each block
- Check
loan_portfolio_object.latest_end
againsthead_block_time
- If expired:
- Cancel open orders of this portfolio with virtual
limit_order_cancel
operations - If
loan.principal_balance < loan.principal_borrowed + loan.daily_interest
: initiate margin call - Otherwise: close loan as described above
- Cancel open orders of this portfolio with virtual
In each block, for each loan that is in margin call state,
- If
loan.principal_balance >= loan.principal_borrowed + loan.daily_interest
- Cancel open order, if any
- Close loan as described above
Similar to database::clear_expired_orders
, in each block
- Check valid
loan_portfolio_object.confiscation_time
againsthead_block_time
- If expired,
- Cancel open order, if any
- Add
loan.principal_balance
ofloan.principal_asset
toloan.lender
's balance - Add
loan.trade_balance
ofloan.trade_asset
toloan.lender
's balance - Create appropriate virtual
loan_closed_operation
- Delete
loan
vote_tally_helper
computesvoting_stake
per account as before, plus core in- loan_offers
- borrow_offers
- If core is the
trade_asset
in a loan_portfolio- Let
lender_stake = 0
- Let
borrower_stake = trade_balance + trade_in_orders
- Let
- If core is the
principal_asset
in a loan_portfolio- Let
lender_stake = min(principal_balance + principal_in_orders, principal_borrowed)
- Let
borrower_stake = principal_balance + principal_in_orders - lender_stake
- Let
- If tradable_asset is a bitAsset backed by borrowed_asset and is in global settlement
reference_price = global_settlement_price
- Otherwise
- if the market has any orders with
asset_to_sell = borrowed_asset
andasset_to_buy = tradeable_asset
reference_price = highest_offer
- otherwise
reference_price = last_price
- if the market has any orders with
- Let
principal = loan.principal_balance + loan.principal_in_orders
- If
principal >= loan.mccv
, clearloan.call_price
- Otherwise
- if
(loan.trade_balance + loan.trade_in_orders) > 0
- set
loan.call_price = (loan.mccv - principal) / (loan.trade_balance + loan.trade_in_orders)
- if
reference_price < loan.call_price
: trigger margin call
- set
- else
- Trigger margin call
- if
The following commands will be added to cli_wallet
:
list_loan_offers <account>
list_borrow_offers <account>
get_loan_offers <loan-asset> <trade-asset>
get_borrow_offers <loan-asset> <trade-asset>
loan_offer_create
with operation parametersborrow_offer_create
with operation parameterslending_offer_cancel <id>
loan_update <id> <delta-principal> <delta-trade>
get_loan_valuation <id>
get_loan_call_price <id>
loan_close <id>
- The
sell_asset
command will receive an additional optional parameter, the loan portfolio id
A stagnant, nascent, or illiquid order book on the DEX for a particular market pair might not reflect the valuation of the collateral according to external market pairs. That will affect the appraisal value of the loan collateral which then affects margin calculations. Margin calculations affect both future loan offers on the books and matched loans.
Potential lenders and borrowers should carefully review any internal market pair and compare it with the external market pair to determine (a) whether internal market reflects a reasonable exchange ratio/price, and (b) whether the internal market could be easily manipulated to either overvalue or undervalue collateral.
If a margin call is initiated and if a liquidation plan requires selling the tradable asset to repay the lender in lent asset type, borrowers should be aware that it will be sold as an effective market order. The resulting sale on the DEX order book may return much less than if the offer were made on an external market.
Loans that are margin called might require a liquidation plan that involves placing an limit order to buy enough of the lent asset to repay the loan.
If the market order remains unfilled on the DEX order book in excess of maximum margin call duration, the borrower's entire loan portfolio shall be confiscated thereby leaving the borrower with nothing after the loan closure.
A margin call on a loan portfolio will immediately try to buy large amounts of the borrowed asset from the market. This can lead to a sudden spike in the trade price. This in turn can affect the reference price, which could lead to additional margin calls in other portfolios.
Asset issuers have extensive control over how their asset is used on BitShares including the ability to whitelist the trading of an asset against other assets), to restrict the transfers of an asset, and to seize any issued asset from an account if the asset is defined with the appropriate flags. These interaction of these powers with lending for margin trading are described.
The power to whitelist and blacklist trading pairs for an issuer's asset, which has the appropriate flags enabled, shall be unaffected by this proposal. This lending proposal makes use of the existing trading mechanisms therefore all rules shall continue to apply.
For example, if an issuer's asset is blacklisted from trading against any other asset, no trading of the Asset will be possible either from an account's regular set of balances or from their loan portfolio.
Alternatively, an issuer's asset (X) might initially be whitelisted to trade against any other asset, which permits the creation of a loan portfolio to trade against another asset (Y). Trading by the borrower ensues and the borrower obtains some quantity of Asset Y in their portfolio. If the asset issuer then blacklists trading between X and Y, the borrower shall no longer be able to trade the asset from anywhere including their loan portfolio. Another effect will be that margin calls shall no longer be able to be liquidated by means of buying back the borrowed asset on the DEX. Consequently if a margin call is initiated after a blacklisting and the loan portfolio's balance of the borrowed asset was insufficient to repay the lender, the margin call shall eventually result in an unconventional loan closure.
The existing power to restrict the direct transfer of an issuer's asset, which has the appropriate flags enabled, from one account to another shall be unaffected by this proposal.
Interest payment involves the transfer of the [borrowed asset-type](#borrow-asset] from the borrower to the lender. Therefore the creation of loan and borrow offers, and the matching of offers shall only be permitted if (a) if the borrow asset is not transfer restricted, and (b) if both the lender and the borrower are whitelisted or are not blacklisted for the borrow asset.
An unconventional loan closure transfers all balances of the borrow asset type and the tradable asset type to the lender. Therefore the creation of loan and borrow offers, and the matching of offers shall only be permitted if (a) if the tradable asset is not transfer restricted, and (b) both the lender and the borrower are whitelisted or are not blacklisted for the tradable asset.
The power to seize an issuer's asset, which has the appropriate flags enabled, shall remain possible if the asset is held in the account's regular set of balances. This power does not currently extend to assets held in open orders. Similarly, it shall not be possible to seize an asset that is held inside of a loan offer, borrow offer, or loan portfolio. An asset issuer may instead first impose a transfer restriction on the account, and then wait for the loan to be closed with appropriate balances being distributed to the regular balances of the borrower and lender at which time the conventional asset seizure may be invoked.
This BSIP defines a protocol upgrade to support peer-to-peer lending, borrowing and margin trading markets on the BitShares DEX. The motivation behind this BSIP is to increase the user demand for smartcoins on BitShares by offering on-chain peer-to-peer lending and borrowing to augment the existing trading. The multiple stage process between borrowers and lenders is supported with software specifications and a discussion of risks to lenders, borrowers, and asset holders, and asset issuers.
This document is placed in the public domain.