brain storm line of credit operations
This commit is contained in:
parent
7d6d7066c2
commit
33fe8e9d7c
1 changed files with 146 additions and 0 deletions
146
libraries/chain/include/graphene/chain/line_of_credit.hpp
Normal file
146
libraries/chain/include/graphene/chain/line_of_credit.hpp
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
#pragma once
|
||||
|
||||
namespace graphene { namespace chain {
|
||||
|
||||
struct line_of_credit
|
||||
{
|
||||
enum flag
|
||||
{
|
||||
/**
|
||||
* Debt may be increased via credit_passthrough operation, controlled by borrower
|
||||
**/
|
||||
bool allow_lender_passthrough = 0x01,
|
||||
bool allow_borrower_passthrough = 0x02,
|
||||
/** borrower may pull BitUSD from lender */
|
||||
bool allow_cash_advance = 0x04,
|
||||
/** the lender may change the interest rate */
|
||||
bool allow_variable_interest = 0x08
|
||||
};
|
||||
|
||||
account_id_type borrower;
|
||||
account_id_type lender;
|
||||
share_type debt;
|
||||
share_type credit_limit;
|
||||
share_type passthrough_fee;
|
||||
asset_id_type asset_type;
|
||||
/** accumulated daily, compounded every update */
|
||||
uint16_t interest_apr = 0;
|
||||
uint8_t flags = 0;
|
||||
/** requires borrower and lender to approve update */
|
||||
digest_type loan_contract_digest;
|
||||
};
|
||||
|
||||
/**
|
||||
* Index on borrower/asset_type and lender/asset_type
|
||||
*/
|
||||
class line_of_credit_object : public db::abstract_object<line_of_credit_object>
|
||||
{
|
||||
static const uint8_t space_id = protocol_ids;
|
||||
static const uint8_t type_id = line_of_credit_object_type;
|
||||
|
||||
account_id_type borrower()const { return terms.borrower; }
|
||||
account_id_type lender()const { return terms.lender; }
|
||||
asset debt()const { return asset( terms.debt, terms.asset_type ); }
|
||||
asset credit_limit()const { return asset( terms.credit_limit, terms.asset_type ); }
|
||||
asset_id_type asset_type()const { return term.asset_type; }
|
||||
|
||||
line_of_credit terms;
|
||||
time_point_sec last_update;
|
||||
|
||||
/**
|
||||
* Both borrower and lender must approve of the line of credit before any
|
||||
* debts may accrue.
|
||||
*/
|
||||
bool borrower_approved = false;
|
||||
bool borrower_lender_approved = false;
|
||||
};
|
||||
|
||||
struct by_borrower;
|
||||
struct by_lender;
|
||||
|
||||
/**
|
||||
* @ingroup object_index
|
||||
*/
|
||||
typedef multi_index_container<
|
||||
line_of_credit_object,
|
||||
indexed_by<
|
||||
ordered_unique< tag<by_id>, member< object, object_id_type, &object::id > >,
|
||||
ordered_non_unique< tag<by_borrower>, composite_key<
|
||||
line_of_credit_object,
|
||||
const_member_fun<line_of_credit_object, account_id_type, &line_of_credit_object::borrower>,
|
||||
const_member_fun<line_of_credit_object, asset_id_type, &line_of_credit_object::asset_type> >
|
||||
>,
|
||||
ordered_non_unique< tag<by_lender>, composite_key<
|
||||
line_of_credit_object,
|
||||
const_member_fun<line_of_credit_object, account_id_type, &line_of_credit_object::lender>,
|
||||
const_member_fun<line_of_credit_object, asset_id_type, &line_of_credit_object::asset_type> >
|
||||
>
|
||||
>
|
||||
> line_of_credit_object_multi_index_type;
|
||||
typedef generic_index<line_of_credit_object, line_of_credit_object_multi_index_type> line_of_credit_index;
|
||||
|
||||
struct line_of_credit_create_operation
|
||||
{
|
||||
asset fee;
|
||||
account_id_type creator; ///< pays the transaction fee and approves terms by default
|
||||
line_of_credit terms;
|
||||
};
|
||||
|
||||
struct line_of_credit_accept_terms_operation
|
||||
{
|
||||
asset fee;
|
||||
line_of_credit_id_type id;
|
||||
account_id_type acceptor;
|
||||
};
|
||||
|
||||
struct line_of_credit_update_operation
|
||||
{
|
||||
asset fee; ///< paid for by terms.lender
|
||||
account_id_type updater; ///< account performing the update
|
||||
line_of_credit_id_type id;
|
||||
/**
|
||||
* Lender may increase or lower, borrower may increase
|
||||
*/
|
||||
uint16_t new_interest_rate = 0;
|
||||
uint8_t flags;
|
||||
/**
|
||||
* Lender may increase or lower, borrower may lower
|
||||
*/
|
||||
asset new_credit_limit;
|
||||
};
|
||||
|
||||
/**
|
||||
* This operation is used to transfer the debt to a debt
|
||||
* collector.
|
||||
*/
|
||||
struct line_of_credit_transfer_debt_operation
|
||||
{
|
||||
asset fee; ///< paid for by current_lender
|
||||
line_of_credit_id_type loc;
|
||||
account_id_type current_lender;
|
||||
account_id_type new_lender;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief enables payment of 3rd parties by rebalancing debts among users
|
||||
*/
|
||||
struct line_of_credit_passthrough_operation
|
||||
{
|
||||
struct transfer_node
|
||||
{
|
||||
line_of_credit_id_type loc;
|
||||
account_id_type borrower;
|
||||
account_id_type lender;
|
||||
share_type delta_debt;
|
||||
share_type fee_paid; ///< always paid to the lender
|
||||
};
|
||||
|
||||
asset fee;
|
||||
account_id_type fee_payer; ///< accout with actual asset to pay fee
|
||||
account_id_type from; ///< account funding the init_amount
|
||||
asset init_amount;
|
||||
vector<transfer_node> passthrough; ///< pass through nodes
|
||||
};
|
||||
|
||||
} } // graphene / chain
|
||||
Loading…
Reference in a new issue