close_account.rs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #![cfg(feature = "test-sbf")]
  2. mod setup;
  3. use {
  4. mollusk_svm::{result::Check, Mollusk},
  5. solana_sdk::{
  6. account::{AccountSharedData, 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 = AccountSharedData::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. instruction::close_account(&spl_token::id(), &account, &destination, &owner, &[])
  29. .unwrap(),
  30. system_instruction::create_account(
  31. &owner,
  32. &account,
  33. 1_000_000_000,
  34. Account::LEN as u64,
  35. &spl_token::id(),
  36. ),
  37. instruction::initialize_account(&spl_token::id(), &account, &mint, &owner).unwrap(),
  38. ],
  39. &[
  40. (mint, mint_account),
  41. (account, token_account),
  42. (owner, owner_account),
  43. (destination, AccountSharedData::default()),
  44. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  45. ],
  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. #[test]
  61. fn fail_init_after_close_account() {
  62. let mollusk = Mollusk::new(&spl_token::id(), "spl_token");
  63. let owner = Pubkey::new_unique();
  64. let mint = Pubkey::new_unique();
  65. let account = Pubkey::new_unique();
  66. let destination = Pubkey::new_unique();
  67. let decimals = 9;
  68. let owner_account = AccountSharedData::new(1_000_000_000, 0, &system_program::id());
  69. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  70. let token_account = setup::setup_token_account(&mint, &owner, 0);
  71. let expected_destination_lamports = token_account.lamports();
  72. mollusk.process_and_validate_instruction_chain(
  73. &[
  74. instruction::close_account(&spl_token::id(), &account, &destination, &owner, &[])
  75. .unwrap(),
  76. system_instruction::transfer(&owner, &account, 1_000_000_000),
  77. instruction::initialize_account(&spl_token::id(), &account, &mint, &owner).unwrap(),
  78. ],
  79. &[
  80. (mint, mint_account),
  81. (account, token_account),
  82. (owner, owner_account),
  83. (destination, AccountSharedData::default()),
  84. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  85. ],
  86. &[
  87. Check::err(ProgramError::InvalidAccountData),
  88. // Account not re-initialized.
  89. Check::account(&account)
  90. .lamports(1_000_000_000)
  91. .owner(&system_program::id())
  92. .build(),
  93. // The destination should have the lamports from the closed account.
  94. Check::account(&destination)
  95. .lamports(expected_destination_lamports)
  96. .build(),
  97. ],
  98. );
  99. }