Commit dba1186c authored by liuyuhang's avatar liuyuhang Committed by 33cn

add prob project

parent 579ca570
...@@ -249,6 +249,11 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt ...@@ -249,6 +249,11 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt
// 更新VotesRecord // 更新VotesRecord
kv = append(kv, &types.KeyValue{Key: VotesRecord(voteProb.ProposalID), Value: types.Encode(&votes)}) kv = append(kv, &types.KeyValue{Key: VotesRecord(voteProb.ProposalID), Value: types.Encode(&votes)})
// 更新当前具有权利的董事会成员
if cur.VoteResult.Pass {
kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value:types.Encode(cur.PropBoard)})
}
ty := auty.TyLogVotePropBoard ty := auty.TyLogVotePropBoard
if cur.VoteResult.Pass { if cur.VoteResult.Pass {
ty = auty.TyLogTmintPropBoard ty = auty.TyLogTmintPropBoard
...@@ -324,6 +329,11 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types. ...@@ -324,6 +329,11 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types.
kv = append(kv, &types.KeyValue{Key: propBoardID(tmintProb.ProposalID), Value: types.Encode(&cur)}) kv = append(kv, &types.KeyValue{Key: propBoardID(tmintProb.ProposalID), Value: types.Encode(&cur)})
// 更新当前具有权利的董事会成员
if cur.VoteResult.Pass {
kv = append(kv, &types.KeyValue{Key: activeBoardID(), Value:types.Encode(cur.PropBoard)})
}
getReceiptLog(pre, &cur, auty.TyLogTmintPropBoard) getReceiptLog(pre, &cur, auty.TyLogTmintPropBoard)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
......
...@@ -27,6 +27,10 @@ var ( ...@@ -27,6 +27,10 @@ var (
localBoardPrefix = localPrefix + "board" + "-" localBoardPrefix = localPrefix + "board" + "-"
) )
func activeBoardID() []byte {
return []byte(fmt.Sprintf("%s", boardPrefix))
}
func propBoardID(txHash string) []byte { func propBoardID(txHash string) []byte {
return []byte(fmt.Sprintf("%s%s", boardPrefix, txHash)) return []byte(fmt.Sprintf("%s%s", boardPrefix, txHash))
} }
......
...@@ -13,8 +13,8 @@ import ( ...@@ -13,8 +13,8 @@ import (
) )
const ( const (
// 重大项目金额阈值 largeAmount = types.Coin * 100 *10000 // 重大项目金额阈值
largeAmount = types.Coin * 100 *10000 publicPeriod = 120960 // 公示一周时间,以区块高度计算
) )
...@@ -159,6 +159,40 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -159,6 +159,40 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
return nil, err return nil, err
} }
// 董事会成员验证
value, err = a.db.Get(activeBoardID())
if err != nil {
err = auty.ErrNoActiveBoard
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "get activeBoardID failed",
voteProb.ProposalID, "err", err)
return nil, err
}
prob := &auty.ProposalBoard{}
err = types.Decode(value, prob)
if err != nil {
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "decode ProposalBoard failed",
voteProb.ProposalID, "err", err)
return nil, err
}
if len(prob.Boards) > maxBoards || len(prob.Boards) < minBoards {
err = auty.ErrNoActiveBoard
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "illegality boards number",
voteProb.ProposalID, "err", err)
return nil, err
}
var isBoard bool
for _, addr := range prob.Boards {
if addr == a.fromaddr {
isBoard = true
}
}
if !isBoard {
err = auty.ErrNoActiveBoard
alog.Error("votePropProject ", "addr", a.fromaddr, "this addr is not active board member",
voteProb.ProposalID, "err", err)
return nil, err
}
// 检查是否已经参与投票 // 检查是否已经参与投票
var votes auty.VotesRecord var votes auty.VotesRecord
value, err = a.db.Get(VotesRecord(voteProb.ProposalID)) value, err = a.db.Get(VotesRecord(voteProb.ProposalID))
...@@ -170,8 +204,116 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -170,8 +204,116 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
return nil, err return nil, err
} }
} }
for _, addr := range votes.Address {
if addr == a.fromaddr {
err := auty.ErrRepeatVoteAddr
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "repeat address ProposalID",
voteProb.ProposalID, "err", err)
return nil, err
}
}
// 更新已经投票地址
votes.Address = append(votes.Address, a.fromaddr)
// 更新投票结果
cur.BoardVoteRes.TotalVotes = int32(len(prob.Boards))
if voteProb.Approve {
cur.BoardVoteRes.ApproveVotes += 1
} else {
cur.BoardVoteRes.OpposeVotes += 1
}
var logs []*types.ReceiptLog
var kv []*types.KeyValue
if float32(cur.BoardVoteRes.ApproveVotes + cur.BoardVoteRes.OpposeVotes) / float32(cur.BoardVoteRes.TotalVotes) >= participationRate &&
float32(cur.BoardVoteRes.ApproveVotes) / float32(cur.BoardVoteRes.ApproveVotes + cur.BoardVoteRes.OpposeVotes) >= approveRate {
cur.BoardVoteRes.Pass = true
cur.PropProject.RealEndBlockHeight = a.height
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyAddr, a.execaddr, lockAmount)
if err != nil {
alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
key := propProjectID(voteProb.ProposalID)
cur.Status = auty.AutonomyStatusVotePropProject
if cur.BoardVoteRes.Pass {
if cur.PubVote.Publicity { // 进入公视
cur.Status = auty.AutonomyStatusPubVotePropProject
} else {
cur.Status = auty.AutonomyStatusTmintPropProject
}
}
value = types.Encode(&cur)
kv = append(kv, &types.KeyValue{Key: key, Value: value})
// 更新VotesRecord
kv = append(kv, &types.KeyValue{Key: VotesRecord(voteProb.ProposalID), Value: types.Encode(&votes)})
// 检查是否有重复 ty := auty.TyLogVotePropProject
if cur.BoardVoteRes.Pass {
if cur.PubVote.Publicity {
ty = auty.TyLogPubVotePropProject
} else {
ty = auty.TyLogTmintPropProject
}
}
receiptLog := getProjectReceiptLog(pre, &cur, int32(ty))
logs = append(logs, receiptLog)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
}
func (a *action) pubVotePropProject(voteProb *auty.PubVoteProposalProject) (*types.Receipt, error) {
// 获取GameID
value, err := a.db.Get(propProjectID(voteProb.ProposalID))
if err != nil {
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "get propProjectID failed",
voteProb.ProposalID, "err", err)
return nil, err
}
var cur auty.AutonomyProposalProject
err = types.Decode(value, &cur)
if err != nil {
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "decode AutonomyProposalProject failed",
voteProb.ProposalID, "err", err)
return nil, err
}
pre := copyAutonomyProposalProject(&cur)
start := cur.GetPropProject().StartBlockHeight
end := cur.GetPropProject().EndBlockHeight
real := cur.GetPropProject().RealEndBlockHeight
if start < a.height || end < a.height || (real != 0 && real < a.height) {
err := auty.ErrVotePeriod
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ProposalID",
voteProb.ProposalID, "err", err)
return nil, err
}
// 检查当前状态
if cur.Status != auty.AutonomyStatusProposalProject && cur.Status != auty.AutonomyStatusVotePropProject {
err := auty.ErrProposalStatus
alog.Error("votePropProject ", "addr", a.fromaddr, "status", cur.Status, "ProposalID",
voteProb.ProposalID, "err", err)
return nil, err
}
// 检查是否已经参与投票
var votes auty.VotesRecord
value, err = a.db.Get(VotesRecord(voteProb.ProposalID))
if err == nil {
err = types.Decode(value, &votes)
if err != nil {
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "decode VotesRecord failed",
voteProb.ProposalID, "err", err)
return nil, err
}
}
for _, addr := range votes.Address { for _, addr := range votes.Address {
if addr == a.fromaddr { if addr == a.fromaddr {
err := auty.ErrRepeatVoteAddr err := auty.ErrRepeatVoteAddr
...@@ -184,7 +326,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -184,7 +326,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
votes.Address = append(votes.Address, a.fromaddr) votes.Address = append(votes.Address, a.fromaddr)
if cur.GetBoardVoteRes().TotalVotes == 0 { //需要统计票数 if cur.GetBoardVoteRes().TotalVotes == 0 { //需要统计票数
addr := "16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp" addr := "16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp"
account, err := a.getStartHeightVoteAccount(addr, start) account, err := a.getStartHeightVoteAccount(addr, start)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -196,7 +338,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -196,7 +338,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
if err != nil { if err != nil {
return nil, err return nil, err
} }
if voteProb.Approve { if voteProb.voteProb {
cur.BoardVoteRes.ApproveVotes += int32(account.Balance/ticketPrice) cur.BoardVoteRes.ApproveVotes += int32(account.Balance/ticketPrice)
} else { } else {
cur.BoardVoteRes.OpposeVotes += int32(account.Balance/ticketPrice) cur.BoardVoteRes.OpposeVotes += int32(account.Balance/ticketPrice)
...@@ -240,11 +382,6 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -240,11 +382,6 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
} }
func (a *action) pubVotePropProject(voteProb *auty.PubVoteProposalProject) (*types.Receipt, error) {
return nil, nil
}
func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*types.Receipt, error) { func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*types.Receipt, error) {
// 获取GameID // 获取GameID
value, err := a.db.Get(propProjectID(tmintProb.ProposalID)) value, err := a.db.Get(propProjectID(tmintProb.ProposalID))
......
...@@ -27,10 +27,11 @@ const ( ...@@ -27,10 +27,11 @@ const (
TyLogVotePropBoard = 2103 TyLogVotePropBoard = 2103
TyLogTmintPropBoard = 2104 TyLogTmintPropBoard = 2104
TyLogPropProject = 2111 TyLogPropProject = 2111
TyLogRvkPropProject = 2112 TyLogRvkPropProject = 2112
TyLogVotePropProject = 2113 TyLogVotePropProject = 2113
TyLogTmintPropProject = 2114 TyLogPubVotePropProject = 2114
TyLogTmintPropProject = 2115
TyLogPropRule = 2121 TyLogPropRule = 2121
TyLogRvkPropRule = 2122 TyLogRvkPropRule = 2122
...@@ -73,6 +74,7 @@ const ( ...@@ -73,6 +74,7 @@ const (
AutonomyStatusProposalProject = iota + 1 AutonomyStatusProposalProject = iota + 1
AutonomyStatusRvkPropProject AutonomyStatusRvkPropProject
AutonomyStatusVotePropProject AutonomyStatusVotePropProject
AutonomyStatusPubVotePropProject
AutonomyStatusTmintPropProject AutonomyStatusTmintPropProject
) )
......
...@@ -19,4 +19,6 @@ var ( ...@@ -19,4 +19,6 @@ var (
ErrRevokeProposalPower = errors.New("ErrRevokeProposalPower") ErrRevokeProposalPower = errors.New("ErrRevokeProposalPower")
// ErrTerminatePeriod 不能终止 // ErrTerminatePeriod 不能终止
ErrTerminatePeriod = errors.New("ErrTerminatePeriod") ErrTerminatePeriod = errors.New("ErrTerminatePeriod")
// ErrNoActiveBoard 没有有效董事会
ErrNoActiveBoard = errors.New("ErrNoActiveBoard")
) )
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