assignWithSeed.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. getAddressDecoder,
  11. getAddressEncoder,
  12. } from '@solana/addresses';
  13. import {
  14. Codec,
  15. Decoder,
  16. Encoder,
  17. addDecoderSizePrefix,
  18. addEncoderSizePrefix,
  19. combineCodec,
  20. getStructDecoder,
  21. getStructEncoder,
  22. getU32Decoder,
  23. getU32Encoder,
  24. getUtf8Decoder,
  25. getUtf8Encoder,
  26. transformEncoder,
  27. } from '@solana/codecs';
  28. import {
  29. IAccountMeta,
  30. IInstruction,
  31. IInstructionWithAccounts,
  32. IInstructionWithData,
  33. ReadonlySignerAccount,
  34. WritableAccount,
  35. } from '@solana/instructions';
  36. import { IAccountSignerMeta, TransactionSigner } from '@solana/signers';
  37. import { SYSTEM_PROGRAM_ADDRESS } from '../programs';
  38. import { ResolvedAccount, getAccountMetaFactory } from '../shared';
  39. export type AssignWithSeedInstruction<
  40. TProgram extends string = typeof SYSTEM_PROGRAM_ADDRESS,
  41. TAccountAccount extends string | IAccountMeta<string> = string,
  42. TAccountBaseAccount extends string | IAccountMeta<string> = string,
  43. TRemainingAccounts extends readonly IAccountMeta<string>[] = [],
  44. > = IInstruction<TProgram> &
  45. IInstructionWithData<Uint8Array> &
  46. IInstructionWithAccounts<
  47. [
  48. TAccountAccount extends string
  49. ? WritableAccount<TAccountAccount>
  50. : TAccountAccount,
  51. TAccountBaseAccount extends string
  52. ? ReadonlySignerAccount<TAccountBaseAccount> &
  53. IAccountSignerMeta<TAccountBaseAccount>
  54. : TAccountBaseAccount,
  55. ...TRemainingAccounts,
  56. ]
  57. >;
  58. export type AssignWithSeedInstructionData = {
  59. discriminator: number;
  60. base: Address;
  61. seed: string;
  62. programAddress: Address;
  63. };
  64. export type AssignWithSeedInstructionDataArgs = {
  65. base: Address;
  66. seed: string;
  67. programAddress: Address;
  68. };
  69. export function getAssignWithSeedInstructionDataEncoder(): Encoder<AssignWithSeedInstructionDataArgs> {
  70. return transformEncoder(
  71. getStructEncoder([
  72. ['discriminator', getU32Encoder()],
  73. ['base', getAddressEncoder()],
  74. ['seed', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],
  75. ['programAddress', getAddressEncoder()],
  76. ]),
  77. (value) => ({ ...value, discriminator: 10 })
  78. );
  79. }
  80. export function getAssignWithSeedInstructionDataDecoder(): Decoder<AssignWithSeedInstructionData> {
  81. return getStructDecoder([
  82. ['discriminator', getU32Decoder()],
  83. ['base', getAddressDecoder()],
  84. ['seed', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],
  85. ['programAddress', getAddressDecoder()],
  86. ]);
  87. }
  88. export function getAssignWithSeedInstructionDataCodec(): Codec<
  89. AssignWithSeedInstructionDataArgs,
  90. AssignWithSeedInstructionData
  91. > {
  92. return combineCodec(
  93. getAssignWithSeedInstructionDataEncoder(),
  94. getAssignWithSeedInstructionDataDecoder()
  95. );
  96. }
  97. export type AssignWithSeedInput<
  98. TAccountAccount extends string = string,
  99. TAccountBaseAccount extends string = string,
  100. > = {
  101. account: Address<TAccountAccount>;
  102. baseAccount: TransactionSigner<TAccountBaseAccount>;
  103. base: AssignWithSeedInstructionDataArgs['base'];
  104. seed: AssignWithSeedInstructionDataArgs['seed'];
  105. programAddress: AssignWithSeedInstructionDataArgs['programAddress'];
  106. };
  107. export function getAssignWithSeedInstruction<
  108. TAccountAccount extends string,
  109. TAccountBaseAccount extends string,
  110. >(
  111. input: AssignWithSeedInput<TAccountAccount, TAccountBaseAccount>
  112. ): AssignWithSeedInstruction<
  113. typeof SYSTEM_PROGRAM_ADDRESS,
  114. TAccountAccount,
  115. TAccountBaseAccount
  116. > {
  117. // Program address.
  118. const programAddress = SYSTEM_PROGRAM_ADDRESS;
  119. // Original accounts.
  120. const originalAccounts = {
  121. account: { value: input.account ?? null, isWritable: true },
  122. baseAccount: { value: input.baseAccount ?? null, isWritable: false },
  123. };
  124. const accounts = originalAccounts as Record<
  125. keyof typeof originalAccounts,
  126. ResolvedAccount
  127. >;
  128. // Original args.
  129. const args = { ...input };
  130. const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
  131. const instruction = {
  132. accounts: [
  133. getAccountMeta(accounts.account),
  134. getAccountMeta(accounts.baseAccount),
  135. ],
  136. programAddress,
  137. data: getAssignWithSeedInstructionDataEncoder().encode(
  138. args as AssignWithSeedInstructionDataArgs
  139. ),
  140. } as AssignWithSeedInstruction<
  141. typeof SYSTEM_PROGRAM_ADDRESS,
  142. TAccountAccount,
  143. TAccountBaseAccount
  144. >;
  145. return instruction;
  146. }
  147. export type ParsedAssignWithSeedInstruction<
  148. TProgram extends string = typeof SYSTEM_PROGRAM_ADDRESS,
  149. TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[],
  150. > = {
  151. programAddress: Address<TProgram>;
  152. accounts: {
  153. account: TAccountMetas[0];
  154. baseAccount: TAccountMetas[1];
  155. };
  156. data: AssignWithSeedInstructionData;
  157. };
  158. export function parseAssignWithSeedInstruction<
  159. TProgram extends string,
  160. TAccountMetas extends readonly IAccountMeta[],
  161. >(
  162. instruction: IInstruction<TProgram> &
  163. IInstructionWithAccounts<TAccountMetas> &
  164. IInstructionWithData<Uint8Array>
  165. ): ParsedAssignWithSeedInstruction<TProgram, TAccountMetas> {
  166. if (instruction.accounts.length < 2) {
  167. // TODO: Coded error.
  168. throw new Error('Not enough accounts');
  169. }
  170. let accountIndex = 0;
  171. const getNextAccount = () => {
  172. const accountMeta = instruction.accounts![accountIndex]!;
  173. accountIndex += 1;
  174. return accountMeta;
  175. };
  176. return {
  177. programAddress: instruction.programAddress,
  178. accounts: {
  179. account: getNextAccount(),
  180. baseAccount: getNextAccount(),
  181. },
  182. data: getAssignWithSeedInstructionDataDecoder().decode(instruction.data),
  183. };
  184. }