From 7da19aa28c5570c2017c56310c33c5c8f0c70444 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Tue, 28 May 2024 11:31:18 +0200 Subject: [PATCH] Import sp_client through sdk_common --- crates/sp_client/Cargo.toml | 2 - crates/sp_client/src/api.rs | 139 ++++++++++++++++++-------------- crates/sp_client/src/images.rs | 2 +- crates/sp_client/src/process.rs | 2 +- crates/sp_client/src/user.rs | 22 ++--- 5 files changed, 91 insertions(+), 76 deletions(-) diff --git a/crates/sp_client/Cargo.toml b/crates/sp_client/Cargo.toml index 264bd2f..3999e06 100644 --- a/crates/sp_client/Cargo.toml +++ b/crates/sp_client/Cargo.toml @@ -8,8 +8,6 @@ name = "sdk_client" crate-type = ["cdylib"] [dependencies] -sp_client= { path = "../../../sp-client" } -# sp_client= { git = "https://github.com/Sosthene00/sp-client", branch = "sp_client" } anyhow = "1.0" serde = { version = "1.0.188", features = ["derive"] } serde_json = "1.0" diff --git a/crates/sp_client/src/api.rs b/crates/sp_client/src/api.rs index 9a5d7c1..16ddacc 100644 --- a/crates/sp_client/src/api.rs +++ b/crates/sp_client/src/api.rs @@ -14,39 +14,41 @@ use anyhow::Error as AnyhowError; use sdk_common::crypto::{ AeadCore, Aes256Decryption, Aes256Encryption, Aes256Gcm, AnkSharedSecret, KeyInit, Purpose, }; +use sdk_common::sp_client::bitcoin::blockdata::fee_rate; +use sdk_common::sp_client::bitcoin::consensus::{deserialize, serialize}; +use sdk_common::sp_client::bitcoin::hashes::HashEngine; +use sdk_common::sp_client::bitcoin::hashes::{sha256, Hash}; +use sdk_common::sp_client::bitcoin::hex::{ + parse, DisplayHex, FromHex, HexToArrayError, HexToBytesError, +}; +use sdk_common::sp_client::bitcoin::key::Secp256k1; +use sdk_common::sp_client::bitcoin::secp256k1::ecdh::shared_secret_point; +use sdk_common::sp_client::bitcoin::secp256k1::{PublicKey, SecretKey}; +use sdk_common::sp_client::bitcoin::{Amount, Network, OutPoint, Psbt, Transaction, Txid}; +use sdk_common::sp_client::silentpayments::utils as sp_utils; +use sdk_common::sp_client::silentpayments::{Error as SpError, Network as SpNetwork}; use serde_json::{Error as SerdeJsonError, Value}; use shamir::SecretData; -use sp_client::bitcoin::blockdata::fee_rate; -use sp_client::bitcoin::consensus::{deserialize, serialize}; -use sp_client::bitcoin::hashes::HashEngine; -use sp_client::bitcoin::hashes::{sha256, Hash}; -use sp_client::bitcoin::hex::{parse, DisplayHex, FromHex, HexToArrayError, HexToBytesError}; -use sp_client::bitcoin::key::Secp256k1; -use sp_client::bitcoin::secp256k1::ecdh::shared_secret_point; -use sp_client::bitcoin::secp256k1::{PublicKey, SecretKey}; -use sp_client::bitcoin::{Amount, Network, OutPoint, Psbt, Transaction, Txid}; -use sp_client::silentpayments::utils as sp_utils; -use sp_client::silentpayments::{Error as SpError, Network as SpNetwork}; +use sdk_common::sp_client::silentpayments::sending::SilentPaymentAddress; use serde::{Deserialize, Serialize}; -use sp_client::silentpayments::sending::SilentPaymentAddress; use tsify::Tsify; use wasm_bindgen::convert::FromWasmAbi; use wasm_bindgen::prelude::*; use sdk_common::network::{ - self, AnkFlag, AnkNetworkMsg, CachedMessage, CachedMessageStatus, FaucetMessage, NewTxMessage, - CipherMessage, + self, AnkFlag, AnkNetworkMsg, CachedMessage, CachedMessageStatus, CipherMessage, FaucetMessage, + NewTxMessage, }; use sdk_common::silentpayments::{ create_transaction, create_transaction_for_address_with_shared_secret, create_transaction_spend_outpoint, map_outputs_to_sp_address, }; -use sp_client::spclient::{ +use sdk_common::sp_client::spclient::{ derive_keys_from_seed, OutputList, OutputSpendStatus, OwnedOutput, Recipient, SpClient, }; -use sp_client::spclient::{SpWallet, SpendKey}; +use sdk_common::sp_client::spclient::{SpWallet, SpendKey}; use crate::user::{lock_connected_user, User, UserWallets, CONNECTED_USER}; use crate::{images, lock_messages, CACHEDMESSAGES}; @@ -102,32 +104,32 @@ impl From for ApiError { } } -impl From for ApiError { - fn from(value: sp_client::bitcoin::psbt::PsbtParseError) -> Self { +impl From for ApiError { + fn from(value: sdk_common::sp_client::bitcoin::psbt::PsbtParseError) -> Self { ApiError { message: value.to_string(), } } } -impl From for ApiError { - fn from(value: sp_client::bitcoin::psbt::ExtractTxError) -> Self { +impl From for ApiError { + fn from(value: sdk_common::sp_client::bitcoin::psbt::ExtractTxError) -> Self { ApiError { message: value.to_string(), } } } -impl From for ApiError { - fn from(value: sp_client::bitcoin::secp256k1::Error) -> Self { +impl From for ApiError { + fn from(value: sdk_common::sp_client::bitcoin::secp256k1::Error) -> Self { ApiError { message: value.to_string(), } } } -impl From for ApiError { - fn from(value: sp_client::bitcoin::consensus::encode::Error) -> Self { +impl From for ApiError { + fn from(value: sdk_common::sp_client::bitcoin::consensus::encode::Error) -> Self { ApiError { message: value.to_string(), } @@ -423,13 +425,10 @@ fn handle_recover_transaction( // we inspect inputs looking for links with previous tx for input in tx.input.iter() { - if let Some(pos) = messages - .iter() - .position(|m| { - debug!("{:?}", Some(input.previous_output)); - m.confirmed_by == Some(input.previous_output) - }) - { + if let Some(pos) = messages.iter().position(|m| { + debug!("{:?}", Some(input.previous_output)); + m.confirmed_by == Some(input.previous_output) + }) { let message = messages.get_mut(pos).unwrap(); // If we are receiver, that's pretty much it, just set status to complete message.status = CachedMessageStatus::Complete; @@ -511,31 +510,40 @@ fn handle_recover_transaction( // eiter this is notification, a challenge, or response to a challenge // if notification, commitment is the same than in the message // if challenge or response, commitment is H(commitment | b_scan), b_scan being different depending on who we are - if let Some(message) = messages - .iter() - .find(|m| { - if commitment.is_empty() || m.commitment.is_none() { return false } - match m.status { - CachedMessageStatus::SentWaitingConfirmation => { - // commitment we're looking for is simply what's in the message - m.commitment.as_ref().map(|c| Vec::from_hex(&c).unwrap()).unwrap() == commitment - }, - CachedMessageStatus::MustSpendConfirmation | CachedMessageStatus::ReceivedMustConfirm => { - // we compute the potential commitment - let m_commitment = m.commitment.as_ref().map(|c| Vec::from_hex(&c).unwrap()).unwrap(); - let mut buf = [0u8;64]; - buf[..32].copy_from_slice(&m_commitment); - buf[32..].copy_from_slice(&sp_wallet.get_client().get_scan_key().secret_bytes()); - - let mut engine = sha256::HashEngine::default(); - engine.write_all(&buf).unwrap(); - let hash = sha256::Hash::from_engine(engine); - hash.to_byte_array().to_vec() == commitment - }, - _ => return false + if let Some(message) = messages.iter().find(|m| { + if commitment.is_empty() || m.commitment.is_none() { + return false; + } + match m.status { + CachedMessageStatus::SentWaitingConfirmation => { + // commitment we're looking for is simply what's in the message + m.commitment + .as_ref() + .map(|c| Vec::from_hex(&c).unwrap()) + .unwrap() + == commitment } - }) - { + CachedMessageStatus::MustSpendConfirmation + | CachedMessageStatus::ReceivedMustConfirm => { + // we compute the potential commitment + let m_commitment = m + .commitment + .as_ref() + .map(|c| Vec::from_hex(&c).unwrap()) + .unwrap(); + let mut buf = [0u8; 64]; + buf[..32].copy_from_slice(&m_commitment); + buf[32..] + .copy_from_slice(&sp_wallet.get_client().get_scan_key().secret_bytes()); + + let mut engine = sha256::HashEngine::default(); + engine.write_all(&buf).unwrap(); + let hash = sha256::Hash::from_engine(engine); + hash.to_byte_array().to_vec() == commitment + } + _ => return false, + } + }) { return Ok(message.clone()); } else { return Err(anyhow::Error::msg( @@ -624,7 +632,7 @@ pub fn parse_network_msg(raw: String, fee_rate: u32) -> ApiResult debug!("Faucet msg returned with an error: {}", error); } unimplemented!(); - }, + } AnkFlag::Cipher => { // let's try to decrypt with keys we found in transactions but haven't used yet let mut messages = lock_messages()?; @@ -738,7 +746,9 @@ pub fn answer_confirmation_transaction( message = m; } else { - return Err(ApiError { message: format!("Can't find message for id {}", message_id) }); + return Err(ApiError { + message: format!("Can't find message for id {}", message_id), + }); } let sp_address: SilentPaymentAddress = @@ -798,7 +808,9 @@ pub fn create_confirmation_transaction( message = m; } else { - return Err(ApiError { message: format!("Can't find message for id {}", message_id) }); + return Err(ApiError { + message: format!("Can't find message for id {}", message_id), + }); } let sp_address: SilentPaymentAddress = message.sender.as_ref().unwrap().as_str().try_into()?; @@ -836,7 +848,10 @@ pub fn create_confirmation_transaction( let final_tx = signed_psbt.extract_tx()?; - message.confirmed_by = Some(OutPoint { txid: final_tx.txid(), vout: recipients_vouts[0] as u32 }); + message.confirmed_by = Some(OutPoint { + txid: final_tx.txid(), + vout: recipients_vouts[0] as u32, + }); Ok(createTransactionReturn { txid: final_tx.txid().to_string(), @@ -891,7 +906,10 @@ pub fn create_notification_transaction( shared_secret.to_byte_array().to_lower_hex_string() ); - let cipher = encrypt_with_key(serde_json::to_string(&message)?, shared_secret.to_byte_array().to_lower_hex_string())?; + let cipher = encrypt_with_key( + serde_json::to_string(&message)?, + shared_secret.to_byte_array().to_lower_hex_string(), + )?; // update our cache let sp_address2vouts = map_outputs_to_sp_address(&signed_psbt)?; @@ -913,7 +931,6 @@ pub fn create_notification_transaction( new_msg.recipient = Some(address); new_msg.sender = Some(sp_wallet.get_client().get_receiving_address()); new_msg.status = CachedMessageStatus::SentWaitingConfirmation; - // plaintext and ciphertext to be added later when sending the encrypted message lock_messages()?.push(new_msg.clone()); Ok(createTransactionReturn { diff --git a/crates/sp_client/src/images.rs b/crates/sp_client/src/images.rs index f0e0698..75f3a0d 100644 --- a/crates/sp_client/src/images.rs +++ b/crates/sp_client/src/images.rs @@ -1,7 +1,7 @@ use anyhow::{Error, Result}; use img_parts::{jpeg::Jpeg, Bytes, ImageEXIF}; +use sdk_common::sp_client::bitcoin::secp256k1::SecretKey; use serde::{Deserialize, Serialize}; -use sp_client::bitcoin::secp256k1::SecretKey; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BackUpImage(Vec); diff --git a/crates/sp_client/src/process.rs b/crates/sp_client/src/process.rs index 36e1c47..25eed24 100644 --- a/crates/sp_client/src/process.rs +++ b/crates/sp_client/src/process.rs @@ -1,8 +1,8 @@ use std::fmt::DebugStruct; +use sdk_common::sp_client::silentpayments::sending::SilentPaymentAddress; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use sp_client::silentpayments::sending::SilentPaymentAddress; use tsify::Tsify; use wasm_bindgen::prelude::*; diff --git a/crates/sp_client/src/user.rs b/crates/sp_client/src/user.rs index 5038554..f7af595 100644 --- a/crates/sp_client/src/user.rs +++ b/crates/sp_client/src/user.rs @@ -1,13 +1,13 @@ use anyhow::{Error, Result}; use rand::{self, thread_rng, Rng, RngCore}; +use sdk_common::sp_client::bitcoin::hashes::Hash; +use sdk_common::sp_client::bitcoin::hashes::HashEngine; +use sdk_common::sp_client::bitcoin::hex::{DisplayHex, FromHex}; +use sdk_common::sp_client::bitcoin::secp256k1::SecretKey; +use sdk_common::sp_client::bitcoin::secp256k1::ThirtyTwoByteHash; +use sdk_common::sp_client::spclient::SpClient; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use sp_client::bitcoin::hashes::Hash; -use sp_client::bitcoin::hashes::HashEngine; -use sp_client::bitcoin::hex::{DisplayHex, FromHex}; -use sp_client::bitcoin::secp256k1::SecretKey; -use sp_client::bitcoin::secp256k1::ThirtyTwoByteHash; -use sp_client::spclient::SpClient; use tsify::Tsify; use wasm_bindgen::prelude::*; @@ -18,11 +18,11 @@ use std::io::{Cursor, Read, Write}; use std::str::FromStr; use std::sync::{Mutex, MutexGuard, OnceLock}; -use sp_client::bitcoin::secp256k1::constants::SECRET_KEY_SIZE; -use sp_client::silentpayments::bitcoin_hashes::sha256; -use sp_client::silentpayments::sending::SilentPaymentAddress; -use sp_client::spclient::SpendKey; -use sp_client::spclient::{OutputList, SpWallet}; +use sdk_common::sp_client::bitcoin::secp256k1::constants::SECRET_KEY_SIZE; +use sdk_common::sp_client::silentpayments::bitcoin_hashes::sha256; +use sdk_common::sp_client::silentpayments::sending::SilentPaymentAddress; +use sdk_common::sp_client::spclient::SpendKey; +use sdk_common::sp_client::spclient::{OutputList, SpWallet}; use crate::peers::Peer; use crate::user;