1use crate::{
2 api::Namespace,
3 helpers::{self, CallFuture},
4 transports::ic_http_client::CallOptions,
5 types::{Address, H256},
6 Transport,
7};
8
9#[derive(Debug, Clone)]
11pub struct ParityAccounts<T> {
12 transport: T,
13}
14
15impl<T: Transport> Namespace<T> for ParityAccounts<T> {
16 fn new(transport: T) -> Self
17 where
18 Self: Sized,
19 {
20 ParityAccounts { transport }
21 }
22
23 fn transport(&self) -> &T {
24 &self.transport
25 }
26}
27
28impl<T: Transport> ParityAccounts<T> {
29 pub fn parity_kill_account(&self, address: &Address, pwd: &str, options: CallOptions) -> CallFuture<bool, T::Out> {
31 let address = helpers::serialize(&address);
32 let pwd = helpers::serialize(&pwd);
33 CallFuture::new(
34 self.transport
35 .execute("parity_killAccount", vec![address, pwd], options),
36 )
37 }
38 pub fn parity_new_account_from_phrase(
41 &self,
42 seed: &str,
43 pwd: &str,
44 options: CallOptions,
45 ) -> CallFuture<Address, T::Out> {
46 let seed = helpers::serialize(&seed);
47 let pwd = helpers::serialize(&pwd);
48 CallFuture::new(
49 self.transport
50 .execute("parity_newAccountFromPhrase", vec![seed, pwd], options),
51 )
52 }
53 pub fn new_account_from_secret(
56 &self,
57 secret: &H256,
58 pwd: &str,
59 options: CallOptions,
60 ) -> CallFuture<Address, T::Out> {
61 let secret = helpers::serialize(&secret);
62 let pwd = helpers::serialize(&pwd);
63 CallFuture::new(
64 self.transport
65 .execute("parity_newAccountFromSecret", vec![secret, pwd], options),
66 )
67 }
68 pub fn parity_new_account_from_wallet(
71 &self,
72 wallet: &str,
73 pwd: &str,
74 options: CallOptions,
75 ) -> CallFuture<Address, T::Out> {
76 let wallet = helpers::serialize(&wallet);
77 let pwd = helpers::serialize(&pwd);
78 CallFuture::new(
79 self.transport
80 .execute("parity_newAccountFromWallet", vec![wallet, pwd], options),
81 )
82 }
83 pub fn parity_remove_address(&self, address: &Address, options: CallOptions) -> CallFuture<bool, T::Out> {
86 let address = helpers::serialize(&address);
87 CallFuture::new(self.transport.execute("parity_removeAddress", vec![address], options))
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use super::ParityAccounts;
94 use crate::{api::Namespace, rpc::Value, transports::ic_http_client::CallOptions};
95 use ethereum_types::{Address, H256};
96
97 rpc_test! (
98 ParityAccounts : parity_kill_account, &"9b776baeaf3896657a9ba0db5564623b3e0173e0".parse::<Address>().unwrap(), "123456789",CallOptions::default()
99 => "parity_killAccount", vec![r#""0x9b776baeaf3896657a9ba0db5564623b3e0173e0""#, r#""123456789""#];
100 Value::Bool(true) => true
101 );
102
103 rpc_test! (
104 ParityAccounts : parity_new_account_from_phrase, "member funny cloth wrist ugly water tuition always fall recycle maze long", "123456789",CallOptions::default()
105 => "parity_newAccountFromPhrase", vec![r#""member funny cloth wrist ugly water tuition always fall recycle maze long""#, r#""123456789""#];
106 Value::String("0xE43eD16390bd419d48B09d6E2aa20203D1eF93E1".into()) => "E43eD16390bd419d48B09d6E2aa20203D1eF93E1".parse::<Address>().unwrap()
107 );
108
109 rpc_test! (
110 ParityAccounts : new_account_from_secret, &"c6592108cc3577f6a2d6178bc6947b43db39057195802caa0120f26e39af4945".parse::<H256>().unwrap(), "123456789",CallOptions::default()
111 => "parity_newAccountFromSecret", vec![r#""0xc6592108cc3577f6a2d6178bc6947b43db39057195802caa0120f26e39af4945""#, r#""123456789""#];
112 Value::String("0x9b776Baeaf3896657A9ba0db5564623B3E0173e0".into()) => "9b776Baeaf3896657A9ba0db5564623B3E0173e0".parse::<Address>().unwrap()
113 );
114
115 rpc_test! (
116 ParityAccounts : parity_new_account_from_wallet, r#"{"version":3,"id":"3b330c3b-b0b3-4e39-b62e-c2041a98d673","address":"4c8ab9d3e938285776d6717d7319f6a9b1d809dd","Crypto":{"ciphertext":"bb3a6dbf21f0bf2b5eb0b43426590f16650acee9462ab710cca18781691a5739","cipherparams":{"iv":"6a533f77fc5cb8a752a16ec6a3200da1"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"a58609853dec53c81feb165e346c700e714285771825bb4cbf87c4ea1996b682","n":8192,"r":8,"p":1},"mac":"a71edeb659ed628db13579ce9f75c80c9d386c1239b280548d9a0e58ad20d6c7"}}"#, "123456789",CallOptions::default()
117 => "parity_newAccountFromWallet", vec![r#""{\"version\":3,\"id\":\"3b330c3b-b0b3-4e39-b62e-c2041a98d673\",\"address\":\"4c8ab9d3e938285776d6717d7319f6a9b1d809dd\",\"Crypto\":{\"ciphertext\":\"bb3a6dbf21f0bf2b5eb0b43426590f16650acee9462ab710cca18781691a5739\",\"cipherparams\":{\"iv\":\"6a533f77fc5cb8a752a16ec6a3200da1\"},\"cipher\":\"aes-128-ctr\",\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"salt\":\"a58609853dec53c81feb165e346c700e714285771825bb4cbf87c4ea1996b682\",\"n\":8192,\"r\":8,\"p\":1},\"mac\":\"a71edeb659ed628db13579ce9f75c80c9d386c1239b280548d9a0e58ad20d6c7\"}}""#, r#""123456789""#];
118 Value::String("0x4C8aB9d3e938285776d6717d7319F6a9B1d809DD".into()) => "4C8aB9d3e938285776d6717d7319F6a9B1d809DD".parse::<Address>().unwrap()
119 );
120
121 rpc_test! (
122 ParityAccounts : parity_remove_address, &"9b776baeaf3896657a9ba0db5564623b3e0173e0".parse::<Address>().unwrap(),CallOptions::default()
123 => "parity_removeAddress", vec![r#""0x9b776baeaf3896657a9ba0db5564623b3e0173e0""#];
124 Value::Bool(true) => true
125 );
126}