1
0

createAssociatedToken.test.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import {
  2. Account,
  3. appendTransactionMessageInstruction,
  4. generateKeyPairSigner,
  5. none,
  6. pipe,
  7. } from '@solana/kit';
  8. import test from 'ava';
  9. import {
  10. AccountState,
  11. TOKEN_PROGRAM_ADDRESS,
  12. Token,
  13. fetchToken,
  14. findAssociatedTokenPda,
  15. getCreateAssociatedTokenInstructionAsync,
  16. } from '../src';
  17. import {
  18. createDefaultSolanaClient,
  19. createDefaultTransaction,
  20. createMint,
  21. generateKeyPairSignerWithSol,
  22. signAndSendTransaction,
  23. } from './_setup';
  24. test('it creates a new associated token account', async (t) => {
  25. // Given a mint account, its mint authority and a token owner.
  26. const client = createDefaultSolanaClient();
  27. const [payer, mintAuthority, owner] = await Promise.all([
  28. generateKeyPairSignerWithSol(client),
  29. generateKeyPairSigner(),
  30. generateKeyPairSigner(),
  31. ]);
  32. const mint = await createMint(client, payer, mintAuthority.address);
  33. // When we create and initialize a token account at this address.
  34. const createAta = await getCreateAssociatedTokenInstructionAsync({
  35. payer,
  36. mint,
  37. owner: owner.address,
  38. });
  39. await pipe(
  40. await createDefaultTransaction(client, payer),
  41. (tx) => appendTransactionMessageInstruction(createAta, tx),
  42. (tx) => signAndSendTransaction(client, tx)
  43. );
  44. // Then we expect the token account to exist and have the following data.
  45. const [ata] = await findAssociatedTokenPda({
  46. mint,
  47. owner: owner.address,
  48. tokenProgram: TOKEN_PROGRAM_ADDRESS,
  49. });
  50. t.like(await fetchToken(client.rpc, ata), <Account<Token>>{
  51. address: ata,
  52. data: {
  53. mint,
  54. owner: owner.address,
  55. amount: 0n,
  56. delegate: none(),
  57. state: AccountState.Initialized,
  58. isNative: none(),
  59. delegatedAmount: 0n,
  60. closeAuthority: none(),
  61. },
  62. });
  63. });