createAssociatedToken.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. /**
  2. * This code was AUTOGENERATED using the codama library.
  3. * Please DO NOT EDIT THIS FILE, instead use visitors
  4. * to add features, then rerun codama to update it.
  5. *
  6. * @see https://github.com/codama-idl/codama
  7. */
  8. import {
  9. combineCodec,
  10. getStructDecoder,
  11. getStructEncoder,
  12. getU8Decoder,
  13. getU8Encoder,
  14. transformEncoder,
  15. type Address,
  16. type Codec,
  17. type Decoder,
  18. type Encoder,
  19. type IAccountMeta,
  20. type IAccountSignerMeta,
  21. type IInstruction,
  22. type IInstructionWithAccounts,
  23. type IInstructionWithData,
  24. type ReadonlyAccount,
  25. type TransactionSigner,
  26. type WritableAccount,
  27. type WritableSignerAccount,
  28. } from '@solana/kit';
  29. import { findAssociatedTokenPda } from '../pdas';
  30. import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs';
  31. import {
  32. expectAddress,
  33. getAccountMetaFactory,
  34. type ResolvedAccount,
  35. } from '../shared';
  36. export const CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR = 0;
  37. export function getCreateAssociatedTokenDiscriminatorBytes() {
  38. return getU8Encoder().encode(CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR);
  39. }
  40. export type CreateAssociatedTokenInstruction<
  41. TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  42. TAccountPayer extends string | IAccountMeta<string> = string,
  43. TAccountAta extends string | IAccountMeta<string> = string,
  44. TAccountOwner extends string | IAccountMeta<string> = string,
  45. TAccountMint extends string | IAccountMeta<string> = string,
  46. TAccountSystemProgram extends
  47. | string
  48. | IAccountMeta<string> = '11111111111111111111111111111111',
  49. TAccountTokenProgram extends
  50. | string
  51. | IAccountMeta<string> = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
  52. TRemainingAccounts extends readonly IAccountMeta<string>[] = [],
  53. > = IInstruction<TProgram> &
  54. IInstructionWithData<Uint8Array> &
  55. IInstructionWithAccounts<
  56. [
  57. TAccountPayer extends string
  58. ? WritableSignerAccount<TAccountPayer> &
  59. IAccountSignerMeta<TAccountPayer>
  60. : TAccountPayer,
  61. TAccountAta extends string ? WritableAccount<TAccountAta> : TAccountAta,
  62. TAccountOwner extends string
  63. ? ReadonlyAccount<TAccountOwner>
  64. : TAccountOwner,
  65. TAccountMint extends string
  66. ? ReadonlyAccount<TAccountMint>
  67. : TAccountMint,
  68. TAccountSystemProgram extends string
  69. ? ReadonlyAccount<TAccountSystemProgram>
  70. : TAccountSystemProgram,
  71. TAccountTokenProgram extends string
  72. ? ReadonlyAccount<TAccountTokenProgram>
  73. : TAccountTokenProgram,
  74. ...TRemainingAccounts,
  75. ]
  76. >;
  77. export type CreateAssociatedTokenInstructionData = { discriminator: number };
  78. export type CreateAssociatedTokenInstructionDataArgs = {};
  79. export function getCreateAssociatedTokenInstructionDataEncoder(): Encoder<CreateAssociatedTokenInstructionDataArgs> {
  80. return transformEncoder(
  81. getStructEncoder([['discriminator', getU8Encoder()]]),
  82. (value) => ({
  83. ...value,
  84. discriminator: CREATE_ASSOCIATED_TOKEN_DISCRIMINATOR,
  85. })
  86. );
  87. }
  88. export function getCreateAssociatedTokenInstructionDataDecoder(): Decoder<CreateAssociatedTokenInstructionData> {
  89. return getStructDecoder([['discriminator', getU8Decoder()]]);
  90. }
  91. export function getCreateAssociatedTokenInstructionDataCodec(): Codec<
  92. CreateAssociatedTokenInstructionDataArgs,
  93. CreateAssociatedTokenInstructionData
  94. > {
  95. return combineCodec(
  96. getCreateAssociatedTokenInstructionDataEncoder(),
  97. getCreateAssociatedTokenInstructionDataDecoder()
  98. );
  99. }
  100. export type CreateAssociatedTokenAsyncInput<
  101. TAccountPayer extends string = string,
  102. TAccountAta extends string = string,
  103. TAccountOwner extends string = string,
  104. TAccountMint extends string = string,
  105. TAccountSystemProgram extends string = string,
  106. TAccountTokenProgram extends string = string,
  107. > = {
  108. /** Funding account (must be a system account). */
  109. payer: TransactionSigner<TAccountPayer>;
  110. /** Associated token account address to be created. */
  111. ata?: Address<TAccountAta>;
  112. /** Wallet address for the new associated token account. */
  113. owner: Address<TAccountOwner>;
  114. /** The token mint for the new associated token account. */
  115. mint: Address<TAccountMint>;
  116. /** System program. */
  117. systemProgram?: Address<TAccountSystemProgram>;
  118. /** SPL Token program. */
  119. tokenProgram?: Address<TAccountTokenProgram>;
  120. };
  121. export async function getCreateAssociatedTokenInstructionAsync<
  122. TAccountPayer extends string,
  123. TAccountAta extends string,
  124. TAccountOwner extends string,
  125. TAccountMint extends string,
  126. TAccountSystemProgram extends string,
  127. TAccountTokenProgram extends string,
  128. TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  129. >(
  130. input: CreateAssociatedTokenAsyncInput<
  131. TAccountPayer,
  132. TAccountAta,
  133. TAccountOwner,
  134. TAccountMint,
  135. TAccountSystemProgram,
  136. TAccountTokenProgram
  137. >,
  138. config?: { programAddress?: TProgramAddress }
  139. ): Promise<
  140. CreateAssociatedTokenInstruction<
  141. TProgramAddress,
  142. TAccountPayer,
  143. TAccountAta,
  144. TAccountOwner,
  145. TAccountMint,
  146. TAccountSystemProgram,
  147. TAccountTokenProgram
  148. >
  149. > {
  150. // Program address.
  151. const programAddress =
  152. config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;
  153. // Original accounts.
  154. const originalAccounts = {
  155. payer: { value: input.payer ?? null, isWritable: true },
  156. ata: { value: input.ata ?? null, isWritable: true },
  157. owner: { value: input.owner ?? null, isWritable: false },
  158. mint: { value: input.mint ?? null, isWritable: false },
  159. systemProgram: { value: input.systemProgram ?? null, isWritable: false },
  160. tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },
  161. };
  162. const accounts = originalAccounts as Record<
  163. keyof typeof originalAccounts,
  164. ResolvedAccount
  165. >;
  166. // Resolve default values.
  167. if (!accounts.tokenProgram.value) {
  168. accounts.tokenProgram.value =
  169. 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;
  170. }
  171. if (!accounts.ata.value) {
  172. accounts.ata.value = await findAssociatedTokenPda({
  173. owner: expectAddress(accounts.owner.value),
  174. tokenProgram: expectAddress(accounts.tokenProgram.value),
  175. mint: expectAddress(accounts.mint.value),
  176. });
  177. }
  178. if (!accounts.systemProgram.value) {
  179. accounts.systemProgram.value =
  180. '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
  181. }
  182. const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
  183. const instruction = {
  184. accounts: [
  185. getAccountMeta(accounts.payer),
  186. getAccountMeta(accounts.ata),
  187. getAccountMeta(accounts.owner),
  188. getAccountMeta(accounts.mint),
  189. getAccountMeta(accounts.systemProgram),
  190. getAccountMeta(accounts.tokenProgram),
  191. ],
  192. programAddress,
  193. data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),
  194. } as CreateAssociatedTokenInstruction<
  195. TProgramAddress,
  196. TAccountPayer,
  197. TAccountAta,
  198. TAccountOwner,
  199. TAccountMint,
  200. TAccountSystemProgram,
  201. TAccountTokenProgram
  202. >;
  203. return instruction;
  204. }
  205. export type CreateAssociatedTokenInput<
  206. TAccountPayer extends string = string,
  207. TAccountAta extends string = string,
  208. TAccountOwner extends string = string,
  209. TAccountMint extends string = string,
  210. TAccountSystemProgram extends string = string,
  211. TAccountTokenProgram extends string = string,
  212. > = {
  213. /** Funding account (must be a system account). */
  214. payer: TransactionSigner<TAccountPayer>;
  215. /** Associated token account address to be created. */
  216. ata: Address<TAccountAta>;
  217. /** Wallet address for the new associated token account. */
  218. owner: Address<TAccountOwner>;
  219. /** The token mint for the new associated token account. */
  220. mint: Address<TAccountMint>;
  221. /** System program. */
  222. systemProgram?: Address<TAccountSystemProgram>;
  223. /** SPL Token program. */
  224. tokenProgram?: Address<TAccountTokenProgram>;
  225. };
  226. export function getCreateAssociatedTokenInstruction<
  227. TAccountPayer extends string,
  228. TAccountAta extends string,
  229. TAccountOwner extends string,
  230. TAccountMint extends string,
  231. TAccountSystemProgram extends string,
  232. TAccountTokenProgram extends string,
  233. TProgramAddress extends Address = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  234. >(
  235. input: CreateAssociatedTokenInput<
  236. TAccountPayer,
  237. TAccountAta,
  238. TAccountOwner,
  239. TAccountMint,
  240. TAccountSystemProgram,
  241. TAccountTokenProgram
  242. >,
  243. config?: { programAddress?: TProgramAddress }
  244. ): CreateAssociatedTokenInstruction<
  245. TProgramAddress,
  246. TAccountPayer,
  247. TAccountAta,
  248. TAccountOwner,
  249. TAccountMint,
  250. TAccountSystemProgram,
  251. TAccountTokenProgram
  252. > {
  253. // Program address.
  254. const programAddress =
  255. config?.programAddress ?? ASSOCIATED_TOKEN_PROGRAM_ADDRESS;
  256. // Original accounts.
  257. const originalAccounts = {
  258. payer: { value: input.payer ?? null, isWritable: true },
  259. ata: { value: input.ata ?? null, isWritable: true },
  260. owner: { value: input.owner ?? null, isWritable: false },
  261. mint: { value: input.mint ?? null, isWritable: false },
  262. systemProgram: { value: input.systemProgram ?? null, isWritable: false },
  263. tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },
  264. };
  265. const accounts = originalAccounts as Record<
  266. keyof typeof originalAccounts,
  267. ResolvedAccount
  268. >;
  269. // Resolve default values.
  270. if (!accounts.tokenProgram.value) {
  271. accounts.tokenProgram.value =
  272. 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;
  273. }
  274. if (!accounts.systemProgram.value) {
  275. accounts.systemProgram.value =
  276. '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
  277. }
  278. const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
  279. const instruction = {
  280. accounts: [
  281. getAccountMeta(accounts.payer),
  282. getAccountMeta(accounts.ata),
  283. getAccountMeta(accounts.owner),
  284. getAccountMeta(accounts.mint),
  285. getAccountMeta(accounts.systemProgram),
  286. getAccountMeta(accounts.tokenProgram),
  287. ],
  288. programAddress,
  289. data: getCreateAssociatedTokenInstructionDataEncoder().encode({}),
  290. } as CreateAssociatedTokenInstruction<
  291. TProgramAddress,
  292. TAccountPayer,
  293. TAccountAta,
  294. TAccountOwner,
  295. TAccountMint,
  296. TAccountSystemProgram,
  297. TAccountTokenProgram
  298. >;
  299. return instruction;
  300. }
  301. export type ParsedCreateAssociatedTokenInstruction<
  302. TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
  303. TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[],
  304. > = {
  305. programAddress: Address<TProgram>;
  306. accounts: {
  307. /** Funding account (must be a system account). */
  308. payer: TAccountMetas[0];
  309. /** Associated token account address to be created. */
  310. ata: TAccountMetas[1];
  311. /** Wallet address for the new associated token account. */
  312. owner: TAccountMetas[2];
  313. /** The token mint for the new associated token account. */
  314. mint: TAccountMetas[3];
  315. /** System program. */
  316. systemProgram: TAccountMetas[4];
  317. /** SPL Token program. */
  318. tokenProgram: TAccountMetas[5];
  319. };
  320. data: CreateAssociatedTokenInstructionData;
  321. };
  322. export function parseCreateAssociatedTokenInstruction<
  323. TProgram extends string,
  324. TAccountMetas extends readonly IAccountMeta[],
  325. >(
  326. instruction: IInstruction<TProgram> &
  327. IInstructionWithAccounts<TAccountMetas> &
  328. IInstructionWithData<Uint8Array>
  329. ): ParsedCreateAssociatedTokenInstruction<TProgram, TAccountMetas> {
  330. if (instruction.accounts.length < 6) {
  331. // TODO: Coded error.
  332. throw new Error('Not enough accounts');
  333. }
  334. let accountIndex = 0;
  335. const getNextAccount = () => {
  336. const accountMeta = instruction.accounts![accountIndex]!;
  337. accountIndex += 1;
  338. return accountMeta;
  339. };
  340. return {
  341. programAddress: instruction.programAddress,
  342. accounts: {
  343. payer: getNextAccount(),
  344. ata: getNextAccount(),
  345. owner: getNextAccount(),
  346. mint: getNextAccount(),
  347. systemProgram: getNextAccount(),
  348. tokenProgram: getNextAccount(),
  349. },
  350. data: getCreateAssociatedTokenInstructionDataDecoder().decode(
  351. instruction.data
  352. ),
  353. };
  354. }