createGuard.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  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/kinobi-so/kinobi
  7. */
  8. import {
  9. addDecoderSizePrefix,
  10. addEncoderSizePrefix,
  11. combineCodec,
  12. fixDecoderSize,
  13. fixEncoderSize,
  14. getAddressEncoder,
  15. getArrayDecoder,
  16. getArrayEncoder,
  17. getBytesDecoder,
  18. getBytesEncoder,
  19. getOptionDecoder,
  20. getOptionEncoder,
  21. getProgramDerivedAddress,
  22. getStructDecoder,
  23. getStructEncoder,
  24. getU32Decoder,
  25. getU32Encoder,
  26. getUtf8Decoder,
  27. getUtf8Encoder,
  28. transformEncoder,
  29. type Address,
  30. type Codec,
  31. type Decoder,
  32. type Encoder,
  33. type IAccountMeta,
  34. type IAccountSignerMeta,
  35. type IInstruction,
  36. type IInstructionWithAccounts,
  37. type IInstructionWithData,
  38. type Option,
  39. type OptionOrNullable,
  40. type ReadonlyAccount,
  41. type ReadonlySignerAccount,
  42. type ReadonlyUint8Array,
  43. type TransactionSigner,
  44. type WritableAccount,
  45. type WritableSignerAccount,
  46. } from '@solana/web3.js';
  47. import { WEN_TRANSFER_GUARD_PROGRAM_ADDRESS } from '../programs';
  48. import {
  49. expectAddress,
  50. getAccountMetaFactory,
  51. type ResolvedAccount,
  52. } from '../shared';
  53. import {
  54. getCpiRuleDecoder,
  55. getCpiRuleEncoder,
  56. getMetadataAdditionalFieldRuleDecoder,
  57. getMetadataAdditionalFieldRuleEncoder,
  58. getTransferAmountRuleDecoder,
  59. getTransferAmountRuleEncoder,
  60. type CpiRule,
  61. type CpiRuleArgs,
  62. type MetadataAdditionalFieldRule,
  63. type MetadataAdditionalFieldRuleArgs,
  64. type TransferAmountRule,
  65. type TransferAmountRuleArgs,
  66. } from '../types';
  67. export const CREATE_GUARD_DISCRIMINATOR = new Uint8Array([
  68. 251, 254, 17, 198, 219, 218, 154, 99,
  69. ]);
  70. export function getCreateGuardDiscriminatorBytes() {
  71. return fixEncoderSize(getBytesEncoder(), 8).encode(
  72. CREATE_GUARD_DISCRIMINATOR
  73. );
  74. }
  75. export type CreateGuardInstruction<
  76. TProgram extends string = typeof WEN_TRANSFER_GUARD_PROGRAM_ADDRESS,
  77. TAccountGuard extends string | IAccountMeta<string> = string,
  78. TAccountMint extends string | IAccountMeta<string> = string,
  79. TAccountMintTokenAccount extends string | IAccountMeta<string> = string,
  80. TAccountGuardAuthority extends string | IAccountMeta<string> = string,
  81. TAccountPayer extends string | IAccountMeta<string> = string,
  82. TAccountAssociatedTokenProgram extends
  83. | string
  84. | IAccountMeta<string> = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
  85. TAccountTokenProgram extends
  86. | string
  87. | IAccountMeta<string> = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
  88. TAccountSystemProgram extends
  89. | string
  90. | IAccountMeta<string> = '11111111111111111111111111111111',
  91. TRemainingAccounts extends readonly IAccountMeta<string>[] = [],
  92. > = IInstruction<TProgram> &
  93. IInstructionWithData<Uint8Array> &
  94. IInstructionWithAccounts<
  95. [
  96. TAccountGuard extends string
  97. ? WritableAccount<TAccountGuard>
  98. : TAccountGuard,
  99. TAccountMint extends string
  100. ? WritableSignerAccount<TAccountMint> & IAccountSignerMeta<TAccountMint>
  101. : TAccountMint,
  102. TAccountMintTokenAccount extends string
  103. ? WritableAccount<TAccountMintTokenAccount>
  104. : TAccountMintTokenAccount,
  105. TAccountGuardAuthority extends string
  106. ? ReadonlySignerAccount<TAccountGuardAuthority> &
  107. IAccountSignerMeta<TAccountGuardAuthority>
  108. : TAccountGuardAuthority,
  109. TAccountPayer extends string
  110. ? WritableSignerAccount<TAccountPayer> &
  111. IAccountSignerMeta<TAccountPayer>
  112. : TAccountPayer,
  113. TAccountAssociatedTokenProgram extends string
  114. ? ReadonlyAccount<TAccountAssociatedTokenProgram>
  115. : TAccountAssociatedTokenProgram,
  116. TAccountTokenProgram extends string
  117. ? ReadonlyAccount<TAccountTokenProgram>
  118. : TAccountTokenProgram,
  119. TAccountSystemProgram extends string
  120. ? ReadonlyAccount<TAccountSystemProgram>
  121. : TAccountSystemProgram,
  122. ...TRemainingAccounts,
  123. ]
  124. >;
  125. export type CreateGuardInstructionData = {
  126. discriminator: ReadonlyUint8Array;
  127. name: string;
  128. symbol: string;
  129. uri: string;
  130. cpiRule: Option<CpiRule>;
  131. transferAmountRule: Option<TransferAmountRule>;
  132. additionalFieldsRule: Array<MetadataAdditionalFieldRule>;
  133. };
  134. export type CreateGuardInstructionDataArgs = {
  135. name: string;
  136. symbol: string;
  137. uri: string;
  138. cpiRule: OptionOrNullable<CpiRuleArgs>;
  139. transferAmountRule: OptionOrNullable<TransferAmountRuleArgs>;
  140. additionalFieldsRule: Array<MetadataAdditionalFieldRuleArgs>;
  141. };
  142. export function getCreateGuardInstructionDataEncoder(): Encoder<CreateGuardInstructionDataArgs> {
  143. return transformEncoder(
  144. getStructEncoder([
  145. ['discriminator', fixEncoderSize(getBytesEncoder(), 8)],
  146. ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],
  147. ['symbol', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],
  148. ['uri', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],
  149. ['cpiRule', getOptionEncoder(getCpiRuleEncoder())],
  150. ['transferAmountRule', getOptionEncoder(getTransferAmountRuleEncoder())],
  151. [
  152. 'additionalFieldsRule',
  153. getArrayEncoder(getMetadataAdditionalFieldRuleEncoder()),
  154. ],
  155. ]),
  156. (value) => ({ ...value, discriminator: CREATE_GUARD_DISCRIMINATOR })
  157. );
  158. }
  159. export function getCreateGuardInstructionDataDecoder(): Decoder<CreateGuardInstructionData> {
  160. return getStructDecoder([
  161. ['discriminator', fixDecoderSize(getBytesDecoder(), 8)],
  162. ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],
  163. ['symbol', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],
  164. ['uri', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],
  165. ['cpiRule', getOptionDecoder(getCpiRuleDecoder())],
  166. ['transferAmountRule', getOptionDecoder(getTransferAmountRuleDecoder())],
  167. [
  168. 'additionalFieldsRule',
  169. getArrayDecoder(getMetadataAdditionalFieldRuleDecoder()),
  170. ],
  171. ]);
  172. }
  173. export function getCreateGuardInstructionDataCodec(): Codec<
  174. CreateGuardInstructionDataArgs,
  175. CreateGuardInstructionData
  176. > {
  177. return combineCodec(
  178. getCreateGuardInstructionDataEncoder(),
  179. getCreateGuardInstructionDataDecoder()
  180. );
  181. }
  182. export type CreateGuardAsyncInput<
  183. TAccountGuard extends string = string,
  184. TAccountMint extends string = string,
  185. TAccountMintTokenAccount extends string = string,
  186. TAccountGuardAuthority extends string = string,
  187. TAccountPayer extends string = string,
  188. TAccountAssociatedTokenProgram extends string = string,
  189. TAccountTokenProgram extends string = string,
  190. TAccountSystemProgram extends string = string,
  191. > = {
  192. guard?: Address<TAccountGuard>;
  193. mint: TransactionSigner<TAccountMint>;
  194. mintTokenAccount?: Address<TAccountMintTokenAccount>;
  195. guardAuthority: TransactionSigner<TAccountGuardAuthority>;
  196. payer: TransactionSigner<TAccountPayer>;
  197. associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;
  198. tokenProgram?: Address<TAccountTokenProgram>;
  199. systemProgram?: Address<TAccountSystemProgram>;
  200. name: CreateGuardInstructionDataArgs['name'];
  201. symbol: CreateGuardInstructionDataArgs['symbol'];
  202. uri: CreateGuardInstructionDataArgs['uri'];
  203. cpiRule: CreateGuardInstructionDataArgs['cpiRule'];
  204. transferAmountRule: CreateGuardInstructionDataArgs['transferAmountRule'];
  205. additionalFieldsRule: CreateGuardInstructionDataArgs['additionalFieldsRule'];
  206. };
  207. export async function getCreateGuardInstructionAsync<
  208. TAccountGuard extends string,
  209. TAccountMint extends string,
  210. TAccountMintTokenAccount extends string,
  211. TAccountGuardAuthority extends string,
  212. TAccountPayer extends string,
  213. TAccountAssociatedTokenProgram extends string,
  214. TAccountTokenProgram extends string,
  215. TAccountSystemProgram extends string,
  216. TProgramAddress extends Address = typeof WEN_TRANSFER_GUARD_PROGRAM_ADDRESS,
  217. >(
  218. input: CreateGuardAsyncInput<
  219. TAccountGuard,
  220. TAccountMint,
  221. TAccountMintTokenAccount,
  222. TAccountGuardAuthority,
  223. TAccountPayer,
  224. TAccountAssociatedTokenProgram,
  225. TAccountTokenProgram,
  226. TAccountSystemProgram
  227. >,
  228. config?: { programAddress?: TProgramAddress }
  229. ): Promise<
  230. CreateGuardInstruction<
  231. TProgramAddress,
  232. TAccountGuard,
  233. TAccountMint,
  234. TAccountMintTokenAccount,
  235. TAccountGuardAuthority,
  236. TAccountPayer,
  237. TAccountAssociatedTokenProgram,
  238. TAccountTokenProgram,
  239. TAccountSystemProgram
  240. >
  241. > {
  242. // Program address.
  243. const programAddress =
  244. config?.programAddress ?? WEN_TRANSFER_GUARD_PROGRAM_ADDRESS;
  245. // Original accounts.
  246. const originalAccounts = {
  247. guard: { value: input.guard ?? null, isWritable: true },
  248. mint: { value: input.mint ?? null, isWritable: true },
  249. mintTokenAccount: {
  250. value: input.mintTokenAccount ?? null,
  251. isWritable: true,
  252. },
  253. guardAuthority: { value: input.guardAuthority ?? null, isWritable: false },
  254. payer: { value: input.payer ?? null, isWritable: true },
  255. associatedTokenProgram: {
  256. value: input.associatedTokenProgram ?? null,
  257. isWritable: false,
  258. },
  259. tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },
  260. systemProgram: { value: input.systemProgram ?? null, isWritable: false },
  261. };
  262. const accounts = originalAccounts as Record<
  263. keyof typeof originalAccounts,
  264. ResolvedAccount
  265. >;
  266. // Original args.
  267. const args = { ...input };
  268. // Resolve default values.
  269. if (!accounts.guard.value) {
  270. accounts.guard.value = await getProgramDerivedAddress({
  271. programAddress,
  272. seeds: [
  273. getBytesEncoder().encode(
  274. new Uint8Array([
  275. 119, 101, 110, 95, 116, 111, 107, 101, 110, 95, 116, 114, 97, 110,
  276. 115, 102, 101, 114, 95, 103, 117, 97, 114, 100,
  277. ])
  278. ),
  279. getBytesEncoder().encode(
  280. new Uint8Array([103, 117, 97, 114, 100, 95, 118, 49])
  281. ),
  282. getAddressEncoder().encode(expectAddress(accounts.mint.value)),
  283. ],
  284. });
  285. }
  286. if (!accounts.tokenProgram.value) {
  287. accounts.tokenProgram.value =
  288. 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;
  289. }
  290. if (!accounts.mintTokenAccount.value) {
  291. accounts.mintTokenAccount.value = await getProgramDerivedAddress({
  292. programAddress,
  293. seeds: [
  294. getAddressEncoder().encode(
  295. expectAddress(accounts.guardAuthority.value)
  296. ),
  297. getAddressEncoder().encode(expectAddress(accounts.tokenProgram.value)),
  298. getAddressEncoder().encode(expectAddress(accounts.mint.value)),
  299. ],
  300. });
  301. }
  302. if (!accounts.associatedTokenProgram.value) {
  303. accounts.associatedTokenProgram.value =
  304. 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;
  305. }
  306. if (!accounts.systemProgram.value) {
  307. accounts.systemProgram.value =
  308. '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
  309. }
  310. const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
  311. const instruction = {
  312. accounts: [
  313. getAccountMeta(accounts.guard),
  314. getAccountMeta(accounts.mint),
  315. getAccountMeta(accounts.mintTokenAccount),
  316. getAccountMeta(accounts.guardAuthority),
  317. getAccountMeta(accounts.payer),
  318. getAccountMeta(accounts.associatedTokenProgram),
  319. getAccountMeta(accounts.tokenProgram),
  320. getAccountMeta(accounts.systemProgram),
  321. ],
  322. programAddress,
  323. data: getCreateGuardInstructionDataEncoder().encode(
  324. args as CreateGuardInstructionDataArgs
  325. ),
  326. } as CreateGuardInstruction<
  327. TProgramAddress,
  328. TAccountGuard,
  329. TAccountMint,
  330. TAccountMintTokenAccount,
  331. TAccountGuardAuthority,
  332. TAccountPayer,
  333. TAccountAssociatedTokenProgram,
  334. TAccountTokenProgram,
  335. TAccountSystemProgram
  336. >;
  337. return instruction;
  338. }
  339. export type CreateGuardInput<
  340. TAccountGuard extends string = string,
  341. TAccountMint extends string = string,
  342. TAccountMintTokenAccount extends string = string,
  343. TAccountGuardAuthority extends string = string,
  344. TAccountPayer extends string = string,
  345. TAccountAssociatedTokenProgram extends string = string,
  346. TAccountTokenProgram extends string = string,
  347. TAccountSystemProgram extends string = string,
  348. > = {
  349. guard: Address<TAccountGuard>;
  350. mint: TransactionSigner<TAccountMint>;
  351. mintTokenAccount: Address<TAccountMintTokenAccount>;
  352. guardAuthority: TransactionSigner<TAccountGuardAuthority>;
  353. payer: TransactionSigner<TAccountPayer>;
  354. associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;
  355. tokenProgram?: Address<TAccountTokenProgram>;
  356. systemProgram?: Address<TAccountSystemProgram>;
  357. name: CreateGuardInstructionDataArgs['name'];
  358. symbol: CreateGuardInstructionDataArgs['symbol'];
  359. uri: CreateGuardInstructionDataArgs['uri'];
  360. cpiRule: CreateGuardInstructionDataArgs['cpiRule'];
  361. transferAmountRule: CreateGuardInstructionDataArgs['transferAmountRule'];
  362. additionalFieldsRule: CreateGuardInstructionDataArgs['additionalFieldsRule'];
  363. };
  364. export function getCreateGuardInstruction<
  365. TAccountGuard extends string,
  366. TAccountMint extends string,
  367. TAccountMintTokenAccount extends string,
  368. TAccountGuardAuthority extends string,
  369. TAccountPayer extends string,
  370. TAccountAssociatedTokenProgram extends string,
  371. TAccountTokenProgram extends string,
  372. TAccountSystemProgram extends string,
  373. TProgramAddress extends Address = typeof WEN_TRANSFER_GUARD_PROGRAM_ADDRESS,
  374. >(
  375. input: CreateGuardInput<
  376. TAccountGuard,
  377. TAccountMint,
  378. TAccountMintTokenAccount,
  379. TAccountGuardAuthority,
  380. TAccountPayer,
  381. TAccountAssociatedTokenProgram,
  382. TAccountTokenProgram,
  383. TAccountSystemProgram
  384. >,
  385. config?: { programAddress?: TProgramAddress }
  386. ): CreateGuardInstruction<
  387. TProgramAddress,
  388. TAccountGuard,
  389. TAccountMint,
  390. TAccountMintTokenAccount,
  391. TAccountGuardAuthority,
  392. TAccountPayer,
  393. TAccountAssociatedTokenProgram,
  394. TAccountTokenProgram,
  395. TAccountSystemProgram
  396. > {
  397. // Program address.
  398. const programAddress =
  399. config?.programAddress ?? WEN_TRANSFER_GUARD_PROGRAM_ADDRESS;
  400. // Original accounts.
  401. const originalAccounts = {
  402. guard: { value: input.guard ?? null, isWritable: true },
  403. mint: { value: input.mint ?? null, isWritable: true },
  404. mintTokenAccount: {
  405. value: input.mintTokenAccount ?? null,
  406. isWritable: true,
  407. },
  408. guardAuthority: { value: input.guardAuthority ?? null, isWritable: false },
  409. payer: { value: input.payer ?? null, isWritable: true },
  410. associatedTokenProgram: {
  411. value: input.associatedTokenProgram ?? null,
  412. isWritable: false,
  413. },
  414. tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },
  415. systemProgram: { value: input.systemProgram ?? null, isWritable: false },
  416. };
  417. const accounts = originalAccounts as Record<
  418. keyof typeof originalAccounts,
  419. ResolvedAccount
  420. >;
  421. // Original args.
  422. const args = { ...input };
  423. // Resolve default values.
  424. if (!accounts.tokenProgram.value) {
  425. accounts.tokenProgram.value =
  426. 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb' as Address<'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'>;
  427. }
  428. if (!accounts.associatedTokenProgram.value) {
  429. accounts.associatedTokenProgram.value =
  430. 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' as Address<'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'>;
  431. }
  432. if (!accounts.systemProgram.value) {
  433. accounts.systemProgram.value =
  434. '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>;
  435. }
  436. const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
  437. const instruction = {
  438. accounts: [
  439. getAccountMeta(accounts.guard),
  440. getAccountMeta(accounts.mint),
  441. getAccountMeta(accounts.mintTokenAccount),
  442. getAccountMeta(accounts.guardAuthority),
  443. getAccountMeta(accounts.payer),
  444. getAccountMeta(accounts.associatedTokenProgram),
  445. getAccountMeta(accounts.tokenProgram),
  446. getAccountMeta(accounts.systemProgram),
  447. ],
  448. programAddress,
  449. data: getCreateGuardInstructionDataEncoder().encode(
  450. args as CreateGuardInstructionDataArgs
  451. ),
  452. } as CreateGuardInstruction<
  453. TProgramAddress,
  454. TAccountGuard,
  455. TAccountMint,
  456. TAccountMintTokenAccount,
  457. TAccountGuardAuthority,
  458. TAccountPayer,
  459. TAccountAssociatedTokenProgram,
  460. TAccountTokenProgram,
  461. TAccountSystemProgram
  462. >;
  463. return instruction;
  464. }
  465. export type ParsedCreateGuardInstruction<
  466. TProgram extends string = typeof WEN_TRANSFER_GUARD_PROGRAM_ADDRESS,
  467. TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[],
  468. > = {
  469. programAddress: Address<TProgram>;
  470. accounts: {
  471. guard: TAccountMetas[0];
  472. mint: TAccountMetas[1];
  473. mintTokenAccount: TAccountMetas[2];
  474. guardAuthority: TAccountMetas[3];
  475. payer: TAccountMetas[4];
  476. associatedTokenProgram: TAccountMetas[5];
  477. tokenProgram: TAccountMetas[6];
  478. systemProgram: TAccountMetas[7];
  479. };
  480. data: CreateGuardInstructionData;
  481. };
  482. export function parseCreateGuardInstruction<
  483. TProgram extends string,
  484. TAccountMetas extends readonly IAccountMeta[],
  485. >(
  486. instruction: IInstruction<TProgram> &
  487. IInstructionWithAccounts<TAccountMetas> &
  488. IInstructionWithData<Uint8Array>
  489. ): ParsedCreateGuardInstruction<TProgram, TAccountMetas> {
  490. if (instruction.accounts.length < 8) {
  491. // TODO: Coded error.
  492. throw new Error('Not enough accounts');
  493. }
  494. let accountIndex = 0;
  495. const getNextAccount = () => {
  496. const accountMeta = instruction.accounts![accountIndex]!;
  497. accountIndex += 1;
  498. return accountMeta;
  499. };
  500. return {
  501. programAddress: instruction.programAddress,
  502. accounts: {
  503. guard: getNextAccount(),
  504. mint: getNextAccount(),
  505. mintTokenAccount: getNextAccount(),
  506. guardAuthority: getNextAccount(),
  507. payer: getNextAccount(),
  508. associatedTokenProgram: getNextAccount(),
  509. tokenProgram: getNextAccount(),
  510. systemProgram: getNextAccount(),
  511. },
  512. data: getCreateGuardInstructionDataDecoder().decode(instruction.data),
  513. };
  514. }