Commit 2138931a authored by liuyuhang's avatar liuyuhang Committed by 33cn

add comment cmd

parent 19ee94ab
...@@ -53,6 +53,8 @@ func AutonomyCmd() *cobra.Command { ...@@ -53,6 +53,8 @@ func AutonomyCmd() *cobra.Command {
cmd.AddCommand( cmd.AddCommand(
TransferFundCmd(), TransferFundCmd(),
CommentProposalCmd(),
ShowProposalCommentCmd(),
) )
return cmd return cmd
......
...@@ -257,4 +257,84 @@ func transferFund(cmd *cobra.Command, args []string) { ...@@ -257,4 +257,84 @@ func transferFund(cmd *cobra.Command, args []string) {
var res string var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "autonomy.TransferFundTx", params, &res) ctx := jsonrpc.NewRPCCtx(rpcLaddr, "autonomy.TransferFundTx", params, &res)
ctx.RunWithoutMarshal() ctx.RunWithoutMarshal()
} }
\ No newline at end of file
// CommentProposalCmd 评论提案
func CommentProposalCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "comment",
Short: "comment proposal",
Run: commentProposal,
}
addCommentProposalflags(cmd)
return cmd
}
func addCommentProposalflags(cmd *cobra.Command) {
cmd.Flags().StringP("proposalID", "p", "", "proposal ID")
cmd.MarkFlagRequired("proposalID")
cmd.Flags().StringP("repCmtHash", "r", "", "reply Comment hash")
cmd.Flags().StringP("comment", "c", "", "comment")
cmd.MarkFlagRequired("comment")
}
func commentProposal(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
proposalID, _:= cmd.Flags().GetString("proposalID")
repCmtHash, _:= cmd.Flags().GetString("repCmtHash")
comment, _:= cmd.Flags().GetString("comment")
params := &auty.Comment{
ProposalID:proposalID,
RepCmtHash:repCmtHash,
Comment:comment,
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "autonomy.CommentProposalTx", params, &res)
ctx.RunWithoutMarshal()
}
// ShowProposalCommentCmd 显示提案评论查询信息
func ShowProposalCommentCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "showComment",
Short: "show proposal comment info",
Run: showProposalComment,
}
addShowProposalCommentflags(cmd)
return cmd
}
func addShowProposalCommentflags(cmd *cobra.Command) {
cmd.Flags().StringP("proposalID", "p", "", "proposal ID")
cmd.MarkFlagRequired("proposalID")
cmd.Flags().Int32P("count", "c", 0, "count")
cmd.Flags().Int32P("direction", "d", 0, "direction")
cmd.Flags().Int64P("index", "i", 0, "index")
}
func showProposalComment(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
propID, _:= cmd.Flags().GetString("proposalID")
count, _ := cmd.Flags().GetInt32("count")
direction, _ := cmd.Flags().GetInt32("direction")
index, _ := cmd.Flags().GetInt64("index")
var params rpctypes.Query4Jrpc
var rep interface{}
params.Execer = auty.AutonomyX
req := auty.ReqQueryProposalComment{
ProposalID: propID,
Count: count,
Direction: direction,
Index: index,
}
params.FuncName = auty.ListProposalComment
params.Payload = types.MustPBToJSON(&req)
rep = &auty.ReplyQueryProposalComment{}
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.Query", params, rep)
ctx.Run()
}
...@@ -16,6 +16,7 @@ var ( ...@@ -16,6 +16,7 @@ var (
alog = log.New("module", "execs.autonomy") alog = log.New("module", "execs.autonomy")
driverName = auty.AutonomyX driverName = auty.AutonomyX
autonomyAddr = address.ExecAddress(auty.AutonomyX) autonomyAddr = address.ExecAddress(auty.AutonomyX)
autonomyFundAddr = address.ExecAddress("autonomyfund")
) )
......
...@@ -220,7 +220,7 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt ...@@ -220,7 +220,7 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt
// 首次进入投票期,即将提案金转入自治系统地址 // 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalBoard { if cur.Status == auty.AutonomyStatusProposalBoard {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyAddr, a.execaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("votePropBoard ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err) alog.Error("votePropBoard ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err return nil, err
...@@ -311,7 +311,7 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types. ...@@ -311,7 +311,7 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types.
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用 // 未进行投票情况下,符合提案关闭的也需要扣除提案费用
if cur.Status == auty.AutonomyStatusProposalBoard { if cur.Status == auty.AutonomyStatusProposalBoard {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyAddr, a.execaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("votePropBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err) alog.Error("votePropBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err return nil, err
......
...@@ -319,7 +319,7 @@ func voteProposalBoard(t *testing.T, env *execEnv, exec drivers.Driver, stateDB ...@@ -319,7 +319,7 @@ func voteProposalBoard(t *testing.T, env *execEnv, exec drivers.Driver, stateDB
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(0), account.Frozen) require.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadExecAccount(autonomyAddr, address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyFundAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount), account.Balance) require.Equal(t, int64(proposalAmount), account.Balance)
// status // status
value, err := stateDB.Get(propBoardID(proposalID)) value, err := stateDB.Get(propBoardID(proposalID))
......
...@@ -75,4 +75,9 @@ func (a *Autonomy) ExecDelLocal_VotePropRule(payload *auty.VoteProposalRule, tx ...@@ -75,4 +75,9 @@ func (a *Autonomy) ExecDelLocal_VotePropRule(payload *auty.VoteProposalRule, tx
// ExecDelLocal_TmintPropRule 终止提案规则 // ExecDelLocal_TmintPropRule 终止提案规则
func (a *Autonomy) ExecDelLocal_TmintPropRule(payload *auty.TerminateProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (a *Autonomy) ExecDelLocal_TmintPropRule(payload *auty.TerminateProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return a.execDelLocalRule(receiptData) return a.execDelLocalRule(receiptData)
}
// ExecDelLocal_TmintPropRule 终止提案规则
func (a *Autonomy) ExecDelLocal_Comment(payload *auty.Comment, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return a.execDelLocalComment(receiptData)
} }
\ No newline at end of file
...@@ -38,18 +38,27 @@ func (a *action) propProject(prob *auty.ProposalProject) (*types.Receipt, error) ...@@ -38,18 +38,27 @@ func (a *action) propProject(prob *auty.ProposalProject) (*types.Receipt, error)
return nil, err return nil, err
} }
var logs []*types.ReceiptLog
var kv []*types.KeyValue
// 冻结提案金
receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, rule.ProposalAmount) receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, rule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", rule.ProposalAmount) alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen proposal amount", rule.ProposalAmount, "error", err)
return nil, err return nil, err
} }
var logs []*types.ReceiptLog
var kv []*types.KeyValue
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
// 冻结项目金
receiptPrj, err := a.coinsAccount.ExecFrozen(autonomyFundAddr, a.execaddr, prob.Amount)
if err != nil {
alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen project amount", prob.Amount, "error", err)
return nil, err
}
logs = append(logs, receiptPrj.Logs...)
kv = append(kv, receiptPrj.KV...)
var isPubVote bool var isPubVote bool
if prob.Amount >= rule.LargeProjectAmount { if prob.Amount >= rule.LargeProjectAmount {
isPubVote = true isPubVote = true
...@@ -107,6 +116,7 @@ func (a *action) rvkPropProject(rvkProb *auty.RevokeProposalProject) (*types.Rec ...@@ -107,6 +116,7 @@ func (a *action) rvkPropProject(rvkProb *auty.RevokeProposalProject) (*types.Rec
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
// 解冻提案金
receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("rvkPropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurRule.ProposalAmount, "err", err) alog.Error("rvkPropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive amount", cur.CurRule.ProposalAmount, "err", err)
...@@ -115,6 +125,15 @@ func (a *action) rvkPropProject(rvkProb *auty.RevokeProposalProject) (*types.Rec ...@@ -115,6 +125,15 @@ func (a *action) rvkPropProject(rvkProb *auty.RevokeProposalProject) (*types.Rec
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
// 解冻项目金
receiptPrj, err := a.coinsAccount.ExecActive(autonomyFundAddr, a.execaddr, cur.PropProject.Amount)
if err != nil {
alog.Error("rvkPropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive project amount", cur.PropProject.Amount, "error", err)
return nil, err
}
logs = append(logs, receiptPrj.Logs...)
kv = append(kv, receiptPrj.KV...)
cur.Status = auty.AutonomyStatusRvkPropProject cur.Status = auty.AutonomyStatusRvkPropProject
kv = append(kv, &types.KeyValue{Key: propProjectID(rvkProb.ProposalID), Value: types.Encode(cur)}) kv = append(kv, &types.KeyValue{Key: propProjectID(rvkProb.ProposalID), Value: types.Encode(cur)})
...@@ -191,7 +210,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -191,7 +210,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
// 首次进入投票期,即将提案金转入自治系统地址 // 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalProject { if cur.Status == auty.AutonomyStatusProposalProject {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyAddr, a.execaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err) alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err return nil, err
...@@ -218,9 +237,9 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec ...@@ -218,9 +237,9 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
} else { } else {
cur.Status = auty.AutonomyStatusTmintPropProject cur.Status = auty.AutonomyStatusTmintPropProject
// 提案通过,将工程金额从基金付款给承包商 // 提案通过,将工程金额从基金付款给承包商
receipt, err := a.coinsAccount.ExecTransfer(autonomyAddr, cur.PropProject.ToAddr, a.execaddr, cur.PropProject.Amount) receipt, err := a.coinsAccount.ExecTransferFrozen(autonomyFundAddr, cur.PropProject.ToAddr, a.execaddr, cur.PropProject.Amount)
if err != nil { if err != nil {
alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransfer to contractor project amount fail", err) alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen to contractor project amount fail", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -304,8 +323,17 @@ func (a *action) pubVotePropProject(voteProb *auty.PubVoteProposalProject) (*typ ...@@ -304,8 +323,17 @@ func (a *action) pubVotePropProject(voteProb *auty.PubVoteProposalProject) (*typ
if cur.PubVote.TotalVotes != 0 && if cur.PubVote.TotalVotes != 0 &&
float32(cur.PubVote.OpposeVotes) / float32(cur.PubVote.TotalVotes) >= float32(cur.CurRule.PubOpposeRatio) / 100.0 { float32(cur.PubVote.OpposeVotes) / float32(cur.PubVote.TotalVotes) >= float32(cur.CurRule.PubOpposeRatio) / 100.0 {
cur.PubVote.PubPass = false
cur.PubVote.PubPass = false
cur.PropProject.RealEndBlockHeight = a.height cur.PropProject.RealEndBlockHeight = a.height
// 解冻项目金
receiptPrj, err := a.coinsAccount.ExecActive(autonomyFundAddr, a.execaddr, cur.PropProject.Amount)
if err != nil {
alog.Error("pubVotePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive project amount", cur.PropProject.Amount, "error", err)
return nil, err
}
logs = append(logs, receiptPrj.Logs...)
kv = append(kv, receiptPrj.KV...)
} }
key := propProjectID(voteProb.ProposalID) key := propProjectID(voteProb.ProposalID)
...@@ -394,9 +422,9 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty ...@@ -394,9 +422,9 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty
// 如果为提案状态,则判断是否需要扣除提案费 // 如果为提案状态,则判断是否需要扣除提案费
if cur.Status == auty.AutonomyStatusProposalProject && a.height > end { if cur.Status == auty.AutonomyStatusProposalProject && a.height > end {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyAddr, a.execaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err) alog.Error("tmintPropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
...@@ -404,15 +432,24 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty ...@@ -404,15 +432,24 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty
} }
if (cur.PubVote.Publicity && cur.PubVote.PubPass) || // 需要公示且公示通过 if (cur.PubVote.Publicity && cur.PubVote.PubPass) || // 需要公示且公示通过
(!cur.PubVote.Publicity && cur.BoardVoteRes.Pass){ // 不需要公示且董事会通过 (!cur.PubVote.Publicity && cur.BoardVoteRes.Pass) { // 不需要公示且董事会通过
// 提案通过,将工程金额从基金付款给承包商 // 提案通过,将工程金额从基金付款给承包商
receipt, err := a.coinsAccount.ExecTransfer(autonomyAddr, cur.PropProject.ToAddr, a.execaddr, cur.PropProject.Amount) receipt, err := a.coinsAccount.ExecTransferFrozen(autonomyFundAddr, cur.PropProject.ToAddr, a.execaddr, cur.PropProject.Amount)
if err != nil { if err != nil {
alog.Error("tmintPropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransfer to contractor project amount fail", err) alog.Error("tmintPropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen to contractor project amount fail", 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...)
} else {
// 解冻项目金
receiptPrj, err := a.coinsAccount.ExecActive(autonomyFundAddr, a.execaddr, cur.PropProject.Amount)
if err != nil {
alog.Error("tmintPropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecActive project amount", cur.PropProject.Amount, "error", err)
return nil, err
}
logs = append(logs, receiptPrj.Logs...)
kv = append(kv, receiptPrj.KV...)
} }
cur.Status = auty.AutonomyStatusTmintPropProject cur.Status = auty.AutonomyStatusTmintPropProject
......
...@@ -59,6 +59,17 @@ func InitRule(stateDB dbm.KV) { ...@@ -59,6 +59,17 @@ func InitRule(stateDB dbm.KV) {
stateDB.Set(activeRuleID(), types.Encode(rule)) stateDB.Set(activeRuleID(), types.Encode(rule))
} }
func InitFund(stateDB dbm.KV, amount int64) {
accountA := types.Account{
Balance: amount,
Frozen: 0,
Addr: autonomyFundAddr,
}
accCoin := account.NewCoinsAccount()
accCoin.SetDB(stateDB)
accCoin.SaveExecAccount(autonomyAddr, &accountA)
}
func TestPropProject(t *testing.T) { func TestPropProject(t *testing.T) {
env, exec, _, _ := InitEnv() env, exec, _, _ := InitEnv()
...@@ -110,6 +121,7 @@ func TestPropProject(t *testing.T) { ...@@ -110,6 +121,7 @@ func TestPropProject(t *testing.T) {
func TestRevokeProposalProject(t *testing.T) { func TestRevokeProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv() env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB) InitBoard(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject // PropProject
testPropProject(t, env, exec, stateDB, kvdb, true) testPropProject(t, env, exec, stateDB, kvdb, true)
//RevokeProposalProject //RevokeProposalProject
...@@ -119,6 +131,7 @@ func TestRevokeProposalProject(t *testing.T) { ...@@ -119,6 +131,7 @@ func TestRevokeProposalProject(t *testing.T) {
func TestVoteProposalProject(t *testing.T) { func TestVoteProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv() env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB) InitBoard(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject // PropProject
testPropProject(t, env, exec, stateDB, kvdb, true) testPropProject(t, env, exec, stateDB, kvdb, true)
//voteProposalProject //voteProposalProject
...@@ -131,6 +144,7 @@ func TestPubVoteProposalProject(t *testing.T) { ...@@ -131,6 +144,7 @@ func TestPubVoteProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv() env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB) InitBoard(stateDB)
InitRule(stateDB) InitRule(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject // PropProject
testPropProject(t, env, exec, stateDB, kvdb, true) testPropProject(t, env, exec, stateDB, kvdb, true)
// voteProposalProject // voteProposalProject
...@@ -145,6 +159,7 @@ func TestPubVoteProposalProject(t *testing.T) { ...@@ -145,6 +159,7 @@ func TestPubVoteProposalProject(t *testing.T) {
func TestTerminateProposalProject(t *testing.T) { func TestTerminateProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv() env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB) InitBoard(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject // PropProject
testPropProject(t, env, exec, stateDB, kvdb, true) testPropProject(t, env, exec, stateDB, kvdb, true)
//terminateProposalProject //terminateProposalProject
...@@ -360,8 +375,8 @@ func checkVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID str ...@@ -360,8 +375,8 @@ func checkVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID str
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(0), account.Frozen) require.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadExecAccount(autonomyAddr, address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyFundAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount) - testProjectAmount, account.Balance) require.Equal(t, int64(proposalAmount), account.Balance)
// status // status
value, err := stateDB.Get(propProjectID(proposalID)) value, err := stateDB.Get(propProjectID(proposalID))
require.NoError(t, err) require.NoError(t, err)
...@@ -459,8 +474,8 @@ func checkPubVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID ...@@ -459,8 +474,8 @@ func checkPubVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(0), account.Frozen) require.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadExecAccount(autonomyAddr, address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyFundAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount), account.Balance) require.Equal(t, int64(proposalAmount) + testProjectAmount, account.Balance)
// status // status
value, err := stateDB.Get(propProjectID(proposalID)) value, err := stateDB.Get(propProjectID(proposalID))
require.NoError(t, err) require.NoError(t, err)
......
...@@ -39,4 +39,10 @@ func (a *Autonomy) Query_GetProposalRule(in *types.ReqString) (types.Message, er ...@@ -39,4 +39,10 @@ func (a *Autonomy) Query_GetProposalRule(in *types.ReqString) (types.Message, er
// Query_ListProposalRule 批量查询 // Query_ListProposalRule 批量查询
func (a *Autonomy) Query_ListProposalRule(in *auty.ReqQueryProposalRule) (types.Message, error) { func (a *Autonomy) Query_ListProposalRule(in *auty.ReqQueryProposalRule) (types.Message, error) {
return a.listProposalRule(in) return a.listProposalRule(in)
}
// Query_ListProposalComment 批量查询提案评论
func (a *Autonomy) Query_ListProposalComment(in *auty.ReqQueryProposalComment) (types.Message, error) {
return a.listProposalComment(in)
} }
\ No newline at end of file
...@@ -173,7 +173,74 @@ func (a *Autonomy) execLocalComment(receiptData *types.ReceiptData) (*types.Loca ...@@ -173,7 +173,74 @@ func (a *Autonomy) execLocalComment(receiptData *types.ReceiptData) (*types.Loca
func saveCommentHeightIndex(res *auty.ReceiptProposalComment) (kvs []*types.KeyValue) { func saveCommentHeightIndex(res *auty.ReceiptProposalComment) (kvs []*types.KeyValue) {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcCommentHeight(res.Cmt.ProposalID, dapp.HeightIndexStr(res.Height, int64(res.Index))) kv.Key = calcCommentHeight(res.Cmt.ProposalID, dapp.HeightIndexStr(res.Height, int64(res.Index)))
kv.Value = types.Encode(&types.ReqString{Data:res.Cmt.Comment}) kv.Value = types.Encode(&auty.RelationCmt{RepCmtHash: res.Cmt.RepCmtHash, Comment: res.Cmt.Comment})
kvs = append(kvs, kv) kvs = append(kvs, kv)
return kvs return kvs
}
func (a *Autonomy) execDelLocalComment(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
var set []*types.KeyValue
for _, log := range receiptData.Logs {
switch log.Ty {
case auty.TyLogCommentProp:
{
var receipt auty.ReceiptProposalComment
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
kv := delCommentHeightIndex(&receipt)
set = append(set, kv...)
}
default:
break
}
}
dbSet.KV = append(dbSet.KV, set...)
return dbSet, nil
}
func delCommentHeightIndex(res *auty.ReceiptProposalComment) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
kv.Key = calcCommentHeight(res.Cmt.ProposalID, dapp.HeightIndexStr(res.Height, int64(res.Index)))
kv.Value = nil
kvs = append(kvs, kv)
return kvs
}
func (a *Autonomy) listProposalComment(req *auty.ReqQueryProposalComment) (types.Message, error) {
if req == nil {
return nil, types.ErrInvalidParam
}
var key []byte
var values [][]byte
var err error
localDb := a.GetLocalDB()
if req.GetIndex() == -1 {
key = nil
} else { //翻页查找指定的txhash列表
heightstr := genHeightIndexStr(req.GetIndex())
key = calcCommentHeight(req.ProposalID, heightstr)
}
prefix := calcCommentHeight(req.ProposalID, "")
values, err = localDb.List(prefix, key, req.Count, req.GetDirection())
if err != nil {
return nil, err
}
if len(values) == 0 {
return nil, types.ErrNotFound
}
var rep auty.ReplyQueryProposalComment
for _, value := range values {
cmt := &auty.RelationCmt{}
err = types.Decode(value, cmt)
if err != nil {
return nil, err
}
rep.RltCmt = append(rep.RltCmt, cmt)
}
return &rep, nil
} }
\ No newline at end of file
...@@ -188,7 +188,7 @@ func (a *action) votePropRule(voteProb *auty.VoteProposalRule) (*types.Receipt, ...@@ -188,7 +188,7 @@ func (a *action) votePropRule(voteProb *auty.VoteProposalRule) (*types.Receipt,
// 首次进入投票期,即将提案金转入自治系统地址 // 首次进入投票期,即将提案金转入自治系统地址
if cur.Status == auty.AutonomyStatusProposalRule { if cur.Status == auty.AutonomyStatusProposalRule {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyAddr, a.execaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("votePropRule ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err) alog.Error("votePropRule ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err return nil, err
...@@ -281,7 +281,7 @@ func (a *action) tmintPropRule(tmintProb *auty.TerminateProposalRule) (*types.Re ...@@ -281,7 +281,7 @@ func (a *action) tmintPropRule(tmintProb *auty.TerminateProposalRule) (*types.Re
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用 // 未进行投票情况下,符合提案关闭的也需要扣除提案费用
if cur.Status == auty.AutonomyStatusProposalRule { if cur.Status == auty.AutonomyStatusProposalRule {
receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyAddr, a.execaddr, cur.CurRule.ProposalAmount) receipt, err := a.coinsAccount.ExecTransferFrozen(cur.Address, autonomyFundAddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil { if err != nil {
alog.Error("votePropRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err) alog.Error("votePropRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err return nil, err
...@@ -315,7 +315,7 @@ func (a *action) transfer(tf *auty.TransferFund) (*types.Receipt, error) { ...@@ -315,7 +315,7 @@ func (a *action) transfer(tf *auty.TransferFund) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
var kv []*types.KeyValue var kv []*types.KeyValue
receipt, err := a.coinsAccount.ExecTransfer(a.fromaddr, autonomyAddr, a.execaddr, tf.Amount) receipt, err := a.coinsAccount.ExecTransfer(a.fromaddr, autonomyFundAddr, a.execaddr, tf.Amount)
if err != nil { if err != nil {
alog.Error("autonomy transfer ", "addr", a.fromaddr, "amount", tf.Amount, "ExecTransfer fail", err) alog.Error("autonomy transfer ", "addr", a.fromaddr, "amount", tf.Amount, "ExecTransfer fail", err)
return nil, err return nil, err
......
...@@ -263,7 +263,7 @@ func voteProposalRule(t *testing.T, env *execEnv, exec drivers.Driver, stateDB d ...@@ -263,7 +263,7 @@ func voteProposalRule(t *testing.T, env *execEnv, exec drivers.Driver, stateDB d
accCoin.SetDB(stateDB) accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX)) account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(0), account.Frozen) require.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadExecAccount(autonomyAddr, address.ExecAddress(auty.AutonomyX)) account = accCoin.LoadExecAccount(autonomyFundAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount), account.Balance) require.Equal(t, int64(proposalAmount), account.Balance)
// status // status
value, err := stateDB.Get(propRuleID(proposalID)) value, err := stateDB.Get(propRuleID(proposalID))
......
...@@ -80,11 +80,29 @@ message TransferFund { ...@@ -80,11 +80,29 @@ message TransferFund {
// Comment action // Comment action
message Comment { message Comment {
string proposalID = 1; string proposalID = 1;
string comment = 2; string repCmtHash = 2;
string comment = 3;
} }
message ReceiptProposalComment { message ReceiptProposalComment {
Comment cmt = 1; Comment cmt = 1;
int64 height = 2; int64 height = 2;
int32 index = 3; int32 index = 3;
}
// query
message ReqQueryProposalComment {
string proposalID = 1;
int32 count = 2;
int32 direction = 3;
int64 index = 4;
}
message RelationCmt {
string repCmtHash = 1;
string comment = 2;
}
message ReplyQueryProposalComment {
repeated RelationCmt rltCmt = 1;
} }
\ No newline at end of file
...@@ -199,4 +199,18 @@ func (c *Jrpc) TransferFundTx(parm *auty.TransferFund, result *interface{}) erro ...@@ -199,4 +199,18 @@ func (c *Jrpc) TransferFundTx(parm *auty.TransferFund, result *interface{}) erro
*result = hex.EncodeToString(reply.Data) *result = hex.EncodeToString(reply.Data)
return nil return nil
}
// CommentProposalTx 提案评论
func (c *Jrpc) CommentProposalTx(parm *auty.Comment, result *interface{}) error {
if parm == nil {
return types.ErrInvalidParam
}
reply, err := c.cli.commentProposal(context.Background(), parm)
if err != nil {
return err
}
*result = hex.EncodeToString(reply.Data)
return nil
} }
\ No newline at end of file
...@@ -222,4 +222,19 @@ func (c *channelClient) transferFund(ctx context.Context, head *auty.TransferFun ...@@ -222,4 +222,19 @@ func (c *channelClient) transferFund(ctx context.Context, head *auty.TransferFun
return nil, err return nil, err
} }
return &types.UnsignTx{Data: data}, nil return &types.UnsignTx{Data: data}, nil
}
func (c *channelClient) commentProposal(ctx context.Context, head *auty.Comment) (*types.UnsignTx, error) {
val := &auty.AutonomyAction{
Ty: auty.AutonomyActionCommentProp,
Value: &auty.AutonomyAction_CommentProp{CommentProp: head},
}
tx := &types.Transaction{
Payload: types.Encode(val),
}
data, err := types.FormatTxEncode(types.ExecName(auty.AutonomyX), tx)
if err != nil {
return nil, err
}
return &types.UnsignTx{Data: data}, nil
} }
\ No newline at end of file
...@@ -48,6 +48,9 @@ It has these top-level messages: ...@@ -48,6 +48,9 @@ It has these top-level messages:
TransferFund TransferFund
Comment Comment
ReceiptProposalComment ReceiptProposalComment
ReqQueryProposalComment
RelationCmt
ReplyQueryProposalComment
*/ */
package types package types
......
...@@ -23,6 +23,7 @@ const ( ...@@ -23,6 +23,7 @@ const (
AutonomyActionTmintPropRule AutonomyActionTmintPropRule
AutonomyActionTransfer AutonomyActionTransfer
AutonomyActionCommentProp
//log for autonomy //log for autonomy
TyLogPropBoard = 2101 TyLogPropBoard = 2101
...@@ -80,6 +81,8 @@ const ( ...@@ -80,6 +81,8 @@ const (
GetProposalRule = "GetProposalRule" GetProposalRule = "GetProposalRule"
// ListProposalRule // ListProposalRule
ListProposalRule = "ListProposalRule" ListProposalRule = "ListProposalRule"
// ListProposalComment
ListProposalComment = "ListProposalComment"
) )
......
This diff is collapsed.
...@@ -62,6 +62,9 @@ func (a *AutonomyType) GetLogMap() map[int64]*types.LogInfo { ...@@ -62,6 +62,9 @@ func (a *AutonomyType) GetLogMap() map[int64]*types.LogInfo {
TyLogRvkPropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogRvkPropRule"}, TyLogRvkPropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogRvkPropRule"},
TyLogVotePropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogVotePropRule"}, TyLogVotePropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogVotePropRule"},
TyLogTmintPropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogTmintPropRule"}, TyLogTmintPropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogTmintPropRule"},
TyLogCommentProp: {Ty: reflect.TypeOf(ReceiptProposalComment{}), Name: "LogCommentProp"},
} }
} }
...@@ -90,5 +93,6 @@ func (a *AutonomyType) GetTypeMap() map[string]int32 { ...@@ -90,5 +93,6 @@ func (a *AutonomyType) GetTypeMap() map[string]int32 {
"TmintPropRule": AutonomyActionTmintPropRule, "TmintPropRule": AutonomyActionTmintPropRule,
"Transfer": AutonomyActionTransfer, "Transfer": AutonomyActionTransfer,
"CommentProp": AutonomyActionCommentProp,
} }
} }
\ 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