miscNonRentExempt.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import * as anchor from "@project-serum/anchor";
  2. import { Program, AnchorError } from "@project-serum/anchor";
  3. import {
  4. PublicKey,
  5. Keypair,
  6. SystemProgram,
  7. SYSVAR_RENT_PUBKEY,
  8. } from "@solana/web3.js";
  9. // @ts-expect-error
  10. import { Misc } from "../../target/types/misc";
  11. const { assert } = require("chai");
  12. describe("miscNonRentExempt", () => {
  13. // Configure the client to use the local cluster.
  14. const provider = anchor.AnchorProvider.env();
  15. anchor.setProvider(provider);
  16. const program = anchor.workspace.Misc as Program<Misc>;
  17. it("init_if_needed checks rent_exemption if init is not needed", async () => {
  18. const data = Keypair.generate();
  19. await program.rpc.initDecreaseLamports({
  20. accounts: {
  21. data: data.publicKey,
  22. user: provider.wallet.publicKey,
  23. systemProgram: SystemProgram.programId,
  24. },
  25. signers: [data],
  26. });
  27. try {
  28. await program.rpc.initIfNeededChecksRentExemption({
  29. accounts: {
  30. data: data.publicKey,
  31. user: provider.wallet.publicKey,
  32. systemProgram: SystemProgram.programId,
  33. },
  34. signers: [data],
  35. });
  36. assert.ok(false);
  37. } catch (_err) {
  38. assert.isTrue(_err instanceof AnchorError);
  39. const err: AnchorError = _err;
  40. assert.strictEqual(err.error.errorCode.number, 2005);
  41. }
  42. });
  43. it("allows non-rent exempt accounts", async () => {
  44. const data = Keypair.generate();
  45. await program.rpc.initializeNoRentExempt({
  46. accounts: {
  47. data: data.publicKey,
  48. rent: SYSVAR_RENT_PUBKEY,
  49. },
  50. signers: [data],
  51. instructions: [
  52. SystemProgram.createAccount({
  53. programId: program.programId,
  54. space: 8 + 16 + 16,
  55. lamports:
  56. await program.provider.connection.getMinimumBalanceForRentExemption(
  57. 39
  58. ),
  59. fromPubkey: provider.wallet.publicKey,
  60. newAccountPubkey: data.publicKey,
  61. }),
  62. ],
  63. });
  64. await program.rpc.testNoRentExempt({
  65. accounts: {
  66. data: data.publicKey,
  67. },
  68. });
  69. });
  70. it("allows rent exemption to be skipped", async () => {
  71. const data = anchor.web3.Keypair.generate();
  72. await program.rpc.initializeSkipRentExempt({
  73. accounts: {
  74. data: data.publicKey,
  75. rent: SYSVAR_RENT_PUBKEY,
  76. },
  77. signers: [data],
  78. instructions: [
  79. SystemProgram.createAccount({
  80. programId: program.programId,
  81. space: 8 + 16 + 16,
  82. lamports:
  83. await program.provider.connection.getMinimumBalanceForRentExemption(
  84. 39
  85. ),
  86. fromPubkey: provider.wallet.publicKey,
  87. newAccountPubkey: data.publicKey,
  88. }),
  89. ],
  90. });
  91. });
  92. it("can use rent_exempt to enforce rent exemption", async () => {
  93. const data = Keypair.generate();
  94. await program.rpc.initializeSkipRentExempt({
  95. accounts: {
  96. data: data.publicKey,
  97. rent: SYSVAR_RENT_PUBKEY,
  98. },
  99. signers: [data],
  100. instructions: [
  101. SystemProgram.createAccount({
  102. programId: program.programId,
  103. space: 8 + 16 + 16,
  104. lamports:
  105. await program.provider.connection.getMinimumBalanceForRentExemption(
  106. 39
  107. ),
  108. fromPubkey: provider.wallet.publicKey,
  109. newAccountPubkey: data.publicKey,
  110. }),
  111. ],
  112. });
  113. try {
  114. await program.rpc.testEnforceRentExempt({
  115. accounts: {
  116. data: data.publicKey,
  117. },
  118. });
  119. assert.ok(false);
  120. } catch (_err) {
  121. assert.isTrue(_err instanceof AnchorError);
  122. const err: AnchorError = _err;
  123. assert.strictEqual(err.error.errorCode.number, 2005);
  124. assert.strictEqual(
  125. "A rent exemption constraint was violated",
  126. err.error.errorMessage
  127. );
  128. }
  129. });
  130. });