p2pk.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. use std::sync::Arc;
  2. use std::time::Duration;
  3. use anyhow::Result;
  4. use bip39::Mnemonic;
  5. use cdk::amount::SplitTarget;
  6. use cdk::cdk_database::WalletMemoryDatabase;
  7. use cdk::nuts::{CurrencyUnit, SecretKey, SpendingConditions};
  8. use cdk::wallet::SendKind;
  9. use cdk::{Amount, Wallet};
  10. use cdk_integration_tests::{create_backends_fake_wallet, start_mint, wallet_mint, MINT_URL};
  11. #[tokio::test(flavor = "multi_thread", worker_threads = 1)]
  12. pub async fn test_p2pk_swap() -> Result<()> {
  13. tokio::spawn(async move {
  14. let ln_backends = create_backends_fake_wallet();
  15. start_mint(ln_backends).await.expect("Could not start mint")
  16. });
  17. tokio::time::sleep(Duration::from_millis(500)).await;
  18. let mnemonic = Mnemonic::generate(12)?;
  19. let wallet = Wallet::new(
  20. MINT_URL,
  21. CurrencyUnit::Sat,
  22. Arc::new(WalletMemoryDatabase::default()),
  23. &mnemonic.to_seed_normalized(""),
  24. None,
  25. )?;
  26. let wallet = Arc::new(wallet);
  27. // Mint 100 sats for the wallet
  28. wallet_mint(Arc::clone(&wallet), 100.into()).await?;
  29. let secret = SecretKey::generate();
  30. let spending_conditions = SpendingConditions::new_p2pk(secret.public_key(), None);
  31. let amount = Amount::from(10);
  32. let token = wallet
  33. .send(
  34. amount,
  35. None,
  36. Some(spending_conditions),
  37. &SplitTarget::None,
  38. &SendKind::default(),
  39. false,
  40. )
  41. .await?;
  42. let attempt_amount = wallet
  43. .receive(&token.to_string(), SplitTarget::default(), &[], &[])
  44. .await;
  45. // This should fail since the token is not signed
  46. assert!(attempt_amount.is_err());
  47. let wrong_secret = SecretKey::generate();
  48. let received_amount = wallet
  49. .receive(
  50. &token.to_string(),
  51. SplitTarget::default(),
  52. &[wrong_secret],
  53. &[],
  54. )
  55. .await;
  56. assert!(received_amount.is_err());
  57. let received_amount = wallet
  58. .receive(&token.to_string(), SplitTarget::default(), &[secret], &[])
  59. .await
  60. .unwrap();
  61. assert_eq!(received_amount, amount);
  62. Ok(())
  63. }