context.rs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. use crate::account::*;
  2. use anchor_lang::prelude::*;
  3. use anchor_spl::associated_token::AssociatedToken;
  4. use anchor_spl::token::{Mint, Token, TokenAccount};
  5. use anchor_spl::token_interface::{Mint as MintInterface, TokenAccount as TokenAccountInterface};
  6. #[derive(Accounts)]
  7. pub struct TestTokenSeedsInit<'info> {
  8. #[account(
  9. init,
  10. seeds = [b"my-mint-seed".as_ref()],
  11. bump,
  12. payer = authority,
  13. mint::decimals = 6,
  14. mint::authority = authority,
  15. )]
  16. pub mint: Option<Account<'info, Mint>>,
  17. #[account(
  18. init,
  19. seeds = [b"my-token-seed".as_ref()],
  20. bump,
  21. payer = authority,
  22. token::mint = mint,
  23. token::authority = authority,
  24. )]
  25. pub my_pda: Option<Account<'info, TokenAccount>>,
  26. #[account(mut)]
  27. /// CHECK:
  28. pub authority: Option<AccountInfo<'info>>,
  29. pub system_program: Option<Program<'info, System>>,
  30. pub token_program: Option<Program<'info, Token>>,
  31. }
  32. #[derive(Accounts)]
  33. pub struct TestInitAssociatedToken<'info> {
  34. #[account(
  35. init,
  36. associated_token::mint = mint,
  37. payer = payer,
  38. associated_token::authority = payer,
  39. )]
  40. pub token: Option<Account<'info, TokenAccount>>,
  41. pub mint: Option<Account<'info, Mint>>,
  42. #[account(mut)]
  43. pub payer: Option<Signer<'info>>,
  44. pub system_program: Option<Program<'info, System>>,
  45. pub token_program: Option<Program<'info, Token>>,
  46. pub associated_token_program: Option<Program<'info, AssociatedToken>>,
  47. }
  48. #[derive(Accounts)]
  49. pub struct TestInitAssociatedTokenWithTokenProgram<'info> {
  50. #[account(init,
  51. payer = payer,
  52. associated_token::mint = mint,
  53. associated_token::authority = payer,
  54. associated_token::token_program = associated_token_token_program,
  55. )]
  56. pub token: Option<InterfaceAccount<'info, TokenAccountInterface>>,
  57. pub mint: Option<InterfaceAccount<'info, MintInterface>>,
  58. #[account(mut)]
  59. pub payer: Option<Signer<'info>>,
  60. pub system_program: Option<Program<'info, System>>,
  61. /// CHECK: ignore
  62. pub associated_token_token_program: Option<AccountInfo<'info>>,
  63. pub associated_token_program: Option<Program<'info, AssociatedToken>>,
  64. }
  65. #[derive(Accounts)]
  66. pub struct TestValidateAssociatedToken<'info> {
  67. #[account(
  68. associated_token::mint = mint,
  69. associated_token::authority = wallet,
  70. )]
  71. pub token: Option<Account<'info, TokenAccount>>,
  72. pub mint: Option<Account<'info, Mint>>,
  73. /// CHECK:
  74. pub wallet: Option<AccountInfo<'info>>,
  75. }
  76. #[derive(Accounts)]
  77. #[instruction(nonce: u8)]
  78. pub struct TestInstructionConstraint<'info> {
  79. #[account(
  80. seeds = [b"my-seed", my_account.as_ref().unwrap().key.as_ref()],
  81. bump = nonce,
  82. )]
  83. /// CHECK:
  84. pub my_pda: Option<AccountInfo<'info>>,
  85. /// CHECK:
  86. pub my_account: Option<AccountInfo<'info>>,
  87. }
  88. #[derive(Accounts)]
  89. #[instruction(domain: String, seed: Vec<u8>, bump: u8)]
  90. pub struct TestPdaInit<'info> {
  91. #[account(
  92. init,
  93. seeds = [b"my-seed", domain.as_bytes(), foo.as_ref().unwrap().key.as_ref(), &seed],
  94. bump,
  95. payer = my_payer,
  96. space = DataU16::LEN + 8
  97. )]
  98. pub my_pda: Option<Account<'info, DataU16>>,
  99. #[account(mut)]
  100. pub my_payer: Option<Signer<'info>>,
  101. /// CHECK:
  102. pub foo: Option<AccountInfo<'info>>,
  103. pub system_program: Option<Program<'info, System>>,
  104. }
  105. #[derive(Accounts)]
  106. pub struct TestPdaInitZeroCopy<'info> {
  107. #[account(
  108. init,
  109. seeds = [b"my-seed".as_ref()],
  110. bump,
  111. payer = my_payer,
  112. space = DataZeroCopy::LEN + 8
  113. )]
  114. pub my_pda: Option<AccountLoader<'info, DataZeroCopy>>,
  115. #[account(mut)]
  116. pub my_payer: Option<Signer<'info>>,
  117. pub system_program: Option<Program<'info, System>>,
  118. }
  119. #[derive(Accounts)]
  120. pub struct TestPdaMutZeroCopy<'info> {
  121. #[account(
  122. mut,
  123. seeds = [b"my-seed".as_ref()],
  124. bump = my_pda.load()?.bump,
  125. )]
  126. pub my_pda: Option<AccountLoader<'info, DataZeroCopy>>,
  127. /// CHECK:
  128. pub my_payer: Option<AccountInfo<'info>>,
  129. }
  130. #[derive(Accounts)]
  131. pub struct Initialize<'info> {
  132. #[account(zero)]
  133. pub data: Option<Account<'info, Data>>,
  134. }
  135. #[derive(Accounts)]
  136. pub struct InitializeSkipRentExempt<'info> {
  137. #[account(zero, rent_exempt = skip)]
  138. pub data: Option<Account<'info, Data>>,
  139. }
  140. #[derive(Accounts)]
  141. pub struct InitializeNoRentExempt<'info> {
  142. /// CHECK:
  143. pub data: Option<AccountInfo<'info>>,
  144. }
  145. #[derive(Accounts)]
  146. pub struct TestOwner<'info> {
  147. #[account(owner = *misc.key)]
  148. /// CHECK:
  149. pub data: Option<AccountInfo<'info>>,
  150. /// CHECK:
  151. pub misc: AccountInfo<'info>,
  152. }
  153. #[derive(Accounts)]
  154. pub struct TestExecutable<'info> {
  155. #[account(executable)]
  156. /// CHECK:
  157. pub program: Option<AccountInfo<'info>>,
  158. }
  159. #[derive(Accounts)]
  160. pub struct TestClose<'info> {
  161. #[account(mut, close = sol_dest)]
  162. pub data: Option<Account<'info, Data>>,
  163. /// CHECK:
  164. sol_dest: Option<AccountInfo<'info>>,
  165. }
  166. #[derive(Accounts)]
  167. pub struct TestCloseTwice<'info> {
  168. #[account(mut, close = sol_dest)]
  169. pub data: Option<Account<'info, Data>>,
  170. /// CHECK:
  171. pub sol_dest: Option<AccountInfo<'info>>,
  172. }
  173. #[derive(Accounts)]
  174. pub struct TestCloseMut<'info> {
  175. #[account(mut)]
  176. pub data: Option<Account<'info, Data>>,
  177. /// CHECK:
  178. pub sol_dest: Option<AccountInfo<'info>>,
  179. }
  180. #[derive(Accounts)]
  181. pub struct TestSimulate {}
  182. #[derive(Accounts)]
  183. pub struct TestCompositePayer<'info> {
  184. pub composite: TestInit<'info>,
  185. #[account(init, payer = payer.as_ref().unwrap(), space = Data::LEN + 8)]
  186. pub data: Option<Account<'info, Data>>,
  187. pub payer: Option<Signer<'info>>,
  188. pub system_program: Option<Program<'info, System>>,
  189. }
  190. #[derive(Accounts)]
  191. pub struct TestInit<'info> {
  192. #[account(init, payer = payer, space = DataI8::LEN + 8)]
  193. pub data: Option<Account<'info, DataI8>>,
  194. #[account(mut)]
  195. pub payer: Option<Signer<'info>>,
  196. pub system_program: Option<Program<'info, System>>,
  197. }
  198. #[derive(Accounts)]
  199. pub struct TestInitZeroCopy<'info> {
  200. #[account(init, payer = payer, space = DataZeroCopy::LEN + 8)]
  201. pub data: Option<AccountLoader<'info, DataZeroCopy>>,
  202. #[account(mut)]
  203. pub payer: Option<Signer<'info>>,
  204. pub system_program: Option<Program<'info, System>>,
  205. }
  206. #[derive(Accounts)]
  207. pub struct TestInitMint<'info> {
  208. #[account(init, mint::decimals = 6, mint::authority = payer, mint::freeze_authority = payer, payer = payer, )]
  209. pub mint: Option<Account<'info, Mint>>,
  210. #[account(mut)]
  211. pub payer: Option<Signer<'info>>,
  212. pub system_program: Option<Program<'info, System>>,
  213. pub token_program: Option<Program<'info, Token>>,
  214. }
  215. #[derive(Accounts)]
  216. pub struct TestInitMintWithTokenProgram<'info> {
  217. #[account(init,
  218. payer = payer,
  219. mint::decimals = 6,
  220. mint::authority = payer,
  221. mint::freeze_authority = payer,
  222. mint::token_program = mint_token_program,
  223. )]
  224. pub mint: Option<InterfaceAccount<'info, MintInterface>>,
  225. #[account(mut)]
  226. pub payer: Option<Signer<'info>>,
  227. pub system_program: Option<Program<'info, System>>,
  228. /// CHECK: ignore
  229. pub mint_token_program: Option<AccountInfo<'info>>,
  230. }
  231. #[derive(Accounts)]
  232. pub struct TestInitToken<'info> {
  233. #[account(init, token::mint = mint, token::authority = payer, payer = payer, )]
  234. pub token: Option<Account<'info, TokenAccount>>,
  235. pub mint: Option<Account<'info, Mint>>,
  236. #[account(mut)]
  237. pub payer: Option<Signer<'info>>,
  238. pub system_program: Option<Program<'info, System>>,
  239. pub token_program: Option<Program<'info, Token>>,
  240. }
  241. #[derive(Accounts)]
  242. pub struct TestInitTokenWithTokenProgram<'info> {
  243. #[account(init,
  244. payer = payer,
  245. token::mint = mint,
  246. token::authority = payer,
  247. token::token_program = token_token_program,
  248. )]
  249. pub token: Option<Account<'info, TokenAccount>>,
  250. pub mint: Option<Account<'info, Mint>>,
  251. #[account(mut)]
  252. pub payer: Option<Signer<'info>>,
  253. pub system_program: Option<Program<'info, System>>,
  254. /// CHECK: ignore
  255. pub token_token_program: Option<AccountInfo<'info>>,
  256. }
  257. #[derive(Accounts)]
  258. pub struct TestFetchAll<'info> {
  259. #[account(init, payer = authority, space = DataWithFilter::LEN + 8)]
  260. pub data: Option<Account<'info, DataWithFilter>>,
  261. #[account(mut)]
  262. pub authority: Option<Signer<'info>>,
  263. pub system_program: Option<Program<'info, System>>,
  264. }
  265. #[derive(Accounts)]
  266. pub struct TestInitWithEmptySeeds<'info> {
  267. #[account(init, seeds = [], bump, payer = authority, space = Data::LEN + 8)]
  268. pub pda: Option<Account<'info, Data>>,
  269. #[account(mut)]
  270. pub authority: Option<Signer<'info>>,
  271. pub system_program: Option<Program<'info, System>>,
  272. }
  273. #[derive(Accounts)]
  274. pub struct TestEmptySeedsConstraint<'info> {
  275. #[account(seeds = [], bump)]
  276. /// CHECK:
  277. pub pda: Option<AccountInfo<'info>>,
  278. }
  279. #[derive(Accounts)]
  280. pub struct InitWithSpace<'info> {
  281. #[account(init, payer = payer, space = DataU16::LEN + 8)]
  282. pub data: Option<Account<'info, DataU16>>,
  283. #[account(mut)]
  284. pub payer: Option<Signer<'info>>,
  285. pub system_program: Option<Program<'info, System>>,
  286. }
  287. #[derive(Accounts)]
  288. pub struct TestInitIfNeeded<'info> {
  289. // intentionally using more space (+500) to check whether space is checked when using init_if_needed
  290. #[account(init_if_needed, payer = payer, space = DataU16::LEN + 8 + 500)]
  291. pub data: Option<Account<'info, DataU16>>,
  292. #[account(mut)]
  293. pub payer: Option<Signer<'info>>,
  294. pub system_program: Option<Program<'info, System>>,
  295. }
  296. #[derive(Accounts)]
  297. pub struct TestInitIfNeededChecksOwner<'info> {
  298. #[account(init_if_needed, payer = payer, space = 100, owner = *owner.key, seeds = [b"hello"], bump)]
  299. /// CHECK:
  300. pub data: Option<UncheckedAccount<'info>>,
  301. #[account(mut)]
  302. pub payer: Option<Signer<'info>>,
  303. pub system_program: Option<Program<'info, System>>,
  304. /// CHECK:
  305. pub owner: AccountInfo<'info>,
  306. }
  307. #[derive(Accounts)]
  308. #[instruction(seed_data: String)]
  309. pub struct TestInitIfNeededChecksSeeds<'info> {
  310. #[account(init_if_needed, payer = payer, space = 100, seeds = [seed_data.as_bytes()], bump)]
  311. /// CHECK:
  312. pub data: Option<UncheckedAccount<'info>>,
  313. #[account(mut)]
  314. pub payer: Option<Signer<'info>>,
  315. pub system_program: Option<Program<'info, System>>,
  316. }
  317. #[derive(Accounts)]
  318. #[instruction(decimals: u8)]
  319. pub struct TestInitMintIfNeeded<'info> {
  320. #[account(init_if_needed, mint::decimals = decimals, mint::authority = mint_authority, mint::freeze_authority = freeze_authority, payer = payer)]
  321. pub mint: Option<Account<'info, Mint>>,
  322. #[account(mut)]
  323. pub payer: Option<Signer<'info>>,
  324. pub system_program: Option<Program<'info, System>>,
  325. pub token_program: Option<Program<'info, Token>>,
  326. /// CHECK:
  327. pub mint_authority: Option<AccountInfo<'info>>,
  328. /// CHECK:
  329. pub freeze_authority: Option<AccountInfo<'info>>,
  330. }
  331. #[derive(Accounts)]
  332. pub struct TestInitMintIfNeededWithTokenProgram<'info> {
  333. #[account(init_if_needed,
  334. payer = payer,
  335. mint::decimals = 6,
  336. mint::authority = mint_authority,
  337. mint::freeze_authority = freeze_authority,
  338. mint::token_program = mint_token_program,
  339. )]
  340. pub mint: Option<Account<'info, Mint>>,
  341. #[account(mut)]
  342. pub payer: Option<Signer<'info>>,
  343. pub system_program: Option<Program<'info, System>>,
  344. /// CHECK: ignore
  345. pub mint_token_program: Option<AccountInfo<'info>>,
  346. /// CHECK: ignore
  347. pub mint_authority: Option<AccountInfo<'info>>,
  348. /// CHECK: ignore
  349. pub freeze_authority: Option<AccountInfo<'info>>,
  350. }
  351. #[derive(Accounts)]
  352. pub struct TestInitTokenIfNeeded<'info> {
  353. #[account(init_if_needed, token::mint = mint, token::authority = authority, payer = payer, )]
  354. pub token: Option<Account<'info, TokenAccount>>,
  355. pub mint: Option<Account<'info, Mint>>,
  356. #[account(mut)]
  357. pub payer: Option<Signer<'info>>,
  358. pub system_program: Option<Program<'info, System>>,
  359. pub token_program: Option<Program<'info, Token>>,
  360. /// CHECK:
  361. pub authority: Option<AccountInfo<'info>>,
  362. }
  363. #[derive(Accounts)]
  364. pub struct TestInitTokenIfNeededWithTokenProgram<'info> {
  365. #[account(init_if_needed,
  366. payer = payer,
  367. token::mint = mint,
  368. token::authority = authority,
  369. token::token_program = token_token_program
  370. )]
  371. pub token: Option<Account<'info, TokenAccount>>,
  372. pub mint: Option<Account<'info, Mint>>,
  373. #[account(mut)]
  374. pub payer: Option<Signer<'info>>,
  375. pub system_program: Option<Program<'info, System>>,
  376. /// CHECK: ignore
  377. pub token_token_program: Option<AccountInfo<'info>>,
  378. /// CHECK:
  379. pub authority: Option<AccountInfo<'info>>,
  380. }
  381. #[derive(Accounts)]
  382. pub struct TestInitAssociatedTokenIfNeeded<'info> {
  383. #[account(init_if_needed,
  384. payer = payer,
  385. associated_token::mint = mint,
  386. associated_token::authority = authority
  387. )]
  388. pub token: Option<Account<'info, TokenAccount>>,
  389. pub mint: Option<Account<'info, Mint>>,
  390. #[account(mut)]
  391. pub payer: Option<Signer<'info>>,
  392. pub system_program: Option<Program<'info, System>>,
  393. pub token_program: Option<Program<'info, Token>>,
  394. pub associated_token_program: Option<Program<'info, AssociatedToken>>,
  395. /// CHECK:
  396. pub authority: Option<AccountInfo<'info>>,
  397. }
  398. #[derive(Accounts)]
  399. pub struct TestInitAssociatedTokenIfNeededWithTokenProgram<'info> {
  400. #[account(init_if_needed,
  401. payer = payer,
  402. associated_token::mint = mint,
  403. associated_token::authority = authority,
  404. associated_token::token_program = associated_token_token_program,
  405. )]
  406. pub token: Option<InterfaceAccount<'info, TokenAccountInterface>>,
  407. pub mint: Option<InterfaceAccount<'info, MintInterface>>,
  408. #[account(mut)]
  409. pub payer: Option<Signer<'info>>,
  410. pub system_program: Option<Program<'info, System>>,
  411. /// CHECK: ignore
  412. pub associated_token_token_program: Option<AccountInfo<'info>>,
  413. pub associated_token_program: Option<Program<'info, AssociatedToken>>,
  414. /// CHECK: ignore
  415. pub authority: Option<AccountInfo<'info>>,
  416. }
  417. #[derive(Accounts)]
  418. pub struct TestMultidimensionalArray<'info> {
  419. #[account(zero)]
  420. pub data: Option<Account<'info, DataMultidimensionalArray>>,
  421. }
  422. #[derive(Accounts)]
  423. pub struct TestConstArraySize<'info> {
  424. #[account(zero)]
  425. pub data: Option<Account<'info, DataConstArraySize>>,
  426. }
  427. #[derive(Accounts)]
  428. pub struct TestConstIxDataSize<'info> {
  429. #[account(zero)]
  430. pub data: Option<Account<'info, DataConstArraySize>>,
  431. }
  432. #[derive(Accounts)]
  433. pub struct TestMultidimensionalArrayConstSizes<'info> {
  434. #[account(zero)]
  435. pub data: Option<Account<'info, DataMultidimensionalArrayConstSizes>>,
  436. }
  437. #[derive(Accounts)]
  438. pub struct NoRentExempt<'info> {
  439. /// CHECK:
  440. pub data: Option<AccountInfo<'info>>,
  441. }
  442. #[derive(Accounts)]
  443. pub struct EnforceRentExempt<'info> {
  444. #[account(rent_exempt = enforce)]
  445. /// CHECK:
  446. pub data: Option<AccountInfo<'info>>,
  447. }
  448. #[derive(Accounts)]
  449. pub struct InitDecreaseLamports<'info> {
  450. #[account(init, payer = user, space = 1000)]
  451. /// CHECK:
  452. pub data: Option<AccountInfo<'info>>,
  453. #[account(mut)]
  454. pub user: Option<Signer<'info>>,
  455. pub system_program: Option<Program<'info, System>>,
  456. }
  457. #[derive(Accounts)]
  458. pub struct InitIfNeededChecksRentExemption<'info> {
  459. #[account(init_if_needed, payer = user, space = 1000)]
  460. /// CHECK:
  461. pub data: Option<AccountInfo<'info>>,
  462. #[account(mut)]
  463. pub user: Option<Signer<'info>>,
  464. pub system_program: Option<Program<'info, System>>,
  465. }
  466. #[derive(Accounts)]
  467. #[instruction(bump: u8, second_bump: u8)]
  468. pub struct TestProgramIdConstraint<'info> {
  469. // not a real associated token account
  470. // just deriving like this for testing purposes
  471. #[account(seeds = [b"seed"], bump = bump, seeds::program = anchor_spl::associated_token::ID)]
  472. /// CHECK:
  473. first: Option<AccountInfo<'info>>,
  474. #[account(seeds = [b"seed"], bump = second_bump, seeds::program = crate::ID)]
  475. /// CHECK:
  476. second: Option<AccountInfo<'info>>,
  477. }
  478. #[derive(Accounts)]
  479. pub struct TestProgramIdConstraintUsingFindPda<'info> {
  480. // not a real associated token account
  481. // just deriving like this for testing purposes
  482. #[account(seeds = [b"seed"], bump, seeds::program = anchor_spl::associated_token::ID)]
  483. /// CHECK:
  484. first: Option<AccountInfo<'info>>,
  485. #[account(seeds = [b"seed"], bump, seeds::program = crate::ID)]
  486. /// CHECK:
  487. second: Option<AccountInfo<'info>>,
  488. }
  489. #[derive(Accounts)]
  490. pub struct TestUnsafeFieldSafetyErrors<'info> {
  491. #[doc = "test"]
  492. /// CHECK:
  493. pub data: Option<UncheckedAccount<'info>>,
  494. #[account(mut)]
  495. /// CHECK:
  496. pub data_two: Option<UncheckedAccount<'info>>,
  497. #[account(
  498. seeds = [b"my-seed", signer.as_ref().unwrap().key.as_ref()],
  499. bump
  500. )]
  501. /// CHECK:
  502. pub data_three: Option<UncheckedAccount<'info>>,
  503. /// CHECK:
  504. pub data_four: Option<UncheckedAccount<'info>>,
  505. pub signer: Option<Signer<'info>>,
  506. pub system_program: Option<Program<'info, System>>,
  507. }
  508. #[derive(Accounts)]
  509. pub struct TestConstraintToken<'info> {
  510. #[account(
  511. token::mint = mint,
  512. token::authority = payer
  513. )]
  514. pub token: Option<Account<'info, TokenAccount>>,
  515. pub mint: Option<Account<'info, Mint>>,
  516. pub payer: Option<Signer<'info>>,
  517. }
  518. #[derive(Accounts)]
  519. pub struct TestAuthorityConstraint<'info> {
  520. #[account(
  521. token::mint = mint,
  522. token::authority = fake_authority
  523. )]
  524. pub token: Option<Account<'info, TokenAccount>>,
  525. pub mint: Option<Account<'info, Mint>>,
  526. pub fake_authority: Option<AccountInfo<'info>>,
  527. }
  528. #[derive(Accounts)]
  529. pub struct TestOnlyAuthorityConstraint<'info> {
  530. #[account(
  531. token::authority = payer
  532. )]
  533. pub token: Option<Account<'info, TokenAccount>>,
  534. pub mint: Option<Account<'info, Mint>>,
  535. pub payer: Option<Signer<'info>>,
  536. }
  537. #[derive(Accounts)]
  538. pub struct TestOnlyTokenProgramConstraint<'info> {
  539. #[account(
  540. token::token_program = token_token_program
  541. )]
  542. pub token: Option<Account<'info, TokenAccount>>,
  543. pub token_token_program: Option<AccountInfo<'info>>,
  544. }
  545. #[derive(Accounts)]
  546. pub struct TestOnlyMintConstraint<'info> {
  547. #[account(
  548. token::mint = mint,
  549. )]
  550. pub token: Option<Account<'info, TokenAccount>>,
  551. pub mint: Option<Account<'info, Mint>>,
  552. }
  553. #[derive(Accounts)]
  554. #[instruction(decimals: u8)]
  555. pub struct TestMintConstraint<'info> {
  556. #[account(
  557. mint::decimals = decimals,
  558. mint::authority = mint_authority,
  559. mint::freeze_authority = freeze_authority
  560. )]
  561. pub mint: Option<Account<'info, Mint>>,
  562. pub mint_authority: Option<AccountInfo<'info>>,
  563. pub freeze_authority: Option<AccountInfo<'info>>,
  564. }
  565. #[derive(Accounts)]
  566. #[instruction(decimals: u8)]
  567. pub struct TestMintOnlyDecimalsConstraint<'info> {
  568. #[account(
  569. mint::decimals = decimals,
  570. )]
  571. pub mint: Option<Account<'info, Mint>>,
  572. }
  573. #[derive(Accounts)]
  574. pub struct TestMintAuthorityConstraint<'info> {
  575. #[account(
  576. mint::authority = mint_authority,
  577. mint::freeze_authority = freeze_authority
  578. )]
  579. pub mint: Option<Account<'info, Mint>>,
  580. pub mint_authority: Option<AccountInfo<'info>>,
  581. pub freeze_authority: Option<AccountInfo<'info>>,
  582. }
  583. #[derive(Accounts)]
  584. pub struct TestMintOneAuthorityConstraint<'info> {
  585. #[account(
  586. mint::authority = mint_authority,
  587. )]
  588. pub mint: Option<Account<'info, Mint>>,
  589. pub mint_authority: Option<AccountInfo<'info>>,
  590. }
  591. #[derive(Accounts)]
  592. #[instruction(decimals: u8)]
  593. pub struct TestMintMissMintAuthConstraint<'info> {
  594. #[account(
  595. mint::decimals = decimals,
  596. mint::freeze_authority = freeze_authority,
  597. )]
  598. pub mint: Option<Account<'info, Mint>>,
  599. pub freeze_authority: Option<AccountInfo<'info>>,
  600. }
  601. #[derive(Accounts)]
  602. pub struct TestMintOnlyTokenProgramConstraint<'info> {
  603. #[account(
  604. mint::token_program = mint_token_program,
  605. )]
  606. pub mint: Option<Account<'info, Mint>>,
  607. /// CHECK: ignore
  608. pub mint_token_program: Option<AccountInfo<'info>>,
  609. }
  610. #[derive(Accounts)]
  611. pub struct TestAssociatedToken<'info> {
  612. #[account(
  613. associated_token::mint = mint,
  614. associated_token::authority = authority,
  615. )]
  616. pub token: Option<Account<'info, TokenAccount>>,
  617. pub mint: Option<Account<'info, Mint>>,
  618. pub authority: Option<AccountInfo<'info>>,
  619. }
  620. #[derive(Accounts)]
  621. pub struct TestAssociatedTokenWithTokenProgramConstraint<'info> {
  622. #[account(
  623. associated_token::mint = mint,
  624. associated_token::authority = authority,
  625. associated_token::token_program = associated_token_token_program,
  626. )]
  627. pub token: Option<InterfaceAccount<'info, TokenAccountInterface>>,
  628. pub mint: InterfaceAccount<'info, MintInterface>,
  629. /// CHECK: ignore
  630. pub authority: AccountInfo<'info>,
  631. /// CHECK: ignore
  632. pub associated_token_token_program: Option<AccountInfo<'info>>,
  633. }
  634. #[derive(Accounts)]
  635. pub struct InitManyAssociatedTokenAccounts<'info> {
  636. #[account(
  637. init,
  638. payer = user,
  639. mint::authority = user,
  640. mint::decimals = 9,
  641. )]
  642. pub mint: Account<'info, Mint>,
  643. #[account(
  644. init,
  645. payer = user,
  646. associated_token::authority = user,
  647. associated_token::mint = mint,
  648. )]
  649. pub ata1: Account<'info, TokenAccount>,
  650. #[account(
  651. init,
  652. payer = user,
  653. associated_token::authority = system_program,
  654. associated_token::mint = mint,
  655. )]
  656. pub ata2: Account<'info, TokenAccount>,
  657. #[account(
  658. init,
  659. payer = user,
  660. associated_token::authority = token_program,
  661. associated_token::mint = mint,
  662. )]
  663. pub ata3: Account<'info, TokenAccount>,
  664. #[account(
  665. init,
  666. payer = user,
  667. associated_token::authority = associated_token_program,
  668. associated_token::mint = mint,
  669. )]
  670. pub ata4: Account<'info, TokenAccount>,
  671. #[account(
  672. init,
  673. payer = user,
  674. associated_token::authority = mint,
  675. associated_token::mint = mint,
  676. )]
  677. pub ata5: Account<'info, TokenAccount>,
  678. #[account(mut)]
  679. pub user: Signer<'info>,
  680. pub system_program: Program<'info, System>,
  681. pub token_program: Program<'info, Token>,
  682. pub associated_token_program: Program<'info, AssociatedToken>,
  683. }
  684. #[derive(Accounts)]
  685. pub struct TestMultipleZeroConstraint<'info> {
  686. #[account(zero)]
  687. pub one: Option<Account<'info, Data>>,
  688. #[account(zero)]
  689. pub two: Option<Account<'info, Data>>,
  690. }
  691. #[derive(Accounts)]
  692. pub struct TestInitAndZero<'info> {
  693. #[account(init, payer = payer, space = Data::DISCRIMINATOR.len() + Data::LEN)]
  694. pub init: Option<Account<'info, Data>>,
  695. #[account(zero)]
  696. pub zero: Option<Account<'info, Data>>,
  697. #[account(mut)]
  698. pub payer: Option<Signer<'info>>,
  699. pub system_program: Option<Program<'info, System>>,
  700. }