Просмотр исходного кода

darkfid: implement set_default_address rpc function

ghassmo 4 лет назад
Родитель
Сommit
3edebe6b77
4 измененных файлов с 33 добавлено и 10 удалено
  1. 23 6
      src/bin/darkfid.rs
  2. 3 2
      src/bin/drk.rs
  3. 4 2
      src/client.rs
  4. 3 0
      src/rpc/jsonrpc.rs

+ 23 - 6
src/bin/darkfid.rs

@@ -174,7 +174,7 @@ impl Darkfid {
     async fn get_keys(&self, id: Value, _params: Value) -> JsonResult {
     async fn get_keys(&self, id: Value, _params: Value) -> JsonResult {
         let result: Result<Vec<String>> = async {
         let result: Result<Vec<String>> = async {
             let keypairs = self.client.lock().await.get_keypairs().await?;
             let keypairs = self.client.lock().await.get_keypairs().await?;
-            let default_keypair = self.client.lock().await.get_default_keypair().await?;
+            let default_keypair = self.client.lock().await.main_keypair;
 
 
             let mut addresses: Vec<String> = keypairs
             let mut addresses: Vec<String> = keypairs
                 .iter()
                 .iter()
@@ -198,7 +198,7 @@ impl Darkfid {
         }
         }
     }
     }
 
 
-    // --> {"method": "export_keypair", "params": "path/"}
+    // --> {"method": "export_keypair", "params": "[path/]"}
     // <-- {"result": true}
     // <-- {"result": true}
     async fn export_keypair(&self, id: Value, params: Value) -> JsonResult {
     async fn export_keypair(&self, id: Value, params: Value) -> JsonResult {
         let args = params.as_array();
         let args = params.as_array();
@@ -234,11 +234,28 @@ impl Darkfid {
     }
     }
 
 
     // --> {"method": "set_default_address", "params":
     // --> {"method": "set_default_address", "params":
-    // "vdNS7oBj7KvsMWWmo9r96SV4SqATLrGsH2a3PGpCfJC"}
+    // "[vdNS7oBj7KvsMWWmo9r96SV4SqATLrGsH2a3PGpCfJC]"}
     // <-- {"result": true}
     // <-- {"result": true}
-    async fn set_default_address(&self, _id: Value, _params: Value) -> JsonResult {
-        // TODO
-        unimplemented!()
+    async fn set_default_address(&self, id: Value, params: Value) -> JsonResult {
+        let args = params.as_array();
+
+        if args.is_none() && args.unwrap()[0].as_str().is_none() {
+            return JsonResult::Err(jsonerr(InvalidParams, None, id))
+        }
+
+        let addr_str = args.unwrap()[0].as_str().unwrap();
+
+        let result: Result<()> = async {
+            let public = PublicKey::from(Address::from_str(addr_str.into())?);
+            self.client.lock().await.set_default_keypair(&public).await?;
+            Ok(())
+        }
+        .await;
+
+        match result {
+            Ok(_) => JsonResult::Resp(jsonresp(json!(true), id)),
+            Err(err) => JsonResult::Err(jsonerr(ServerError(-32005), Some(err.to_string()), id)),
+        }
     }
     }
 
 
     // --> {"method": "get_balances", "params": []}
     // --> {"method": "get_balances", "params": []}

+ 3 - 2
src/bin/drk.rs

@@ -108,14 +108,15 @@ impl Drk {
     }
     }
 
 
     // --> {"jsonrpc": "2.0", "method": "set_default_address", "params":
     // --> {"jsonrpc": "2.0", "method": "set_default_address", "params":
-    // "vdNS7oBj7KvsMWWmo9r96SV4SqATLrGsH2a3PGpCfJC", "id": 42} <-- {"jsonrpc": "2.0", "result":
+    // "[vdNS7oBj7KvsMWWmo9r96SV4SqATLrGsH2a3PGpCfJC]", "id": 42}
+    // <-- {"jsonrpc": "2.0", "result":
     // true, "id": 42}
     // true, "id": 42}
     async fn set_default_address(&self, address: &str) -> Result<Value> {
     async fn set_default_address(&self, address: &str) -> Result<Value> {
         let req = jsonrpc::request(json!("set_default_address"), json!([address]));
         let req = jsonrpc::request(json!("set_default_address"), json!([address]));
         Ok(self.request(req).await?)
         Ok(self.request(req).await?)
     }
     }
 
 
-    // --> {"jsonrpc": "2.0", "method": "export_keypair", "params": "path/", "id": 42}
+    // --> {"jsonrpc": "2.0", "method": "export_keypair", "params": "[path/]", "id": 42}
     // <-- {"jsonrpc": "2.0", "result": true, "id": 42}
     // <-- {"jsonrpc": "2.0", "result": true, "id": 42}
     async fn export_keypair(&self, path: &str) -> Result<Value> {
     async fn export_keypair(&self, path: &str) -> Result<Value> {
         let req = jsonrpc::request(json!("export_keypair"), json!([path]));
         let req = jsonrpc::request(json!("export_keypair"), json!([path]));

+ 4 - 2
src/client.rs

@@ -384,8 +384,10 @@ impl Client {
         self.wallet.get_keypairs().await
         self.wallet.get_keypairs().await
     }
     }
 
 
-    pub async fn get_default_keypair(&self) -> Result<Keypair> {
-        self.wallet.get_default_keypair().await
+    pub async fn set_default_keypair(&mut self, public: &PublicKey) -> Result<()> {
+        self.wallet.set_default_keypair(public).await?;
+        self.main_keypair = self.wallet.get_default_keypair().await?;
+        Ok(())
     }
     }
 
 
     pub async fn key_gen(&self) -> Result<()> {
     pub async fn key_gen(&self) -> Result<()> {

+ 3 - 0
src/rpc/jsonrpc.rs

@@ -22,6 +22,7 @@ pub enum ErrorCode {
     KeyGenError,
     KeyGenError,
     GetAddressesError,
     GetAddressesError,
     CreateFile,
     CreateFile,
+    SetDefaultAddress,
     InvalidAmountParam,
     InvalidAmountParam,
     InvalidNetworkParam,
     InvalidNetworkParam,
     InvalidTokenIdParam,
     InvalidTokenIdParam,
@@ -41,6 +42,7 @@ impl ErrorCode {
             ErrorCode::KeyGenError => -32002,
             ErrorCode::KeyGenError => -32002,
             ErrorCode::GetAddressesError => -32003,
             ErrorCode::GetAddressesError => -32003,
             ErrorCode::CreateFile => -32004,
             ErrorCode::CreateFile => -32004,
+            ErrorCode::SetDefaultAddress => -32005,
             ErrorCode::InvalidAmountParam => -32010,
             ErrorCode::InvalidAmountParam => -32010,
             ErrorCode::InvalidNetworkParam => -32011,
             ErrorCode::InvalidNetworkParam => -32011,
             ErrorCode::InvalidTokenIdParam => -32012,
             ErrorCode::InvalidTokenIdParam => -32012,
@@ -60,6 +62,7 @@ impl ErrorCode {
             ErrorCode::KeyGenError => "Key gen error",
             ErrorCode::KeyGenError => "Key gen error",
             ErrorCode::GetAddressesError => "get addresses error",
             ErrorCode::GetAddressesError => "get addresses error",
             ErrorCode::CreateFile => "error creating a file",
             ErrorCode::CreateFile => "error creating a file",
+            ErrorCode::SetDefaultAddress => "error set default address",
             ErrorCode::InvalidAmountParam => "Invalid amount param",
             ErrorCode::InvalidAmountParam => "Invalid amount param",
             ErrorCode::InvalidNetworkParam => "Invalid network param",
             ErrorCode::InvalidNetworkParam => "Invalid network param",
             ErrorCode::InvalidTokenIdParam => "Invalid token id param",
             ErrorCode::InvalidTokenIdParam => "Invalid token id param",