close_account.rs 4.4 KB

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