account_data.spec.ts 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // SPDX-License-Identifier: Apache-2.0
  2. import {loadContractAndCallConstructor, newConnectionAndPayer} from "./setup";
  3. import {Connection, Keypair, PublicKey} from "@solana/web3.js";
  4. import {
  5. approveChecked,
  6. AuthorityType,
  7. createMint,
  8. getAccount, getMint,
  9. getOrCreateAssociatedTokenAccount, mintTo,
  10. setAuthority
  11. } from "@solana/spl-token";
  12. import expect from "expect";
  13. import {Program} from "@coral-xyz/anchor";
  14. describe('Deserialize account data', function () {
  15. this.timeout(500000);
  16. let program: Program;
  17. let storage: Keypair;
  18. let connection: Connection;
  19. let payer: Keypair;
  20. before(async function (){
  21. ({ program, storage } = await loadContractAndCallConstructor('AccountData'));
  22. ([connection, payer] = newConnectionAndPayer()) ;
  23. });
  24. it('token account', async function check_token_account() {
  25. const mint_authority = Keypair.generate();
  26. const freeze_authority = Keypair.generate();
  27. const mint = await createMint(
  28. connection,
  29. payer,
  30. mint_authority.publicKey,
  31. freeze_authority.publicKey,
  32. 0
  33. );
  34. const owner = Keypair.generate();
  35. let token_account = await getOrCreateAssociatedTokenAccount(
  36. connection,
  37. payer,
  38. mint,
  39. owner.publicKey
  40. );
  41. let res = await program.methods.tokenAccount()
  42. .accounts({addr: token_account.address})
  43. .view();
  44. expect(res.mintAccount).toEqual(token_account.mint);
  45. expect(res.owner).toEqual(token_account.owner);
  46. expect(res.balance.toString()).toEqual(token_account.amount.toString());
  47. expect(res.delegatePresent).toEqual(false);
  48. expect(res.delegatePresent).toEqual(token_account.delegate != null);
  49. expect(res.delegate).toEqual(new PublicKey("11111111111111111111111111111111")); // 0
  50. expect(res.state).toEqual({"initialized": {}});
  51. expect(res.isNativePresent).toEqual(false);
  52. expect(res.isNativePresent).toEqual(token_account.rentExemptReserve != null);
  53. expect(res.isNative.toString()).toEqual("0");
  54. expect(res.delegatedAmount.toString()).toEqual(token_account.delegatedAmount.toString());
  55. expect(res.closeAuthorityPresent).toEqual(false);
  56. expect(res.closeAuthorityPresent).toEqual(token_account.closeAuthority != null);
  57. expect(res.closeAuthority).toEqual(new PublicKey("11111111111111111111111111111111")); // 0
  58. const delegate_account = Keypair.generate();
  59. // delegate tokens
  60. await approveChecked(
  61. connection,
  62. payer,
  63. mint,
  64. token_account.address,
  65. delegate_account.publicKey,
  66. owner,
  67. 1,
  68. 0
  69. );
  70. token_account = await getAccount(connection, token_account.address);
  71. res = await program.methods.tokenAccount()
  72. .accounts({addr: token_account.address})
  73. .view();
  74. // The delegate account should be present now
  75. expect(res.delegatePresent).toEqual(true);
  76. expect(res.delegatePresent).toEqual(token_account.delegate != null);
  77. expect(res.delegate).toEqual(token_account.delegate);
  78. const close_authority = Keypair.generate();
  79. // close authority
  80. await setAuthority(
  81. connection,
  82. payer,
  83. token_account.address,
  84. owner,
  85. AuthorityType.CloseAccount,
  86. close_authority.publicKey
  87. );
  88. token_account = await getAccount(connection, token_account.address);
  89. res = await program.methods.tokenAccount()
  90. .accounts({addr: token_account.address})
  91. .view();
  92. // The close authority should be present
  93. expect(res.closeAuthorityPresent).toEqual(true);
  94. expect(res.closeAuthorityPresent).toEqual(token_account.closeAuthority != null);
  95. expect(res.closeAuthority).toEqual(close_authority.publicKey);
  96. const sol_mint = new PublicKey("So11111111111111111111111111111111111111112");
  97. token_account = await getOrCreateAssociatedTokenAccount(
  98. connection,
  99. payer,
  100. sol_mint,
  101. owner.publicKey
  102. );
  103. res = await program.methods.tokenAccount()
  104. .accounts({addr: token_account.address})
  105. .view();
  106. // Is native must be present
  107. expect(res.isNativePresent).toEqual(token_account.isNative);
  108. expect(res.isNativePresent).toEqual(true);
  109. expect(res.isNativePresent).toEqual(token_account.rentExemptReserve != null);
  110. expect(res.isNative.toString()).toEqual(token_account.rentExemptReserve!.toString());
  111. });
  112. it('mint account', async function mint_account() {
  113. const mint_authority = Keypair.generate();
  114. const freeze_authority = Keypair.generate();
  115. const mint = await createMint(
  116. connection,
  117. payer,
  118. mint_authority.publicKey,
  119. freeze_authority.publicKey,
  120. 2
  121. );
  122. const owner = Keypair.generate();
  123. const token_account = await getOrCreateAssociatedTokenAccount(
  124. connection,
  125. payer,
  126. mint,
  127. owner.publicKey
  128. );
  129. await mintTo(
  130. connection,
  131. payer,
  132. mint,
  133. token_account.address,
  134. mint_authority,
  135. 5
  136. );
  137. let mint_data = await getMint(connection, mint);
  138. let res = await program.methods.mintAccount()
  139. .accounts({addr: mint})
  140. .view();
  141. // Authorities are present
  142. expect(res.authorityPresent).toEqual(true);
  143. expect(res.authorityPresent).toEqual(mint_data.mintAuthority != null);
  144. expect(res.mintAuthority).toEqual(mint_data.mintAuthority);
  145. expect(res.supply.toString()).toEqual(mint_data.supply.toString())
  146. expect(res.decimals).toEqual(mint_data.decimals);
  147. expect(res.isInitialized).toEqual(mint_data.isInitialized);
  148. expect(res.freezeAuthorityPresent).toEqual(true);
  149. expect(res.freezeAuthorityPresent).toEqual(mint_data.freezeAuthority != null);
  150. expect(res.freezeAuthority).toEqual(mint_data.freezeAuthority);
  151. await setAuthority(
  152. connection,
  153. payer,
  154. mint,
  155. mint_authority,
  156. AuthorityType.MintTokens,
  157. null
  158. );
  159. await setAuthority(
  160. connection,
  161. payer,
  162. mint,
  163. freeze_authority,
  164. AuthorityType.FreezeAccount,
  165. null
  166. );
  167. mint_data = await getMint(connection, mint);
  168. res = await program.methods.mintAccount()
  169. .accounts({addr: mint})
  170. .view();
  171. // Authorities are not present
  172. expect(res.authorityPresent).toEqual(false);
  173. expect(res.authorityPresent).toEqual(mint_data.mintAuthority != null);
  174. expect(res.supply.toString()).toEqual(mint_data.supply.toString())
  175. expect(res.decimals).toEqual(mint_data.decimals);
  176. expect(res.isInitialized).toEqual(mint_data.isInitialized);
  177. expect(res.freezeAuthorityPresent).toEqual(false);
  178. expect(res.freezeAuthorityPresent).toEqual(mint_data.freezeAuthority != null);
  179. });
  180. });