pink_web3/api/
parity_set.rs

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)]
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) -> CallFuture<bool, T::Out> {
28        CallFuture::new(self.transport().execute("parity_acceptNonReservedPeers", vec![]))
29    }
30
31    /// Add a reserved peer
32    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    /// Set Parity to drop all non-reserved peers. To restore default behavior call parity_acceptNonReservedPeers
38    pub fn drop_non_reserved_peers(&self) -> CallFuture<bool, T::Out> {
39        CallFuture::new(self.transport().execute("parity_dropNonReservedPeers", vec![]))
40    }
41
42    /// Get list of connected/connecting peers.
43    pub fn parity_net_peers(&self) -> CallFuture<ParityPeerType, T::Out> {
44        CallFuture::new(self.transport.execute("parity_netPeers", vec![]))
45    }
46
47    /// Attempts to upgrade Parity to the version specified in parity_upgradeReady
48    pub fn execute_upgrade(&self) -> CallFuture<bool, T::Out> {
49        CallFuture::new(self.transport().execute("parity_executeUpgrade", vec![]))
50    }
51
52    /// Creates a hash of a file at a given URL
53    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    /// Remove a reserved peer
59    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    /// Changes author (coinbase) for mined blocks
65    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    /// Sets the network spec file Parity is using
71    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    /// Sets an authority account for signing consensus messages
77    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    /// Changes extra data for newly mined blocks
87    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    /// Sets new gas ceiling target for mined blocks
93    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    /// Sets a new gas floor target for mined blocks
99    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    /// Sets the maximum amount of gas a single transaction may consume
105    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    /// Changes minimal gas price for transaction to be accepted to the queue
111    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    /// Changes the operating mode of Parity.
117    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    /// Changes limit for transactions in queue. (NOT WORKING !)
123    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    /// Returns a ReleaseInfo object describing the release which is available for upgrade or null if none is available.
129    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}