1use crate::rpc::{
6 errors::build_rpc_server_error,
7 traits::pos::Pos,
8 types::{
9 pos::{
10 Account, Block, BlockNumber, CommitteeState, EpochState,
11 LedgerInfoWithSignatures, PoSEpochReward, Status, Transaction,
12 },
13 RpcAddress,
14 },
15 RpcInterceptor,
16};
17use cfx_addr::Network;
18use cfx_rpc_cfx_api::PosRpcServer;
19pub use cfx_rpc_cfx_impl::{
20 convert_to_pos_epoch_reward, hash_value_to_h256,
21 PosHandler as NewPosHandler,
22};
23use cfx_rpc_utils::error::jsonrpc_error_helpers::error_object_owned_to_jsonrpc_error as convert_error;
24use cfx_types::{H256, U64};
25use cfxcore::{
26 consensus::pos_handler::PosVerifier, BlockDataManager, SharedConsensusGraph,
27};
28use jsonrpc_core::Result as JsonRpcResult;
29use std::sync::Arc;
30
31pub struct PoSInterceptor {
32 pos_handler: Arc<PosVerifier>,
33}
34
35impl PoSInterceptor {
36 pub fn new(pos_handler: Arc<PosVerifier>) -> Self {
37 PoSInterceptor { pos_handler }
38 }
39}
40
41impl RpcInterceptor for PoSInterceptor {
42 fn before(&self, _name: &String) -> JsonRpcResult<()> {
43 match self.pos_handler.pos_option() {
44 Some(_) => Ok(()),
45 None => Err(build_rpc_server_error(
46 crate::rpc::errors::codes::POS_NOT_ENABLED,
47 "PoS chain is not enabled".into(),
48 )),
49 }
50 }
51}
52
53pub struct PosHandler {
54 inner: NewPosHandler,
55}
56
57impl PosHandler {
58 pub fn new(
59 pos_handler: Arc<PosVerifier>, pow_data_manager: Arc<BlockDataManager>,
60 network_type: Network, consensus: SharedConsensusGraph,
61 ) -> Self {
62 PosHandler {
63 inner: NewPosHandler::new(
64 pos_handler,
65 pow_data_manager,
66 network_type,
67 consensus,
68 ),
69 }
70 }
71}
72
73impl Pos for PosHandler {
74 fn pos_status(&self) -> JsonRpcResult<Status> {
75 self.inner.pos_status().map_err(convert_error)
76 }
77
78 fn pos_account(
79 &self, address: H256, view: Option<U64>,
80 ) -> JsonRpcResult<Account> {
81 self.inner.pos_account(address, view).map_err(convert_error)
82 }
83
84 fn pos_account_by_pow_address(
85 &self, address: RpcAddress, view: Option<U64>,
86 ) -> JsonRpcResult<Account> {
87 self.inner
88 .pos_account_by_pow_address(address, view)
89 .map_err(convert_error)
90 }
91
92 fn pos_committee(
93 &self, view: Option<U64>,
94 ) -> JsonRpcResult<CommitteeState> {
95 self.inner.pos_committee(view).map_err(convert_error)
96 }
97
98 fn pos_block_by_hash(&self, hash: H256) -> JsonRpcResult<Option<Block>> {
99 self.inner.pos_block_by_hash(hash).map_err(convert_error)
100 }
101
102 fn pos_block_by_number(
103 &self, number: BlockNumber,
104 ) -> JsonRpcResult<Option<Block>> {
105 self.inner
106 .pos_block_by_number(number)
107 .map_err(convert_error)
108 }
109
110 fn pos_transaction_by_number(
111 &self, number: U64,
112 ) -> JsonRpcResult<Option<Transaction>> {
113 self.inner
114 .pos_transaction_by_number(number)
115 .map_err(convert_error)
116 }
117
118 fn pos_consensus_blocks(&self) -> JsonRpcResult<Vec<Block>> {
119 self.inner.pos_consensus_blocks().map_err(convert_error)
120 }
121
122 fn pos_get_epoch_state(
123 &self, epoch: U64,
124 ) -> JsonRpcResult<Option<EpochState>> {
125 self.inner.pos_get_epoch_state(epoch).map_err(convert_error)
126 }
127
128 fn pos_get_ledger_info_by_epoch(
129 &self, epoch: U64,
130 ) -> JsonRpcResult<Option<LedgerInfoWithSignatures>> {
131 self.inner
132 .pos_get_ledger_info_by_epoch(epoch)
133 .map_err(convert_error)
134 }
135
136 fn pos_get_ledger_info_by_block_number(
137 &self, number: BlockNumber,
138 ) -> JsonRpcResult<Option<LedgerInfoWithSignatures>> {
139 self.inner
140 .pos_get_ledger_info_by_block_number(number)
141 .map_err(convert_error)
142 }
143
144 fn pos_get_ledger_info_by_epoch_and_round(
145 &self, epoch: U64, round: U64,
146 ) -> JsonRpcResult<Option<LedgerInfoWithSignatures>> {
147 self.inner
148 .pos_get_ledger_info_by_epoch_and_round(epoch, round)
149 .map_err(convert_error)
150 }
151
152 fn pos_get_ledger_infos_by_epoch(
153 &self, start_epoch: U64, end_epoch: U64,
154 ) -> JsonRpcResult<Vec<LedgerInfoWithSignatures>> {
155 self.inner
156 .pos_get_ledger_infos_by_epoch(start_epoch, end_epoch)
157 .map_err(convert_error)
158 }
159
160 fn pos_get_rewards_by_epoch(
161 &self, epoch: U64,
162 ) -> JsonRpcResult<Option<PoSEpochReward>> {
163 self.inner
164 .pos_get_rewards_by_epoch(epoch)
165 .map_err(convert_error)
166 }
167}