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
...@@ -16,10 +16,10 @@ import ( ...@@ -16,10 +16,10 @@ import (
// List control // List control
const ( const (
ListDESC = int32(0) ListDESC = int32(0) // list降序
ListASC = int32(1) ListASC = int32(1) // list升序
DefultCount = int32(20) //默认一次取多少条记录 DefultCount = int32(20) // 默认一次取多少条记录
MaxCount = int32(100) //最多取100条 MaxCount = int32(100) // 最多取100条
) )
const ( const (
...@@ -29,6 +29,7 @@ const ( ...@@ -29,6 +29,7 @@ const (
MaxStabilityFee = 1000 // 最大稳定费 MaxStabilityFee = 1000 // 最大稳定费
MaxLiquidationPenalty = 1000 // 最大清算罚金 MaxLiquidationPenalty = 1000 // 最大清算罚金
MinCreatorAccount = 1000000 // 借贷创建者账户最小ccny余额 MinCreatorAccount = 1000000 // 借贷创建者账户最小ccny余额
PriceWarningRate = 1.3
) )
// CollateralizeDB def // CollateralizeDB def
...@@ -63,6 +64,7 @@ type Action struct { ...@@ -63,6 +64,7 @@ type Action struct {
coinsAccount *account.DB // bty账户 coinsAccount *account.DB // bty账户
tokenAccount *account.DB // ccny账户 tokenAccount *account.DB // ccny账户
db dbm.KV db dbm.KV
localDB dbm.Lister
txhash []byte txhash []byte
fromaddr string fromaddr string
blocktime int64 blocktime int64
...@@ -84,10 +86,9 @@ func NewCollateralizeAction(c *Collateralize, tx *types.Transaction, index int) ...@@ -84,10 +86,9 @@ func NewCollateralizeAction(c *Collateralize, tx *types.Transaction, index int)
} }
return &Action{ return &Action{
coinsAccount: c.GetCoinsAccount(), tokenAccount:tokenDb, db: c.GetStateDB(), coinsAccount: c.GetCoinsAccount(), tokenAccount:tokenDb, db: c.GetStateDB(), localDB:c.GetLocalDB(),
txhash: hash, fromaddr: fromaddr, blocktime: c.GetBlockTime(), txhash: hash, fromaddr: fromaddr, blocktime: c.GetBlockTime(), height: c.GetHeight(),
height: c.GetHeight(), execaddr: dapp.ExecAddress(string(tx.Execer)), execaddr: dapp.ExecAddress(string(tx.Execer)), difficulty: c.GetDifficulty(), index: index, Collateralize: c}
difficulty: c.GetDifficulty(), index: index, Collateralize: c}
} }
// GetCollCommonRecipt generate logs for Collateralize common action // GetCollCommonRecipt generate logs for Collateralize common action
...@@ -96,6 +97,7 @@ func (action *Action) GetCollCommonRecipt(collateralize *pty.Collateralize, preS ...@@ -96,6 +97,7 @@ func (action *Action) GetCollCommonRecipt(collateralize *pty.Collateralize, preS
c.CollateralizeId = collateralize.CollateralizeId c.CollateralizeId = collateralize.CollateralizeId
c.PreStatus = preStatus c.PreStatus = preStatus
c.Status = collateralize.Status c.Status = collateralize.Status
c.Index = action.GetIndex()
return c return c
} }
...@@ -126,11 +128,11 @@ func (action *Action) GetBorrowReceiptLog(collateralize *pty.Collateralize, preS ...@@ -126,11 +128,11 @@ func (action *Action) GetBorrowReceiptLog(collateralize *pty.Collateralize, preS
} }
// GetRepayReceiptLog generate logs for Collateralize Repay action // GetRepayReceiptLog generate logs for Collateralize Repay action
func (action *Action) GetRepayReceiptLog(Collateralize *pty.Collateralize, preStatus int32) *types.ReceiptLog { func (action *Action) GetRepayReceiptLog(collateralize *pty.Collateralize, preStatus int32) *types.ReceiptLog {
log := &types.ReceiptLog{} log := &types.ReceiptLog{}
log.Ty = pty.TyLogCollateralizeRepay log.Ty = pty.TyLogCollateralizeRepay
c := action.GetCollCommonRecipt(Collateralize, preStatus) c := action.GetCollCommonRecipt(collateralize, preStatus)
log.Log = types.Encode(c) log.Log = types.Encode(c)
...@@ -138,11 +140,25 @@ func (action *Action) GetRepayReceiptLog(Collateralize *pty.Collateralize, preSt ...@@ -138,11 +140,25 @@ func (action *Action) GetRepayReceiptLog(Collateralize *pty.Collateralize, preSt
} }
// GetAppendReceiptLog generate logs for Collateralize append action // GetAppendReceiptLog generate logs for Collateralize append action
func (action *Action) GetAppendReceiptLog(Collateralize *pty.Collateralize, preStatus int32) *types.ReceiptLog { func (action *Action) GetAppendReceiptLog(collateralize *pty.Collateralize, preStatus int32) *types.ReceiptLog {
log := &types.ReceiptLog{} log := &types.ReceiptLog{}
log.Ty = pty.TyLogCollateralizeAppend log.Ty = pty.TyLogCollateralizeAppend
c := action.GetCollCommonRecipt(Collateralize, preStatus) c := action.GetCollCommonRecipt(collateralize, preStatus)
log.Log = types.Encode(c)
return log
}
// GetFeedReceiptLog generate logs for Collateralize price feed action
func (action *Action) GetFeedReceiptLog(collateralize *pty.Collateralize, borrowRecord *pty.BorrowRecord, preStatus int32) *types.ReceiptLog {
log := &types.ReceiptLog{}
log.Ty = pty.TyLogCollateralizeFeed
c := action.GetCollCommonRecipt(collateralize, preStatus)
c.AccountAddr = borrowRecord.AccountAddr
c.RecordStatus = borrowRecord.Status
log.Log = types.Encode(c) log.Log = types.Encode(c)
...@@ -166,6 +182,17 @@ func (action *Action) GetIndex() int64 { ...@@ -166,6 +182,17 @@ func (action *Action) GetIndex() int64 {
return action.height*types.MaxTxsPerBlock + int64(action.index) return action.height*types.MaxTxsPerBlock + int64(action.index)
} }
func getLatestLiquidationPrice(coll *pty.Collateralize) float32 {
var latest float32
for _, collRecord := range coll.BorrowRecords {
if collRecord.LiquidationPrice > latest {
latest = collRecord.LiquidationPrice
}
}
return latest
}
// CollateralizeCreate 创建借贷,持有一定数量ccny的用户可创建借贷,提供给其他用户借贷 // CollateralizeCreate 创建借贷,持有一定数量ccny的用户可创建借贷,提供给其他用户借贷
func (action *Action) CollateralizeCreate(create *pty.CollateralizeCreate) (*types.Receipt, error) { func (action *Action) CollateralizeCreate(create *pty.CollateralizeCreate) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
...@@ -189,7 +216,7 @@ func (action *Action) CollateralizeCreate(create *pty.CollateralizeCreate) (*typ ...@@ -189,7 +216,7 @@ func (action *Action) CollateralizeCreate(create *pty.CollateralizeCreate) (*typ
} }
// 查找ID是否重复 // 查找ID是否重复
_, err := findCollateralize(action.db, collateralizeID) _, err := queryCollateralizeByID(action.db, collateralizeID)
if err != types.ErrNotFound { if err != types.ErrNotFound {
clog.Error("CollateralizeCreate", "CollateralizeCreate repeated", collateralizeID) clog.Error("CollateralizeCreate", "CollateralizeCreate repeated", collateralizeID)
return nil, pty.ErrCollateralizeRepeatHash return nil, pty.ErrCollateralizeRepeatHash
...@@ -233,7 +260,7 @@ func (action *Action) CollateralizeCreate(create *pty.CollateralizeCreate) (*typ ...@@ -233,7 +260,7 @@ func (action *Action) CollateralizeCreate(create *pty.CollateralizeCreate) (*typ
func getBtyNumToFrozen(value int64, price float32, ratio float32) (int64,error) { func getBtyNumToFrozen(value int64, price float32, ratio float32) (int64,error) {
if price == 0 { if price == 0 {
clog.Error("Bty price should greate to 0") clog.Error("Bty price should greate to 0")
return 0, pty.ErrPriceZero return 0, pty.ErrPriceInvalid
} }
btyValue := float32(value)/ratio btyValue := float32(value)/ratio
...@@ -244,11 +271,11 @@ func getBtyNumToFrozen(value int64, price float32, ratio float32) (int64,error) ...@@ -244,11 +271,11 @@ func getBtyNumToFrozen(value int64, price float32, ratio float32) (int64,error)
// 计算清算价格 // 计算清算价格
// value:借出ccny数量, colValue:抵押物数量, price:抵押物价格 // value:借出ccny数量, colValue:抵押物数量, price:抵押物价格
func calcRepayPrice(value int64, colValue int64) float32 { func calcLiquidationPrice(value int64, colValue int64) float32 {
liquidationRation := float32(value) / float32(colValue) liquidationRation := float32(value) / float32(colValue)
repayPrice := liquidationRation * pty.CollateralizeRepayRatio liquidationPrice := liquidationRation * pty.CollateralizePreLiquidationRatio
return repayPrice return liquidationPrice
} }
// 获取最近抵押物价格 // 获取最近抵押物价格
...@@ -299,7 +326,6 @@ func (action *Action) CheckExecTokenAccount(addr string, amount int64, isFrozen ...@@ -299,7 +326,6 @@ func (action *Action) CheckExecTokenAccount(addr string, amount int64, isFrozen
return true return true
} }
} }
return false return false
} }
...@@ -310,7 +336,7 @@ func (action *Action) CollateralizeBorrow(borrow *pty.CollateralizeBorrow) (*typ ...@@ -310,7 +336,7 @@ func (action *Action) CollateralizeBorrow(borrow *pty.CollateralizeBorrow) (*typ
var kv []*types.KeyValue var kv []*types.KeyValue
// 查找对应的借贷ID // 查找对应的借贷ID
collateralize, err := findCollateralize(action.db, borrow.CollateralizeId) collateralize, err := queryCollateralizeByID(action.db, borrow.CollateralizeId)
if err != nil { if err != nil {
clog.Error("CollateralizeBorrow", "CollateralizeId", borrow.CollateralizeId, "err", err) clog.Error("CollateralizeBorrow", "CollateralizeId", borrow.CollateralizeId, "err", err)
return nil, err return nil, err
...@@ -405,12 +431,12 @@ func (action *Action) CollateralizeBorrow(borrow *pty.CollateralizeBorrow) (*typ ...@@ -405,12 +431,12 @@ func (action *Action) CollateralizeBorrow(borrow *pty.CollateralizeBorrow) (*typ
borrowRecord.StartTime = action.blocktime borrowRecord.StartTime = action.blocktime
borrowRecord.CollateralPrice = lastPrice borrowRecord.CollateralPrice = lastPrice
borrowRecord.DebtValue = borrow.Value borrowRecord.DebtValue = borrow.Value
borrowRecord.LiquidationPrice = coll.LiquidationRatio * lastPrice * pty.CollateralizeRepayRatio borrowRecord.LiquidationPrice = coll.LiquidationRatio * lastPrice * pty.CollateralizePreLiquidationRatio
borrowRecord.Status = pty.CollateralizeUserStatusCreate borrowRecord.Status = pty.CollateralizeUserStatusCreate
// 记录当前借贷的最高自动清算价格 // 记录当前借贷的最高自动清算价格
if coll.LatestRepayPrice < borrowRecord.LiquidationPrice { if coll.LatestLiquidationPrice < borrowRecord.LiquidationPrice {
coll.LatestRepayPrice = borrowRecord.LiquidationPrice coll.LatestLiquidationPrice = borrowRecord.LiquidationPrice
} }
// 保存 // 保存
...@@ -434,7 +460,7 @@ func (action *Action) CollateralizeRepay(repay *pty.CollateralizeRepay) (*types. ...@@ -434,7 +460,7 @@ func (action *Action) CollateralizeRepay(repay *pty.CollateralizeRepay) (*types.
var receipt *types.Receipt var receipt *types.Receipt
// 找到相应的借贷 // 找到相应的借贷
collateralize, err := findCollateralize(action.db, repay.CollateralizeId) collateralize, err := queryCollateralizeByID(action.db, repay.CollateralizeId)
if err != nil { if err != nil {
clog.Error("CollateralizeRepay", "CollID", repay.CollateralizeId, "err", err) clog.Error("CollateralizeRepay", "CollID", repay.CollateralizeId, "err", err)
return nil, err return nil, err
...@@ -501,6 +527,7 @@ func (action *Action) CollateralizeRepay(repay *pty.CollateralizeRepay) (*types. ...@@ -501,6 +527,7 @@ func (action *Action) CollateralizeRepay(repay *pty.CollateralizeRepay) (*types.
// 保存 // 保存
coll.Balance += repay.Value coll.Balance += repay.Value
coll.LatestLiquidationPrice = getLatestLiquidationPrice(&coll.Collateralize)
coll.Save(action.db) coll.Save(action.db)
kv = append(kv, coll.GetKVSet()...) kv = append(kv, coll.GetKVSet()...)
...@@ -517,7 +544,7 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty ...@@ -517,7 +544,7 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty
var kv []*types.KeyValue var kv []*types.KeyValue
// 查找对应的借贷ID // 查找对应的借贷ID
collateralize, err := findCollateralize(action.db, cAppend.CollateralizeId) collateralize, err := queryCollateralizeByID(action.db, cAppend.CollateralizeId)
if err != nil { if err != nil {
clog.Error("CollateralizeAppend", "CollateralizeId", cAppend.CollateralizeId, "err", err) clog.Error("CollateralizeAppend", "CollateralizeId", cAppend.CollateralizeId, "err", err)
return nil, err return nil, err
...@@ -563,7 +590,7 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty ...@@ -563,7 +590,7 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty
// 抵押物转账 // 抵押物转账
receipt, err := action.coinsAccount.ExecTransfer(action.fromaddr, coll.CreateAddr, action.execaddr, cAppend.CollateralValue*decimal) receipt, err := action.coinsAccount.ExecTransfer(action.fromaddr, coll.CreateAddr, action.execaddr, cAppend.CollateralValue*decimal)
if err != nil { if err != nil {
clog.Error("CollateralizeBorrow.ExecTransfer", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", cAppend.CollateralValue) clog.Error("CollateralizeBorrow.ExecTransfer", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", cAppend.CollateralValue, "err", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -572,7 +599,7 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty ...@@ -572,7 +599,7 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty
// 抵押物冻结 // 抵押物冻结
receipt, err = action.coinsAccount.ExecFrozen(coll.CreateAddr, action.execaddr, cAppend.CollateralValue) receipt, err = action.coinsAccount.ExecFrozen(coll.CreateAddr, action.execaddr, cAppend.CollateralValue)
if err != nil { if err != nil {
clog.Error("CollateralizeBorrow.Frozen", "addr", coll.CreateAddr, "execaddr", action.execaddr, "amount", cAppend.CollateralValue) clog.Error("CollateralizeBorrow.Frozen", "addr", coll.CreateAddr, "execaddr", action.execaddr, "amount", cAppend.CollateralValue, "err", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -581,17 +608,12 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty ...@@ -581,17 +608,12 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty
// 构造借出记录 // 构造借出记录
borrowRecord.CollateralValue += cAppend.CollateralValue borrowRecord.CollateralValue += cAppend.CollateralValue
borrowRecord.CollateralPrice = lastPrice borrowRecord.CollateralPrice = lastPrice
borrowRecord.LiquidationPrice = calcRepayPrice(borrowRecord.DebtValue, borrowRecord.CollateralValue) borrowRecord.LiquidationPrice = calcLiquidationPrice(borrowRecord.DebtValue, borrowRecord.CollateralValue)
// 记录当前借贷的最高自动清算价格 // 记录当前借贷的最高自动清算价格
if coll.LatestRepayPrice < borrowRecord.LiquidationPrice { coll.LatestLiquidationPrice = getLatestLiquidationPrice(&coll.Collateralize)
coll.LatestRepayPrice = borrowRecord.LiquidationPrice
}
// 保存
coll.BorrowRecords = append(coll.BorrowRecords, borrowRecord)
coll.Status = pty.CollateralizeStatusCreated
coll.Save(action.db) coll.Save(action.db)
kv = append(kv, coll.GetKVSet()...) kv = append(kv, coll.GetKVSet()...)
receiptLog := action.GetAppendReceiptLog(&coll.Collateralize, preStatus) receiptLog := action.GetAppendReceiptLog(&coll.Collateralize, preStatus)
...@@ -601,27 +623,221 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty ...@@ -601,27 +623,221 @@ func (action *Action) CollateralizeAppend(cAppend *pty.CollateralizeAppend) (*ty
return receipt, nil return receipt, nil
} }
func getManageKey(key string, db dbm.KV) ([]byte, error) {
manageKey := types.ManageKey(key)
value, err := db.Get([]byte(manageKey))
if err != nil {
return nil, err
}
return value, nil
}
const (
priceFeedKey = "collateralize-price-feed"
guarantorKey = "collateralize-guarantor"
)
func isRightPriceFeed(addr string, db dbm.KV) bool {
value, err := getManageKey(priceFeedKey, db)
if err != nil {
clog.Error("CollateralizePriceFeed", "priceFeedKey", priceFeedKey)
return false
}
if value == nil {
clog.Error("CollateralizePriceFeed priceFeedKey found nil value")
return false
}
var item types.ConfigItem
err = types.Decode(value, &item)
if err != nil {
clog.Error("CollateralizePriceFeed", "Decode", value)
return false
}
for _, op := range item.GetArr().Value {
if op == addr {
return true
}
}
return false
}
func getGuarantorAddr(db dbm.KV) (string, error) {
value, err := getManageKey(guarantorKey, db)
if err != nil {
clog.Error("CollateralizePriceFeed", "getGuarantorAddr", err)
return "", err
}
if value == nil {
clog.Error("CollateralizePriceFeed guarantorKey found nil value")
return "", err
}
var item types.ConfigItem
err = types.Decode(value, &item)
if err != nil {
clog.Error("CollateralizePriceFeed", "getGuarantorAddr", err)
return "", err
}
return item.GetAddr(), nil
}
// 系统清算
func (action *Action) systemLiquidation(coll *pty.Collateralize, price float32) (*types.Receipt, error) {
var logs []*types.ReceiptLog
var kv []*types.KeyValue
collDB := &CollateralizeDB{*coll}
for _, borrowRecord := range coll.BorrowRecords {
var preStatus int32
if borrowRecord.LiquidationPrice * PriceWarningRate >= price {
if borrowRecord.LiquidationPrice >= price {
getGuarantorAddr, err := getGuarantorAddr(action.db)
if err != nil {
if err != nil {
clog.Error("systemLiquidation", "getGuarantorAddr", err)
continue
}
}
// 抵押物转移
receipt, err := action.coinsAccount.ExecTransferFrozen(action.fromaddr, getGuarantorAddr, action.execaddr, borrowRecord.CollateralValue)
if err != nil {
clog.Error("systemLiquidation", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", borrowRecord.CollateralValue, "err", err)
continue
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
// 借贷记录清算
borrowRecord.LiquidateTime = action.blocktime
preStatus = borrowRecord.Status
borrowRecord.Status = pty.CollateralizeUserStatusSystemLiquidate
} else {
preStatus = borrowRecord.Status
borrowRecord.Status = pty.CollateralizeUserStatusWarning
}
log := action.GetFeedReceiptLog(coll, borrowRecord, preStatus)
logs = append(logs, log)
}
}
// 保存
coll.LatestLiquidationPrice = getLatestLiquidationPrice(coll)
collDB.Save(action.db)
kv = append(kv, collDB.GetKVSet()...)
receipt := &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil
}
// 价格计算策略
func pricePolicy(feed *pty.CollateralizeFeed) float32 {
var totalPrice float32
var totalVolume int64
for _, volume := range feed.Volume {
totalVolume += volume
}
for i, price := range feed.Price {
totalPrice += price * float32(float64(feed.Volume[i])/float64(totalVolume))
}
return totalPrice
}
// CollateralizeFeed 喂价 // CollateralizeFeed 喂价
func (action *Action) CollateralizeFeed(repay *pty.CollateralizeFeed) (*types.Receipt, error) { func (action *Action) CollateralizeFeed(feed *pty.CollateralizeFeed) (*types.Receipt, error) {
//TODO var logs []*types.ReceiptLog
return nil, nil var kv []*types.KeyValue
if feed == nil || len(feed.Price) == 0 || len(feed.Price) != len(feed.Volume) {
clog.Error("CollateralizePriceFeed", types.ErrInvalidParam)
return nil, types.ErrInvalidParam
}
if !isRightPriceFeed(action.fromaddr, action.db) {
clog.Error("CollateralizePriceFeed", "addr", action.fromaddr, "error", "Address has no permission to feed price")
return nil, pty.ErrPriceFeedPermissionDeny
}
price := pricePolicy(feed)
if price == 0 || price == -1 {
clog.Error("CollateralizePriceFeed", "price", price, "err", pty.ErrPriceInvalid)
return nil, pty.ErrPriceInvalid
}
collIDRecords, err := queryCollateralizes(action.localDB)
if err != nil {
clog.Error("CollateralizePriceFeed", "get collateralize record error", err)
return nil, err
}
for _, collID := range collIDRecords {
coll, err := queryCollateralizeByID(action.db, collID.CollateralizeId)
if err != nil {
clog.Error("CollateralizePriceFeed", "Collateralize ID", coll.CollateralizeId, "get collateralize record by id error", err)
continue
}
if coll.LatestLiquidationPrice >= price {
receipt, err := action.systemLiquidation(coll, price)
if err != nil {
clog.Error("CollateralizePriceFeed", "Collateralize ID", coll.CollateralizeId, "system liquidation error", err)
continue
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
}
var priceRecord pty.AssetPriceRecord
if feed.CollType == pty.CollateralizeAssetTypeBty {
priceRecord.BtyPrice = price
} else if feed.CollType == pty.CollateralizeAssetTypeBtc {
priceRecord.BtcPrice = price
} else if feed.CollType == pty.CollateralizeAssetTypeEth {
priceRecord.EthPrice = price
} else {
priceRecord.BtyPrice = price
}
priceRecord.PreRecordTime = priceRecord.RecordTime
priceRecord.RecordTime = action.blocktime
// 喂价记录
pricekv := &types.KeyValue{Key: calcCollateralizePriceKey(string(action.blocktime)), Value: types.Encode(&priceRecord)}
action.db.Set(pricekv.Key, pricekv.Value)
kv = append(kv, pricekv)
// 最近喂价记录
pricekv = &types.KeyValue{Key: calcCollateralizeLatestPriceKey(), Value: types.Encode(&priceRecord)}
action.db.Set(pricekv.Key, pricekv.Value)
kv = append(kv, pricekv)
receipt := &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil
} }
// CollateralizeClose 终止借贷 // CollateralizeClose 终止借贷
//TODO 暂时只实现无人借贷可终止
func (action *Action) CollateralizeClose(close *pty.CollateralizeClose) (*types.Receipt, error) { func (action *Action) CollateralizeClose(close *pty.CollateralizeClose) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
collateralize, err := findCollateralize(action.db, close.CollateralizeId) collateralize, err := queryCollateralizeByID(action.db, close.CollateralizeId)
if err != nil { if err != nil {
clog.Error("CollateralizeClose", "CollateralizeId", close.CollateralizeId, "err", err) clog.Error("CollateralizeClose", "CollateralizeId", close.CollateralizeId, "err", err)
return nil, err return nil, err
} }
if collateralize.Balance != collateralize.TotalBalance { for _, borrowRecord := range collateralize.BorrowRecords {
clog.Error("CollateralizeClose", "CollateralizeId", close.CollateralizeId, "addr", action.fromaddr, "execaddr", action.execaddr, "err", pty.ErrCollateralizeBalanceInvalid) if borrowRecord.Status != pty.CollateralizeUserStatusClose {
return nil, pty.ErrCollateralizeBalanceInvalid clog.Error("CollateralizeClose", "CollateralizeId", close.CollateralizeId, "addr", action.fromaddr, "execaddr", action.execaddr, "err", pty.ErrCollateralizeRecordNotEmpty)
return nil, pty.ErrCollateralizeRecordNotEmpty
}
} }
clog.Debug("CollateralizeClose", "ID", close.CollateralizeId) clog.Debug("CollateralizeClose", "ID", close.CollateralizeId)
...@@ -639,18 +855,39 @@ func (action *Action) CollateralizeClose(close *pty.CollateralizeClose) (*types. ...@@ -639,18 +855,39 @@ func (action *Action) CollateralizeClose(close *pty.CollateralizeClose) (*types.
} }
// 查找借贷 // 查找借贷
func findCollateralize(db dbm.KV, CollateralizeID string) (*pty.Collateralize, error) { func queryCollateralizeByID(db dbm.KV, CollateralizeID string) (*pty.Collateralize, error) {
data, err := db.Get(Key(CollateralizeID)) data, err := db.Get(Key(CollateralizeID))
if err != nil { if err != nil {
clog.Debug("findCollateralize", "get", err) clog.Debug("queryCollateralizeByID", "error", err)
return nil, err return nil, err
} }
var coll pty.Collateralize var coll pty.Collateralize
//decode
err = types.Decode(data, &coll) err = types.Decode(data, &coll)
if err != nil { if err != nil {
clog.Debug("findCollateralize", "decode", err) clog.Debug("queryCollateralizeByID", "decode", err)
return nil, err return nil, err
} }
return &coll, nil return &coll, nil
} }
func queryCollateralizes(localdb dbm.Lister) ([]*pty.CollateralizeRecord, error) {
data, err := localdb.List(calcCollateralizePrefix(), nil, DefultCount, ListDESC)
if err != nil {
clog.Debug("queryCollateralizes", "error", err)
return nil, err
}
var colls []*pty.CollateralizeRecord
var coll pty.CollateralizeRecord
for _, collBytes := range data {
err = types.Decode(collBytes, &coll)
if err != nil {
clog.Debug("queryCollateralizeByID", "decode", err)
return nil, err
}
colls = append(colls, &coll)
}
return colls, nil
}
\ 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 {
......
...@@ -20,23 +20,23 @@ var _ = math.Inf ...@@ -20,23 +20,23 @@ var _ = math.Inf
// proto package needs to be updated. // proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// 借贷信息
type Collateralize struct { type Collateralize struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
TotalBalance int64 `protobuf:"varint,2,opt,name=totalBalance,proto3" json:"totalBalance,omitempty"` TotalBalance int64 `protobuf:"varint,2,opt,name=totalBalance,proto3" json:"totalBalance,omitempty"`
DebtCeiling int64 `protobuf:"varint,3,opt,name=debtCeiling,proto3" json:"debtCeiling,omitempty"` DebtCeiling int64 `protobuf:"varint,3,opt,name=debtCeiling,proto3" json:"debtCeiling,omitempty"`
LiquidationRatio float32 `protobuf:"fixed32,4,opt,name=liquidationRatio,proto3" json:"liquidationRatio,omitempty"` LiquidationRatio float32 `protobuf:"fixed32,4,opt,name=liquidationRatio,proto3" json:"liquidationRatio,omitempty"`
StabilityFee int64 `protobuf:"varint,5,opt,name=stabilityFee,proto3" json:"stabilityFee,omitempty"` StabilityFee int64 `protobuf:"varint,5,opt,name=stabilityFee,proto3" json:"stabilityFee,omitempty"`
LiquidationPenalty int64 `protobuf:"varint,6,opt,name=liquidationPenalty,proto3" json:"liquidationPenalty,omitempty"` LiquidationPenalty int64 `protobuf:"varint,6,opt,name=liquidationPenalty,proto3" json:"liquidationPenalty,omitempty"`
CreateAddr string `protobuf:"bytes,7,opt,name=createAddr,proto3" json:"createAddr,omitempty"` CreateAddr string `protobuf:"bytes,7,opt,name=createAddr,proto3" json:"createAddr,omitempty"`
Balance int64 `protobuf:"varint,8,opt,name=balance,proto3" json:"balance,omitempty"` Balance int64 `protobuf:"varint,8,opt,name=balance,proto3" json:"balance,omitempty"`
BorrowRecords []*BorrowRecord `protobuf:"bytes,9,rep,name=borrowRecords,proto3" json:"borrowRecords,omitempty"` BorrowRecords []*BorrowRecord `protobuf:"bytes,9,rep,name=borrowRecords,proto3" json:"borrowRecords,omitempty"`
BadRecords []*BorrowRecord `protobuf:"bytes,10,rep,name=badRecords,proto3" json:"badRecords,omitempty"` Status int32 `protobuf:"varint,10,opt,name=status,proto3" json:"status,omitempty"`
Status int32 `protobuf:"varint,11,opt,name=status,proto3" json:"status,omitempty"` CollType int32 `protobuf:"varint,11,opt,name=collType,proto3" json:"collType,omitempty"`
CollType int32 `protobuf:"varint,12,opt,name=collType,proto3" json:"collType,omitempty"` LatestLiquidationPrice float32 `protobuf:"fixed32,12,opt,name=latestLiquidationPrice,proto3" json:"latestLiquidationPrice,omitempty"`
LatestRepayPrice float32 `protobuf:"fixed32,13,opt,name=latestRepayPrice,proto3" json:"latestRepayPrice,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *Collateralize) Reset() { *m = Collateralize{} } func (m *Collateralize) Reset() { *m = Collateralize{} }
...@@ -127,13 +127,6 @@ func (m *Collateralize) GetBorrowRecords() []*BorrowRecord { ...@@ -127,13 +127,6 @@ func (m *Collateralize) GetBorrowRecords() []*BorrowRecord {
return nil return nil
} }
func (m *Collateralize) GetBadRecords() []*BorrowRecord {
if m != nil {
return m.BadRecords
}
return nil
}
func (m *Collateralize) GetStatus() int32 { func (m *Collateralize) GetStatus() int32 {
if m != nil { if m != nil {
return m.Status return m.Status
...@@ -148,13 +141,14 @@ func (m *Collateralize) GetCollType() int32 { ...@@ -148,13 +141,14 @@ func (m *Collateralize) GetCollType() int32 {
return 0 return 0
} }
func (m *Collateralize) GetLatestRepayPrice() float32 { func (m *Collateralize) GetLatestLiquidationPrice() float32 {
if m != nil { if m != nil {
return m.LatestRepayPrice return m.LatestLiquidationPrice
} }
return 0 return 0
} }
// 借出记录
type BorrowRecord struct { type BorrowRecord struct {
AccountAddr string `protobuf:"bytes,1,opt,name=accountAddr,proto3" json:"accountAddr,omitempty"` AccountAddr string `protobuf:"bytes,1,opt,name=accountAddr,proto3" json:"accountAddr,omitempty"`
StartTime int64 `protobuf:"varint,2,opt,name=startTime,proto3" json:"startTime,omitempty"` StartTime int64 `protobuf:"varint,2,opt,name=startTime,proto3" json:"startTime,omitempty"`
...@@ -163,6 +157,7 @@ type BorrowRecord struct { ...@@ -163,6 +157,7 @@ type BorrowRecord struct {
DebtValue int64 `protobuf:"varint,5,opt,name=debtValue,proto3" json:"debtValue,omitempty"` DebtValue int64 `protobuf:"varint,5,opt,name=debtValue,proto3" json:"debtValue,omitempty"`
LiquidationPrice float32 `protobuf:"fixed32,6,opt,name=liquidationPrice,proto3" json:"liquidationPrice,omitempty"` LiquidationPrice float32 `protobuf:"fixed32,6,opt,name=liquidationPrice,proto3" json:"liquidationPrice,omitempty"`
Status int32 `protobuf:"varint,7,opt,name=status,proto3" json:"status,omitempty"` Status int32 `protobuf:"varint,7,opt,name=status,proto3" json:"status,omitempty"`
LiquidateTime int64 `protobuf:"varint,8,opt,name=liquidateTime,proto3" json:"liquidateTime,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -242,12 +237,20 @@ func (m *BorrowRecord) GetStatus() int32 { ...@@ -242,12 +237,20 @@ func (m *BorrowRecord) GetStatus() int32 {
return 0 return 0
} }
func (m *BorrowRecord) GetLiquidateTime() int64 {
if m != nil {
return m.LiquidateTime
}
return 0
}
// 资产价格记录
type AssetPriceRecord struct { type AssetPriceRecord struct {
RecordTime string `protobuf:"bytes,1,opt,name=recordTime,proto3" json:"recordTime,omitempty"` RecordTime int64 `protobuf:"varint,1,opt,name=recordTime,proto3" json:"recordTime,omitempty"`
BtyPrice float32 `protobuf:"fixed32,2,opt,name=btyPrice,proto3" json:"btyPrice,omitempty"` BtyPrice float32 `protobuf:"fixed32,2,opt,name=btyPrice,proto3" json:"btyPrice,omitempty"`
BtcPrice float32 `protobuf:"fixed32,3,opt,name=btcPrice,proto3" json:"btcPrice,omitempty"` BtcPrice float32 `protobuf:"fixed32,3,opt,name=btcPrice,proto3" json:"btcPrice,omitempty"`
EthPrice float32 `protobuf:"fixed32,4,opt,name=ethPrice,proto3" json:"ethPrice,omitempty"` EthPrice float32 `protobuf:"fixed32,4,opt,name=ethPrice,proto3" json:"ethPrice,omitempty"`
PreRecordTime string `protobuf:"bytes,5,opt,name=preRecordTime,proto3" json:"preRecordTime,omitempty"` PreRecordTime int64 `protobuf:"varint,5,opt,name=preRecordTime,proto3" json:"preRecordTime,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -278,11 +281,11 @@ func (m *AssetPriceRecord) XXX_DiscardUnknown() { ...@@ -278,11 +281,11 @@ func (m *AssetPriceRecord) XXX_DiscardUnknown() {
var xxx_messageInfo_AssetPriceRecord proto.InternalMessageInfo var xxx_messageInfo_AssetPriceRecord proto.InternalMessageInfo
func (m *AssetPriceRecord) GetRecordTime() string { func (m *AssetPriceRecord) GetRecordTime() int64 {
if m != nil { if m != nil {
return m.RecordTime return m.RecordTime
} }
return "" return 0
} }
func (m *AssetPriceRecord) GetBtyPrice() float32 { func (m *AssetPriceRecord) GetBtyPrice() float32 {
...@@ -306,13 +309,14 @@ func (m *AssetPriceRecord) GetEthPrice() float32 { ...@@ -306,13 +309,14 @@ func (m *AssetPriceRecord) GetEthPrice() float32 {
return 0 return 0
} }
func (m *AssetPriceRecord) GetPreRecordTime() string { func (m *AssetPriceRecord) GetPreRecordTime() int64 {
if m != nil { if m != nil {
return m.PreRecordTime return m.PreRecordTime
} }
return "" return 0
} }
// action
type CollateralizeAction struct { type CollateralizeAction struct {
// Types that are valid to be assigned to Value: // Types that are valid to be assigned to Value:
// *CollateralizeAction_Create // *CollateralizeAction_Create
...@@ -461,6 +465,7 @@ func (*CollateralizeAction) XXX_OneofWrappers() []interface{} { ...@@ -461,6 +465,7 @@ func (*CollateralizeAction) XXX_OneofWrappers() []interface{} {
} }
} }
// 创建借贷
type CollateralizeCreate struct { type CollateralizeCreate struct {
DebtCeiling int64 `protobuf:"varint,1,opt,name=debtCeiling,proto3" json:"debtCeiling,omitempty"` DebtCeiling int64 `protobuf:"varint,1,opt,name=debtCeiling,proto3" json:"debtCeiling,omitempty"`
LiquidationRatio float32 `protobuf:"fixed32,2,opt,name=liquidationRatio,proto3" json:"liquidationRatio,omitempty"` LiquidationRatio float32 `protobuf:"fixed32,2,opt,name=liquidationRatio,proto3" json:"liquidationRatio,omitempty"`
...@@ -532,6 +537,7 @@ func (m *CollateralizeCreate) GetTotalBalance() int64 { ...@@ -532,6 +537,7 @@ func (m *CollateralizeCreate) GetTotalBalance() int64 {
return 0 return 0
} }
// 质押借出
type CollateralizeBorrow struct { type CollateralizeBorrow struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
...@@ -579,6 +585,7 @@ func (m *CollateralizeBorrow) GetValue() int64 { ...@@ -579,6 +585,7 @@ func (m *CollateralizeBorrow) GetValue() int64 {
return 0 return 0
} }
// 质押清算
type CollateralizeRepay struct { type CollateralizeRepay struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
...@@ -626,6 +633,7 @@ func (m *CollateralizeRepay) GetValue() int64 { ...@@ -626,6 +633,7 @@ func (m *CollateralizeRepay) GetValue() int64 {
return 0 return 0
} }
// 追加抵押物
type CollateralizeAppend struct { type CollateralizeAppend struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
CollateralValue int64 `protobuf:"varint,2,opt,name=collateralValue,proto3" json:"collateralValue,omitempty"` CollateralValue int64 `protobuf:"varint,2,opt,name=collateralValue,proto3" json:"collateralValue,omitempty"`
...@@ -673,12 +681,14 @@ func (m *CollateralizeAppend) GetCollateralValue() int64 { ...@@ -673,12 +681,14 @@ func (m *CollateralizeAppend) GetCollateralValue() int64 {
return 0 return 0
} }
// 喂价
type CollateralizeFeed struct { type CollateralizeFeed struct {
Price []int64 `protobuf:"varint,1,rep,packed,name=price,proto3" json:"price,omitempty"` CollType int32 `protobuf:"varint,1,opt,name=collType,proto3" json:"collType,omitempty"`
Volume []int64 `protobuf:"varint,2,rep,packed,name=volume,proto3" json:"volume,omitempty"` Price []float32 `protobuf:"fixed32,2,rep,packed,name=price,proto3" json:"price,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` Volume []int64 `protobuf:"varint,3,rep,packed,name=volume,proto3" json:"volume,omitempty"`
XXX_unrecognized []byte `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *CollateralizeFeed) Reset() { *m = CollateralizeFeed{} } func (m *CollateralizeFeed) Reset() { *m = CollateralizeFeed{} }
...@@ -706,7 +716,14 @@ func (m *CollateralizeFeed) XXX_DiscardUnknown() { ...@@ -706,7 +716,14 @@ func (m *CollateralizeFeed) XXX_DiscardUnknown() {
var xxx_messageInfo_CollateralizeFeed proto.InternalMessageInfo var xxx_messageInfo_CollateralizeFeed proto.InternalMessageInfo
func (m *CollateralizeFeed) GetPrice() []int64 { func (m *CollateralizeFeed) GetCollType() int32 {
if m != nil {
return m.CollType
}
return 0
}
func (m *CollateralizeFeed) GetPrice() []float32 {
if m != nil { if m != nil {
return m.Price return m.Price
} }
...@@ -720,6 +737,7 @@ func (m *CollateralizeFeed) GetVolume() []int64 { ...@@ -720,6 +737,7 @@ func (m *CollateralizeFeed) GetVolume() []int64 {
return nil return nil
} }
// 喂价关闭
type CollateralizeClose struct { type CollateralizeClose struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
...@@ -759,13 +777,15 @@ func (m *CollateralizeClose) GetCollateralizeId() string { ...@@ -759,13 +777,15 @@ func (m *CollateralizeClose) GetCollateralizeId() string {
return "" return ""
} }
// exec_local记录信息
type ReceiptCollateralize struct { type ReceiptCollateralize struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
CreateAddr string `protobuf:"bytes,3,opt,name=createAddr,proto3" json:"createAddr,omitempty"` CreateAddr string `protobuf:"bytes,2,opt,name=createAddr,proto3" json:"createAddr,omitempty"`
AccountAddr string `protobuf:"bytes,4,opt,name=accountAddr,proto3" json:"accountAddr,omitempty"` AccountAddr string `protobuf:"bytes,3,opt,name=accountAddr,proto3" json:"accountAddr,omitempty"`
Status int32 `protobuf:"varint,5,opt,name=status,proto3" json:"status,omitempty"` Status int32 `protobuf:"varint,4,opt,name=status,proto3" json:"status,omitempty"`
PreStatus int32 `protobuf:"varint,6,opt,name=preStatus,proto3" json:"preStatus,omitempty"` PreStatus int32 `protobuf:"varint,5,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
Index int64 `protobuf:"varint,7,opt,name=index,proto3" json:"index,omitempty"` Index int64 `protobuf:"varint,6,opt,name=index,proto3" json:"index,omitempty"`
RecordStatus int32 `protobuf:"varint,7,opt,name=recordStatus,proto3" json:"recordStatus,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -838,6 +858,13 @@ func (m *ReceiptCollateralize) GetIndex() int64 { ...@@ -838,6 +858,13 @@ func (m *ReceiptCollateralize) GetIndex() int64 {
return 0 return 0
} }
func (m *ReceiptCollateralize) GetRecordStatus() int32 {
if m != nil {
return m.RecordStatus
}
return 0
}
type ReqCollateralizeInfo struct { type ReqCollateralizeInfo struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
...@@ -1171,6 +1198,7 @@ func (m *ReplyCollateralizeBadDebt) GetRecords() []*BorrowRecord { ...@@ -1171,6 +1198,7 @@ func (m *ReplyCollateralizeBadDebt) GetRecords() []*BorrowRecord {
// used for execlocal // used for execlocal
type CollateralizeRecord struct { type CollateralizeRecord struct {
CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"` CollateralizeId string `protobuf:"bytes,1,opt,name=collateralizeId,proto3" json:"collateralizeId,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
Index int64 `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"` Index int64 `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
...@@ -1209,6 +1237,13 @@ func (m *CollateralizeRecord) GetCollateralizeId() string { ...@@ -1209,6 +1237,13 @@ func (m *CollateralizeRecord) GetCollateralizeId() string {
return "" return ""
} }
func (m *CollateralizeRecord) GetAddr() string {
if m != nil {
return m.Addr
}
return ""
}
func (m *CollateralizeRecord) GetIndex() int64 { func (m *CollateralizeRecord) GetIndex() int64 {
if m != nil { if m != nil {
return m.Index return m.Index
...@@ -1280,62 +1315,63 @@ func init() { ...@@ -1280,62 +1315,63 @@ func init() {
func init() { proto.RegisterFile("collateralize.proto", fileDescriptor_a988fb4a61381972) } func init() { proto.RegisterFile("collateralize.proto", fileDescriptor_a988fb4a61381972) }
var fileDescriptor_a988fb4a61381972 = []byte{ var fileDescriptor_a988fb4a61381972 = []byte{
// 906 bytes of a gzipped FileDescriptorProto // 922 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x57, 0xcd, 0x6e, 0xfb, 0x44, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x57, 0x41, 0x6f, 0xe3, 0x44,
0x10, 0xff, 0xdb, 0x8e, 0x93, 0x66, 0xd2, 0x40, 0xd9, 0x56, 0xe0, 0x46, 0xa5, 0x8a, 0x2c, 0x0e, 0x14, 0x5e, 0xdb, 0x71, 0xb2, 0x79, 0x69, 0x61, 0x99, 0x46, 0x8b, 0x37, 0x5a, 0x56, 0x91, 0xc5,
0x11, 0x12, 0x91, 0x48, 0x7b, 0xe1, 0x82, 0x48, 0x83, 0xaa, 0x16, 0x71, 0xa8, 0x4c, 0xe1, 0xc0, 0xc1, 0x42, 0x22, 0x12, 0x61, 0x85, 0xc4, 0x05, 0x91, 0x06, 0xad, 0x5a, 0xd4, 0x03, 0x72, 0x0b,
0x6d, 0x6d, 0x6f, 0xc1, 0x92, 0xb1, 0xdd, 0xf5, 0xa6, 0x60, 0xce, 0x5c, 0x78, 0x12, 0x2e, 0xdc, 0x07, 0x24, 0x0e, 0x13, 0x7b, 0x0a, 0x96, 0x5c, 0xdb, 0x1d, 0x4f, 0x0a, 0xe6, 0x0f, 0x21, 0x21,
0x79, 0x0b, 0x5e, 0x80, 0x3b, 0xcf, 0x81, 0x76, 0x76, 0x13, 0x7f, 0x46, 0x4a, 0xe8, 0xf1, 0x7f, 0xee, 0xfc, 0x18, 0x2e, 0x9c, 0xf8, 0x01, 0xfc, 0x02, 0x34, 0x6f, 0x26, 0x89, 0xc7, 0x76, 0xa4,
0xa9, 0xb2, 0xf3, 0x3d, 0xbf, 0xf9, 0x79, 0x76, 0x0b, 0xa7, 0x41, 0x1a, 0xc7, 0x54, 0x30, 0x4e, 0x84, 0x1e, 0xf7, 0x52, 0x65, 0xde, 0x7b, 0xf3, 0xe6, 0xbd, 0xef, 0x7d, 0xfe, 0x66, 0x0a, 0x67,
0xe3, 0xe8, 0x57, 0x36, 0xcf, 0x78, 0x2a, 0x52, 0x62, 0x8b, 0x22, 0x63, 0xb9, 0xfb, 0x7b, 0x0f, 0x51, 0x9e, 0xa6, 0x54, 0x30, 0x4e, 0xd3, 0xe4, 0x57, 0x36, 0x2b, 0x78, 0x2e, 0x72, 0xe2, 0x8a,
0xc6, 0xab, 0xaa, 0x9a, 0xcc, 0xe0, 0xdd, 0x9a, 0xfd, 0x7d, 0xe8, 0x18, 0x53, 0x63, 0x36, 0xf4, 0xaa, 0x60, 0xa5, 0xff, 0xb7, 0x03, 0xa7, 0xcb, 0xba, 0x9b, 0x04, 0xf0, 0xae, 0x11, 0x7f, 0x19,
0x9a, 0x62, 0xe2, 0xc2, 0xb1, 0x48, 0x05, 0x8d, 0x6f, 0x68, 0x4c, 0x93, 0x80, 0x39, 0xe6, 0xd4, 0x7b, 0xd6, 0xd4, 0x0a, 0x86, 0x61, 0xd3, 0x4c, 0x7c, 0x38, 0x11, 0xb9, 0xa0, 0xe9, 0x39, 0x4d,
0x98, 0x59, 0x5e, 0x4d, 0x46, 0xa6, 0x30, 0x0a, 0x99, 0x2f, 0x56, 0x2c, 0x8a, 0xa3, 0xe4, 0x07, 0x69, 0x16, 0x31, 0xcf, 0x9e, 0x5a, 0x81, 0x13, 0x1a, 0x36, 0x32, 0x85, 0x51, 0xcc, 0x56, 0x62,
0xc7, 0x42, 0x93, 0xaa, 0x88, 0x7c, 0x0c, 0x27, 0x71, 0xf4, 0xbc, 0x8e, 0x42, 0x2a, 0xa2, 0x34, 0xc9, 0x92, 0x34, 0xc9, 0x7e, 0xf4, 0x1c, 0x0c, 0xa9, 0x9b, 0xc8, 0x47, 0xf0, 0x2c, 0x4d, 0xee,
0xf1, 0xe4, 0x5f, 0xa7, 0x37, 0x35, 0x66, 0xa6, 0xd7, 0x92, 0xcb, 0x8c, 0xb9, 0xa0, 0x7e, 0x14, 0xd7, 0x49, 0x4c, 0x45, 0x92, 0x67, 0xa1, 0xfc, 0xeb, 0xf5, 0xa6, 0x56, 0x60, 0x87, 0x2d, 0xbb,
0x47, 0xa2, 0xb8, 0x65, 0xcc, 0xb1, 0x55, 0xc6, 0xaa, 0x8c, 0xcc, 0x81, 0x54, 0xfc, 0x1e, 0x58, 0x3c, 0xb1, 0x14, 0x74, 0x95, 0xa4, 0x89, 0xa8, 0xde, 0x30, 0xe6, 0xb9, 0xea, 0xc4, 0xba, 0x8d,
0x42, 0x63, 0x51, 0x38, 0x7d, 0xb4, 0xec, 0xd0, 0x90, 0x4b, 0x80, 0x80, 0x33, 0x2a, 0xd8, 0x32, 0xcc, 0x80, 0xd4, 0xf6, 0x7d, 0xc3, 0x32, 0x9a, 0x8a, 0xca, 0xeb, 0x63, 0x64, 0x87, 0x87, 0xbc,
0x0c, 0xb9, 0x33, 0xc0, 0x56, 0x2b, 0x12, 0xe2, 0xc0, 0xc0, 0xd7, 0x0d, 0x1e, 0x61, 0x90, 0xcd, 0x02, 0x88, 0x38, 0xa3, 0x82, 0x2d, 0xe2, 0x98, 0x7b, 0x03, 0x6c, 0xb5, 0x66, 0x21, 0x1e, 0x0c,
0x91, 0x7c, 0x06, 0x63, 0x3f, 0xe5, 0x3c, 0xfd, 0xd9, 0x63, 0x41, 0xca, 0xc3, 0xdc, 0x19, 0x4e, 0x56, 0xba, 0xc1, 0xa7, 0x98, 0x64, 0xb3, 0x24, 0x9f, 0xc3, 0xe9, 0x2a, 0xe7, 0x3c, 0xff, 0x39,
0xad, 0xd9, 0x68, 0x71, 0x3a, 0x47, 0x68, 0xe7, 0x37, 0x15, 0x9d, 0x57, 0xb7, 0x24, 0x57, 0x00, 0x64, 0x51, 0xce, 0xe3, 0xd2, 0x1b, 0x4e, 0x9d, 0x60, 0x34, 0x3f, 0x9b, 0x21, 0xb4, 0xb3, 0xf3,
0x3e, 0x0d, 0x37, 0x7e, 0xb0, 0xdb, 0xaf, 0x62, 0x46, 0xde, 0x87, 0x7e, 0x2e, 0xa8, 0x58, 0xe7, 0x9a, 0x2f, 0x34, 0x23, 0xc9, 0x73, 0xe8, 0x97, 0x82, 0x8a, 0x75, 0xe9, 0xc1, 0xd4, 0x0a, 0xdc,
0xce, 0x68, 0x6a, 0xcc, 0x6c, 0x4f, 0x9f, 0xc8, 0x04, 0x8e, 0xe4, 0x68, 0x1e, 0x8b, 0x8c, 0x39, 0x50, 0xaf, 0xc8, 0x04, 0x9e, 0x4a, 0x94, 0x6f, 0xaa, 0x82, 0x79, 0x23, 0xf4, 0x6c, 0xd7, 0xe4,
0xc7, 0xa8, 0xd9, 0x9e, 0x11, 0x5d, 0x2a, 0x58, 0x2e, 0x3c, 0x96, 0xd1, 0xe2, 0x81, 0x47, 0x01, 0x33, 0x78, 0x2e, 0xe1, 0x2f, 0xc5, 0x55, 0xad, 0x09, 0x9e, 0x44, 0xcc, 0x3b, 0x41, 0xb8, 0xf6,
0x73, 0xc6, 0x1a, 0xdd, 0x86, 0xdc, 0xfd, 0xcd, 0x84, 0xe3, 0x6a, 0x72, 0x39, 0x3c, 0x1a, 0x04, 0x78, 0xfd, 0xdf, 0x6d, 0x38, 0xa9, 0xd7, 0x22, 0x67, 0x42, 0xa3, 0x28, 0x5f, 0x67, 0x02, 0x5b,
0xe9, 0x3a, 0x11, 0x88, 0x8d, 0xa2, 0x41, 0x55, 0x44, 0x2e, 0x60, 0x98, 0x0b, 0xca, 0xc5, 0x63, 0x56, 0xd3, 0xad, 0x9b, 0xc8, 0x4b, 0x18, 0x96, 0x82, 0x72, 0x71, 0x93, 0xdc, 0x6d, 0xc6, 0xba,
0xf4, 0xd3, 0x66, 0xfe, 0xa5, 0xa0, 0x4e, 0xa5, 0xef, 0x68, 0xbc, 0x66, 0x9a, 0x00, 0x4d, 0x71, 0x33, 0x98, 0x0c, 0xf9, 0x8e, 0xa6, 0x6b, 0xa6, 0xe7, 0xda, 0x34, 0x9b, 0x91, 0xaa, 0x56, 0x35,
0xdd, 0x52, 0x55, 0xa9, 0x38, 0xd0, 0x14, 0xcb, 0x8c, 0x92, 0x3d, 0x2a, 0x9a, 0x9a, 0x7f, 0x29, 0xda, 0xa6, 0x59, 0x9e, 0x28, 0x49, 0xa1, 0xb2, 0xa9, 0xb1, 0xee, 0x0c, 0x0d, 0x8e, 0xa8, 0x44,
0x68, 0x90, 0x49, 0x05, 0xea, 0xb7, 0xc8, 0xa4, 0x22, 0x95, 0x70, 0x0e, 0xaa, 0x70, 0xba, 0x7f, 0xfd, 0x16, 0x47, 0x54, 0xa6, 0x1d, 0xb4, 0x03, 0x03, 0xda, 0x0f, 0xe1, 0x74, 0x13, 0xcb, 0xb0,
0x1a, 0x70, 0xb2, 0xcc, 0x73, 0x26, 0xd0, 0x4c, 0x43, 0x71, 0x09, 0xc0, 0xf1, 0x17, 0x76, 0xaa, 0x2f, 0x35, 0x4d, 0xd3, 0xe8, 0xff, 0x61, 0xc1, 0xb3, 0x45, 0x59, 0x32, 0x81, 0xc9, 0x34, 0x60,
0x90, 0xa8, 0x48, 0xe4, 0x0c, 0x7c, 0xa1, 0xf1, 0x35, 0x31, 0xe1, 0xf6, 0xac, 0x74, 0x81, 0xd2, 0xaf, 0x00, 0x38, 0xfe, 0xc2, 0x7d, 0x16, 0xee, 0xab, 0x59, 0xe4, 0xd4, 0x56, 0xa2, 0x52, 0x65,
0x59, 0x1b, 0x5d, 0xb0, 0xd5, 0x31, 0xf1, 0x63, 0xb5, 0xe3, 0xed, 0x99, 0x7c, 0x04, 0xe3, 0x8c, 0xd9, 0x58, 0xd6, 0x76, 0xad, 0x7c, 0x91, 0xf2, 0x39, 0x1b, 0x5f, 0xb4, 0xf5, 0x31, 0xf1, 0x53,
0xeb, 0x02, 0x30, 0xad, 0x8d, 0x69, 0xeb, 0x42, 0xf7, 0x5f, 0x13, 0x4e, 0x6b, 0x5f, 0xf0, 0x32, 0x1d, 0x97, 0xed, 0x5a, 0x96, 0x5b, 0x70, 0x5d, 0x00, 0x1e, 0xab, 0x40, 0x31, 0x8d, 0xfe, 0x3f,
0x90, 0x3d, 0x92, 0x6b, 0xe8, 0x2b, 0x16, 0x63, 0xb5, 0xa3, 0xc5, 0x44, 0xd3, 0xab, 0x66, 0xbb, 0x36, 0x9c, 0x19, 0x9f, 0xef, 0x22, 0x92, 0x48, 0x90, 0xd7, 0xd0, 0x57, 0x14, 0xc6, 0x6a, 0x47,
0x42, 0x8b, 0xbb, 0x37, 0x9e, 0xb6, 0x95, 0x5e, 0x8a, 0xa9, 0xd8, 0xc5, 0x0e, 0x2f, 0x45, 0x12, 0xf3, 0x89, 0xe6, 0xa4, 0x11, 0xbb, 0xc4, 0x88, 0x8b, 0x27, 0xa1, 0x8e, 0x95, 0xbb, 0x14, 0x4d,
0xe9, 0xa5, 0x6c, 0xc9, 0xa7, 0x60, 0x73, 0xc9, 0x23, 0x6c, 0x6f, 0xb4, 0x38, 0xef, 0x72, 0x42, 0xb1, 0x8b, 0x3d, 0xbb, 0x14, 0x95, 0xe4, 0x2e, 0x15, 0x4b, 0x3e, 0x01, 0x97, 0xb3, 0x82, 0x56,
0xa2, 0xdd, 0xbd, 0xf1, 0x94, 0xa5, 0x4c, 0x44, 0xb3, 0x8c, 0x25, 0x21, 0xb6, 0xbd, 0x23, 0xd1, 0xd8, 0xde, 0x68, 0xfe, 0xa2, 0x6b, 0x53, 0x28, 0x03, 0x2e, 0x9e, 0x84, 0x2a, 0x52, 0x1e, 0x44,
0x12, 0x2d, 0x64, 0x22, 0x65, 0x4b, 0xe6, 0xd0, 0x7b, 0x62, 0x2c, 0x44, 0x24, 0x46, 0x0b, 0xa7, 0x8b, 0x82, 0x65, 0x31, 0xb6, 0xbd, 0xe7, 0xa0, 0x05, 0x46, 0xc8, 0x83, 0x54, 0x2c, 0x99, 0x41,
0xcb, 0xe7, 0x96, 0x31, 0xe9, 0x81, 0x76, 0xb2, 0xb0, 0x20, 0x4e, 0x73, 0x45, 0x82, 0x1d, 0x85, 0xef, 0x96, 0xb1, 0x18, 0x91, 0x18, 0xcd, 0xbd, 0xae, 0x3d, 0x6f, 0x18, 0x93, 0x3b, 0x30, 0x4e,
0xad, 0xa4, 0x81, 0x2c, 0x0c, 0x2d, 0xc9, 0x3b, 0x60, 0x8a, 0xc2, 0x01, 0xa4, 0x84, 0x29, 0x8a, 0x16, 0x16, 0xa5, 0x79, 0xa9, 0xa8, 0xb2, 0xa7, 0xb0, 0xa5, 0x0c, 0x90, 0x85, 0x61, 0x24, 0x79,
0x9b, 0x01, 0xd8, 0x2f, 0x92, 0x5b, 0xee, 0x3f, 0x46, 0x03, 0x68, 0x05, 0x5e, 0x73, 0xc5, 0x19, 0x07, 0x6c, 0x51, 0xe9, 0x6f, 0xd2, 0x16, 0xd5, 0xf9, 0x00, 0xdc, 0x07, 0xc9, 0x40, 0xff, 0x2f,
0xfb, 0xad, 0x38, 0x73, 0xcf, 0x15, 0x67, 0xed, 0xbd, 0xe2, 0x7a, 0x3b, 0x57, 0x5c, 0x73, 0x51, 0xab, 0x01, 0xb4, 0x02, 0xaf, 0xa9, 0x6f, 0xd6, 0x61, 0xfa, 0x66, 0x1f, 0xa8, 0x6f, 0xce, 0xc1,
0xdb, 0xed, 0x45, 0xed, 0x7e, 0xdb, 0x68, 0x4e, 0xcd, 0xf8, 0x80, 0xdb, 0xe0, 0x4c, 0xe3, 0xa4, 0xfa, 0xd6, 0xdb, 0xab, 0x6f, 0x4d, 0x95, 0x76, 0xdb, 0x2a, 0xed, 0x7f, 0xdb, 0x68, 0x4e, 0xcd,
0xd7, 0x80, 0x06, 0xed, 0x11, 0x48, 0x9b, 0x05, 0xaf, 0x8e, 0x1a, 0x35, 0x29, 0xaf, 0xd8, 0xb1, 0xf8, 0x88, 0xab, 0x60, 0xac, 0x71, 0xd2, 0x62, 0xa1, 0x41, 0xbb, 0x01, 0xd2, 0x66, 0xc1, 0xa3,
0x7f, 0xd8, 0x8e, 0xcd, 0x64, 0x76, 0x6e, 0x26, 0x77, 0x09, 0xef, 0xb5, 0xe8, 0x25, 0xab, 0xca, 0xb3, 0x26, 0x4d, 0xca, 0x2b, 0x76, 0x1c, 0x9e, 0xb6, 0x43, 0xbf, 0xec, 0x4e, 0xfd, 0xf2, 0x7f,
0xf0, 0x93, 0x35, 0xa6, 0x96, 0xac, 0x2a, 0xdb, 0x2c, 0x94, 0x97, 0x34, 0x5e, 0xe3, 0x26, 0x94, 0x80, 0xf7, 0x5a, 0xf4, 0x32, 0x34, 0xda, 0x6a, 0x68, 0xf4, 0x18, 0xdc, 0x42, 0xcb, 0x80, 0x13,
0x62, 0x7d, 0x72, 0x3f, 0x6f, 0x60, 0x80, 0x84, 0xdb, 0xbf, 0x58, 0xf7, 0x6f, 0x03, 0xce, 0x3c, 0xd8, 0xa1, 0x5a, 0x48, 0x49, 0x7a, 0xc8, 0xd3, 0xf5, 0x9d, 0x1c, 0xa8, 0x13, 0x38, 0xa1, 0x5e,
0x16, 0xb0, 0x28, 0x13, 0xff, 0xf7, 0xaa, 0xae, 0x5f, 0x72, 0x56, 0xeb, 0x92, 0x6b, 0x6c, 0xfa, 0xf9, 0x5f, 0x34, 0xf0, 0x41, 0x32, 0x1e, 0xde, 0x88, 0xff, 0xaf, 0x05, 0xe3, 0x90, 0x45, 0x2c,
0x5e, 0x7b, 0xd3, 0x97, 0xdb, 0xd2, 0xae, 0x5d, 0x3e, 0x17, 0x30, 0xcc, 0x38, 0xfb, 0x46, 0xa9, 0x29, 0xc4, 0xff, 0xbd, 0xc3, 0xcd, 0xdb, 0xcf, 0x6e, 0xdd, 0x7e, 0x8d, 0xbb, 0xc2, 0x69, 0xdf,
0xfa, 0xa8, 0x2a, 0x05, 0x12, 0xa8, 0x28, 0x09, 0xd9, 0x2f, 0xb8, 0x62, 0x2d, 0x4f, 0x1d, 0xdc, 0x15, 0x3b, 0xbd, 0xed, 0x19, 0x7a, 0xfb, 0x12, 0x86, 0x05, 0x67, 0xd7, 0xca, 0xe5, 0xa2, 0x6b,
0x2f, 0x64, 0x3f, 0xcf, 0xb5, 0x5e, 0xee, 0x93, 0xa7, 0xf4, 0x00, 0x48, 0xbe, 0x87, 0x49, 0x33, 0x67, 0x90, 0x40, 0x25, 0x59, 0xcc, 0x7e, 0xd1, 0x17, 0xb3, 0x5a, 0x48, 0xae, 0x2a, 0x59, 0xbd,
0x82, 0x22, 0xec, 0x61, 0x71, 0x08, 0x81, 0x1e, 0x95, 0x0d, 0x9b, 0xa8, 0xc6, 0xdf, 0xee, 0x0a, 0xae, 0x2b, 0xb8, 0x61, 0xf3, 0xbf, 0x94, 0x3d, 0xdf, 0x1b, 0xfd, 0x5e, 0x66, 0xb7, 0xf9, 0x11,
0x3e, 0x68, 0xc5, 0xa6, 0xe1, 0x97, 0xcc, 0x17, 0x07, 0x14, 0xf8, 0x87, 0x01, 0x1f, 0x76, 0x57, 0xb0, 0x7d, 0x0f, 0x93, 0x66, 0x06, 0x45, 0xf8, 0xe3, 0xf2, 0x10, 0x02, 0x3d, 0xba, 0x43, 0x0d,
0x78, 0x17, 0xe5, 0x22, 0xe5, 0xc5, 0xeb, 0x8a, 0x94, 0xc0, 0xe2, 0x6c, 0x70, 0x54, 0xb6, 0xa7, 0x7f, 0xfb, 0x4b, 0x78, 0xbf, 0x95, 0x9b, 0xc6, 0x5f, 0xb1, 0x95, 0x38, 0xa2, 0xc0, 0xdf, 0x2c,
0x0e, 0x78, 0x39, 0x46, 0x9c, 0xe1, 0x05, 0xa0, 0xe7, 0x54, 0x0a, 0xca, 0x61, 0xf4, 0xab, 0xc3, 0xf8, 0xa0, 0xbb, 0xc2, 0x8b, 0xa4, 0x14, 0x39, 0xaf, 0x1e, 0x57, 0xa4, 0x04, 0x1f, 0xe7, 0xa7,
0xf8, 0xcb, 0x94, 0x95, 0x66, 0x71, 0x51, 0xe7, 0xe8, 0x9a, 0x73, 0x96, 0x08, 0x84, 0xb3, 0x1c, 0x27, 0xa6, 0x16, 0x78, 0x05, 0x27, 0x9c, 0xe1, 0x05, 0xb2, 0x19, 0xd8, 0xd6, 0xd0, 0x3d, 0x30,
0xbd, 0x51, 0x1b, 0xfd, 0x5b, 0xfe, 0xfe, 0x73, 0xbf, 0x82, 0xf3, 0x36, 0x70, 0x1b, 0xaa, 0x7c, 0xff, 0x4f, 0x5b, 0x56, 0x5a, 0xa4, 0x95, 0xc9, 0xe3, 0x35, 0xe7, 0x2c, 0x13, 0x08, 0xe7, 0x8e,
0x02, 0x03, 0xae, 0x9f, 0x77, 0xc6, 0xee, 0xe7, 0xdd, 0xc6, 0xa6, 0xb5, 0x7e, 0xf5, 0xb3, 0xe3, 0x1e, 0x96, 0x41, 0x8f, 0xb7, 0xfc, 0xf1, 0xe8, 0x7f, 0x0d, 0x2f, 0xda, 0xc0, 0x6d, 0xa8, 0xf2,
0xa0, 0x45, 0xa9, 0x86, 0x6b, 0x55, 0x87, 0xfb, 0x35, 0x9c, 0x75, 0x84, 0xcd, 0xc9, 0x75, 0xb3, 0x31, 0x0c, 0xb8, 0x7e, 0x53, 0x5a, 0xfb, 0xdf, 0x94, 0x9b, 0x98, 0x96, 0x22, 0xea, 0x67, 0xcb,
0xba, 0x49, 0xf7, 0x95, 0x5d, 0x2b, 0xd2, 0xef, 0xe3, 0xbf, 0x0e, 0x57, 0xff, 0x05, 0x00, 0x00, 0xa3, 0x49, 0xa2, 0x06, 0xee, 0xd4, 0x07, 0x7e, 0x05, 0xe3, 0x8e, 0xa3, 0x4a, 0xf2, 0xba, 0x59,
0xff, 0xff, 0xbb, 0x53, 0x0d, 0x10, 0x51, 0x0c, 0x00, 0x00, 0xf1, 0xa4, 0xfb, 0x19, 0x60, 0x14, 0xbe, 0xea, 0xe3, 0xff, 0x22, 0x9f, 0xfe, 0x17, 0x00, 0x00,
0xff, 0xff, 0x2e, 0xf8, 0x38, 0x08, 0xa2, 0x0c, 0x00, 0x00,
} }
...@@ -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