mint.rs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //! Mint integration tests
  2. use std::collections::HashMap;
  3. use std::sync::Arc;
  4. use std::time::Duration;
  5. use anyhow::{bail, Result};
  6. use bip39::Mnemonic;
  7. use cdk::amount::SplitTarget;
  8. use cdk::cdk_database::WalletMemoryDatabase;
  9. use cdk::nuts::CurrencyUnit;
  10. use cdk::wallet::SendKind;
  11. use cdk::Error;
  12. use cdk::Wallet;
  13. use cdk_integration_tests::{create_backends_fake_wallet, start_mint, wallet_mint, MINT_URL};
  14. #[tokio::test(flavor = "multi_thread", worker_threads = 1)]
  15. pub async fn test_mint_double_receive() -> Result<()> {
  16. tokio::spawn(async move {
  17. let ln_backends = create_backends_fake_wallet();
  18. let mut supported_units = HashMap::new();
  19. supported_units.insert(CurrencyUnit::Sat, (0, 64));
  20. start_mint(ln_backends, supported_units)
  21. .await
  22. .expect("Could not start mint")
  23. });
  24. tokio::time::sleep(Duration::from_millis(500)).await;
  25. let mnemonic = Mnemonic::generate(12)?;
  26. let wallet = Wallet::new(
  27. MINT_URL,
  28. CurrencyUnit::Sat,
  29. Arc::new(WalletMemoryDatabase::default()),
  30. &mnemonic.to_seed_normalized(""),
  31. None,
  32. )?;
  33. let wallet = Arc::new(wallet);
  34. wallet_mint(Arc::clone(&wallet), 100.into(), SplitTarget::default()).await?;
  35. println!("Minted");
  36. let token = wallet
  37. .send(
  38. 10.into(),
  39. None,
  40. None,
  41. &SplitTarget::default(),
  42. &SendKind::default(),
  43. false,
  44. )
  45. .await?;
  46. let mnemonic = Mnemonic::generate(12)?;
  47. let wallet_two = Wallet::new(
  48. MINT_URL,
  49. CurrencyUnit::Sat,
  50. Arc::new(WalletMemoryDatabase::default()),
  51. &mnemonic.to_seed_normalized(""),
  52. None,
  53. )?;
  54. let rec = wallet_two
  55. .receive(&token.to_string(), SplitTarget::default(), &[], &[])
  56. .await?;
  57. println!("Received: {}", rec);
  58. // Attempt to receive again
  59. if let Err(err) = wallet
  60. .receive(&token.to_string(), SplitTarget::default(), &[], &[])
  61. .await
  62. {
  63. match err {
  64. Error::TokenAlreadySpent => (),
  65. _ => {
  66. println!("{}", err);
  67. bail!("Expected an already spent error");
  68. }
  69. }
  70. }
  71. Ok(())
  72. }