Commit 6cd7e2b2 authored by pengjun's avatar pengjun

#627 add price feed & system liquidation

parent 961263a5
......@@ -55,11 +55,31 @@ func newCollateralize() drivers.Driver {
}
// GetDriverName for Collateralize
func (Coll *Collateralize) GetDriverName() string {
func (c *Collateralize) GetDriverName() string {
return pty.CollateralizeX
}
func (Coll *Collateralize) addCollateralizeStatus(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
func (c *Collateralize) addCollateralizeID(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeKey(collateralizelog.CollateralizeId, collateralizelog.Index)
record := &pty.CollateralizeRecord{
CollateralizeId:collateralizelog.CollateralizeId,
Index: collateralizelog.Index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) deleteCollateralizeID(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeKey(collateralizelog.CollateralizeId, collateralizelog.Index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) addCollateralizeStatus(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeStatusKey(collateralizelog.Status, collateralizelog.Index)
record := &pty.CollateralizeRecord{
CollateralizeId:collateralizelog.CollateralizeId,
......@@ -71,7 +91,7 @@ func (Coll *Collateralize) addCollateralizeStatus(collateralizelog *pty.ReceiptC
return kvs
}
func (Coll *Collateralize) deleteCollateralizeStatus(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
func (c *Collateralize) deleteCollateralizeStatus(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeStatusKey(collateralizelog.Status, collateralizelog.Index)
kv := &types.KeyValue{Key: key, Value: nil}
......@@ -79,7 +99,7 @@ func (Coll *Collateralize) deleteCollateralizeStatus(collateralizelog *pty.Recei
return kvs
}
func (Coll *Collateralize) addCollateralizeAddr(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
func (c *Collateralize) addCollateralizeAddr(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeAddrKey(collateralizelog.AccountAddr, collateralizelog.Index)
record := &pty.CollateralizeRecord{
CollateralizeId:collateralizelog.CollateralizeId,
......@@ -91,10 +111,32 @@ func (Coll *Collateralize) addCollateralizeAddr(collateralizelog *pty.ReceiptCol
return kvs
}
func (Coll *Collateralize) deleteCollateralizeAddr(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
func (c *Collateralize) deleteCollateralizeAddr(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeAddrKey(collateralizelog.AccountAddr, collateralizelog.Index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) addCollateralizeRecordStatus(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeRecordStatusKey(collateralizelog.RecordStatus, collateralizelog.Index)
record := &pty.CollateralizeRecord{
CollateralizeId:collateralizelog.CollateralizeId,
Addr: collateralizelog.AccountAddr,
Index: collateralizelog.Index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) deleteCollateralizeRecordStatus(collateralizelog *pty.ReceiptCollateralize) (kvs []*types.KeyValue) {
key := calcCollateralizeRecordStatusKey(collateralizelog.RecordStatus, collateralizelog.Index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
\ No newline at end of file
......@@ -13,30 +13,35 @@ import (
func (c *Collateralize) execDelLocal(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
set := &types.LocalDBSet{}
for _, item := range receiptData.Logs {
var collateralizelog pty.ReceiptCollateralize
err := types.Decode(item.Log, &collateralizelog)
var collateralizeLog pty.ReceiptCollateralize
err := types.Decode(item.Log, &collateralizeLog)
if err != nil {
return nil, err
}
switch item.Ty {
case pty.TyLogCollateralizeCreate:
kv := c.deleteCollateralizeStatus(&collateralizelog)
kv := c.deleteCollateralizeStatus(&collateralizeLog)
set.KV = append(set.KV, kv...)
break
case pty.TyLogCollateralizeBorrow:
kv := c.deleteCollateralizeAddr(&collateralizelog)
set.KV = append(set.KV, kv...)
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(&collateralizeLog)...)
set.KV = append(set.KV, c.deleteCollateralizeAddr(&collateralizeLog)...)
break
case pty.TyLogCollateralizeAppend: // append没有状态变化
break
case pty.TyLogCollateralizeRepay:
kv := c.addCollateralizeAddr(&collateralizelog)
set.KV = append(set.KV, kv...)
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(&collateralizeLog)...)
set.KV = append(set.KV, c.addCollateralizeAddr(&collateralizeLog)...)
break
case pty.TyLogCollateralizeFeed:
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(&collateralizeLog)...)
if collateralizeLog.RecordStatus == pty.CollateralizeUserStatusSystemLiquidate {
set.KV = append(set.KV, c.addCollateralizeAddr(&collateralizeLog)...)
}
break
/*case pty.TyLogCollateralizeFeed:*/ // TODO
case pty.TyLogCollateralizeClose:
kv := c.addCollateralizeStatus(&collateralizelog)
kv := c.addCollateralizeStatus(&collateralizeLog)
set.KV = append(set.KV, kv...)
break
}
......
......@@ -13,31 +13,34 @@ import (
func (c *Collateralize) execLocal(tx *types.Transaction, receipt *types.ReceiptData) (*types.LocalDBSet, error) {
set := &types.LocalDBSet{}
for _, item := range receipt.Logs {
var collateralizelog pty.ReceiptCollateralize
err := types.Decode(item.Log, &collateralizelog)
var collateralizeLog pty.ReceiptCollateralize
err := types.Decode(item.Log, &collateralizeLog)
if err != nil {
return nil, err
}
switch item.Ty {
case pty.TyLogCollateralizeCreate:
kv := c.addCollateralizeStatus(&collateralizelog)
set.KV = append(set.KV, kv...)
set.KV = append(set.KV, c.addCollateralizeStatus(&collateralizeLog)...)
break
case pty.TyLogCollateralizeBorrow:
kv := c.addCollateralizeAddr(&collateralizelog)
set.KV = append(set.KV, kv...)
set.KV = append(set.KV, c.addCollateralizeRecordStatus(&collateralizeLog)...)
set.KV = append(set.KV, c.addCollateralizeAddr(&collateralizeLog)...)
break
case pty.TyLogCollateralizeAppend://append没有状态变化
case pty.TyLogCollateralizeAppend: //append没有状态变化
break
case pty.TyLogCollateralizeRepay:
kv := c.deleteCollateralizeAddr(&collateralizelog)
set.KV = append(set.KV, kv...)
set.KV = append(set.KV, c.addCollateralizeRecordStatus(&collateralizeLog)...)
set.KV = append(set.KV, c.deleteCollateralizeAddr(&collateralizeLog)...)
break
case pty.TyLogCollateralizeFeed:
set.KV = append(set.KV, c.addCollateralizeRecordStatus(&collateralizeLog)...)
if collateralizeLog.RecordStatus == pty.CollateralizeUserStatusSystemLiquidate {
set.KV = append(set.KV, c.deleteCollateralizeAddr(&collateralizeLog)...)
}
break
/*case pty.TyLogCollateralizeFeed:*/ // TODO
case pty.TyLogCollateralizeClose:
kv := c.deleteCollateralizeStatus(&collateralizelog)
set.KV = append(set.KV, kv...)
set.KV = append(set.KV, c.deleteCollateralizeStatus(&collateralizeLog)...)
break
}
}
......
......@@ -6,8 +6,13 @@ package executor
import "fmt"
func calcCollateralizeKey(CollateralizeID string) []byte {
key := fmt.Sprintf("LODB-Collateralize-ID:%s", CollateralizeID)
func calcCollateralizeKey(collateralizeID string, index int64) []byte {
key := fmt.Sprintf("LODB-Collateralize-ID:%s:%018d", collateralizeID, index)
return []byte(key)
}
func calcCollateralizePrefix() []byte {
key := fmt.Sprintf("LODB-Collateralize-ID:")
return []byte(key)
}
......@@ -40,3 +45,13 @@ func calcCollateralizeLatestPriceKey() []byte {
key := fmt.Sprintf("LODB-Collateralize-latest-price")
return []byte(key)
}
func calcCollateralizeRecordStatusPrefix(status int32) []byte {
key := fmt.Sprintf("LODB-Collateralize-record-status:%d", status)
return []byte(key)
}
func calcCollateralizeRecordStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-Collateralize-record-status:%d:%018d", status, index)
return []byte(key)
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ syntax = "proto3";
package types;
// 借贷信息
message Collateralize {
string collateralizeId = 1; //借贷ID,一期借贷对应一个ID
int64 totalBalance = 2; //当期可借贷的总金额(ccny)
......@@ -12,12 +13,12 @@ message Collateralize {
string createAddr = 7; //创建人地址
int64 balance = 8; //剩余可借贷金额(ccny)
repeated BorrowRecord borrowRecords = 9; //借贷记录
repeated BorrowRecord badRecords = 10;//被系统清算的借贷
int32 status = 11;//当期借贷的状态,是否关闭
int32 collType = 12;//质押资产类型(1,bty,2,btc,3,eth...)
float latestRepayPrice = 13;//最大清算价格
int32 status = 10;//当期借贷的状态,是否关闭
int32 collType = 11;//质押资产类型(1,bty,2,btc,3,eth...)
float latestLiquidationPrice = 12;//最大清算价格
}
// 借出记录
message BorrowRecord {
string accountAddr = 1; //借贷人地址
int64 startTime = 2; //借贷时间
......@@ -26,16 +27,19 @@ message BorrowRecord {
int64 debtValue = 5; //债务价值(ccny)
float liquidationPrice = 6; //抵押物清算价格
int32 status = 7; //抵押状态,是否被清算
int64 liquidateTime = 8; //清算时间
}
// 资产价格记录
message AssetPriceRecord {
string recordTime = 1; //价格记录时间
int64 recordTime = 1; //价格记录时间
float btyPrice = 2; //bty价格
float btcPrice = 3; //btc价格
float ethPrice = 4; //eth价格
string preRecordTime = 5; //上一次记录时间
int64 preRecordTime = 5; //上一次记录时间
}
// action
message CollateralizeAction {
oneof value {
CollateralizeCreate create = 1; //创建一期借贷
......@@ -48,6 +52,7 @@ message CollateralizeAction {
int32 ty = 10;
}
// 创建借贷
message CollateralizeCreate {
int64 debtCeiling = 1; //单用户可借出的限额(ccny)
float liquidationRatio = 2; //清算比例
......@@ -56,37 +61,45 @@ message CollateralizeCreate {
int64 totalBalance = 5; //可借贷总金额
}
// 质押借出
message CollateralizeBorrow {
string collateralizeId = 1; //借贷期数ID
int64 value = 2; //借贷价值(ccny)
}
// 质押清算
message CollateralizeRepay {
string collateralizeId = 1; //借贷期数ID
int64 value = 2; //借贷价值(ccny)
}
// 追加抵押物
message CollateralizeAppend {
string collateralizeId = 1; //借贷期数ID
int64 collateralValue = 2; //追加价值(bty)
}
// 喂价
message CollateralizeFeed {
repeated int64 price = 1; //喂价
repeated int64 volume = 2; //成交量
int32 collType = 1; //抵押物价格类型(1,bty,2,btc,3,eth...)
repeated float price = 2; //喂价
repeated int64 volume = 3; //成交量
}
// 喂价关闭
message CollateralizeClose {
string collateralizeId = 1; //借贷期数ID
}
// exec_local记录信息
message ReceiptCollateralize {
string collateralizeId = 1;
string createAddr = 3;
string accountAddr = 4;
int32 status = 5;
int32 preStatus = 6;
int64 index = 7;
string createAddr = 2;
string accountAddr = 3;
int32 status = 4;
int32 preStatus = 5;
int64 index = 6;
int32 recordStatus = 7;
}
message ReqCollateralizeInfo {
......@@ -128,7 +141,8 @@ message ReplyCollateralizeBadDebt {
// used for execlocal
message CollateralizeRecord {
string collateralizeId = 1;
int64 index = 3;
string addr = 2;
int64 index = 3;
}
message CollateralizeRecords {
......
......@@ -12,7 +12,7 @@ var (
ErrCollateralizeRepeatHash = errors.New("ErrCollateralizeRepeatHash")
ErrCollateralizeStatus = errors.New("ErrCollateralizeStatus")
ErrCollateralizeExceedDebtCeiling = errors.New("ErrCollateralizeExceedDebtCeiling")
ErrPriceZero = errors.New("ErrPriceZero")
ErrPriceInvalid = errors.New("ErrPriceInvalid")
ErrAssetType = errors.New("ErrAssetType")
ErrRecordNotExist = errors.New("ErrRecordNotExist")
ErrCollateralizeErrCloser = errors.New("ErrCollateralizeErrCloser")
......@@ -20,4 +20,6 @@ var (
ErrCollateralizeAccountExist = errors.New("ErrCollateralizeAccountExist")
ErrCollateralizeLowBalance = errors.New("ErrCollateralizeLowBalance")
ErrCollateralizeBalanceInvalid = errors.New("ErrCollateralizeBalanceInvalid")
ErrPriceFeedPermissionDeny = errors.New("ErrPriceFeedPermissionDeny")
ErrCollateralizeRecordNotEmpty = errors.New("ErrCollateralizeRecordNotEmpty")
)
......@@ -14,19 +14,19 @@ const (
CollateralizeActionClose
//log for Collateralize
TyLogCollateralizeCreate = 801
TyLogCollateralizeBorrow = 802
TyLogCollateralizeRepay = 803
TyLogCollateralizeAppend = 804
TyLogCollateralizeFeed = 805
TyLogCollateralizeClose = 806
TyLogCollateralizeCreate = 731
TyLogCollateralizeBorrow = 732
TyLogCollateralizeRepay = 733
TyLogCollateralizeAppend = 734
TyLogCollateralizeFeed = 735
TyLogCollateralizeClose = 736
)
// Collateralize name
const (
CollateralizeX = "collateralize"
CCNYTokenName = "ccny"
CollateralizeRepayRatio = 1.1 //TODO 清算比例,抵押物价值跌到借出ccny价值110%的时候开始清算
CollateralizePreLiquidationRatio = 1.1 //TODO 预清算比例,抵押物价值跌到借出ccny价值110%的时候开始清算
)
//Collateralize status
......@@ -44,6 +44,6 @@ const (
const (
CollateralizeUserStatusCreate = 1 + iota
CollateralizeUserStatusWarning
CollateralizeUserStatusSystemRepayed
CollateralizeUserStatusSystemLiquidate
CollateralizeUserStatusClose
)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment