close_account.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. mod setup;
  2. use {
  3. mollusk_svm::{result::Check, Mollusk},
  4. solana_account::{Account as SolanaAccount, ReadableAccount},
  5. solana_program_error::ProgramError,
  6. solana_program_pack::Pack,
  7. solana_pubkey::Pubkey,
  8. solana_sdk_ids::system_program,
  9. solana_system_interface::instruction::{create_account, transfer},
  10. spl_token_interface::{instruction, state::Account},
  11. };
  12. #[test]
  13. fn success_init_after_close_account() {
  14. let mollusk = Mollusk::new(&spl_token_interface::id(), "spl_token");
  15. let owner = Pubkey::new_unique();
  16. let mint = Pubkey::new_unique();
  17. let account = Pubkey::new_unique();
  18. let destination = Pubkey::new_unique();
  19. let decimals = 9;
  20. let owner_account = SolanaAccount::new(1_000_000_000, 0, &system_program::id());
  21. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  22. let token_account = setup::setup_token_account(&mint, &owner, 0);
  23. let expected_destination_lamports = token_account.lamports();
  24. mollusk.process_and_validate_instruction_chain(
  25. &[
  26. (
  27. &instruction::close_account(
  28. &spl_token_interface::id(),
  29. &account,
  30. &destination,
  31. &owner,
  32. &[],
  33. )
  34. .unwrap(),
  35. &[Check::success()],
  36. ),
  37. (
  38. &create_account(
  39. &owner,
  40. &account,
  41. 1_000_000_000,
  42. Account::LEN as u64,
  43. &spl_token_interface::id(),
  44. ),
  45. &[Check::success()],
  46. ),
  47. (
  48. &instruction::initialize_account(
  49. &spl_token_interface::id(),
  50. &account,
  51. &mint,
  52. &owner,
  53. )
  54. .unwrap(),
  55. &[
  56. Check::success(),
  57. // Account successfully re-initialized.
  58. Check::account(&account)
  59. .data(setup::setup_token_account(&mint, &owner, 0).data())
  60. .owner(&spl_token_interface::id())
  61. .build(),
  62. // The destination should have the lamports from the closed account.
  63. Check::account(&destination)
  64. .lamports(expected_destination_lamports)
  65. .build(),
  66. ],
  67. ),
  68. ],
  69. &[
  70. (mint, mint_account),
  71. (account, token_account),
  72. (owner, owner_account),
  73. (destination, SolanaAccount::default()),
  74. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  75. ],
  76. );
  77. }
  78. #[test]
  79. fn fail_init_after_close_account() {
  80. let mollusk = Mollusk::new(&spl_token_interface::id(), "spl_token");
  81. let owner = Pubkey::new_unique();
  82. let mint = Pubkey::new_unique();
  83. let account = Pubkey::new_unique();
  84. let destination = Pubkey::new_unique();
  85. let decimals = 9;
  86. let owner_account = SolanaAccount::new(1_000_000_000, 0, &system_program::id());
  87. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  88. let token_account = setup::setup_token_account(&mint, &owner, 0);
  89. let expected_destination_lamports = token_account.lamports();
  90. mollusk.process_and_validate_instruction_chain(
  91. &[
  92. (
  93. &instruction::close_account(
  94. &spl_token_interface::id(),
  95. &account,
  96. &destination,
  97. &owner,
  98. &[],
  99. )
  100. .unwrap(),
  101. &[Check::success()],
  102. ),
  103. (
  104. &transfer(&owner, &account, 1_000_000_000),
  105. &[Check::success()],
  106. ),
  107. (
  108. &instruction::initialize_account(
  109. &spl_token_interface::id(),
  110. &account,
  111. &mint,
  112. &owner,
  113. )
  114. .unwrap(),
  115. &[
  116. Check::err(ProgramError::InvalidAccountData),
  117. // Account not re-initialized.
  118. Check::account(&account)
  119. .lamports(1_000_000_000)
  120. .owner(&system_program::id())
  121. .build(),
  122. // The destination should have the lamports from the closed account.
  123. Check::account(&destination)
  124. .lamports(expected_destination_lamports)
  125. .build(),
  126. ],
  127. ),
  128. ],
  129. &[
  130. (mint, mint_account),
  131. (account, token_account),
  132. (owner, owner_account),
  133. (destination, SolanaAccount::default()),
  134. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  135. ],
  136. );
  137. }