ic_web3/api/
parity_set.rs

1use crate::{
2    api::Namespace,
3    helpers::{self, CallFuture},
4    types::{Address, ParityPeerType, H256},
5    Transport,
6};
7
8#[derive(Debug, Clone)]
9/// `Parity_Set` Specific API
10pub 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    /// Set Parity to accept non-reserved peers (default behavior)
26    pub fn accept_non_reserved_peers(&self) -> CallFuture<bool, T::Out> {
27        CallFuture::new(self.transport().execute("parity_acceptNonReservedPeers", vec![]))
28    }
29
30    /// Add a reserved peer
31    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    /// Set Parity to drop all non-reserved peers. To restore default behavior call parity_acceptNonReservedPeers
37    pub fn drop_non_reserved_peers(&self) -> CallFuture<bool, T::Out> {
38        CallFuture::new(self.transport().execute("parity_dropNonReservedPeers", vec![]))
39    }
40
41    /// Get list of connected/connecting peers.
42    pub fn parity_net_peers(&self) -> CallFuture<ParityPeerType, T::Out> {
43        CallFuture::new(self.transport.execute("parity_netPeers", vec![]))
44    }
45
46    /// Attempts to upgrade Parity to the version specified in parity_upgradeReady
47    pub fn execute_upgrade(&self) -> CallFuture<bool, T::Out> {
48        CallFuture::new(self.transport().execute("parity_executeUpgrade", vec![]))
49    }
50
51    /// Creates a hash of a file at a given URL
52    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    /// Remove a reserved peer
58    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    /// Changes author (coinbase) for mined blocks
64    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    /// Sets the network spec file Parity is using
70    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    /// Sets an authority account for signing consensus messages
76    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    /// Changes extra data for newly mined blocks
86    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    /// Sets new gas ceiling target for mined blocks
92    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    /// Sets a new gas floor target for mined blocks
98    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    /// Sets the maximum amount of gas a single transaction may consume
104    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    /// Changes minimal gas price for transaction to be accepted to the queue
110    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    /// Changes the operating mode of Parity.
116    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    /// Changes limit for transactions in queue. (NOT WORKING !)
122    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    /// Returns a ReleaseInfo object describing the release which is available for upgrade or null if none is available.
128    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}