1use crate::{
2 api::Namespace,
3 helpers::{self, CallFuture},
4 transports::ic_http_client::CallOptions,
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, options: CallOptions) -> CallFuture<bool, T::Out> {
28 CallFuture::new(
29 self.transport()
30 .execute("parity_acceptNonReservedPeers", vec![], options),
31 )
32 }
33
34 pub fn add_reserved_peer(&self, enode: &str, options: CallOptions) -> CallFuture<bool, T::Out> {
36 let enode = helpers::serialize(&enode);
37 CallFuture::new(self.transport().execute("parity_addReservedPeer", vec![enode], options))
38 }
39
40 pub fn drop_non_reserved_peers(&self, options: CallOptions) -> CallFuture<bool, T::Out> {
42 CallFuture::new(self.transport().execute("parity_dropNonReservedPeers", vec![], options))
43 }
44
45 pub fn parity_net_peers(&self, options: CallOptions) -> CallFuture<ParityPeerType, T::Out> {
47 CallFuture::new(self.transport.execute("parity_netPeers", vec![], options))
48 }
49
50 pub fn execute_upgrade(&self, options: CallOptions) -> CallFuture<bool, T::Out> {
52 CallFuture::new(self.transport().execute("parity_executeUpgrade", vec![], options))
53 }
54
55 pub fn hash_content(&self, url: &str, options: CallOptions) -> CallFuture<H256, T::Out> {
57 let url = helpers::serialize(&url);
58 CallFuture::new(self.transport().execute("parity_hashContent", vec![url], options))
59 }
60
61 pub fn remove_reserved_peer(&self, enode: &str, options: CallOptions) -> CallFuture<bool, T::Out> {
63 let enode = helpers::serialize(&enode);
64 CallFuture::new(
65 self.transport()
66 .execute("parity_removeReservedPeer", vec![enode], options),
67 )
68 }
69
70 pub fn set_author(&self, author: &Address, options: CallOptions) -> CallFuture<bool, T::Out> {
72 let address = helpers::serialize(&author);
73 CallFuture::new(self.transport().execute("parity_setAuthor", vec![address], options))
74 }
75
76 pub fn set_chain(&self, chain: &str, options: CallOptions) -> CallFuture<bool, T::Out> {
78 let chain = helpers::serialize(&chain);
79 CallFuture::new(self.transport().execute("parity_setChain", vec![chain], options))
80 }
81
82 pub fn set_engine_signer(
84 &self,
85 address: &Address,
86 password: &str,
87 options: CallOptions,
88 ) -> CallFuture<bool, T::Out> {
89 let address = helpers::serialize(&address);
90 let password = helpers::serialize(&password);
91 CallFuture::new(
92 self.transport()
93 .execute("parity_setEngineSigner", vec![address, password], options),
94 )
95 }
96
97 pub fn set_extra_data(&self, data: &H256, options: CallOptions) -> CallFuture<bool, T::Out> {
99 let data = helpers::serialize(&data);
100 CallFuture::new(self.transport().execute("parity_setExtraData", vec![data], options))
101 }
102
103 pub fn set_gas_ceil_target(&self, quantity: &H256, options: CallOptions) -> CallFuture<bool, T::Out> {
105 let quantity = helpers::serialize(&quantity);
106 CallFuture::new(
107 self.transport()
108 .execute("parity_setGasCeilTarget", vec![quantity], options),
109 )
110 }
111
112 pub fn set_gas_floor_target(&self, quantity: &H256, options: CallOptions) -> CallFuture<bool, T::Out> {
114 let quantity = helpers::serialize(&quantity);
115 CallFuture::new(
116 self.transport()
117 .execute("parity_setGasFloorTarget", vec![quantity], options),
118 )
119 }
120
121 pub fn set_max_transaction_gas(&self, quantity: &H256, options: CallOptions) -> CallFuture<bool, T::Out> {
123 let quantity = helpers::serialize(&quantity);
124 CallFuture::new(
125 self.transport()
126 .execute("parity_setMaxTransactionGas", vec![quantity], options),
127 )
128 }
129
130 pub fn set_min_gas_price(&self, quantity: &H256, options: CallOptions) -> CallFuture<bool, T::Out> {
132 let quantity = helpers::serialize(&quantity);
133 CallFuture::new(
134 self.transport()
135 .execute("parity_setMinGasPrice", vec![quantity], options),
136 )
137 }
138
139 pub fn set_mode(&self, mode: &str, options: CallOptions) -> CallFuture<bool, T::Out> {
141 let mode = helpers::serialize(&mode);
142 CallFuture::new(self.transport().execute("parity_setMode", vec![mode], options))
143 }
144
145 pub fn set_transactions_limit(&self, limit: &H256, options: CallOptions) -> CallFuture<bool, T::Out> {
147 let limit = helpers::serialize(&limit);
148 CallFuture::new(
149 self.transport()
150 .execute("parity_setTransactionsLimit", vec![limit], options),
151 )
152 }
153
154 pub fn upgrade_ready(&self, options: CallOptions) -> CallFuture<Option<String>, T::Out> {
156 CallFuture::new(self.transport().execute("parity_upgradeReady", vec![], options))
157 }
158}
159
160#[cfg(test)]
161mod tests {
162 use super::ParitySet;
163 use crate::{
164 api::Namespace,
165 rpc::Value,
166 transports::ic_http_client::CallOptions,
167 types::{Address, ParityPeerInfo, ParityPeerType, PeerNetworkInfo, PeerProtocolsInfo, H256},
168 };
169
170 rpc_test! (
171 ParitySet:accept_non_reserved_peers,CallOptions::default() => "parity_acceptNonReservedPeers", Vec::<String>::new();
172 Value::Bool(true) => true
173 );
174
175 rpc_test! (
176 ParitySet:add_reserved_peer,
177 "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770",CallOptions::default()
178 => "parity_addReservedPeer", vec![r#""enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770""#];
179 Value::Bool(true) => true
180 );
181
182 rpc_test! (
183 ParitySet:parity_net_peers ,CallOptions::default()=> "parity_netPeers", Vec::<String>::new();
184 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()
185 => ParityPeerType {
186 active: 1,
187 connected: 1,
188 max: 1,
189 peers: vec![ParityPeerInfo {
190 id: Some(String::from("f900000000000000000000000000000000000000000000000000000000lalalaleelooooooooo")),
191 name: String::from(""),
192 caps: vec![],
193 network: PeerNetworkInfo {
194 remote_address: String::from("Handshake"),
195 local_address: String::from("127.0.0.1:43128"),
196 },
197 protocols: PeerProtocolsInfo {
198 eth: None,
199 pip: None,
200 },
201 }],
202 }
203 );
204
205 rpc_test! (
206 ParitySet:drop_non_reserved_peers,CallOptions::default() => "parity_dropNonReservedPeers", Vec::<String>::new();
207 Value::Bool(true) => true
208 );
209
210 rpc_test! (
211 ParitySet:execute_upgrade,CallOptions::default() => "parity_executeUpgrade", Vec::<String>::new();
212 Value::Bool(true) => true
213 );
214
215 rpc_test! (
216 ParitySet:hash_content,
217 "https://raw.githubusercontent.com/paritytech/parity-ethereum/master/README.md",CallOptions::default()
218 => "parity_hashContent", vec![r#""https://raw.githubusercontent.com/paritytech/parity-ethereum/master/README.md""#];
219 Value::String("0x5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46".into()) => "5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46".parse::<H256>().unwrap()
220 );
221
222 rpc_test! (
223 ParitySet:remove_reserved_peer,
224 "enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770",CallOptions::default()
225 => "parity_removeReservedPeer", vec![r#""enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770""#];
226 Value::Bool(true) => true
227 );
228
229 rpc_test! (
230 ParitySet:set_author, &"407d73d8a49eeb85d32cf465507dd71d507100c1".parse::<Address>().unwrap(),CallOptions::default()
231 => "parity_setAuthor", vec![r#""0x407d73d8a49eeb85d32cf465507dd71d507100c1""#];
232 Value::Bool(true) => true
233 );
234
235 rpc_test! (
236 ParitySet:set_chain, "kovan",CallOptions::default()
237 => "parity_setChain", vec![r#""kovan""#];
238 Value::Bool(true) => true
239 );
240
241 rpc_test! (
242 ParitySet:set_engine_signer, &"407d73d8a49eeb85d32cf465507dd71d507100c1".parse::<Address>().unwrap(), "hunter2",CallOptions::default()
243 => "parity_setEngineSigner", vec![r#""0x407d73d8a49eeb85d32cf465507dd71d507100c1""#, r#""hunter2""#];
244 Value::Bool(true) => true
245 );
246
247 rpc_test! (
248 ParitySet:set_extra_data,
249 &"5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46".parse::<H256>().unwrap(),CallOptions::default()
250 => "parity_setExtraData", vec![r#""0x5198e0fc1a9b90078c2e5bfbc6ab6595c470622d3c28f305d3433c300bba5a46""#];
251 Value::Bool(true) => true
252 );
253
254 rpc_test! (
255 ParitySet:set_gas_ceil_target, &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap(),CallOptions::default()
256 => "parity_setGasCeilTarget", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
257 Value::Bool(true) => true
258 );
259
260 rpc_test! (
261 ParitySet:set_gas_floor_target, &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap(),CallOptions::default()
262 => "parity_setGasFloorTarget", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
263 Value::Bool(true) => true
264 );
265
266 rpc_test! (
267 ParitySet:set_max_transaction_gas,
268 &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap(),CallOptions::default()
269 => "parity_setMaxTransactionGas", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
270 Value::Bool(true) => true
271 );
272
273 rpc_test! (
274 ParitySet:set_min_gas_price,
275 &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap(),CallOptions::default()
276 => "parity_setMinGasPrice", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
277 Value::Bool(true) => true
278 );
279
280 rpc_test! (
281 ParitySet:set_mode, "offline",CallOptions::default()
282 => "parity_setMode", vec![r#""offline""#];
283 Value::Bool(true) => true
284 );
285
286 rpc_test! (
287 ParitySet:set_transactions_limit,
288 &"0000000000000000000000000000000000000000000000000000000000000123".parse::<H256>().unwrap(),CallOptions::default()
289 => "parity_setTransactionsLimit", vec![r#""0x0000000000000000000000000000000000000000000000000000000000000123""#];
290 Value::Bool(true) => true
291 );
292
293 rpc_test!(
294 ParitySet:upgrade_ready,CallOptions::default() => "parity_upgradeReady", Vec::<String>::new();
295 Value::Null => None
296 );
297}