Commit 6cd7e2b2 authored by pengjun's avatar pengjun

#627 add price feed & system liquidation

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