account_data.spec.ts 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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(token_account.address)
  42. .accounts({dataAccount: storage.publicKey})
  43. .remainingAccounts(
  44. [
  45. {pubkey: token_account.address, isSigner: false, isWritable: false}
  46. ]
  47. )
  48. .view();
  49. expect(res.mintAccount).toEqual(token_account.mint);
  50. expect(res.owner).toEqual(token_account.owner);
  51. expect(res.balance.toString()).toEqual(token_account.amount.toString());
  52. expect(res.delegatePresent).toEqual(false);
  53. expect(res.delegatePresent).toEqual(token_account.delegate != null);
  54. expect(res.delegate).toEqual(new PublicKey("11111111111111111111111111111111")); // 0
  55. expect(res.state).toEqual({"initialized": {}});
  56. expect(res.isNativePresent).toEqual(false);
  57. expect(res.isNativePresent).toEqual(token_account.rentExemptReserve != null);
  58. expect(res.isNative.toString()).toEqual("0");
  59. expect(res.delegatedAmount.toString()).toEqual(token_account.delegatedAmount.toString());
  60. expect(res.closeAuthorityPresent).toEqual(false);
  61. expect(res.closeAuthorityPresent).toEqual(token_account.closeAuthority != null);
  62. expect(res.closeAuthority).toEqual(new PublicKey("11111111111111111111111111111111")); // 0
  63. const delegate_account = Keypair.generate();
  64. // delegate tokens
  65. await approveChecked(
  66. connection,
  67. payer,
  68. mint,
  69. token_account.address,
  70. delegate_account.publicKey,
  71. owner,
  72. 1,
  73. 0
  74. );
  75. token_account = await getAccount(connection, token_account.address);
  76. res = await program.methods.tokenAccount(token_account.address)
  77. .accounts({dataAccount: storage.publicKey})
  78. .remainingAccounts(
  79. [
  80. {pubkey: token_account.address, isSigner: false, isWritable: false}
  81. ]
  82. )
  83. .view();
  84. // The delegate account should be present now
  85. expect(res.delegatePresent).toEqual(true);
  86. expect(res.delegatePresent).toEqual(token_account.delegate != null);
  87. expect(res.delegate).toEqual(token_account.delegate);
  88. const close_authority = Keypair.generate();
  89. // close authority
  90. await setAuthority(
  91. connection,
  92. payer,
  93. token_account.address,
  94. owner,
  95. AuthorityType.CloseAccount,
  96. close_authority.publicKey
  97. );
  98. token_account = await getAccount(connection, token_account.address);
  99. res = await program.methods.tokenAccount(token_account.address)
  100. .accounts({dataAccount: storage.publicKey})
  101. .remainingAccounts(
  102. [
  103. {pubkey: token_account.address, isSigner: false, isWritable: false}
  104. ]
  105. )
  106. .view();
  107. // The close authority should be present
  108. expect(res.closeAuthorityPresent).toEqual(true);
  109. expect(res.closeAuthorityPresent).toEqual(token_account.closeAuthority != null);
  110. expect(res.closeAuthority).toEqual(close_authority.publicKey);
  111. const sol_mint = new PublicKey("So11111111111111111111111111111111111111112");
  112. token_account = await getOrCreateAssociatedTokenAccount(
  113. connection,
  114. payer,
  115. sol_mint,
  116. owner.publicKey
  117. );
  118. res = await program.methods.tokenAccount(token_account.address)
  119. .accounts({dataAccount: storage.publicKey})
  120. .remainingAccounts(
  121. [
  122. {pubkey: token_account.address, isSigner: false, isWritable: false}
  123. ]
  124. )
  125. .view();
  126. // Is native must be present
  127. expect(res.isNativePresent).toEqual(token_account.isNative);
  128. expect(res.isNativePresent).toEqual(true);
  129. expect(res.isNativePresent).toEqual(token_account.rentExemptReserve != null);
  130. expect(res.isNative.toString()).toEqual(token_account.rentExemptReserve!.toString());
  131. });
  132. it('mint account', async function mint_account() {
  133. const mint_authority = Keypair.generate();
  134. const freeze_authority = Keypair.generate();
  135. const mint = await createMint(
  136. connection,
  137. payer,
  138. mint_authority.publicKey,
  139. freeze_authority.publicKey,
  140. 2
  141. );
  142. const owner = Keypair.generate();
  143. const token_account = await getOrCreateAssociatedTokenAccount(
  144. connection,
  145. payer,
  146. mint,
  147. owner.publicKey
  148. );
  149. await mintTo(
  150. connection,
  151. payer,
  152. mint,
  153. token_account.address,
  154. mint_authority,
  155. 5
  156. );
  157. let mint_data = await getMint(connection, mint);
  158. let res = await program.methods.mintAccount(mint)
  159. .accounts({dataAccount: storage.publicKey})
  160. .remainingAccounts(
  161. [
  162. {pubkey: mint, isWritable: false, isSigner: false}
  163. ]
  164. )
  165. .view();
  166. // Authorities are present
  167. expect(res.authorityPresent).toEqual(true);
  168. expect(res.authorityPresent).toEqual(mint_data.mintAuthority != null);
  169. expect(res.mintAuthority).toEqual(mint_data.mintAuthority);
  170. expect(res.supply.toString()).toEqual(mint_data.supply.toString())
  171. expect(res.decimals).toEqual(mint_data.decimals);
  172. expect(res.isInitialized).toEqual(mint_data.isInitialized);
  173. expect(res.freezeAuthorityPresent).toEqual(true);
  174. expect(res.freezeAuthorityPresent).toEqual(mint_data.freezeAuthority != null);
  175. expect(res.freezeAuthority).toEqual(mint_data.freezeAuthority);
  176. await setAuthority(
  177. connection,
  178. payer,
  179. mint,
  180. mint_authority,
  181. AuthorityType.MintTokens,
  182. null
  183. );
  184. await setAuthority(
  185. connection,
  186. payer,
  187. mint,
  188. freeze_authority,
  189. AuthorityType.FreezeAccount,
  190. null
  191. );
  192. mint_data = await getMint(connection, mint);
  193. res = await program.methods.mintAccount(mint)
  194. .accounts({dataAccount: storage.publicKey})
  195. .remainingAccounts(
  196. [
  197. {pubkey: mint, isWritable: false, isSigner: false}
  198. ]
  199. )
  200. .view();
  201. // Authorities are not present
  202. expect(res.authorityPresent).toEqual(false);
  203. expect(res.authorityPresent).toEqual(mint_data.mintAuthority != null);
  204. expect(res.supply.toString()).toEqual(mint_data.supply.toString())
  205. expect(res.decimals).toEqual(mint_data.decimals);
  206. expect(res.isInitialized).toEqual(mint_data.isInitialized);
  207. expect(res.freezeAuthorityPresent).toEqual(false);
  208. expect(res.freezeAuthorityPresent).toEqual(mint_data.freezeAuthority != null);
  209. });
  210. });