1use crate::prelude::*;
2use crate::{
3 api::Namespace,
4 helpers::{self, CallFuture},
5 types::{Address, ParityPeerType, H256},
6 Transport,
7};
8
9#[derive(Debug, Clone)]
10pub struct ParitySet<T> {
12 transport: T,
13}
14
15impl<T: Transport> Namespace<T> for ParitySet<T> {
16 fn new(transport: T) -> Self {
17 ParitySet { transport }
18 }
19
20 fn transport(&self) -> &T {
21 &self.transport
22 }
23}
24
25impl<T: Transport> ParitySet<T> {
26 pub fn accept_non_reserved_peers(&self) -> CallFuture<bool, T::Out> {
28 CallFuture::new(self.transport().execute("parity_acceptNonReservedPeers", vec![]))
29 }
30
31 pub fn add_reserved_peer(&self, enode: &str) -> CallFuture<bool, T::Out> {
33 let enode = helpers::serialize(&enode);
34 CallFuture::new(self.transport().execute("parity_addReservedPeer", vec![enode]))
35 }
36
37 pub fn drop_non_reserved_peers(&self) -> CallFuture<bool, T::Out> {
39 CallFuture::new(self.transport().execute("parity_dropNonReservedPeers", vec![]))
40 }
41
42 pub fn parity_net_peers(&self) -> CallFuture<ParityPeerType, T::Out> {
44 CallFuture::new(self.transport.execute("parity_netPeers", vec![]))
45 }
46
47 pub fn execute_upgrade(&self) -> CallFuture<bool, T::Out> {
49 CallFuture::new(self.transport().execute("parity_executeUpgrade", vec![]))
50 }
51
52 pub fn hash_content(&self, url: &str) -> CallFuture<H256, T::Out> {
54 let url = helpers::serialize(&url);
55 CallFuture::new(self.transport().execute("parity_hashContent", vec![url]))
56 }
57
58 pub fn remove_reserved_peer(&self, enode: &str) -> CallFuture<bool, T::Out> {
60 let enode = helpers::serialize(&enode);
61 CallFuture::new(self.transport().execute("parity_removeReservedPeer", vec![enode]))
62 }
63
64 pub fn set_author(&self, author: &Address) -> CallFuture<bool, T::Out> {
66 let address = helpers::serialize(&author);
67 CallFuture::new(self.transport().execute("parity_setAuthor", vec![address]))
68 }
69
70 pub fn set_chain(&self, chain: &str) -> CallFuture<bool, T::Out> {
72 let chain = helpers::serialize(&chain);
73 CallFuture::new(self.transport().execute("parity_setChain", vec![chain]))
74 }
75
76 pub fn set_engine_signer(&self, address: &Address, password: &str) -> CallFuture<bool, T::Out> {
78 let address = helpers::serialize(&address);
79 let password = helpers::serialize(&password);
80 CallFuture::new(
81 self.transport()
82 .execute("parity_setEngineSigner", vec![address, password]),
83 )
84 }
85
86 pub fn set_extra_data(&self, data: &H256) -> CallFuture<bool, T::Out> {
88 let data = helpers::serialize(&data);
89 CallFuture::new(self.transport().execute("parity_setExtraData", vec![data]))
90 }
91
92 pub fn set_gas_ceil_target(&self, quantity: &H256) -> CallFuture<bool, T::Out> {
94 let quantity = helpers::serialize(&quantity);
95 CallFuture::new(self.transport().execute("parity_setGasCeilTarget", vec![quantity]))
96 }
97
98 pub fn set_gas_floor_target(&self, quantity: &H256) -> CallFuture<bool, T::Out> {
100 let quantity = helpers::serialize(&quantity);
101 CallFuture::new(self.transport().execute("parity_setGasFloorTarget", vec![quantity]))
102 }
103
104 pub fn set_max_transaction_gas(&self, quantity: &H256) -> CallFuture<bool, T::Out> {
106 let quantity = helpers::serialize(&quantity);
107 CallFuture::new(self.transport().execute("parity_setMaxTransactionGas", vec![quantity]))
108 }
109
110 pub fn set_min_gas_price(&self, quantity: &H256) -> CallFuture<bool, T::Out> {
112 let quantity = helpers::serialize(&quantity);
113 CallFuture::new(self.transport().execute("parity_setMinGasPrice", vec![quantity]))
114 }
115
116 pub fn set_mode(&self, mode: &str) -> CallFuture<bool, T::Out> {
118 let mode = helpers::serialize(&mode);
119 CallFuture::new(self.transport().execute("parity_setMode", vec![mode]))
120 }
121
122 pub fn set_transactions_limit(&self, limit: &H256) -> CallFuture<bool, T::Out> {
124 let limit = helpers::serialize(&limit);
125 CallFuture::new(self.transport().execute("parity_setTransactionsLimit", vec![limit]))
126 }
127
128 pub fn upgrade_ready(&self) -> CallFuture<Option<String>, T::Out> {
130 CallFuture::new(self.transport().execute("parity_upgradeReady", vec![]))
131 }
132}
133
134#[cfg(test)]
135mod tests {
136 use super::ParitySet;
137 use crate::{
138 api::Namespace,
139 rpc::Value,
140 types::{Address, ParityPeerInfo, ParityPeerType, PeerNetworkInfo, PeerProtocolsInfo, H256},
141 };
142
143 rpc_test! (
144 ParitySet:accept_non_reserved_peers => "parity_acceptNonReservedPeers";
145 Value::Bool(true) => true
146 );
147
148 rpc_test! (
149 ParitySet:add_reserved_peer,
150 "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770"
151 => "parity_addReservedPeer", vec![r#""enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770""#];
152 Value::Bool(true) => true
153 );
154
155 rpc_test! (
156 ParitySet:parity_net_peers => "parity_netPeers";
157 serde_json::from_str::<Value>(r#"{"active":1,"connected":1,"max":1,"peers":[{"id":"f900000000000000000000000000000000000000000000000000000000lalalaleelooooooooo","name":"","caps":[],"network":{"remoteAddress":"Handshake","localAddress":"127.0.0.1:43128"},"protocols":{"eth":null,"pip":null}}]}"#).unwrap()
158 => ParityPeerType {
159 active: 1,
160 connected: 1,
161 max: 1,
162 peers: vec![ParityPeerInfo {
163 id: Some("f900000000000000000000000000000000000000000000000000000000lalalaleelooooooooo".into()),
164 name: "".into(),
165 caps: vec![],
166 network: PeerNetworkInfo {
167 remote_address: "Handshake".into(),
168 local_address: "127.0.0.1:43128".into(),
169 },
170 protocols: PeerProtocolsInfo {
171 eth: None,
172 pip: None,
173 },
174 }],
175 }
176 );
177
178 rpc_test! (
179 ParitySet:drop_non_reserved_peers => "parity_dropNonReservedPeers";
180 Value::Bool(true) => true
181 );
182
183 rpc_test! (
184 ParitySet:execute_upgrade => "parity_executeUpgrade";
185 Value::Bool(true) => true
186 );
187
188 rpc_test! (
189 ParitySet:hash_content,
190 "https://raw.githubusercontent.com/paritytech/parity-ethereum/master/README.md"
191 => "parity_hashContent", vec![r#""https://raw.githubusercontent.com/paritytech/parity-ethereum/master/README.md""#];
192 Value::String("0x5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46".into()) => "5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46".parse::<H256>().unwrap()
193 );
194
195 rpc_test! (
196 ParitySet:remove_reserved_peer,
197 "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770"
198 => "parity_removeReservedPeer", vec![r#""enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770""#];
199 Value::Bool(true) => true
200 );
201
202 rpc_test! (
203 ParitySet:set_author, &"407d73d8a49eeb85d32cf465507dd71d507100c1".parse::<Address>().unwrap()
204 => "parity_setAuthor", vec![r#""0x407d73d8a49eeb85d32cf465507dd71d507100c1""#];
205 Value::Bool(true) => true
206 );
207
208 rpc_test! (
209 ParitySet:set_chain, "kovan"
210 => "parity_setChain", vec![r#""kovan""#];
211 Value::Bool(true) => true
212 );
213
214 rpc_test! (
215 ParitySet:set_engine_signer, &"407d73d8a49eeb85d32cf465507dd71d507100c1".parse::<Address>().unwrap(), "hunter2"
216 => "parity_setEngineSigner", vec![r#""0x407d73d8a49eeb85d32cf465507dd71d507100c1""#, r#""hunter2""#];
217 Value::Bool(true) => true
218 );
219
220 rpc_test! (
221 ParitySet:set_extra_data,
222 &"5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46".parse::<H256>().unwrap()
223 => "parity_setExtraData", vec![r#""0x5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46""#];
224 Value::Bool(true) => true
225 );
226
227 rpc_test! (
228 ParitySet:set_gas_ceil_target, &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap()
229 => "parity_setGasCeilTarget", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
230 Value::Bool(true) => true
231 );
232
233 rpc_test! (
234 ParitySet:set_gas_floor_target, &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap()
235 => "parity_setGasFloorTarget", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
236 Value::Bool(true) => true
237 );
238
239 rpc_test! (
240 ParitySet:set_max_transaction_gas,
241 &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap()
242 => "parity_setMaxTransactionGas", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
243 Value::Bool(true) => true
244 );
245
246 rpc_test! (
247 ParitySet:set_min_gas_price,
248 &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap()
249 => "parity_setMinGasPrice", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
250 Value::Bool(true) => true
251 );
252
253 rpc_test! (
254 ParitySet:set_mode, "offline"
255 => "parity_setMode", vec![r#""offline""#];
256 Value::Bool(true) => true
257 );
258
259 rpc_test! (
260 ParitySet:set_transactions_limit,
261 &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap()
262 => "parity_setTransactionsLimit", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
263 Value::Bool(true) => true
264 );
265
266 rpc_test!(
267 ParitySet:upgrade_ready => "parity_upgradeReady";
268 Value::Null => None
269 );
270}