assert_instruction_count.rs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. mod setup;
  2. use {
  3. mollusk_svm::{result::Check, Mollusk},
  4. solana_sdk::{
  5. account::{Account as SolanaAccount, ReadableAccount},
  6. program_pack::Pack,
  7. pubkey::Pubkey,
  8. },
  9. spl_token::{
  10. id, instruction,
  11. state::{Account, Mint},
  12. },
  13. };
  14. const TRANSFER_AMOUNT: u64 = 1_000_000_000_000_000;
  15. #[test]
  16. fn initialize_mint() {
  17. let mut mollusk = Mollusk::new(&id(), "spl_token");
  18. mollusk.compute_budget.compute_unit_limit = 5_000; // last known 2252
  19. let owner = Pubkey::new_unique();
  20. let mint = Pubkey::new_unique();
  21. let decimals = 9;
  22. let mint_account = {
  23. let space = Mint::LEN;
  24. let lamports = mollusk.sysvars.rent.minimum_balance(space);
  25. SolanaAccount::new(lamports, space, &id())
  26. };
  27. mollusk.process_and_validate_instruction(
  28. &instruction::initialize_mint(&id(), &mint, &owner, None, decimals).unwrap(),
  29. &[
  30. (mint, mint_account),
  31. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  32. ],
  33. &[
  34. Check::success(),
  35. Check::account(&mint)
  36. .data(setup::setup_mint_account(Some(&owner), None, 0, decimals).data())
  37. .build(),
  38. ],
  39. );
  40. }
  41. #[test]
  42. fn initialize_account() {
  43. let mut mollusk = Mollusk::new(&id(), "spl_token");
  44. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 3284
  45. let owner = Pubkey::new_unique();
  46. let mint = Pubkey::new_unique();
  47. let account = Pubkey::new_unique();
  48. let decimals = 9;
  49. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  50. let token_account = {
  51. let space = Account::LEN;
  52. let lamports = mollusk.sysvars.rent.minimum_balance(space);
  53. SolanaAccount::new(lamports, space, &id())
  54. };
  55. mollusk.process_and_validate_instruction(
  56. &instruction::initialize_account(&id(), &account, &mint, &owner).unwrap(),
  57. &[
  58. (account, token_account),
  59. (mint, mint_account),
  60. (owner, SolanaAccount::default()),
  61. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  62. ],
  63. &[
  64. Check::success(),
  65. Check::account(&account)
  66. .data(setup::setup_token_account(&mint, &owner, 0).data())
  67. .build(),
  68. ],
  69. );
  70. }
  71. #[test]
  72. fn mint_to() {
  73. let mut mollusk = Mollusk::new(&id(), "spl_token");
  74. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 2668
  75. let owner = Pubkey::new_unique();
  76. let mint = Pubkey::new_unique();
  77. let account = Pubkey::new_unique();
  78. let decimals = 9;
  79. let mint_account = setup::setup_mint_account(Some(&owner), None, 0, decimals);
  80. let token_account = setup::setup_token_account(&mint, &owner, 0);
  81. mollusk.process_and_validate_instruction(
  82. &instruction::mint_to(&id(), &mint, &account, &owner, &[], TRANSFER_AMOUNT).unwrap(),
  83. &[
  84. (mint, mint_account),
  85. (account, token_account),
  86. (owner, SolanaAccount::default()),
  87. ],
  88. &[
  89. Check::success(),
  90. Check::account(&mint)
  91. .data(
  92. setup::setup_mint_account(Some(&owner), None, TRANSFER_AMOUNT, decimals).data(),
  93. )
  94. .build(),
  95. Check::account(&account)
  96. .data(setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT).data())
  97. .build(),
  98. ],
  99. );
  100. }
  101. #[test]
  102. fn transfer() {
  103. let mut mollusk = Mollusk::new(&id(), "spl_token");
  104. mollusk.compute_budget.compute_unit_limit = 7_000; // last known 2972
  105. let owner = Pubkey::new_unique();
  106. let mint = Pubkey::new_unique();
  107. let source = Pubkey::new_unique();
  108. let destination = Pubkey::new_unique();
  109. let source_token_account = setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT);
  110. let destination_token_account = setup::setup_token_account(&mint, &owner, 0);
  111. mollusk.process_and_validate_instruction(
  112. &instruction::transfer(&id(), &source, &destination, &owner, &[], TRANSFER_AMOUNT).unwrap(),
  113. &[
  114. (source, source_token_account),
  115. (destination, destination_token_account),
  116. (owner, SolanaAccount::default()),
  117. ],
  118. &[
  119. Check::success(),
  120. Check::account(&source)
  121. .data(setup::setup_token_account(&mint, &owner, 0).data())
  122. .build(),
  123. Check::account(&destination)
  124. .data(setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT).data())
  125. .build(),
  126. ],
  127. );
  128. }
  129. #[test]
  130. fn burn() {
  131. let mut mollusk = Mollusk::new(&id(), "spl_token");
  132. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 2655
  133. let owner = Pubkey::new_unique();
  134. let mint = Pubkey::new_unique();
  135. let account = Pubkey::new_unique();
  136. let decimals = 9;
  137. let mint_account = setup::setup_mint_account(None, None, TRANSFER_AMOUNT, decimals);
  138. let token_account = setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT);
  139. mollusk.process_and_validate_instruction(
  140. &instruction::burn(&id(), &account, &mint, &owner, &[], TRANSFER_AMOUNT).unwrap(),
  141. &[
  142. (mint, mint_account),
  143. (account, token_account),
  144. (owner, SolanaAccount::default()),
  145. ],
  146. &[
  147. Check::success(),
  148. Check::account(&account)
  149. .data(setup::setup_token_account(&mint, &owner, 0).data())
  150. .build(),
  151. ],
  152. );
  153. }
  154. #[test]
  155. fn close_account() {
  156. let mut mollusk = Mollusk::new(&id(), "spl_token");
  157. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 1783
  158. let owner = Pubkey::new_unique();
  159. let mint = Pubkey::new_unique();
  160. let account = Pubkey::new_unique();
  161. let decimals = 9;
  162. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  163. let token_account = setup::setup_token_account(&mint, &owner, 0);
  164. mollusk.process_and_validate_instruction(
  165. &instruction::close_account(&id(), &account, &owner, &owner, &[]).unwrap(),
  166. &[
  167. (mint, mint_account),
  168. (account, token_account),
  169. (owner, SolanaAccount::default()),
  170. ],
  171. &[Check::success(), Check::account(&account).closed().build()],
  172. );
  173. }