2026-06-15 21:53:15 +03:00

209 lines
6.5 KiB
Rust

#![expect(
clippy::tests_outside_test_module,
reason = "We don't care about these in tests"
)]
use anyhow::{Context as _, Result};
use integration_tests::{TestContext, private_mention, public_mention};
use lee::program::Program;
use sequencer_service_rpc::RpcClient as _;
use tokio::test;
use wallet::cli::{Command, SubcommandReturnValue, programs::vault::VaultSubcommand};
#[test]
async fn public_transfer_and_public_claim() -> Result<()> {
let mut ctx = TestContext::new().await?;
let amount: u128 = 100;
let sender = ctx.existing_public_accounts()[0];
let recipient = ctx.existing_public_accounts()[1];
let vault_program_id = Program::vault().id();
let recipient_vault_id = vault_core::compute_vault_account_id(vault_program_id, recipient);
let sender_balance_before = ctx.sequencer_client().get_account_balance(sender).await?;
let recipient_balance_before = ctx
.sequencer_client()
.get_account_balance(recipient)
.await?;
let recipient_vault_balance_before = ctx
.sequencer_client()
.get_account_balance(recipient_vault_id)
.await?;
let transfer_result = wallet::cli::execute_subcommand(
ctx.wallet_mut(),
Command::Vault(VaultSubcommand::Transfer {
from: public_mention(sender),
to: public_mention(recipient),
amount,
}),
)
.await?;
assert!(
matches!(transfer_result, SubcommandReturnValue::Empty),
"Expected Empty return value for public vault transfer"
);
let sender_balance_after_transfer = ctx.sequencer_client().get_account_balance(sender).await?;
let recipient_balance_after_transfer = ctx
.sequencer_client()
.get_account_balance(recipient)
.await?;
let recipient_vault_balance_after_transfer = ctx
.sequencer_client()
.get_account_balance(recipient_vault_id)
.await?;
assert_eq!(
sender_balance_after_transfer,
sender_balance_before - amount
);
assert_eq!(recipient_balance_after_transfer, recipient_balance_before);
assert_eq!(
recipient_vault_balance_after_transfer,
recipient_vault_balance_before + amount
);
let claim_result = wallet::cli::execute_subcommand(
ctx.wallet_mut(),
Command::Vault(VaultSubcommand::Claim {
account_id: public_mention(recipient),
amount,
}),
)
.await?;
assert!(
matches!(claim_result, SubcommandReturnValue::Empty),
"Expected Empty return value for public vault claim"
);
let sender_balance_after_claim = ctx.sequencer_client().get_account_balance(sender).await?;
let recipient_balance_after_claim = ctx
.sequencer_client()
.get_account_balance(recipient)
.await?;
let recipient_vault_balance_after_claim = ctx
.sequencer_client()
.get_account_balance(recipient_vault_id)
.await?;
assert_eq!(sender_balance_after_claim, sender_balance_before - amount);
assert_eq!(
recipient_balance_after_claim,
recipient_balance_before + amount
);
assert_eq!(
recipient_vault_balance_after_claim,
recipient_vault_balance_before
);
Ok(())
}
#[test]
async fn private_transfer_and_private_claim() -> Result<()> {
let mut ctx = TestContext::new().await?;
let amount: u128 = 100;
let sender = ctx.existing_private_accounts()[0];
let owner = ctx.existing_private_accounts()[1];
let vault_program_id = Program::vault().id();
let owner_vault_id = vault_core::compute_vault_account_id(vault_program_id, owner);
let sender_balance_before = ctx
.wallet()
.get_account_private(sender)
.context("Failed to load sender private account")?
.balance;
let owner_balance_before = ctx
.wallet()
.get_account_private(owner)
.context("Failed to load owner private account")?
.balance;
let owner_vault_balance_before = ctx
.sequencer_client()
.get_account_balance(owner_vault_id)
.await?;
let transfer_result = wallet::cli::execute_subcommand(
ctx.wallet_mut(),
Command::Vault(VaultSubcommand::Transfer {
from: private_mention(sender),
to: private_mention(owner),
amount,
}),
)
.await?;
assert!(
matches!(
transfer_result,
SubcommandReturnValue::PrivacyPreservingTransfer { .. }
),
"Expected PrivacyPreservingTransfer return value for private vault transfer"
);
let sender_balance_after_transfer = ctx
.wallet()
.get_account_private(sender)
.context("Failed to load sender private account after transfer")?
.balance;
let owner_balance_after_transfer = ctx
.wallet()
.get_account_private(owner)
.context("Failed to load owner private account after transfer")?
.balance;
let owner_vault_balance_after_transfer = ctx
.sequencer_client()
.get_account_balance(owner_vault_id)
.await?;
assert_eq!(
sender_balance_after_transfer,
sender_balance_before - amount
);
assert_eq!(owner_balance_after_transfer, owner_balance_before);
assert_eq!(
owner_vault_balance_after_transfer,
owner_vault_balance_before + amount
);
let claim_result = wallet::cli::execute_subcommand(
ctx.wallet_mut(),
Command::Vault(VaultSubcommand::Claim {
account_id: private_mention(owner),
amount,
}),
)
.await?;
assert!(
matches!(
claim_result,
SubcommandReturnValue::PrivacyPreservingTransfer { .. }
),
"Expected PrivacyPreservingTransfer return value for private vault claim"
);
let sender_balance_after_claim = ctx
.wallet()
.get_account_private(sender)
.context("Failed to load sender private account after claim")?
.balance;
let owner_balance_after_claim = ctx
.wallet()
.get_account_private(owner)
.context("Failed to load owner private account after claim")?
.balance;
let owner_vault_balance_after_claim = ctx
.sequencer_client()
.get_account_balance(owner_vault_id)
.await?;
assert_eq!(sender_balance_after_claim, sender_balance_before - amount);
assert_eq!(owner_balance_after_claim, owner_balance_before + amount);
assert_eq!(owner_vault_balance_after_claim, owner_vault_balance_before);
Ok(())
}