From dac4443bbde2119abbfdefdad864cb2d1d4a5d37 Mon Sep 17 00:00:00 2001 From: Daniel Karzel Date: Tue, 9 Feb 2021 14:32:33 +1100 Subject: [PATCH] Add functionality to open monero wallet through rpc --- monero-harness/src/rpc/wallet.rs | 32 ++++++++++++++++++++++++++++++++ swap/src/monero.rs | 5 +++++ swap/src/monero/wallet.rs | 12 ++++++++++-- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/monero-harness/src/rpc/wallet.rs b/monero-harness/src/rpc/wallet.rs index 1f7920bc..a84f4290 100644 --- a/monero-harness/src/rpc/wallet.rs +++ b/monero-harness/src/rpc/wallet.rs @@ -121,6 +121,33 @@ impl Client { Ok(r.result) } + /// Opens a wallet using `filename`. + pub async fn open_wallet(&self, filename: &str) -> Result<()> { + let params = OpenWalletParams { + filename: filename.to_owned(), + }; + let request = Request::new("open_wallet", params); + + let response = self + .inner + .post(self.url.clone()) + .json(&request) + .send() + .await? + .text() + .await?; + + debug!("open wallet RPC response: {}", response); + + // TODO: Proper error handling once switching to https://github.com/thomaseizinger/rust-jsonrpc-client/ + // Currently blocked by https://github.com/thomaseizinger/rust-jsonrpc-client/issues/20 + if response.contains("error") { + bail!("Failed to open wallet") + } + + Ok(()) + } + /// Creates a wallet using `filename`. pub async fn create_wallet(&self, filename: &str) -> Result<()> { let params = CreateWalletParams { @@ -352,6 +379,11 @@ pub struct SubAddressAccount { pub unlocked_balance: u64, } +#[derive(Serialize, Debug, Clone)] +struct OpenWalletParams { + filename: String, +} + #[derive(Serialize, Debug, Clone)] struct CreateWalletParams { filename: String, diff --git a/swap/src/monero.rs b/swap/src/monero.rs index 3b33d2c4..9d7bdec9 100644 --- a/swap/src/monero.rs +++ b/swap/src/monero.rs @@ -207,6 +207,11 @@ pub trait CreateWalletForOutput { ) -> anyhow::Result<()>; } +#[async_trait] +pub trait OpenWallet { + async fn open_wallet(&self, file_name: &str) -> anyhow::Result<()>; +} + #[async_trait] pub trait CreateWallet { async fn create_wallet(&self, file_name: &str) -> anyhow::Result<()>; diff --git a/swap/src/monero/wallet.rs b/swap/src/monero/wallet.rs index b2d5d330..a53c06c3 100644 --- a/swap/src/monero/wallet.rs +++ b/swap/src/monero/wallet.rs @@ -1,6 +1,6 @@ use crate::monero::{ - Amount, CreateWallet, CreateWalletForOutput, InsufficientFunds, PrivateViewKey, PublicViewKey, - Transfer, TransferProof, TxHash, WatchForTransfer, + Amount, CreateWallet, CreateWalletForOutput, InsufficientFunds, OpenWallet, PrivateViewKey, + PublicViewKey, Transfer, TransferProof, TxHash, WatchForTransfer, }; use ::monero::{Address, Network, PrivateKey, PublicKey}; use anyhow::Result; @@ -94,6 +94,14 @@ impl CreateWalletForOutput for Wallet { } } +#[async_trait] +impl OpenWallet for Wallet { + async fn open_wallet(&self, file_name: &str) -> Result<()> { + self.inner.open_wallet(file_name).await?; + Ok(()) + } +} + #[async_trait] impl CreateWallet for Wallet { async fn create_wallet(&self, file_name: &str) -> Result<()> {