Skip to content
This repository was archived by the owner on Feb 3, 2025. It is now read-only.

Commit 256876a

Browse files
authored
Merge pull request #1158 from MutinyWallet/hermes-tests
Hermes Tests
2 parents 5a6cf57 + 2ff62a4 commit 256876a

File tree

3 files changed

+714
-96
lines changed

3 files changed

+714
-96
lines changed

Diff for: mutiny-core/src/blindauth.rs

+75-2
Original file line numberDiff line numberDiff line change
@@ -407,9 +407,54 @@ fn create_blind_auth_secret(
407407
}
408408

409409
#[cfg(test)]
410+
#[cfg(not(target_arch = "wasm32"))]
410411
mod test {
411-
use crate::blindauth::{ServicePlanIndex, SignedToken, TokenStorage};
412-
use tbs::{BlindedMessage, BlindedSignature};
412+
use crate::auth::MutinyAuthClient;
413+
use crate::blindauth::{BlindAuthClient, ServicePlanIndex, SignedToken, TokenStorage};
414+
use crate::generate_seed;
415+
use crate::logging::MutinyLogger;
416+
use crate::storage::MemoryStorage;
417+
use crate::test_utils::create_manager;
418+
use bitcoin::bip32::ExtendedPrivKey;
419+
use bitcoin::Network;
420+
use nostr::prelude::hex;
421+
use std::sync::Arc;
422+
use tbs::{
423+
unblind_signature, AggregatePublicKey, BlindedMessage, BlindedSignature, PubKeyPoint,
424+
};
425+
426+
const FREE_PK: &str = "a5596b43416c17dcd331a64d4a5f60ab3a470fc03f83a3d834910903ee78f5ade33da927b86481d6edd3de08e89455d6115f5c5e642f4a47d24c85a458369e736cfc410b984cf7e4bf97853a40632f26ca9ad65008bfbe27f40ab8aa7bdffe9f";
427+
428+
fn create_client() -> BlindAuthClient<MemoryStorage> {
429+
let storage = MemoryStorage::default();
430+
let logger = Arc::new(MutinyLogger::default());
431+
let mnemonic = generate_seed(12).unwrap();
432+
let xpriv = ExtendedPrivKey::new_master(Network::Regtest, &mnemonic.to_seed("")).unwrap();
433+
434+
// Set up test auth client
435+
let auth_manager = create_manager();
436+
let lnurl_client = Arc::new(
437+
lnurl::Builder::default()
438+
.build_async()
439+
.expect("failed to make lnurl client"),
440+
);
441+
let auth_client = MutinyAuthClient::new(
442+
auth_manager,
443+
lnurl_client,
444+
logger.clone(),
445+
"https://auth-staging.mutinywallet.com".to_string(),
446+
);
447+
448+
BlindAuthClient::new(
449+
xpriv,
450+
Arc::new(auth_client),
451+
Network::Regtest,
452+
"https://blind-auth-staging.mutinywallet.com".to_string(),
453+
&storage,
454+
logger,
455+
)
456+
.unwrap()
457+
}
413458

414459
#[test]
415460
fn test_token_storage_serialization() {
@@ -447,4 +492,32 @@ mod test {
447492
let deserialized: TokenStorage = serde_json::from_str(string).unwrap();
448493
assert_eq!(storage, deserialized);
449494
}
495+
496+
#[tokio::test]
497+
async fn test_blind_auth_client() {
498+
let client = create_client();
499+
assert!(client.available_tokens().await.is_empty());
500+
501+
client.redeem_available_tokens().await.unwrap();
502+
503+
let tokens = client.available_tokens().await;
504+
assert!(!tokens.is_empty());
505+
506+
let token = tokens.first().unwrap();
507+
508+
// do the unblinding
509+
let (nonce, blinding_key) = client.get_unblinded_info_from_token(token);
510+
let unblinded_sig = unblind_signature(blinding_key, token.blind_sig);
511+
512+
// check that the signature is valid
513+
let free_pk: AggregatePublicKey = AggregatePublicKey(
514+
PubKeyPoint::from_compressed(
515+
hex::decode(FREE_PK).expect("Invalid key hex")[..]
516+
.try_into()
517+
.expect("Invalid key byte key"),
518+
)
519+
.expect("Invalid FREE_PK"),
520+
);
521+
assert!(tbs::verify(nonce.to_message(), unblinded_sig, free_pk));
522+
}
450523
}

Diff for: mutiny-core/src/federation.rs

+19
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,15 @@ pub struct FedimintBalance {
195195
pub amount: u64,
196196
}
197197

198+
#[cfg_attr(test, mockall::automock)]
199+
pub trait FedimintClient {
200+
async fn claim_external_receive(
201+
&self,
202+
secret_key: &SecretKey,
203+
tweaks: Vec<u64>,
204+
) -> Result<(), MutinyError>;
205+
}
206+
198207
pub(crate) struct FederationClient<S: MutinyStorage> {
199208
pub(crate) uuid: String,
200209
pub(crate) fedimint_client: ClientHandleArc,
@@ -808,6 +817,16 @@ fn maybe_update_after_checking_fedimint<S: MutinyStorage>(
808817
Ok(())
809818
}
810819

820+
impl<S: MutinyStorage> FedimintClient for FederationClient<S> {
821+
async fn claim_external_receive(
822+
&self,
823+
secret_key: &SecretKey,
824+
tweaks: Vec<u64>,
825+
) -> Result<(), MutinyError> {
826+
self.claim_external_receive(secret_key, tweaks).await
827+
}
828+
}
829+
811830
fn sats_round_up(amount: &Amount) -> u64 {
812831
Amount::from_msats(amount.msats + 999).sats_round_down()
813832
}

0 commit comments

Comments
 (0)