wrong_fee.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //! Fee tests for over and underpaying
  2. use std::collections::HashMap;
  3. use std::str::FromStr;
  4. use std::sync::Arc;
  5. use std::time::Duration;
  6. use anyhow::{bail, Result};
  7. use bip39::Mnemonic;
  8. use cdk::cdk_database::WalletMemoryDatabase;
  9. use cdk::mint_url::MintUrl;
  10. use cdk::nuts::{CurrencyUnit, SwapRequest};
  11. use cdk::wallet::client::HttpClient;
  12. use cdk::Wallet;
  13. use cdk::{amount::SplitTarget, nuts::PreMintSecrets};
  14. use cdk_integration_tests::{create_backends_fake_wallet, start_mint, wallet_mint, MINT_URL};
  15. #[tokio::test(flavor = "multi_thread", worker_threads = 1)]
  16. pub async fn test_swap_overpay_underpay() -> Result<()> {
  17. tokio::spawn(async move {
  18. let ln_backends = create_backends_fake_wallet();
  19. let mut supported_units = HashMap::new();
  20. supported_units.insert(CurrencyUnit::Sat, (1, 32));
  21. start_mint(ln_backends, supported_units)
  22. .await
  23. .expect("Could not start mint")
  24. });
  25. tokio::time::sleep(Duration::from_millis(500)).await;
  26. let mnemonic = Mnemonic::generate(12)?;
  27. let wallet = Wallet::new(
  28. MINT_URL,
  29. CurrencyUnit::Sat,
  30. Arc::new(WalletMemoryDatabase::default()),
  31. &mnemonic.to_seed_normalized(""),
  32. None,
  33. )?;
  34. let wallet = Arc::new(wallet);
  35. wallet_mint(
  36. Arc::clone(&wallet),
  37. 10000.into(),
  38. SplitTarget::Value(1.into()),
  39. )
  40. .await
  41. .unwrap();
  42. println!("Minted");
  43. let proofs = wallet
  44. .localstore
  45. .get_proofs(Some(MintUrl::from_str(MINT_URL)?), None, None, None)
  46. .await?;
  47. let proofs: Vec<cdk::nuts::Proof> = proofs.into_iter().map(|p| p.proof).collect();
  48. let keyset_id = proofs.first().unwrap().keyset_id;
  49. let pre_swap_proofs = proofs[..1000].to_vec();
  50. // Attempt to swap while overpaying fee
  51. let pre_swap_secret = PreMintSecrets::random(keyset_id, 450.into(), &SplitTarget::default())?;
  52. let swap_request =
  53. SwapRequest::new(pre_swap_proofs.clone(), pre_swap_secret.blinded_messages());
  54. let wallet_client = HttpClient::new();
  55. match wallet_client
  56. .post_swap(MINT_URL.parse()?, swap_request)
  57. .await
  58. {
  59. Ok(_res) => {
  60. bail!("Swap should not have succeeded");
  61. }
  62. Err(err) => match err {
  63. cdk::error::Error::TransactionUnbalanced(_, _, _) => (),
  64. _ => {
  65. println!("{:?}", err);
  66. bail!("Swap returned the wrong error when overpaying fee");
  67. }
  68. },
  69. };
  70. // Attempt to swap while underpaying fee
  71. let pre_swap_secret = PreMintSecrets::random(keyset_id, 1000.into(), &SplitTarget::default())?;
  72. let swap_request =
  73. SwapRequest::new(pre_swap_proofs.clone(), pre_swap_secret.blinded_messages());
  74. match wallet_client
  75. .post_swap(MINT_URL.parse()?, swap_request)
  76. .await
  77. {
  78. Ok(_res) => {
  79. bail!("Swap should not have succeeded");
  80. }
  81. // In the context of this test an error response here is good.
  82. // It means the mint does not allow us to swap for more then we should by overflowing
  83. Err(err) => match err {
  84. cdk::error::Error::TransactionUnbalanced(_, _, _) => (),
  85. _ => {
  86. println!("{:?}", err);
  87. bail!("Swap returned the wrong error when underpaying fee");
  88. }
  89. },
  90. };
  91. Ok(())
  92. }