close-account.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import * as anchor from "@coral-xyz/anchor";
  2. import { Program } from "@coral-xyz/anchor";
  3. import { Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";
  4. import { CloseAccountProgram } from "../target/types/close_account_program";
  5. import {
  6. BlockheightBasedTransactionConfirmationStrategy,
  7. PublicKey,
  8. } from "@solana/web3.js";
  9. import assert from "assert";
  10. describe("close-an-account", () => {
  11. // Configure the client to use the local cluster.
  12. anchor.setProvider(anchor.AnchorProvider.env());
  13. const program = anchor.workspace
  14. .CloseAccountProgram as Program<CloseAccountProgram>;
  15. const connection = program.provider.connection;
  16. const payer = Keypair.generate();
  17. async function airdrop(receiver: PublicKey, amount: number) {
  18. const sig = await program.provider.connection.requestAirdrop(
  19. receiver,
  20. amount
  21. );
  22. const blockStats = await program.provider.connection.getLatestBlockhash();
  23. const strategy: BlockheightBasedTransactionConfirmationStrategy = {
  24. signature: sig,
  25. blockhash: blockStats.blockhash,
  26. lastValidBlockHeight: blockStats.lastValidBlockHeight,
  27. };
  28. await program.provider.connection.confirmTransaction(strategy, "confirmed");
  29. }
  30. function getUserAccount(user: PublicKey): [PublicKey, number] {
  31. return PublicKey.findProgramAddressSync(
  32. [Buffer.from("USER"), user.toBuffer()],
  33. program.programId
  34. );
  35. }
  36. it("Airdrop", async () => {
  37. const balanceBefore = await connection.getBalance(payer.publicKey);
  38. await airdrop(payer.publicKey, LAMPORTS_PER_SOL);
  39. const balanceAfter = await connection.getBalance(payer.publicKey);
  40. assert.equal(balanceAfter, balanceBefore + LAMPORTS_PER_SOL);
  41. });
  42. it("Create Account", async () => {
  43. const [userAccountAddress] = getUserAccount(payer.publicKey);
  44. const userAccountBefore = await program.account.user.fetchNullable(
  45. userAccountAddress,
  46. "confirmed"
  47. );
  48. assert.equal(userAccountBefore, null);
  49. await program.methods
  50. .createUser({
  51. name: "John Doe",
  52. })
  53. .accounts({
  54. payer: payer.publicKey,
  55. userAccount: userAccountAddress,
  56. })
  57. .signers([payer])
  58. .rpc({ commitment: "confirmed", skipPreflight: true });
  59. const userAccountAfter = await program.account.user.fetchNullable(
  60. userAccountAddress,
  61. "confirmed"
  62. );
  63. assert.notEqual(userAccountAfter, null);
  64. assert.equal(userAccountAfter.name, "John Doe");
  65. assert.equal(userAccountAfter.user.toBase58(), payer.publicKey.toBase58());
  66. });
  67. it("Close Account", async () => {
  68. const [userAccountAddress] = getUserAccount(payer.publicKey);
  69. const userAccountBefore = await program.account.user.fetchNullable(
  70. userAccountAddress,
  71. "confirmed"
  72. );
  73. assert.notEqual(userAccountBefore, null);
  74. await program.methods
  75. .closeUser()
  76. .accounts({
  77. user: payer.publicKey,
  78. userAccount: userAccountAddress,
  79. })
  80. .signers([payer])
  81. .rpc({ commitment: "confirmed" });
  82. const userAccountAfter = await program.account.user.fetchNullable(
  83. userAccountAddress,
  84. "processed"
  85. );
  86. assert.equal(userAccountAfter, null);
  87. });
  88. });