createAssociatedToken.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * This code was AUTOGENERATED using the kinobi library.
  3. * Please DO NOT EDIT THIS FILE, instead use visitors
  4. * to add features, then rerun kinobi to update it.
  5. *
  6. * @see https://github.com/metaplex-foundation/kinobi
  7. */
  8. import {
  9. Address,
  10. IAccountMeta,
  11. IAccountSignerMeta,
  12. IInstruction,
  13. IInstructionWithAccounts,
  14. ReadonlyAccount,
  15. TransactionSigner,
  16. WritableAccount,
  17. WritableSignerAccount,
  18. } from '@solana/web3.js';
  19. import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';
  20. import { ResolvedAccount, getAccountMetaFactory } from '../shared';
  21. export type CreateAssociatedTokenInstruction<
  22. TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  23. TAccountPayer extends string | IAccountMeta<string> = string,
  24. TAccountAta extends string | IAccountMeta<string> = string,
  25. TAccountOwner extends string | IAccountMeta<string> = string,
  26. TAccountMint extends string | IAccountMeta<string> = string,
  27. TAccountSystemProgram extends
  28. | string
  29. | IAccountMeta<string> = '11111111111111111111111111111111',
  30. TAccountTokenProgram extends
  31. | string
  32. | IAccountMeta<string> = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
  33. TRemainingAccounts extends readonly IAccountMeta<string>[] = [],
  34. > = IInstruction<TProgram> &
  35. IInstructionWithAccounts<
  36. [
  37. TAccountPayer extends string
  38. ? WritableSignerAccount<TAccountPayer> &
  39. IAccountSignerMeta<TAccountPayer>
  40. : TAccountPayer,
  41. TAccountAta extends string ? WritableAccount<TAccountAta> : TAccountAta,
  42. TAccountOwner extends string
  43. ? ReadonlyAccount<TAccountOwner>
  44. : TAccountOwner,
  45. TAccountMint extends string
  46. ? ReadonlyAccount<TAccountMint>
  47. : TAccountMint,
  48. TAccountSystemProgram extends string
  49. ? ReadonlyAccount<TAccountSystemProgram>
  50. : TAccountSystemProgram,
  51. TAccountTokenProgram extends string
  52. ? ReadonlyAccount<TAccountTokenProgram>
  53. : TAccountTokenProgram,
  54. ...TRemainingAccounts,
  55. ]
  56. >;
  57. export type CreateAssociatedTokenInput<
  58. TAccountPayer extends string = string,
  59. TAccountAta extends string = string,
  60. TAccountOwner extends string = string,
  61. TAccountMint extends string = string,
  62. TAccountSystemProgram extends string = string,
  63. TAccountTokenProgram extends string = string,
  64. > = {
  65. payer: TransactionSigner<TAccountPayer>;
  66. ata: Address<TAccountAta>;
  67. owner: Address<TAccountOwner>;
  68. mint: Address<TAccountMint>;
  69. systemProgram?: Address<TAccountSystemProgram>;
  70. tokenProgram?: Address<TAccountTokenProgram>;
  71. };
  72. export function getCreateAssociatedTokenInstruction<
  73. TAccountPayer extends string,
  74. TAccountAta extends string,
  75. TAccountOwner extends string,
  76. TAccountMint extends string,
  77. TAccountSystemProgram extends string,
  78. TAccountTokenProgram extends string,
  79. >(
  80. input: CreateAssociatedTokenInput<
  81. TAccountPayer,
  82. TAccountAta,
  83. TAccountOwner,
  84. TAccountMint,
  85. TAccountSystemProgram,
  86. TAccountTokenProgram
  87. >
  88. ): CreateAssociatedTokenInstruction<
  89. typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  90. TAccountPayer,
  91. TAccountAta,
  92. TAccountOwner,
  93. TAccountMint,
  94. TAccountSystemProgram,
  95. TAccountTokenProgram
  96. > {
  97. // Program address.
  98. const programAddress = ASSOCIATED_TOKEN_PROGRAM_ADDRESS;
  99. // Original accounts.
  100. const originalAccounts = {
  101. payer: { value: input.payer ?? null, isWritable: true },
  102. ata: { value: input.ata ?? null, isWritable: true },
  103. owner: { value: input.owner ?? null, isWritable: false },
  104. mint: { value: input.mint ?? null, isWritable: false },
  105. systemProgram: { value: input.systemProgram ?? null, isWritable: false },
  106. tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },
  107. };
  108. const accounts = originalAccounts as Record<
  109. keyof typeof originalAccounts,
  110. ResolvedAccount
  111. >;
  112. // Resolve default values.
  113. if (!accounts.systemProgram.value) {
  114. accounts.systemProgram.value =
  115. '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
  116. }
  117. if (!accounts.tokenProgram.value) {
  118. accounts.tokenProgram.value =
  119. 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;
  120. }
  121. const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
  122. const instruction = {
  123. accounts: [
  124. getAccountMeta(accounts.payer),
  125. getAccountMeta(accounts.ata),
  126. getAccountMeta(accounts.owner),
  127. getAccountMeta(accounts.mint),
  128. getAccountMeta(accounts.systemProgram),
  129. getAccountMeta(accounts.tokenProgram),
  130. ],
  131. programAddress,
  132. } as CreateAssociatedTokenInstruction<
  133. typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  134. TAccountPayer,
  135. TAccountAta,
  136. TAccountOwner,
  137. TAccountMint,
  138. TAccountSystemProgram,
  139. TAccountTokenProgram
  140. >;
  141. return instruction;
  142. }
  143. export type ParsedCreateAssociatedTokenInstruction<
  144. TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  145. TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[],
  146. > = {
  147. programAddress: Address<TProgram>;
  148. accounts: {
  149. payer: TAccountMetas[0];
  150. ata: TAccountMetas[1];
  151. owner: TAccountMetas[2];
  152. mint: TAccountMetas[3];
  153. systemProgram: TAccountMetas[4];
  154. tokenProgram: TAccountMetas[5];
  155. };
  156. };
  157. export function parseCreateAssociatedTokenInstruction<
  158. TProgram extends string,
  159. TAccountMetas extends readonly IAccountMeta[],
  160. >(
  161. instruction: IInstruction<TProgram> & IInstructionWithAccounts<TAccountMetas>
  162. ): ParsedCreateAssociatedTokenInstruction<TProgram, TAccountMetas> {
  163. if (instruction.accounts.length < 6) {
  164. // TODO: Coded error.
  165. throw new Error('Not enough accounts');
  166. }
  167. let accountIndex = 0;
  168. const getNextAccount = () => {
  169. const accountMeta = instruction.accounts![accountIndex]!;
  170. accountIndex += 1;
  171. return accountMeta;
  172. };
  173. return {
  174. programAddress: instruction.programAddress,
  175. accounts: {
  176. payer: getNextAccount(),
  177. ata: getNextAccount(),
  178. owner: getNextAccount(),
  179. mint: getNextAccount(),
  180. systemProgram: getNextAccount(),
  181. tokenProgram: getNextAccount(),
  182. },
  183. };
  184. }