assert_instruction_count.rs 6.3 KB

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