diff --git a/Cargo.lock b/Cargo.lock index cfc4895a1..51e4f6423 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1525,7 +1525,7 @@ dependencies = [ [[package]] name = "mutiny-wasm" -version = "1.14.2" +version = "1.14.3" dependencies = [ "anyhow", "async-trait", diff --git a/mutiny-core/src/error.rs b/mutiny-core/src/error.rs index 989e36a5b..ac55439a4 100644 --- a/mutiny-core/src/error.rs +++ b/mutiny-core/src/error.rs @@ -180,6 +180,8 @@ pub enum MutinyError { JwtAuthFailure, #[error("Failed to parse VSS value from getObject response.")] FailedParsingVssValue, + #[error("VSS key not found.")] + VssKeyNotFound, #[error("Device lock changed when connecting.")] DeviceLockChangedWhenConnecting, #[error(transparent)] diff --git a/mutiny-core/src/lib.rs b/mutiny-core/src/lib.rs index 55989e219..1ce769a7e 100644 --- a/mutiny-core/src/lib.rs +++ b/mutiny-core/src/lib.rs @@ -929,6 +929,9 @@ impl MutinyWalletBuilder { } } } + Err(MutinyError::VssKeyNotFound) => { + log_info!(logger, "VSS key not found, retrying... {retries}"); + } Err(MutinyError::FailedParsingVssValue) => { log_info!(logger, "Failed to parse VSS value, retrying... {retries}"); } diff --git a/mutiny-core/src/storage.rs b/mutiny-core/src/storage.rs index 53009434a..cf80f998f 100644 --- a/mutiny-core/src/storage.rs +++ b/mutiny-core/src/storage.rs @@ -557,7 +557,19 @@ pub trait MutinyStorage: Clone + Sized + Send + Sync + 'static { ) -> Result<(), MutinyError> { let device = self.get_device_id()?; let device_description = self.get_device_description(); - if let Some(lock) = self.fetch_device_lock().await? { + + let lock = match self.fetch_device_lock().await { + Ok(lock) => lock, + Err(MutinyError::VssKeyNotFound) => { + log_debug!(logger, "Vss device lock not yet created, proceeding..."); + None + } + Err(e) => { + return Err(e); + } + }; + + if let Some(lock) = lock { if lock.is_locked(&device) { log_debug!(logger, "current device is {}", device); log_debug!(logger, "locked device is {}", lock.device); diff --git a/mutiny-core/src/vss.rs b/mutiny-core/src/vss.rs index de101a776..b30162c9e 100644 --- a/mutiny-core/src/vss.rs +++ b/mutiny-core/src/vss.rs @@ -7,7 +7,7 @@ use anyhow::anyhow; use bitcoin::secp256k1::{Secp256k1, SecretKey}; use hex_conservative::DisplayHex; use lightning::util::logger::*; -use lightning::{log_error, log_info, log_warn}; +use lightning::{log_debug, log_error, log_info, log_warn}; use reqwest::{Method, Url}; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; @@ -170,12 +170,24 @@ impl MutinyVssClient { let body = json!({ "store_id": self.store_id, "key": key }); - let result: EncryptedVssKeyValueItem = self - .make_request(Method::POST, url, Some(body)) - .await? - .json() - .await - .map_err(|e| { + let response = self.make_request(Method::POST, url, Some(body)).await?; + + let response_text = response.text().await.map_err(|e| { + log_error!(self.logger, "Error reading response body: {e}"); + MutinyError::FailedParsingVssValue + })?; + + if response_text == "null" { + log_debug!( + self.logger, + "Vss key not found, response is 'null' for key: {}", + key + ); + return Err(MutinyError::VssKeyNotFound); + } + + let result: EncryptedVssKeyValueItem = + serde_json::from_str(&response_text).map_err(|e| { log_error!(self.logger, "Error parsing get objects response: {e}"); MutinyError::FailedParsingVssValue })?; diff --git a/mutiny-wasm/Cargo.toml b/mutiny-wasm/Cargo.toml index 3298ae204..f437a4a76 100644 --- a/mutiny-wasm/Cargo.toml +++ b/mutiny-wasm/Cargo.toml @@ -2,7 +2,7 @@ cargo-features = ["per-package-target"] [package] name = "mutiny-wasm" -version = "1.14.2" +version = "1.14.3" edition = "2021" authors = ["utxostack"] forced-target = "wasm32-unknown-unknown" diff --git a/mutiny-wasm/src/error.rs b/mutiny-wasm/src/error.rs index 237ca53f6..3036c6227 100644 --- a/mutiny-wasm/src/error.rs +++ b/mutiny-wasm/src/error.rs @@ -190,6 +190,8 @@ pub enum MutinyJsError { JwtAuthFailure, #[error("Failed to parse VSS value from getObject response.")] FailedParsingVssValue, + #[error("VSS key not found.")] + VssKeyNotFound, #[error("Device lock has changed when connecting.")] DeviceLockChangedWhenConnecting, #[error("Cannot have more than one node.")] @@ -262,6 +264,7 @@ impl From for MutinyJsError { MutinyError::InvalidHex => MutinyJsError::InvalidHex, MutinyError::JwtAuthFailure => MutinyJsError::JwtAuthFailure, MutinyError::FailedParsingVssValue => MutinyJsError::FailedParsingVssValue, + MutinyError::VssKeyNotFound => MutinyJsError::VssKeyNotFound, MutinyError::DeviceLockChangedWhenConnecting => { MutinyJsError::DeviceLockChangedWhenConnecting }