close_account.rs 4.4 KB

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