close_account.rs 4.4 KB

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