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