Commit d2526d02 authored by mdj33's avatar mdj33 Committed by vipwzw

autonomy add item proposal

parent 9c037e47
......@@ -132,6 +132,10 @@ function base_init() {
sed -i $sedfix 's/^enableReduceLocaldb=.*/enableReduceLocaldb=false/g' chain33.toml
sed -i $sedfix 's/^enablePushSubscribe=.*/enablePushSubscribe=true/g' chain33.toml
fi
#autonomy config
sed -i $sedfix 's/^autonomyExec =.*/autonomyExec=""/g' chain33.toml
}
function start() {
......
......@@ -113,8 +113,8 @@ ParaRemoteGrpcClient="localhost:8802"
startHeight=345850
#主链指定高度后等待块数,防止主链回滚,联盟链最小为1,小于1则采用缺省高度100
#waitMainBlockNum=100
#打包时间间隔,单位
writeBlockSeconds=2
#等待打包主链区块时间间隔,单位毫
writeBlockMsec=2000
#共识节点账户,共识节点需要配置自己的账户,并且钱包导入对应种子,非共识节点留空
authAccount=""
#创世地址额度
......@@ -380,6 +380,7 @@ ForkUnfreezeIDX= 0
[fork.sub.autonomy]
Enable=0
ForkAutonomyDelRule=0
ForkAutonomyEnableItem=0
[fork.sub.jsvm]
Enable=0
......
......@@ -118,8 +118,8 @@ ParaRemoteGrpcClient="localhost:8802"
startHeight=345850
#主链指定高度后等待块数,防止主链回滚,联盟链最小为1,小于1则采用缺省高度100
#waitMainBlockNum=100
#检索主链最新区块时间间隔,单位
writeBlockSeconds=2
#等待打包主链区块时间间隔,单位毫
writeBlockMsec=2000
#共识节点账户,共识节点需要配置自己的账户,并且钱包导入对应种子,非共识节点留空
authAccount=""
#创世地址额度
......@@ -385,6 +385,7 @@ ForkUnfreezeIDX= 0
[fork.sub.autonomy]
Enable=0
ForkAutonomyDelRule=0
ForkAutonomyEnableItem=0
[fork.sub.jsvm]
Enable=0
......
......@@ -277,6 +277,9 @@ superManager=[
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
]
#autonomy执行器名字
autonomyExec="autonomy"
[exec.sub.paracross]
nodeGroupFrozenCoins=0
#平行链共识停止后主链等待的高度
......
......@@ -35,7 +35,7 @@ const (
//current miner tx take any privatekey for unify all nodes sign purpose, and para chain is free
minerPrivateKey = "6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b"
defaultGenesisAmount int64 = 1e8
poolMainBlockSec int64 = 5
poolMainBlockMsec int64 = 5000
defaultEmptyBlockInterval int64 = 50 //write empty block every interval blocks in mainchain
defaultSearchMatchedBlockDepth int32 = 10000
)
......@@ -70,7 +70,7 @@ type client struct {
}
type subConfig struct {
WriteBlockSeconds int64 `json:"writeBlockSeconds,omitempty"`
WriteBlockMsec int64 `json:"writeBlockMsec,omitempty"`
ParaRemoteGrpcClient string `json:"paraRemoteGrpcClient,omitempty"`
StartHeight int64 `json:"startHeight,omitempty"`
WaitMainBlockNum int64 `json:"waitMainBlockNum,omitempty"`
......@@ -105,8 +105,8 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
subcfg.GenesisAmount = defaultGenesisAmount
}
if subcfg.WriteBlockSeconds <= 0 {
subcfg.WriteBlockSeconds = poolMainBlockSec
if subcfg.WriteBlockMsec <= 0 {
subcfg.WriteBlockMsec = poolMainBlockMsec
}
//WaitMainBlockNum 配置最小为1,因为genesis块是startHeight-1, wait=1和startHeight相等
......@@ -291,7 +291,7 @@ func (client *client) GetStartMainHash(height int64) []byte {
}
if height > 0 {
hint := time.NewTicker(time.Second * time.Duration(client.subCfg.WriteBlockSeconds))
hint := time.NewTicker(time.Second)
for lastHeight < height+client.subCfg.WaitMainBlockNum {
select {
case <-hint.C:
......
......@@ -537,7 +537,7 @@ out:
if err == nil {
continue
}
time.Sleep(time.Second * time.Duration(client.subCfg.WriteBlockSeconds))
time.Sleep(time.Millisecond * time.Duration(client.subCfg.WriteBlockMsec))
continue
}
......
......@@ -69,6 +69,15 @@ func AutonomyCmd() *cobra.Command {
ShowProposalChangeCmd(),
)
// item
cmd.AddCommand(
ProposalItemCmd(),
RevokeProposalItemCmd(),
VoteProposalItemCmd(),
TerminateProposalItemCmd(),
ShowProposalItemCmd(),
)
return cmd
}
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package commands
import (
"encoding/json"
jsonrpc "github.com/33cn/chain33/rpc/jsonclient"
rpctypes "github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types"
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
"github.com/spf13/cobra"
)
// ProposalItemCmd 创建提案命令
func ProposalItemCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "proposalItem",
Short: "create proposal Item",
Run: proposalItem,
}
addProposalItemFlags(cmd)
return cmd
}
func addProposalItemFlags(cmd *cobra.Command) {
cmd.Flags().Int32P("year", "y", 0, "year")
cmd.Flags().Int32P("month", "m", 0, "month")
cmd.Flags().Int32P("day", "d", 0, "day")
cmd.Flags().StringP("itemTxHash", "i", "", "the tx to apply check")
cmd.MarkFlagRequired("itemTxHash")
cmd.Flags().StringP("exec", "x", "", "last stage proposal ID")
cmd.Flags().StringP("description", "p", "", "description item")
cmd.Flags().Int64P("startBlock", "s", 0, "start block height")
cmd.MarkFlagRequired("startBlock")
cmd.Flags().Int64P("endBlock", "e", 0, "end block height")
cmd.MarkFlagRequired("endBlock")
}
func proposalItem(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
paraName, _ := cmd.Flags().GetString("paraName")
year, _ := cmd.Flags().GetInt32("year")
month, _ := cmd.Flags().GetInt32("month")
day, _ := cmd.Flags().GetInt32("day")
txHash, _ := cmd.Flags().GetString("itemTxHash")
exec, _ := cmd.Flags().GetString("exec")
description, _ := cmd.Flags().GetString("description")
startBlock, _ := cmd.Flags().GetInt64("startBlock")
endBlock, _ := cmd.Flags().GetInt64("endBlock")
params := &auty.ProposalItem{
Year: year,
Month: month,
Day: day,
ItemTxHash: txHash,
Exec: exec,
Description: description,
StartBlockHeight: startBlock,
EndBlockHeight: endBlock,
}
payLoad, err := json.Marshal(params)
if err != nil {
return
}
pm := &rpctypes.CreateTxIn{
Execer: types.GetExecName(auty.AutonomyX, paraName),
ActionName: "PropItem",
Payload: payLoad,
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", pm, &res)
ctx.RunWithoutMarshal()
}
// RevokeProposalItemCmd 撤销提案
func RevokeProposalItemCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "revokeItem",
Short: "revoke proposal Item",
Run: revokeProposalItem,
}
addRevokeProposalItemFlags(cmd)
return cmd
}
func addRevokeProposalItemFlags(cmd *cobra.Command) {
cmd.Flags().StringP("proposalID", "p", "", "proposal ID")
cmd.MarkFlagRequired("proposalID")
}
func revokeProposalItem(cmd *cobra.Command, args []string) {
paraName, _ := cmd.Flags().GetString("paraName")
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
ID, _ := cmd.Flags().GetString("proposalID")
params := &auty.RevokeProposalItem{
ProposalID: ID,
}
payLoad, err := json.Marshal(params)
if err != nil {
return
}
pm := &rpctypes.CreateTxIn{
Execer: types.GetExecName(auty.AutonomyX, paraName),
ActionName: "RvkPropItem",
Payload: payLoad,
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", pm, &res)
ctx.RunWithoutMarshal()
}
// VoteProposalItemCmd 投票提案
func VoteProposalItemCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "voteItem",
Short: "vote proposal Item",
Run: voteProposalItem,
}
addVoteProposalItemFlags(cmd)
return cmd
}
func addVoteProposalItemFlags(cmd *cobra.Command) {
cmd.Flags().StringP("proposalID", "p", "", "proposal ID")
cmd.MarkFlagRequired("proposalID")
cmd.Flags().Int32P("approve", "r", 1, "1:approve, 2:oppose, 3:quit, default 1")
}
func voteProposalItem(cmd *cobra.Command, args []string) {
paraName, _ := cmd.Flags().GetString("paraName")
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
ID, _ := cmd.Flags().GetString("proposalID")
approve, _ := cmd.Flags().GetInt32("approve")
params := &auty.VoteProposalItem{
ProposalID: ID,
Vote: auty.AutonomyVoteOption(approve),
}
payLoad, err := json.Marshal(params)
if err != nil {
return
}
pm := &rpctypes.CreateTxIn{
Execer: types.GetExecName(auty.AutonomyX, paraName),
ActionName: "VotePropItem",
Payload: payLoad,
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", pm, &res)
ctx.RunWithoutMarshal()
}
// TerminateProposalItemCmd 终止提案
func TerminateProposalItemCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "terminateItem",
Short: "terminate proposal Item",
Run: terminateProposalItem,
}
addTerminateProposalItemFlags(cmd)
return cmd
}
func addTerminateProposalItemFlags(cmd *cobra.Command) {
cmd.Flags().StringP("proposalID", "p", "", "proposal ID")
cmd.MarkFlagRequired("proposalID")
}
func terminateProposalItem(cmd *cobra.Command, args []string) {
paraName, _ := cmd.Flags().GetString("paraName")
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
ID, _ := cmd.Flags().GetString("proposalID")
params := &auty.RevokeProposalItem{
ProposalID: ID,
}
payLoad, err := json.Marshal(params)
if err != nil {
return
}
pm := &rpctypes.CreateTxIn{
Execer: types.GetExecName(auty.AutonomyX, paraName),
ActionName: "TmintPropItem",
Payload: payLoad,
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", pm, &res)
ctx.RunWithoutMarshal()
}
// ShowProposalItemCmd 显示提案查询信息
func ShowProposalItemCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "showItem",
Short: "show proposal Item info",
Run: showProposalItem,
}
addShowProposalItemflags(cmd)
return cmd
}
func addShowProposalItemflags(cmd *cobra.Command) {
cmd.Flags().Uint32P("type", "y", 0, "type(0:query by hash; 1:list)")
cmd.MarkFlagRequired("type")
cmd.Flags().StringP("proposalID", "p", "", "proposal ID")
cmd.Flags().Uint32P("status", "s", 0, "status")
cmd.Flags().StringP("addr", "a", "", "address")
cmd.Flags().Int32P("count", "c", 1, "count, default is 1")
cmd.Flags().Int32P("direction", "d", 0, "direction, default is reserve")
cmd.Flags().Int64P("height", "t", -1, "height, default is -1")
cmd.Flags().Int32P("index", "i", -1, "index, default is -1")
}
func showProposalItem(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
typ, _ := cmd.Flags().GetUint32("type")
propID, _ := cmd.Flags().GetString("proposalID")
status, _ := cmd.Flags().GetUint32("status")
addr, _ := cmd.Flags().GetString("addr")
count, _ := cmd.Flags().GetInt32("count")
direction, _ := cmd.Flags().GetInt32("direction")
height, _ := cmd.Flags().GetInt64("height")
index, _ := cmd.Flags().GetInt32("index")
var params rpctypes.Query4Jrpc
var rep interface{}
params.Execer = auty.AutonomyX
if 0 == typ {
req := types.ReqString{
Data: propID,
}
params.FuncName = auty.GetProposalItem
params.Payload = types.MustPBToJSON(&req)
rep = &auty.ReplyQueryProposalItem{}
} else if 1 == typ {
req := auty.ReqQueryProposalItem{
Status: int32(status),
Addr: addr,
Count: count,
Direction: direction,
Height: height,
Index: index,
}
params.FuncName = auty.ListProposalItem
params.Payload = types.MustPBToJSON(&req)
rep = &auty.ReplyQueryProposalItem{}
}
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.Query", params, rep)
ctx.Run()
}
......@@ -7,6 +7,7 @@ package executor
import (
"github.com/33cn/chain33/types"
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
"github.com/pkg/errors"
)
// 提案董事会相关
......@@ -133,24 +134,36 @@ func (a *Autonomy) Exec_TmintPropChange(payload *auty.TerminateProposalChange, t
// Exec_PropChange 创建事项规则
func (a *Autonomy) Exec_PropItem(payload *auty.ProposalItem, tx *types.Transaction, index int) (*types.Receipt, error) {
if !a.GetAPI().GetConfig().IsDappFork(a.GetHeight(), auty.AutonomyX, auty.ForkAutonomyEnableItem) {
return nil, errors.Wrapf(types.ErrActionNotSupport, "not after fork")
}
action := newAction(a, tx, int32(index))
return action.propItem(payload)
}
// Exec_RvkPropItem 撤销事项规则
func (a *Autonomy) Exec_RvkPropItem(payload *auty.RevokeProposalItem, tx *types.Transaction, index int) (*types.Receipt, error) {
if !a.GetAPI().GetConfig().IsDappFork(a.GetHeight(), auty.AutonomyX, auty.ForkAutonomyEnableItem) {
return nil, errors.Wrapf(types.ErrActionNotSupport, "not after fork")
}
action := newAction(a, tx, int32(index))
return action.rvkPropItem(payload)
}
// Exec_VotePropItem 投票事项规则
func (a *Autonomy) Exec_VotePropItem(payload *auty.VoteProposalItem, tx *types.Transaction, index int) (*types.Receipt, error) {
if !a.GetAPI().GetConfig().IsDappFork(a.GetHeight(), auty.AutonomyX, auty.ForkAutonomyEnableItem) {
return nil, errors.Wrapf(types.ErrActionNotSupport, "not after fork")
}
action := newAction(a, tx, int32(index))
return action.votePropItem(payload)
}
// Exec_TmintPropItem 终止事项规则
func (a *Autonomy) Exec_TmintPropItem(payload *auty.TerminateProposalItem, tx *types.Transaction, index int) (*types.Receipt, error) {
if !a.GetAPI().GetConfig().IsDappFork(a.GetHeight(), auty.AutonomyX, auty.ForkAutonomyEnableItem) {
return nil, errors.Wrapf(types.ErrActionNotSupport, "not after fork")
}
action := newAction(a, tx, int32(index))
return action.tmintPropItem(payload)
}
......@@ -5,7 +5,6 @@
package executor
import (
"fmt"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
......@@ -108,7 +107,7 @@ func (a *Autonomy) listProposalItem(req *auty.ReqQueryProposalItem) (types.Messa
return &rep, nil
}
func getProposalItemDb(db dbm.KV, req *types.ReqString) (*auty.ReplyQueryProposalItem, error) {
func getProposalItem(db dbm.KV, req *types.ReqString) (*auty.ReplyQueryProposalItem, error) {
if req == nil || len(req.Data) <= 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "invalid parameter")
}
......@@ -127,48 +126,38 @@ func getProposalItemDb(db dbm.KV, req *types.ReqString) (*auty.ReplyQueryProposa
}
// IsAutonomyApprovedItem get 2 parameters: autonomyItemID, applyTxHash
func IsAutonomyApprovedItem(db dbm.KV, req *types.ReqStrings) (types.Message, error) {
rep := &types.Reply{IsOk: false}
func IsAutonomyApprovedItem(db dbm.KV, req *types.ReqMultiStrings) (types.Message, error) {
if req == nil {
rep.Msg = []byte("req is nill")
return rep, types.ErrInvalidParam
return nil, errors.Wrapf(types.ErrInvalidParam, "req is nil")
}
if len(req.Datas) < 2 {
rep.Msg = []byte("req datas less 2 parameters")
return rep, types.ErrInvalidParam
return nil, errors.Wrapf(types.ErrInvalidParam, "req datas less 2 parameters")
}
autonomyItemID := req.Datas[0]
applyTxHash := req.Datas[1]
res, err := getProposalItemDb(db, &types.ReqString{Data: autonomyItemID})
res, err := getProposalItem(db, &types.ReqString{Data: autonomyItemID})
if err != nil {
rep.Msg = []byte(err.Error())
return rep, err
return nil, err
}
if len(res.GetPropItems()) <= 0 {
rep.Msg = []byte("not found item")
return rep, types.ErrNotFound
return nil, errors.Wrapf(types.ErrNotFound, "not get item")
}
if res.PropItems[0].ProposalID != autonomyItemID {
rep.Msg = []byte(fmt.Sprintf("res prop id=%s not equal query=%s", res.PropItems[0].ProposalID, autonomyItemID))
return rep, errors.Wrapf(types.ErrInvalidParam, "item id=%s,req=%s", res.PropItems[0].ProposalID, autonomyItemID)
return nil, errors.Wrapf(types.ErrInvalidParam, "get prop id=%s not equal req=%s", res.PropItems[0].ProposalID, autonomyItemID)
}
if res.PropItems[0].PropItem.ItemTxHash != applyTxHash {
rep.Msg = []byte(fmt.Sprintf("res item tx id=%s not equal query=%s", res.PropItems[0].PropItem.ItemTxHash, applyTxHash))
return rep, errors.Wrapf(types.ErrInvalidParam, "item txHash=%s,req=%s", res.PropItems[0].PropItem.ItemTxHash, applyTxHash)
return nil, errors.Wrapf(types.ErrInvalidParam, "get item id=%s != req=%s", res.PropItems[0].PropItem.ItemTxHash, applyTxHash)
}
if res.PropItems[0].Status == auty.AutonomyStatusTmintPropItem && res.PropItems[0].BoardVoteRes.Pass {
rep.IsOk = true
return rep, nil
return &types.Reply{IsOk: true}, nil
}
if res.PropItems[0].Status != auty.AutonomyStatusTmintPropItem {
rep.Msg = []byte(fmt.Sprintf("item status =%d not terminate", res.PropItems[0].Status))
return rep, errors.Wrapf(types.ErrNotAllow, "item status =%d not terminate", res.PropItems[0].Status)
return nil, errors.Wrapf(types.ErrNotAllow, "item status =%d not terminate", res.PropItems[0].Status)
}
rep.Msg = []byte(fmt.Sprintf("item vote status not pass = %v", res.PropItems[0].BoardVoteRes.Pass))
return rep, errors.Wrap(types.ErrNotAllow, "item vote status not pass")
return nil, errors.Wrapf(types.ErrNotAllow, "item vote status not pass = %v", res.PropItems[0].BoardVoteRes.Pass)
}
......@@ -16,11 +16,7 @@ const (
)
func (a *action) propItem(prob *auty.ProposalItem) (*types.Receipt, error) {
//itemTx 不能等待太久,太久需要重新申请
if a.height > prob.ItemTxBlockHeight+itemWaitBlockNumber {
return nil, errors.Wrapf(types.ErrInvalidParam, "itemTx wait too long, curHeight=%d,itemTx=%d", a.height, prob.ItemTxBlockHeight)
}
//start和end之间不能小于720高度,end不能超过当前高度+100w
if prob.StartBlockHeight < a.height || prob.StartBlockHeight >= prob.EndBlockHeight ||
prob.StartBlockHeight+startEndBlockPeriod > prob.EndBlockHeight ||
prob.EndBlockHeight > a.height+propEndBlockPeriod ||
......@@ -179,7 +175,7 @@ func (a *action) votePropItem(voteProb *auty.VoteProposalItem) (*types.Receipt,
if err != nil {
alog.Error("votePropItem ", "addr", a.fromaddr, "execaddr", a.execaddr, "checkVotesRecord boardVotesRecord failed",
voteProb.ProposalID, "err", err)
return nil, err
return nil, errors.Wrapf(err, "check votes record from addr=%s", a.fromaddr)
}
// 更新已经投票地址
......@@ -242,7 +238,7 @@ func (a *action) tmintPropItem(tmintProb *auty.TerminateProposalItem) (*types.Re
if err != nil {
alog.Error("tmintPropItem ", "addr", a.fromaddr, "execaddr", a.execaddr, "getProposalItem failed",
tmintProb.ProposalID, "err", err)
return nil, err
return nil, errors.Wrapf(err, "get item id=%s", tmintProb.ProposalID)
}
pre := copyAutonomyProposalItem(cur)
......@@ -252,7 +248,7 @@ func (a *action) tmintPropItem(tmintProb *auty.TerminateProposalItem) (*types.Re
err := auty.ErrProposalStatus
alog.Error("tmintPropItem ", "addr", a.fromaddr, "status", cur.Status, "status is not match",
tmintProb.ProposalID, "err", err)
return nil, err
return nil, errors.Wrapf(err, "cur status=%d", cur.Status)
}
// 董事会投票期间不能终止
......@@ -261,7 +257,7 @@ func (a *action) tmintPropItem(tmintProb *auty.TerminateProposalItem) (*types.Re
err := auty.ErrTerminatePeriod
alog.Error("tmintPropItem ", "addr", a.fromaddr, "status", cur.Status, "height", a.height,
"in board vote period can not terminate", tmintProb.ProposalID, "err", err)
return nil, err
return nil, errors.Wrapf(err, "vote period not should be terminated")
}
if cur.BoardVoteRes.TotalVotes != 0 && cur.BoardVoteRes.TotalVotes > cur.BoardVoteRes.QuitVotes &&
......
......@@ -64,7 +64,17 @@ func (a *Autonomy) Query_ListProposalChange(in *auty.ReqQueryProposalChange) (ty
return a.listProposalChange(in)
}
// Query_GetProposalItem 查询提案
func (a *Autonomy) Query_GetProposalItem(in *types.ReqString) (types.Message, error) {
return getProposalItem(a.GetStateDB(), in)
}
// Query_ListProposalItem 批量查询
func (a *Autonomy) Query_ListProposalItem(in *auty.ReqQueryProposalItem) (types.Message, error) {
return a.listProposalItem(in)
}
// Query_GetProposalChange 查询提案修改董事会成员
func (a *Autonomy) Query_IsAutonomyApprovedItem(in *types.ReqStrings) (types.Message, error) {
func (a *Autonomy) Query_IsAutonomyApprovedItem(in *types.ReqMultiStrings) (types.Message, error) {
return IsAutonomyApprovedItem(a.GetStateDB(), in)
}
......@@ -35,7 +35,6 @@ message ProposalItem {
// 项目相关
string itemTxHash = 4; // item tx hash
string exec = 5; // 合约执行器
int64 itemTxBlockHeight = 6; //需要设置区块高度,太久的item不处理
string description = 7; // 简述
// 投票相关
......
......@@ -129,6 +129,11 @@ const (
GetProposalChange = "GetProposalChange"
// ListProposalChange 查询多个
ListProposalChange = "ListProposalChange"
// GetProposalItem 用于在cmd里面的区分不同的查询
GetProposalItem = "GetProposalItem"
// ListProposalItem 查询多个
ListProposalItem = "ListProposalItem"
)
//包的名字可以通过配置文件来配置
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
// protoc v3.9.1
// source: item.proto
package types
import (
reflect "reflect"
sync "sync"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type AutonomyProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
PropItem *ProposalItem `protobuf:"bytes,1,opt,name=propItem,proto3" json:"propItem,omitempty"`
// 投票该提案的规则
CurRule *RuleConfig `protobuf:"bytes,2,opt,name=curRule,proto3" json:"curRule,omitempty"`
// 投票该提案的董事会成员
Boards []string `protobuf:"bytes,3,rep,name=boards,proto3" json:"boards,omitempty"`
// 董事会投票结果
BoardVoteRes *VoteResult `protobuf:"bytes,4,opt,name=boardVoteRes,proto3" json:"boardVoteRes,omitempty"`
// 状态
Status int32 `protobuf:"varint,6,opt,name=status,proto3" json:"status,omitempty"`
Address string `protobuf:"bytes,7,opt,name=address,proto3" json:"address,omitempty"`
Height int64 `protobuf:"varint,8,opt,name=height,proto3" json:"height,omitempty"`
Index int32 `protobuf:"varint,9,opt,name=index,proto3" json:"index,omitempty"`
ProposalID string `protobuf:"bytes,10,opt,name=proposalID,proto3" json:"proposalID,omitempty"`
}
func (x *AutonomyProposalItem) Reset() {
*x = AutonomyProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *AutonomyProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*AutonomyProposalItem) ProtoMessage() {}
func (x *AutonomyProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use AutonomyProposalItem.ProtoReflect.Descriptor instead.
func (*AutonomyProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{0}
}
func (x *AutonomyProposalItem) GetPropItem() *ProposalItem {
if x != nil {
return x.PropItem
}
return nil
}
func (x *AutonomyProposalItem) GetCurRule() *RuleConfig {
if x != nil {
return x.CurRule
}
return nil
}
func (x *AutonomyProposalItem) GetBoards() []string {
if x != nil {
return x.Boards
}
return nil
}
func (x *AutonomyProposalItem) GetBoardVoteRes() *VoteResult {
if x != nil {
return x.BoardVoteRes
}
return nil
}
func (x *AutonomyProposalItem) GetStatus() int32 {
if x != nil {
return x.Status
}
return 0
}
func (x *AutonomyProposalItem) GetAddress() string {
if x != nil {
return x.Address
}
return ""
}
func (x *AutonomyProposalItem) GetHeight() int64 {
if x != nil {
return x.Height
}
return 0
}
func (x *AutonomyProposalItem) GetIndex() int32 {
if x != nil {
return x.Index
}
return 0
}
func (x *AutonomyProposalItem) GetProposalID() string {
if x != nil {
return x.ProposalID
}
return ""
}
type ProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// 提案时间
Year int32 `protobuf:"varint,1,opt,name=year,proto3" json:"year,omitempty"`
Month int32 `protobuf:"varint,2,opt,name=month,proto3" json:"month,omitempty"`
Day int32 `protobuf:"varint,3,opt,name=day,proto3" json:"day,omitempty"`
// 项目相关
ItemTxHash string `protobuf:"bytes,4,opt,name=itemTxHash,proto3" json:"itemTxHash,omitempty"` // item tx hash
Exec string `protobuf:"bytes,5,opt,name=exec,proto3" json:"exec,omitempty"` // 合约执行器
Description string `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"` // 简述
// 投票相关
StartBlockHeight int64 `protobuf:"varint,12,opt,name=startBlockHeight,proto3" json:"startBlockHeight,omitempty"` // 提案开始投票高度
EndBlockHeight int64 `protobuf:"varint,13,opt,name=endBlockHeight,proto3" json:"endBlockHeight,omitempty"` // 提案结束投票高度
RealEndBlockHeight int64 `protobuf:"varint,14,opt,name=realEndBlockHeight,proto3" json:"realEndBlockHeight,omitempty"` // 实际提案结束投票高度
ProjectNeedBlockNum int32 `protobuf:"varint,15,opt,name=projectNeedBlockNum,proto3" json:"projectNeedBlockNum,omitempty"` // 以提案结束投票高度为准,需要项目需要消耗的区块数目所对应的时间
}
func (x *ProposalItem) Reset() {
*x = ProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ProposalItem) ProtoMessage() {}
func (x *ProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ProposalItem.ProtoReflect.Descriptor instead.
func (*ProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{1}
}
func (x *ProposalItem) GetYear() int32 {
if x != nil {
return x.Year
}
return 0
}
func (x *ProposalItem) GetMonth() int32 {
if x != nil {
return x.Month
}
return 0
}
func (x *ProposalItem) GetDay() int32 {
if x != nil {
return x.Day
}
return 0
}
func (x *ProposalItem) GetItemTxHash() string {
if x != nil {
return x.ItemTxHash
}
return ""
}
func (x *ProposalItem) GetExec() string {
if x != nil {
return x.Exec
}
return ""
}
func (x *ProposalItem) GetDescription() string {
if x != nil {
return x.Description
}
return ""
}
func (x *ProposalItem) GetStartBlockHeight() int64 {
if x != nil {
return x.StartBlockHeight
}
return 0
}
func (x *ProposalItem) GetEndBlockHeight() int64 {
if x != nil {
return x.EndBlockHeight
}
return 0
}
func (x *ProposalItem) GetRealEndBlockHeight() int64 {
if x != nil {
return x.RealEndBlockHeight
}
return 0
}
func (x *ProposalItem) GetProjectNeedBlockNum() int32 {
if x != nil {
return x.ProjectNeedBlockNum
}
return 0
}
type RevokeProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ProposalID string `protobuf:"bytes,1,opt,name=proposalID,proto3" json:"proposalID,omitempty"`
}
func (x *RevokeProposalItem) Reset() {
*x = RevokeProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *RevokeProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RevokeProposalItem) ProtoMessage() {}
func (x *RevokeProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use RevokeProposalItem.ProtoReflect.Descriptor instead.
func (*RevokeProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{2}
}
func (x *RevokeProposalItem) GetProposalID() string {
if x != nil {
return x.ProposalID
}
return ""
}
type VoteProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ProposalID string `protobuf:"bytes,1,opt,name=proposalID,proto3" json:"proposalID,omitempty"`
Approve bool `protobuf:"varint,2,opt,name=approve,proto3" json:"approve,omitempty"`
Vote AutonomyVoteOption `protobuf:"varint,3,opt,name=vote,proto3,enum=types.AutonomyVoteOption" json:"vote,omitempty"`
}
func (x *VoteProposalItem) Reset() {
*x = VoteProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *VoteProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*VoteProposalItem) ProtoMessage() {}
func (x *VoteProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use VoteProposalItem.ProtoReflect.Descriptor instead.
func (*VoteProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{3}
}
func (x *VoteProposalItem) GetProposalID() string {
if x != nil {
return x.ProposalID
}
return ""
}
func (x *VoteProposalItem) GetApprove() bool {
if x != nil {
return x.Approve
}
return false
}
func (x *VoteProposalItem) GetVote() AutonomyVoteOption {
if x != nil {
return x.Vote
}
return AutonomyVoteOption_NOJOIN
}
type TerminateProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ProposalID string `protobuf:"bytes,1,opt,name=proposalID,proto3" json:"proposalID,omitempty"`
}
func (x *TerminateProposalItem) Reset() {
*x = TerminateProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *TerminateProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*TerminateProposalItem) ProtoMessage() {}
func (x *TerminateProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use TerminateProposalItem.ProtoReflect.Descriptor instead.
func (*TerminateProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{4}
}
func (x *TerminateProposalItem) GetProposalID() string {
if x != nil {
return x.ProposalID
}
return ""
}
// receipt
type ReceiptProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Prev *AutonomyProposalItem `protobuf:"bytes,1,opt,name=prev,proto3" json:"prev,omitempty"`
Current *AutonomyProposalItem `protobuf:"bytes,2,opt,name=current,proto3" json:"current,omitempty"`
}
func (x *ReceiptProposalItem) Reset() {
*x = ReceiptProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ReceiptProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ReceiptProposalItem) ProtoMessage() {}
func (x *ReceiptProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ReceiptProposalItem.ProtoReflect.Descriptor instead.
func (*ReceiptProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{5}
}
func (x *ReceiptProposalItem) GetPrev() *AutonomyProposalItem {
if x != nil {
return x.Prev
}
return nil
}
func (x *ReceiptProposalItem) GetCurrent() *AutonomyProposalItem {
if x != nil {
return x.Current
}
return nil
}
type LocalProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
PropItem *AutonomyProposalItem `protobuf:"bytes,1,opt,name=propItem,proto3" json:"propItem,omitempty"`
Comments []string `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`
}
func (x *LocalProposalItem) Reset() {
*x = LocalProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *LocalProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*LocalProposalItem) ProtoMessage() {}
func (x *LocalProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use LocalProposalItem.ProtoReflect.Descriptor instead.
func (*LocalProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{6}
}
func (x *LocalProposalItem) GetPropItem() *AutonomyProposalItem {
if x != nil {
return x.PropItem
}
return nil
}
func (x *LocalProposalItem) GetComments() []string {
if x != nil {
return x.Comments
}
return nil
}
// query
type ReqQueryProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Status int32 `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
Count int32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"`
Direction int32 `protobuf:"varint,4,opt,name=direction,proto3" json:"direction,omitempty"`
Height int64 `protobuf:"varint,5,opt,name=height,proto3" json:"height,omitempty"`
Index int32 `protobuf:"varint,6,opt,name=index,proto3" json:"index,omitempty"`
}
func (x *ReqQueryProposalItem) Reset() {
*x = ReqQueryProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ReqQueryProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ReqQueryProposalItem) ProtoMessage() {}
func (x *ReqQueryProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ReqQueryProposalItem.ProtoReflect.Descriptor instead.
func (*ReqQueryProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{7}
}
func (x *ReqQueryProposalItem) GetStatus() int32 {
if x != nil {
return x.Status
}
return 0
}
func (x *ReqQueryProposalItem) GetAddr() string {
if x != nil {
return x.Addr
}
return ""
}
func (x *ReqQueryProposalItem) GetCount() int32 {
if x != nil {
return x.Count
}
return 0
}
func (x *ReqQueryProposalItem) GetDirection() int32 {
if x != nil {
return x.Direction
}
return 0
}
func (x *ReqQueryProposalItem) GetHeight() int64 {
if x != nil {
return x.Height
}
return 0
}
func (x *ReqQueryProposalItem) GetIndex() int32 {
if x != nil {
return x.Index
}
return 0
}
type ReplyQueryProposalItem struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
PropItems []*AutonomyProposalItem `protobuf:"bytes,1,rep,name=propItems,proto3" json:"propItems,omitempty"`
}
func (x *ReplyQueryProposalItem) Reset() {
*x = ReplyQueryProposalItem{}
if protoimpl.UnsafeEnabled {
mi := &file_item_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ReplyQueryProposalItem) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ReplyQueryProposalItem) ProtoMessage() {}
func (x *ReplyQueryProposalItem) ProtoReflect() protoreflect.Message {
mi := &file_item_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ReplyQueryProposalItem.ProtoReflect.Descriptor instead.
func (*ReplyQueryProposalItem) Descriptor() ([]byte, []int) {
return file_item_proto_rawDescGZIP(), []int{8}
}
func (x *ReplyQueryProposalItem) GetPropItems() []*AutonomyProposalItem {
if x != nil {
return x.PropItems
}
return nil
}
var File_item_proto protoreflect.FileDescriptor
var file_item_proto_rawDesc = []byte{
0x0a, 0x0a, 0x69, 0x74, 0x65, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x74, 0x79,
0x70, 0x65, 0x73, 0x1a, 0x0d, 0x6c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x22, 0xc3, 0x02, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x50,
0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x08, 0x70,
0x72, 0x6f, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74,
0x65, 0x6d, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2b, 0x0a, 0x07,
0x63, 0x75, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e,
0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
0x52, 0x07, 0x63, 0x75, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x6f, 0x61,
0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x62, 0x6f, 0x61, 0x72, 0x64,
0x73, 0x12, 0x35, 0x0a, 0x0c, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x65,
0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
0x56, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0c, 0x62, 0x6f, 0x61, 0x72,
0x64, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28,
0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65,
0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67,
0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28,
0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70,
0x6f, 0x73, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72,
0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x44, 0x22, 0xd6, 0x02, 0x0a, 0x0c, 0x50, 0x72, 0x6f,
0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61,
0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x14, 0x0a,
0x05, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x6f,
0x6e, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,
0x52, 0x03, 0x64, 0x61, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x74, 0x65, 0x6d, 0x54, 0x78, 0x48,
0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x74, 0x65, 0x6d, 0x54,
0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x78, 0x65, 0x63, 0x18, 0x05, 0x20,
0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x78, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x73,
0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18,
0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63,
0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x6e, 0x64, 0x42, 0x6c,
0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52,
0x0e, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12,
0x2e, 0x0a, 0x12, 0x72, 0x65, 0x61, 0x6c, 0x45, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48,
0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x72, 0x65, 0x61,
0x6c, 0x45, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12,
0x30, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x42, 0x6c,
0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x70, 0x72,
0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75,
0x6d, 0x22, 0x34, 0x0a, 0x12, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f,
0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f,
0x73, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f,
0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x44, 0x22, 0x7b, 0x0a, 0x10, 0x56, 0x6f, 0x74, 0x65, 0x50,
0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x70,
0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x61,
0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x70,
0x70, 0x72, 0x6f, 0x76, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20,
0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f,
0x6e, 0x6f, 0x6d, 0x79, 0x56, 0x6f, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04,
0x76, 0x6f, 0x74, 0x65, 0x22, 0x37, 0x0a, 0x15, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74,
0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1e, 0x0a,
0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x44, 0x22, 0x7d, 0x0a,
0x13, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c,
0x49, 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x04, 0x70, 0x72, 0x65, 0x76, 0x18, 0x01, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x6e,
0x6f, 0x6d, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x52,
0x04, 0x70, 0x72, 0x65, 0x76, 0x12, 0x35, 0x0a, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41,
0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49,
0x74, 0x65, 0x6d, 0x52, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x68, 0x0a, 0x11,
0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65,
0x6d, 0x12, 0x37, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f,
0x6e, 0x6f, 0x6d, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d,
0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f,
0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f,
0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x71, 0x51, 0x75,
0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x12,
0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18,
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,
0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52,
0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78,
0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x53, 0x0a,
0x16, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f,
0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x49,
0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70,
0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f,
0x73, 0x61, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x49, 0x74, 0x65,
0x6d, 0x73, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2e, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_item_proto_rawDescOnce sync.Once
file_item_proto_rawDescData = file_item_proto_rawDesc
)
func file_item_proto_rawDescGZIP() []byte {
file_item_proto_rawDescOnce.Do(func() {
file_item_proto_rawDescData = protoimpl.X.CompressGZIP(file_item_proto_rawDescData)
})
return file_item_proto_rawDescData
}
var file_item_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
var file_item_proto_goTypes = []interface{}{
(*AutonomyProposalItem)(nil), // 0: types.AutonomyProposalItem
(*ProposalItem)(nil), // 1: types.ProposalItem
(*RevokeProposalItem)(nil), // 2: types.RevokeProposalItem
(*VoteProposalItem)(nil), // 3: types.VoteProposalItem
(*TerminateProposalItem)(nil), // 4: types.TerminateProposalItem
(*ReceiptProposalItem)(nil), // 5: types.ReceiptProposalItem
(*LocalProposalItem)(nil), // 6: types.LocalProposalItem
(*ReqQueryProposalItem)(nil), // 7: types.ReqQueryProposalItem
(*ReplyQueryProposalItem)(nil), // 8: types.ReplyQueryProposalItem
(*RuleConfig)(nil), // 9: types.RuleConfig
(*VoteResult)(nil), // 10: types.VoteResult
(AutonomyVoteOption)(0), // 11: types.AutonomyVoteOption
}
var file_item_proto_depIdxs = []int32{
1, // 0: types.AutonomyProposalItem.propItem:type_name -> types.ProposalItem
9, // 1: types.AutonomyProposalItem.curRule:type_name -> types.RuleConfig
10, // 2: types.AutonomyProposalItem.boardVoteRes:type_name -> types.VoteResult
11, // 3: types.VoteProposalItem.vote:type_name -> types.AutonomyVoteOption
0, // 4: types.ReceiptProposalItem.prev:type_name -> types.AutonomyProposalItem
0, // 5: types.ReceiptProposalItem.current:type_name -> types.AutonomyProposalItem
0, // 6: types.LocalProposalItem.propItem:type_name -> types.AutonomyProposalItem
0, // 7: types.ReplyQueryProposalItem.propItems:type_name -> types.AutonomyProposalItem
8, // [8:8] is the sub-list for method output_type
8, // [8:8] is the sub-list for method input_type
8, // [8:8] is the sub-list for extension type_name
8, // [8:8] is the sub-list for extension extendee
0, // [0:8] is the sub-list for field type_name
}
func init() { file_item_proto_init() }
func file_item_proto_init() {
if File_item_proto != nil {
return
}
file_lcommon_proto_init()
if !protoimpl.UnsafeEnabled {
file_item_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AutonomyProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RevokeProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*VoteProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TerminateProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ReceiptProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*LocalProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ReqQueryProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_item_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ReplyQueryProposalItem); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_item_proto_rawDesc,
NumEnums: 0,
NumMessages: 9,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_item_proto_goTypes,
DependencyIndexes: file_item_proto_depIdxs,
MessageInfos: file_item_proto_msgTypes,
}.Build()
File_item_proto = out.File
file_item_proto_rawDesc = nil
file_item_proto_goTypes = nil
file_item_proto_depIdxs = nil
}
......@@ -15,6 +15,8 @@ var name string
var (
//ForkAutonomyDelRule fork for delete boards member rules
ForkAutonomyDelRule = "ForkAutonomyDelRule"
//ForkAutonomyEnableItem fork for add autonomy item support
ForkAutonomyEnableItem = "ForkAutonomyEnableItem"
)
func init() {
......@@ -28,6 +30,7 @@ func init() {
func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(AutonomyX, "Enable", 0)
cfg.RegisterDappFork(AutonomyX, ForkAutonomyDelRule, 9500000)
cfg.RegisterDappFork(AutonomyX, ForkAutonomyEnableItem, 10000000)
}
//InitExecutor ...
......@@ -78,6 +81,11 @@ func (a *AutonomyType) GetLogMap() map[int64]*types.LogInfo {
TyLogRvkPropChange: {Ty: reflect.TypeOf(ReceiptProposalChange{}), Name: "LogRvkPropChange"},
TyLogVotePropChange: {Ty: reflect.TypeOf(ReceiptProposalChange{}), Name: "LogVotePropChange"},
TyLogTmintPropChange: {Ty: reflect.TypeOf(ReceiptProposalChange{}), Name: "LogTmintPropChange"},
TyLogPropItem: {Ty: reflect.TypeOf(ReceiptProposalItem{}), Name: "LogPropItem"},
TyLogRvkPropItem: {Ty: reflect.TypeOf(ReceiptProposalItem{}), Name: "LogRvkPropItem"},
TyLogVotePropItem: {Ty: reflect.TypeOf(ReceiptProposalItem{}), Name: "LogVotePropItem"},
TyLogTmintPropItem: {Ty: reflect.TypeOf(ReceiptProposalItem{}), Name: "LogTmintPropItem"},
}
}
......@@ -112,5 +120,10 @@ func (a *AutonomyType) GetTypeMap() map[string]int32 {
"RvkPropChange": AutonomyActionRvkPropChange,
"VotePropChange": AutonomyActionVotePropChange,
"TmintPropChange": AutonomyActionTmintPropChange,
"PropItem": AutonomyActionPropItem,
"RvkPropItem": AutonomyActionRvkPropItem,
"VotePropItem": AutonomyActionVotePropItem,
"TmintPropItem": AutonomyActionTmintPropItem,
}
}
......@@ -964,17 +964,14 @@ func (a *action) nodeGroupApprove(config *pt.ParaNodeGroupConfig) (*types.Receip
//只在主链检查, 主链检查失败不会同步到平行链,主链成功,平行链默认成功
if !cfg.IsPara() {
//fork之后采用 autonomy 检查模式
if cfg.IsDappFork(a.height, pt.ParaX, pt.ForkParaAutonomySuperGroup) {
confManager := types.ConfSub(cfg, manager.ManageX)
autonomyExec := confManager.GStr("autonomyExec")
if len(autonomyExec) <= 0 {
return nil, errors.Wrapf(types.ErrNotFound, "manager autonomy key not config")
}
autonomyExec := confManager.GStr(types.AutonomyCfgKey)
if cfg.IsDappFork(a.height, pt.ParaX, pt.ForkParaAutonomySuperGroup) && len(autonomyExec) > 0 {
//去autonomy 合约检验是否id approved, 成功 err返回nil
_, err := a.api.QueryChain(&types.ChainExecutor{
Driver: autonomyExec,
FuncName: "IsAutonomyApprovedItem",
Param: types.Encode(&types.ReqStrings{Datas: []string{config.AutonomyItemID, config.Id}}),
Param: types.Encode(&types.ReqMultiStrings{Datas: []string{config.AutonomyItemID, config.Id}}),
})
if err != nil {
return nil, errors.Wrapf(err, "query autonomy,approveid=%s,hashId=%s", config.AutonomyItemID, config.Id)
......
......@@ -70,7 +70,7 @@ func InitFork(cfg *types.Chain33Config) {
cfg.RegisterDappFork(ParaX, ForkLoopCheckCommitTxDone, 3230000)
cfg.RegisterDappFork(ParaX, ForkParaAssetTransferRbk, 4500000)
cfg.RegisterDappFork(ParaX, ForkParaSupervision, 6000000)
cfg.RegisterDappFork(ParaX, ForkParaAutonomySuperGroup, 10000000)
cfg.RegisterDappFork(ParaX, ForkParaAutonomySuperGroup, 10200000)
//只在平行链启用
cfg.RegisterDappFork(ParaX, ForkParaSelfConsStages, types.MaxHeight)
......
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