program.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import { PublicKey } from "@solana/web3.js";
  2. import { Program, AnchorProvider } from "@project-serum/anchor";
  3. import { SplAssociatedTokenAccountCoder } from "./coder";
  4. export const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = new PublicKey(
  5. "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
  6. );
  7. interface GetProgramParams {
  8. programId?: PublicKey;
  9. provider?: AnchorProvider;
  10. }
  11. export function splAssociatedTokenAccountProgram(
  12. params?: GetProgramParams
  13. ): Program<SplAssociatedTokenAccount> {
  14. return new Program<SplAssociatedTokenAccount>(
  15. IDL,
  16. params?.programId ?? SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID,
  17. params?.provider,
  18. new SplAssociatedTokenAccountCoder(IDL)
  19. );
  20. }
  21. type SplAssociatedTokenAccount = {
  22. version: "1.1.1";
  23. name: "spl_associated_token_account";
  24. instructions: [
  25. {
  26. name: "create";
  27. accounts: [
  28. {
  29. name: "fundingAddress";
  30. isMut: true;
  31. isSigner: true;
  32. },
  33. {
  34. name: "associatedAccountAddress";
  35. isMut: true;
  36. isSigner: false;
  37. },
  38. {
  39. name: "walletAddress";
  40. isMut: false;
  41. isSigner: false;
  42. },
  43. {
  44. name: "tokenMintAddress";
  45. isMut: false;
  46. isSigner: false;
  47. },
  48. {
  49. name: "systemProgram";
  50. isMut: false;
  51. isSigner: false;
  52. },
  53. {
  54. name: "tokenProgram";
  55. isMut: false;
  56. isSigner: false;
  57. }
  58. ];
  59. args: [];
  60. },
  61. {
  62. name: "createIdempotent";
  63. accounts: [
  64. {
  65. name: "fundingAddress";
  66. isMut: true;
  67. isSigner: true;
  68. },
  69. {
  70. name: "associatedAccountAddress";
  71. isMut: true;
  72. isSigner: false;
  73. },
  74. {
  75. name: "walletAddress";
  76. isMut: false;
  77. isSigner: false;
  78. },
  79. {
  80. name: "tokenMintAddress";
  81. isMut: false;
  82. isSigner: false;
  83. },
  84. {
  85. name: "systemProgram";
  86. isMut: false;
  87. isSigner: false;
  88. },
  89. {
  90. name: "tokenProgram";
  91. isMut: false;
  92. isSigner: false;
  93. }
  94. ];
  95. args: [];
  96. },
  97. {
  98. name: "recoverNested";
  99. accounts: [
  100. {
  101. name: "nestedAssociatedAccountAddress";
  102. isMut: true;
  103. isSigner: false;
  104. },
  105. {
  106. name: "nestedTokenMintAddress";
  107. isMut: false;
  108. isSigner: false;
  109. },
  110. {
  111. name: "destinationAssociatedAccountAddress";
  112. isMut: true;
  113. isSigner: false;
  114. },
  115. {
  116. name: "ownerAssociatedAccountAddress";
  117. isMut: false;
  118. isSigner: false;
  119. },
  120. {
  121. name: "ownerTokenMintAddress";
  122. isMut: false;
  123. isSigner: false;
  124. },
  125. {
  126. name: "walletAddress";
  127. isMut: true;
  128. isSigner: true;
  129. },
  130. {
  131. name: "tokenProgram";
  132. isMut: false;
  133. isSigner: false;
  134. }
  135. ];
  136. args: [];
  137. }
  138. ];
  139. errors: [
  140. {
  141. code: 0;
  142. name: "InvalidOwner";
  143. msg: "Associated token account owner does not match address derivation";
  144. }
  145. ];
  146. };
  147. const IDL: SplAssociatedTokenAccount = {
  148. version: "1.1.1",
  149. name: "spl_associated_token_account",
  150. instructions: [
  151. {
  152. name: "create",
  153. accounts: [
  154. {
  155. name: "fundingAddress",
  156. isMut: true,
  157. isSigner: true,
  158. },
  159. {
  160. name: "associatedAccountAddress",
  161. isMut: true,
  162. isSigner: false,
  163. },
  164. {
  165. name: "walletAddress",
  166. isMut: false,
  167. isSigner: false,
  168. },
  169. {
  170. name: "tokenMintAddress",
  171. isMut: false,
  172. isSigner: false,
  173. },
  174. {
  175. name: "systemProgram",
  176. isMut: false,
  177. isSigner: false,
  178. },
  179. {
  180. name: "tokenProgram",
  181. isMut: false,
  182. isSigner: false,
  183. },
  184. ],
  185. args: [],
  186. },
  187. {
  188. name: "createIdempotent",
  189. accounts: [
  190. {
  191. name: "fundingAddress",
  192. isMut: true,
  193. isSigner: true,
  194. },
  195. {
  196. name: "associatedAccountAddress",
  197. isMut: true,
  198. isSigner: false,
  199. },
  200. {
  201. name: "walletAddress",
  202. isMut: false,
  203. isSigner: false,
  204. },
  205. {
  206. name: "tokenMintAddress",
  207. isMut: false,
  208. isSigner: false,
  209. },
  210. {
  211. name: "systemProgram",
  212. isMut: false,
  213. isSigner: false,
  214. },
  215. {
  216. name: "tokenProgram",
  217. isMut: false,
  218. isSigner: false,
  219. },
  220. ],
  221. args: [],
  222. },
  223. {
  224. name: "recoverNested",
  225. accounts: [
  226. {
  227. name: "nestedAssociatedAccountAddress",
  228. isMut: true,
  229. isSigner: false,
  230. },
  231. {
  232. name: "nestedTokenMintAddress",
  233. isMut: false,
  234. isSigner: false,
  235. },
  236. {
  237. name: "destinationAssociatedAccountAddress",
  238. isMut: true,
  239. isSigner: false,
  240. },
  241. {
  242. name: "ownerAssociatedAccountAddress",
  243. isMut: false,
  244. isSigner: false,
  245. },
  246. {
  247. name: "ownerTokenMintAddress",
  248. isMut: false,
  249. isSigner: false,
  250. },
  251. {
  252. name: "walletAddress",
  253. isMut: true,
  254. isSigner: true,
  255. },
  256. {
  257. name: "tokenProgram",
  258. isMut: false,
  259. isSigner: false,
  260. },
  261. ],
  262. args: [],
  263. },
  264. ],
  265. errors: [
  266. {
  267. code: 0,
  268. name: "InvalidOwner",
  269. msg: "Associated token account owner does not match address derivation",
  270. },
  271. ],
  272. };