Commit f9d4465d authored by 任硕's avatar 任硕 Committed by linj

unfreeze exec

parent 9b25d121
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"time" "time"
"gitlab.33.cn/chain33/chain33/account" "gitlab.33.cn/chain33/chain33/account"
"gitlab.33.cn/chain33/chain33/common"
dbm "gitlab.33.cn/chain33/chain33/common/db" dbm "gitlab.33.cn/chain33/chain33/common/db"
uf "gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types" uf "gitlab.33.cn/chain33/chain33/plugin/dapp/unfreeze/types"
"gitlab.33.cn/chain33/chain33/system/dapp" "gitlab.33.cn/chain33/chain33/system/dapp"
...@@ -30,21 +31,21 @@ func newAction(u *Unfreeze, tx *types.Transaction, index int32) *action { ...@@ -30,21 +31,21 @@ func newAction(u *Unfreeze, tx *types.Transaction, index int32) *action {
//创建解冻交易 //创建解冻交易
func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, error) { func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, error) {
/*
*参数检测
*时间等
*/
if create.GetStartTime() <= time.Unix()
//构造ID - txHash //构造ID - txHash
var unfreezeID string = a.txhash var unfreezeID string = "unfreezeID_" + common.ToHex(a.txhash)
tokenAccDB, err := account.NewAccountDB("token", create.TokenName, a.db)
receipt, err := a.coinsAccount.TransferToExec(a.fromaddr, a.execaddr, create.TotalCount) if err != nil {
return nil, err
}
receipt, err := tokenAccDB.ExecFrozen(a.fromaddr, a.execaddr, create.TotalCount)
if err != nil { if err != nil {
uflog.Error("unfreeze create ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", create.TotalCount) uflog.Error("unfreeze create ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", create.TotalCount)
return nil, err return nil, err
} }
var logs []*types.ReceiptLog
var kv []*types.KeyValue
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
unfreeze := &uf.Unfreeze{ unfreeze := &uf.Unfreeze{
UnfreezeID: unfreezeID, UnfreezeID: unfreezeID,
StartTime: create.StartTime, StartTime: create.StartTime,
...@@ -57,30 +58,17 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro ...@@ -57,30 +58,17 @@ func (a *action) UnfreezeCreate(create *uf.UnfreezeCreate) (*types.Receipt, erro
Amount: create.Amount, Amount: create.Amount,
} }
a.saveStateDB(unfreeze) a.saveStateDB(unfreeze)
var logs []*types.ReceiptLog k := []byte(unfreezeID)
var kv []*types.KeyValue v := types.Encode(unfreeze)
kv = append(kv, &types.KeyValue{k, v})
logs = append(logs, receipt.Logs...) receiptLog := a.getCreateLog(unfreeze)
kv = append(kv, receipt.KV...)
receiptLog := a.getReceiptLog(unfreeze) //TODO 修改receiptLog
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
return &types.Receipt{types.ExecOk, kv, logs}, nil return &types.Receipt{types.ExecOk, kv, logs}, nil
} }
//提取解冻币 //提取解冻币
func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt, error) { func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt, error) {
//TODO pseudocode value, err := a.db.Get(key(withdraw.UnfreezeID))
/*
*参数检测
*检测该地址是否存在对应解冻交易ID
*/
/*
*从合约转币到该地址(收币地址)
*/
value, err := a.db.Get(key(withdraw.GetUnfreezeID()))
if err != nil { if err != nil {
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err) uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err)
return nil, err return nil, err
...@@ -91,58 +79,109 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt ...@@ -91,58 +79,109 @@ func (a *action) UnfreezeWithdraw(withdraw *uf.UnfreezeWithdraw) (*types.Receipt
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err) uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err)
return nil, err return nil, err
} }
/*
*检测可取款状态(时间)
*计算可取款额
*计算取款次数增加量
*/
var amount int64
var withdrawTimes int32
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
currentTime := time.Now().Unix()
expectTimes := (currentTime + unfreeze.Period - unfreeze.StartTime) / unfreeze.Period
reaTimes := expectTimes - int64(unfreeze.WithdrawTimes)
if reaTimes <= 0 {
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", types.ErrUnfreezeBeforeDue)
return nil, types.ErrUnfreezeBeforeDue
}
if unfreeze.Remaining <= 0 {
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", types.ErrUnfreezeEmptied)
return nil, types.ErrUnfreezeEmptied
}
var available int64
switch unfreeze.Means {
case 1: // 百分比
for i := int64(0); i < reaTimes; i++ {
if tmp := unfreeze.Remaining * unfreeze.Amount / 10000; tmp == 0 {
available = unfreeze.Remaining
break
} else {
available += tmp
}
}
case 2: // 固额
for i := int64(0); i < reaTimes; i++ {
if unfreeze.Remaining <= unfreeze.Amount {
available = unfreeze.Remaining
break
}
available += unfreeze.Amount
}
default:
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", types.ErrUnfreezeMeans)
return nil, types.ErrUnfreezeMeans
}
receipt, err := a.coinsAccount.ExecTransferFrozen(unfreeze.Initiator, unfreeze.Beneficiary, a.execaddr, amount) tokenAccDB, err := account.NewAccountDB("token", unfreeze.TokenName, a.db)
if err != nil {
return nil, err
}
receipt, err := tokenAccDB.ExecTransferFrozen(unfreeze.Initiator, a.fromaddr, a.execaddr, available)
if err != nil { if err != nil {
uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err) uflog.Error("unfreeze withdraw ", "execaddr", a.execaddr, "err", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
unfreeze.WithdrawTimes += withdrawTimes unfreeze.WithdrawTimes += int32(reaTimes)
unfreeze.Remaining -= available
a.saveStateDB(&unfreeze) a.saveStateDB(&unfreeze)
receiptLog := a.getWithdrawLog(&unfreeze)
logs = append(logs, receiptLog)
k := []byte(withdraw.UnfreezeID)
v := types.Encode(&unfreeze)
kv = append(kv, &types.KeyValue{k, v})
return &types.Receipt{types.ExecOk, kv, logs}, nil return &types.Receipt{types.ExecOk, kv, logs}, nil
} }
//中止定期解冻 //中止定期解冻
func (a *action) UnfreezeTerminate(terminate *uf.UnfreezeTerminate) (*types.Receipt, error) { func (a *action) UnfreezeTerminate(terminate *uf.UnfreezeTerminate) (*types.Receipt, error) {
//TODO pseudocode value, err := a.db.Get(key(terminate.UnfreezeID))
/* if err != nil {
*参数检测 uflog.Error("unfreeze terminate ", "execaddr", a.execaddr, "err", err)
*检测该地址是否存在对应解冻交易ID return nil, err
*/ }
var unfreeze uf.Unfreeze
/* err = types.Decode(value, &unfreeze)
*从合约转币到该地址(发币地址) if err != nil {
*/ uflog.Error("unfreeze terminate ", "execaddr", a.execaddr, "err", err)
//计算合约中剩余币数 return nil, err
var remain int64 }
//获取发币地址 if a.fromaddr != unfreeze.Initiator {
var senderAddr string uflog.Error("unfreeze terminate ", "execaddr", a.execaddr, "err", types.ErrUnfreezeID)
receipt, err := a.coinsAccount.ExecActive(senderAddr, a.execaddr, remain) return nil, types.ErrUnfreezeID
}
if unfreeze.Remaining <= 0 {
uflog.Error("unfreeze terminate ", "execaddr", a.execaddr, "err", types.ErrUnfreezeEmptied)
return nil, types.ErrUnfreezeEmptied
}
tokenAccDB, err := account.NewAccountDB("token", unfreeze.TokenName, a.db)
if err != nil {
return nil, err
}
receipt, err := tokenAccDB.ExecActive(unfreeze.Initiator, a.execaddr, unfreeze.Remaining)
if err != nil { if err != nil {
uflog.Error("unfreeze terminate ", "addr", senderAddr, "execaddr", a.execaddr, "err", err) uflog.Error("unfreeze terminate ", "addr", unfreeze.Initiator, "execaddr", a.execaddr, "err", err)
return nil, err return nil, err
} }
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
/*修改receipt unfreeze.Remaining = 0
*修改数据库中状态 a.saveStateDB(&unfreeze)
*/ receiptLog := a.getTerminateLog(&unfreeze)
logs = append(logs, receiptLog)
k := []byte(terminate.UnfreezeID)
v := types.Encode(&unfreeze)
kv = append(kv, &types.KeyValue{k, v})
return &types.Receipt{types.ExecOk, kv, logs}, nil return &types.Receipt{types.ExecOk, kv, logs}, nil
} }
...@@ -156,19 +195,37 @@ func key(id string) (keys []byte) { ...@@ -156,19 +195,37 @@ func key(id string) (keys []byte) {
return keys return keys
} }
func (a *action) getReceiptLog(unfreeze *uf.Unfreeze) *types.ReceiptLog { func (a *action) getCreateLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
//TODO 判断不同类型receipt log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptCreate{}
r.UnfreezeID = unfreeze.UnfreezeID
r.Initiator = unfreeze.Initiator
log.Log = types.Encode(r)
return log
}
func (a *action) getWithdrawLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{}
log.Ty = uf.TyLogCreateUnfreeze
r := &uf.ReceiptWithdraw{}
r.WithdrawTimes = unfreeze.WithdrawTimes
r.Beneficiary = unfreeze.Beneficiary
log.Log = types.Encode(r)
return log
}
func (a *action) getTerminateLog(unfreeze *uf.Unfreeze) *types.ReceiptLog {
log := &types.ReceiptLog{} log := &types.ReceiptLog{}
r := &uf.ReceiptUnfreeze{} log.Ty = uf.TyLogCreateUnfreeze
r.TokenName = unfreeze.TokenName r := &uf.ReceiptTerminate{}
r.CreateAddr = unfreeze.Initiator r.UnfreezeID = unfreeze.UnfreezeID
r.ReceiveAddr = unfreeze.Beneficiary
log.Log = types.Encode(r) log.Log = types.Encode(r)
return log return log
} }
//查询可提币状态 //查询可提币状态
func QueryWithdraw(stateDB dbm.KV, param *uf.QueryWithdraw) (types.Message, error) { func QueryWithdraw(stateDB dbm.KV, param *uf.QueryWithdrawStatus) (types.Message, error) {
//查询提币次数 //查询提币次数
//计算当前可否提币 //计算当前可否提币
return &types.Reply{}, nil return &types.Reply{}, nil
......
...@@ -5,6 +5,6 @@ import ( ...@@ -5,6 +5,6 @@ import (
"gitlab.33.cn/chain33/chain33/types" "gitlab.33.cn/chain33/chain33/types"
) )
func (u *Unfreeze) Query_QueryWithdraw(in *uf.QueryWithdraw) (types.Message, error) { func (u *Unfreeze) Query_QueryWithdraw(in *uf.QueryWithdrawStatus) (types.Message, error) {
return QueryWithdraw(u.GetStateDB(), in) return QueryWithdraw(u.GetStateDB(), in)
} }
...@@ -23,6 +23,8 @@ message Unfreeze { ...@@ -23,6 +23,8 @@ message Unfreeze {
int64 amount = 9; int64 amount = 9;
//已解冻次数 //已解冻次数
int32 withdrawTimes = 10; int32 withdrawTimes = 10;
//解冻剩余币数
int64 remaining = 11;
} }
// message for execs.unfreeze // message for execs.unfreeze
...@@ -32,18 +34,18 @@ message UnfreezeAction { ...@@ -32,18 +34,18 @@ message UnfreezeAction {
UnfreezeWithdraw withdraw = 2; UnfreezeWithdraw withdraw = 2;
UnfreezeTerminate terminate = 3; UnfreezeTerminate terminate = 3;
} }
int32 ty = 10; int32 ty = 4;
} }
// action
message UnfreezeCreate { message UnfreezeCreate {
int64 startTime = 1; int64 startTime = 1;
string tokenName = 2; string tokenName = 2;
int64 totalCount = 3; int64 totalCount = 3;
string initiator = 4; string beneficiary = 4;
string beneficiary = 5; int64 period = 5;
int64 period = 6; int32 means = 6;
int32 means = 7; int64 amount = 7;
int64 amount = 8;
} }
message UnfreezeWithdraw { message UnfreezeWithdraw {
...@@ -54,13 +56,22 @@ message UnfreezeTerminate { ...@@ -54,13 +56,22 @@ message UnfreezeTerminate {
string unfreezeID = 1; string unfreezeID = 1;
} }
//TODO: 更多receipt类型 // receipt
message ReceiptUnfreeze { message ReceiptCreate {
string tokenName = 1; string unfreezeID = 1;
string createAddr = 2; string initiator = 2;
string receiveAddr = 3; }
message ReceiptWithdraw {
int32 withdrawTimes = 1;
string beneficiary = 3;
}
message ReceiptTerminate {
string unfreezeID = 1;
} }
message QueryWithdraw { // query
message QueryWithdrawStatus {
string unfreezeID = 1; string unfreezeID = 1;
} }
...@@ -35,9 +35,9 @@ type UnfreezeType struct { ...@@ -35,9 +35,9 @@ type UnfreezeType struct {
func (u *UnfreezeType) GetLogMap() map[int64]*types.LogInfo { func (u *UnfreezeType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{ return map[int64]*types.LogInfo{
TyLogCreateUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogCreateUnfreeze"}, TyLogCreateUnfreeze: {reflect.TypeOf(ReceiptCreate{}), "LogCreateUnfreeze"},
TyLogWithdrawUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogWithdrawUnfreeze"}, TyLogWithdrawUnfreeze: {reflect.TypeOf(ReceiptWithdraw{}), "LogWithdrawUnfreeze"},
TyLogTerminateUnfreeze: {reflect.TypeOf(ReceiptUnfreeze{}), "LogTerminateUnfreeze"}, TyLogTerminateUnfreeze: {reflect.TypeOf(ReceiptTerminate{}), "LogTerminateUnfreeze"},
} }
} }
......
This diff is collapsed.
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