Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
91919f31
Y
YTBP
项目概览
YottaChain
/
YTBP
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YTBP
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
91919f31
编写于
5月 17, 2018
作者:
A
Anton Perkov
提交者:
GitHub
5月 17, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3165 from EOSIO/cleos-approve-unapprove-producer
cleos system voteproducer approve/unapprove #3123
上级
e4980b1e
8bc7b109
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
93 addition
and
0 deletion
+93
-0
programs/cleos/main.cpp
programs/cleos/main.cpp
+93
-0
未找到文件。
programs/cleos/main.cpp
浏览文件 @
91919f31
...
...
@@ -918,6 +918,97 @@ struct vote_producers_subcommand {
}
};
struct
approve_producer_subcommand
{
eosio
::
name
voter
;
eosio
::
name
producer_name
;
approve_producer_subcommand
(
CLI
::
App
*
actionRoot
)
{
auto
approve_producer
=
actionRoot
->
add_subcommand
(
"approve"
,
localized
(
"Add one producer to list of voted producers"
));
approve_producer
->
add_option
(
"voter"
,
voter
,
localized
(
"The voting account"
))
->
required
();
approve_producer
->
add_option
(
"producer"
,
producer_name
,
localized
(
"The account to vote for"
))
->
required
();
add_standard_transaction_options
(
approve_producer
);
approve_producer
->
set_callback
([
this
]
{
auto
result
=
call
(
get_table_func
,
fc
::
mutable_variant_object
(
"json"
,
true
)
(
"code"
,
name
(
config
::
system_account_name
).
to_string
())
(
"scope"
,
name
(
config
::
system_account_name
).
to_string
())
(
"table"
,
"voters"
)
(
"table_key"
,
"owner"
)
(
"lower_bound"
,
voter
.
value
)
(
"limit"
,
1
)
);
auto
res
=
result
.
as
<
eosio
::
chain_apis
::
read_only
::
get_table_rows_result
>
();
if
(
res
.
rows
.
empty
()
||
res
.
rows
[
0
][
"owner"
].
as_string
()
!=
name
(
voter
).
to_string
()
)
{
std
::
cerr
<<
"Voter info not found for account "
<<
voter
<<
std
::
endl
;
return
;
}
FC_ASSERT
(
1
==
res
.
rows
.
size
(),
"More than one voter_info for account"
);
auto
prod_vars
=
res
.
rows
[
0
][
"producers"
].
get_array
();
vector
<
eosio
::
name
>
prods
;
for
(
auto
&
x
:
prod_vars
)
{
prods
.
push_back
(
name
(
x
.
as_string
())
);
}
prods
.
push_back
(
producer_name
);
std
::
sort
(
prods
.
begin
(),
prods
.
end
()
);
auto
it
=
std
::
unique
(
prods
.
begin
(),
prods
.
end
()
);
if
(
it
!=
prods
.
end
()
)
{
std
::
cerr
<<
"Producer
\"
"
<<
producer_name
<<
"
\"
is already on the list."
<<
std
::
endl
;
return
;
}
fc
::
variant
act_payload
=
fc
::
mutable_variant_object
()
(
"voter"
,
voter
)
(
"proxy"
,
""
)
(
"producers"
,
prods
);
send_actions
({
create_action
({
permission_level
{
voter
,
config
::
active_name
}},
config
::
system_account_name
,
N
(
voteproducer
),
act_payload
)});
});
}
};
struct
unapprove_producer_subcommand
{
eosio
::
name
voter
;
eosio
::
name
producer_name
;
unapprove_producer_subcommand
(
CLI
::
App
*
actionRoot
)
{
auto
approve_producer
=
actionRoot
->
add_subcommand
(
"unapprove"
,
localized
(
"Remove one producer from list of voted producers"
));
approve_producer
->
add_option
(
"voter"
,
voter
,
localized
(
"The voting account"
))
->
required
();
approve_producer
->
add_option
(
"producer"
,
producer_name
,
localized
(
"The account to remove from voted producers"
))
->
required
();
add_standard_transaction_options
(
approve_producer
);
approve_producer
->
set_callback
([
this
]
{
auto
result
=
call
(
get_table_func
,
fc
::
mutable_variant_object
(
"json"
,
true
)
(
"code"
,
name
(
config
::
system_account_name
).
to_string
())
(
"scope"
,
name
(
config
::
system_account_name
).
to_string
())
(
"table"
,
"voters"
)
(
"table_key"
,
"owner"
)
(
"lower_bound"
,
voter
.
value
)
(
"limit"
,
1
)
);
auto
res
=
result
.
as
<
eosio
::
chain_apis
::
read_only
::
get_table_rows_result
>
();
if
(
res
.
rows
.
empty
()
||
res
.
rows
[
0
][
"owner"
].
as_string
()
!=
name
(
voter
).
to_string
()
)
{
std
::
cerr
<<
"Voter info not found for account "
<<
voter
<<
std
::
endl
;
return
;
}
FC_ASSERT
(
1
==
res
.
rows
.
size
(),
"More than one voter_info for account"
);
auto
prod_vars
=
res
.
rows
[
0
][
"producers"
].
get_array
();
vector
<
eosio
::
name
>
prods
;
for
(
auto
&
x
:
prod_vars
)
{
prods
.
push_back
(
name
(
x
.
as_string
())
);
}
auto
it
=
std
::
remove
(
prods
.
begin
(),
prods
.
end
(),
producer_name
);
if
(
it
==
prods
.
end
()
)
{
std
::
cerr
<<
"Cannot remove: producer
\"
"
<<
producer_name
<<
"
\"
is not on the list."
<<
std
::
endl
;
return
;
}
prods
.
erase
(
it
,
prods
.
end
()
);
//should always delete only one element
fc
::
variant
act_payload
=
fc
::
mutable_variant_object
()
(
"voter"
,
voter
)
(
"proxy"
,
""
)
(
"producers"
,
prods
);
send_actions
({
create_action
({
permission_level
{
voter
,
config
::
active_name
}},
config
::
system_account_name
,
N
(
voteproducer
),
act_payload
)});
});
}
};
struct
list_producers_subcommand
{
bool
print_json
=
false
;
bool
sort_names
=
false
;
...
...
@@ -2332,6 +2423,8 @@ int main( int argc, char** argv ) {
voteProducer
->
require_subcommand
();
auto
voteProxy
=
vote_producer_proxy_subcommand
(
voteProducer
);
auto
voteProducers
=
vote_producers_subcommand
(
voteProducer
);
auto
approveProducer
=
approve_producer_subcommand
(
voteProducer
);
auto
unapproveProducer
=
unapprove_producer_subcommand
(
voteProducer
);
auto
listProducers
=
list_producers_subcommand
(
system
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录