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

add comment cmd

parent 19ee94ab
......@@ -53,6 +53,8 @@ func AutonomyCmd() *cobra.Command {
cmd.AddCommand(
TransferFundCmd(),
CommentProposalCmd(),
ShowProposalCommentCmd(),
)
return cmd
......
......@@ -257,4 +257,84 @@ func transferFund(cmd *cobra.Command, args []string) {
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "autonomy.TransferFundTx", params, &res)
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 (
alog = log.New("module", "execs.autonomy")
driverName = auty.AutonomyX
autonomyAddr = address.ExecAddress(auty.AutonomyX)
autonomyFundAddr = address.ExecAddress("autonomyfund")
)
......
......@@ -220,7 +220,7 @@ func (a *action) votePropBoard(voteProb *auty.VoteProposalBoard) (*types.Receipt
// 首次进入投票期,即将提案金转入自治系统地址
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 {
alog.Error("votePropBoard ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
......@@ -311,7 +311,7 @@ func (a *action) tmintPropBoard(tmintProb *auty.TerminateProposalBoard) (*types.
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用
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 {
alog.Error("votePropBoard ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
......
......@@ -319,7 +319,7 @@ func voteProposalBoard(t *testing.T, env *execEnv, exec drivers.Driver, stateDB
accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
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)
// status
value, err := stateDB.Get(propBoardID(proposalID))
......
......@@ -75,4 +75,9 @@ func (a *Autonomy) ExecDelLocal_VotePropRule(payload *auty.VoteProposalRule, tx
// ExecDelLocal_TmintPropRule 终止提案规则
func (a *Autonomy) ExecDelLocal_TmintPropRule(payload *auty.TerminateProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
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)
return nil, err
}
var logs []*types.ReceiptLog
var kv []*types.KeyValue
// 冻结提案金
receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, rule.ProposalAmount)
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
}
var logs []*types.ReceiptLog
var kv []*types.KeyValue
logs = append(logs, receipt.Logs...)
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
if prob.Amount >= rule.LargeProjectAmount {
isPubVote = true
......@@ -107,6 +116,7 @@ func (a *action) rvkPropProject(rvkProb *auty.RevokeProposalProject) (*types.Rec
var logs []*types.ReceiptLog
var kv []*types.KeyValue
// 解冻提案金
receipt, err := a.coinsAccount.ExecActive(a.fromaddr, a.execaddr, cur.CurRule.ProposalAmount)
if err != nil {
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
logs = append(logs, receipt.Logs...)
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
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
// 首次进入投票期,即将提案金转入自治系统地址
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 {
alog.Error("votePropProject ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
......@@ -218,9 +237,9 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
} else {
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 {
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
}
logs = append(logs, receipt.Logs...)
......@@ -304,8 +323,17 @@ func (a *action) pubVotePropProject(voteProb *auty.PubVoteProposalProject) (*typ
if cur.PubVote.TotalVotes != 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
// 解冻项目金
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)
......@@ -394,9 +422,9 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty
// 如果为提案状态,则判断是否需要扣除提案费
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 {
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
}
logs = append(logs, receipt.Logs...)
......@@ -404,15 +432,24 @@ func (a *action) tmintPropProject(tmintProb *auty.TerminateProposalProject) (*ty
}
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 {
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
}
logs = append(logs, receipt.Logs...)
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
......
......@@ -59,6 +59,17 @@ func InitRule(stateDB dbm.KV) {
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) {
env, exec, _, _ := InitEnv()
......@@ -110,6 +121,7 @@ func TestPropProject(t *testing.T) {
func TestRevokeProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject
testPropProject(t, env, exec, stateDB, kvdb, true)
//RevokeProposalProject
......@@ -119,6 +131,7 @@ func TestRevokeProposalProject(t *testing.T) {
func TestVoteProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject
testPropProject(t, env, exec, stateDB, kvdb, true)
//voteProposalProject
......@@ -131,6 +144,7 @@ func TestPubVoteProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB)
InitRule(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject
testPropProject(t, env, exec, stateDB, kvdb, true)
// voteProposalProject
......@@ -145,6 +159,7 @@ func TestPubVoteProposalProject(t *testing.T) {
func TestTerminateProposalProject(t *testing.T) {
env, exec, stateDB, kvdb := InitEnv()
InitBoard(stateDB)
InitFund(stateDB, testProjectAmount)
// PropProject
testPropProject(t, env, exec, stateDB, kvdb, true)
//terminateProposalProject
......@@ -360,8 +375,8 @@ func checkVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID str
accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadExecAccount(autonomyAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount) - testProjectAmount, account.Balance)
account = accCoin.LoadExecAccount(autonomyFundAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount), account.Balance)
// status
value, err := stateDB.Get(propProjectID(proposalID))
require.NoError(t, err)
......@@ -459,8 +474,8 @@ func checkPubVoteProposalProjectResult(t *testing.T, stateDB dbm.KV, proposalID
accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(0), account.Frozen)
account = accCoin.LoadExecAccount(autonomyAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount), account.Balance)
account = accCoin.LoadExecAccount(autonomyFundAddr, address.ExecAddress(auty.AutonomyX))
require.Equal(t, int64(proposalAmount) + testProjectAmount, account.Balance)
// status
value, err := stateDB.Get(propProjectID(proposalID))
require.NoError(t, err)
......
......@@ -39,4 +39,10 @@ func (a *Autonomy) Query_GetProposalRule(in *types.ReqString) (types.Message, er
// Query_ListProposalRule 批量查询
func (a *Autonomy) Query_ListProposalRule(in *auty.ReqQueryProposalRule) (types.Message, error) {
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
func saveCommentHeightIndex(res *auty.ReceiptProposalComment) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
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)
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,
// 首次进入投票期,即将提案金转入自治系统地址
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 {
alog.Error("votePropRule ", "addr", cur.Address, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
......@@ -281,7 +281,7 @@ func (a *action) tmintPropRule(tmintProb *auty.TerminateProposalRule) (*types.Re
// 未进行投票情况下,符合提案关闭的也需要扣除提案费用
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 {
alog.Error("votePropRule ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecTransferFrozen amount fail", err)
return nil, err
......@@ -315,7 +315,7 @@ func (a *action) transfer(tf *auty.TransferFund) (*types.Receipt, error) {
var logs []*types.ReceiptLog
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 {
alog.Error("autonomy transfer ", "addr", a.fromaddr, "amount", tf.Amount, "ExecTransfer fail", err)
return nil, err
......
......@@ -263,7 +263,7 @@ func voteProposalRule(t *testing.T, env *execEnv, exec drivers.Driver, stateDB d
accCoin.SetDB(stateDB)
account := accCoin.LoadExecAccount(AddrA, address.ExecAddress(auty.AutonomyX))
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)
// status
value, err := stateDB.Get(propRuleID(proposalID))
......
......@@ -80,11 +80,29 @@ message TransferFund {
// Comment action
message Comment {
string proposalID = 1;
string comment = 2;
string repCmtHash = 2;
string comment = 3;
}
message ReceiptProposalComment {
Comment cmt = 1;
int64 height = 2;
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
*result = hex.EncodeToString(reply.Data)
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
return nil, err
}
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:
TransferFund
Comment
ReceiptProposalComment
ReqQueryProposalComment
RelationCmt
ReplyQueryProposalComment
*/
package types
......
......@@ -23,6 +23,7 @@ const (
AutonomyActionTmintPropRule
AutonomyActionTransfer
AutonomyActionCommentProp
//log for autonomy
TyLogPropBoard = 2101
......@@ -80,6 +81,8 @@ const (
GetProposalRule = "GetProposalRule"
// ListProposalRule
ListProposalRule = "ListProposalRule"
// ListProposalComment
ListProposalComment = "ListProposalComment"
)
......
This diff is collapsed.
......@@ -62,6 +62,9 @@ func (a *AutonomyType) GetLogMap() map[int64]*types.LogInfo {
TyLogRvkPropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogRvkPropRule"},
TyLogVotePropRule: {Ty: reflect.TypeOf(ReceiptProposalRule{}), Name: "LogVotePropRule"},
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 {
"TmintPropRule": AutonomyActionTmintPropRule,
"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