ic_web3_rs/api/
parity_set.rs

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)]
10/// `Parity_Set` Specific API
11pub 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    /// Set Parity to accept non-reserved peers (default behavior)
27    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    /// Add a reserved peer
35    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    /// Set Parity to drop all non-reserved peers. To restore default behavior call parity_acceptNonReservedPeers
41    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    /// Get list of connected/connecting peers.
46    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    /// Attempts to upgrade Parity to the version specified in parity_upgradeReady
51    pub fn execute_upgrade(&self, options: CallOptions) -> CallFuture<bool, T::Out> {
52        CallFuture::new(self.transport().execute("parity_executeUpgrade", vec![], options))
53    }
54
55    /// Creates a hash of a file at a given URL
56    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    /// Remove a reserved peer
62    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    /// Changes author (coinbase) for mined blocks
71    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    /// Sets the network spec file Parity is using
77    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    /// Sets an authority account for signing consensus messages
83    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    /// Changes extra data for newly mined blocks
98    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    /// Sets new gas ceiling target for mined blocks
104    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    /// Sets a new gas floor target for mined blocks
113    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    /// Sets the maximum amount of gas a single transaction may consume
122    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    /// Changes minimal gas price for transaction to be accepted to the queue
131    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    /// Changes the operating mode of Parity.
140    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    /// Changes limit for transactions in queue. (NOT WORKING !)
146    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    /// Returns a ReleaseInfo object describing the release which is available for upgrade or null if none is available.
155    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}