p2pk.rs 2.3 KB

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