test.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use litesvm::LiteSVM;
  2. use solana_instruction::{AccountMeta, Instruction};
  3. use solana_keypair::{Keypair, Signer};
  4. use solana_program::native_token::LAMPORTS_PER_SOL;
  5. use solana_pubkey::Pubkey;
  6. use solana_system_interface::instruction::create_account;
  7. use solana_transaction::Transaction;
  8. use transfer_sol_program::processor::TransferInstruction;
  9. #[test]
  10. fn test_transfer_sol() {
  11. let mut svm = LiteSVM::new();
  12. let program_id = Pubkey::new_unique();
  13. let program_bytes = include_bytes!("../../tests/fixtures/transfer_sol_program.so");
  14. svm.add_program(program_id, program_bytes).unwrap();
  15. let payer = Keypair::new();
  16. svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap();
  17. let test_recipient1 = Keypair::new();
  18. let test_recipient2 = Keypair::new();
  19. let test_recipient3 = Keypair::new();
  20. let payer_balance_before = svm.get_balance(&payer.pubkey()).unwrap();
  21. let recipient_balance_before = svm.get_balance(&test_recipient1.pubkey()).unwrap_or(0);
  22. let data = borsh::to_vec(&TransferInstruction::CpiTransfer(LAMPORTS_PER_SOL)).unwrap();
  23. let ix = Instruction {
  24. program_id,
  25. accounts: vec![
  26. AccountMeta::new(payer.pubkey(), true),
  27. AccountMeta::new(test_recipient1.pubkey(), false),
  28. AccountMeta::new(solana_system_interface::program::ID, false),
  29. ],
  30. data,
  31. };
  32. let tx = Transaction::new_signed_with_payer(
  33. &[ix],
  34. Some(&payer.pubkey()),
  35. &[&payer],
  36. svm.latest_blockhash(),
  37. );
  38. let _ = svm.send_transaction(tx).is_ok();
  39. let payer_balance_after = svm.get_balance(&payer.pubkey()).unwrap();
  40. let recipient_balance_after = svm.get_balance(&test_recipient1.pubkey()).unwrap_or(0);
  41. assert!(payer_balance_before > payer_balance_after);
  42. assert!(recipient_balance_before < recipient_balance_after);
  43. let create_ix = create_account(
  44. &payer.pubkey(),
  45. &test_recipient2.pubkey(),
  46. 2 * LAMPORTS_PER_SOL,
  47. 0,
  48. &program_id,
  49. );
  50. let tx = Transaction::new_signed_with_payer(
  51. &[create_ix],
  52. Some(&payer.pubkey()),
  53. &[&payer, &test_recipient2],
  54. svm.latest_blockhash(),
  55. );
  56. let _ = svm.send_transaction(tx).is_ok();
  57. let data = borsh::to_vec(&TransferInstruction::ProgramTransfer(LAMPORTS_PER_SOL)).unwrap();
  58. let ix = Instruction {
  59. program_id,
  60. accounts: vec![
  61. AccountMeta::new(test_recipient2.pubkey(), true),
  62. AccountMeta::new(test_recipient3.pubkey(), false),
  63. AccountMeta::new(solana_system_interface::program::ID, false),
  64. ],
  65. data,
  66. };
  67. let tx = Transaction::new_signed_with_payer(
  68. &[ix],
  69. Some(&payer.pubkey()),
  70. &[&payer, &test_recipient2],
  71. svm.latest_blockhash(),
  72. );
  73. let _ = svm.send_transaction(tx).is_ok();
  74. }