initializeMultisig.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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. AccountRole,
  10. combineCodec,
  11. getStructDecoder,
  12. getStructEncoder,
  13. getU8Decoder,
  14. getU8Encoder,
  15. transformEncoder,
  16. type AccountMeta,
  17. type Address,
  18. type FixedSizeCodec,
  19. type FixedSizeDecoder,
  20. type FixedSizeEncoder,
  21. type Instruction,
  22. type InstructionWithAccounts,
  23. type InstructionWithData,
  24. type ReadonlyAccount,
  25. type ReadonlyUint8Array,
  26. type WritableAccount,
  27. } from '@solana/kit';
  28. import { TOKEN_PROGRAM_ADDRESS } from '../programs';
  29. import { getAccountMetaFactory, type ResolvedAccount } from '../shared';
  30. export const INITIALIZE_MULTISIG_DISCRIMINATOR = 2;
  31. export function getInitializeMultisigDiscriminatorBytes() {
  32. return getU8Encoder().encode(INITIALIZE_MULTISIG_DISCRIMINATOR);
  33. }
  34. export type InitializeMultisigInstruction<
  35. TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,
  36. TAccountMultisig extends string | AccountMeta<string> = string,
  37. TAccountRent extends
  38. | string
  39. | AccountMeta<string> = 'SysvarRent111111111111111111111111111111111',
  40. TRemainingAccounts extends readonly AccountMeta<string>[] = [],
  41. > = Instruction<TProgram> &
  42. InstructionWithData<ReadonlyUint8Array> &
  43. InstructionWithAccounts<
  44. [
  45. TAccountMultisig extends string
  46. ? WritableAccount<TAccountMultisig>
  47. : TAccountMultisig,
  48. TAccountRent extends string
  49. ? ReadonlyAccount<TAccountRent>
  50. : TAccountRent,
  51. ...TRemainingAccounts,
  52. ]
  53. >;
  54. export type InitializeMultisigInstructionData = {
  55. discriminator: number;
  56. /** The number of signers (M) required to validate this multisignature account. */
  57. m: number;
  58. };
  59. export type InitializeMultisigInstructionDataArgs = {
  60. /** The number of signers (M) required to validate this multisignature account. */
  61. m: number;
  62. };
  63. export function getInitializeMultisigInstructionDataEncoder(): FixedSizeEncoder<InitializeMultisigInstructionDataArgs> {
  64. return transformEncoder(
  65. getStructEncoder([
  66. ['discriminator', getU8Encoder()],
  67. ['m', getU8Encoder()],
  68. ]),
  69. (value) => ({ ...value, discriminator: INITIALIZE_MULTISIG_DISCRIMINATOR })
  70. ) as FixedSizeEncoder<InitializeMultisigInstructionDataArgs>;
  71. }
  72. export function getInitializeMultisigInstructionDataDecoder(): FixedSizeDecoder<InitializeMultisigInstructionData> {
  73. return getStructDecoder([
  74. ['discriminator', getU8Decoder()],
  75. ['m', getU8Decoder()],
  76. ]) as FixedSizeDecoder<InitializeMultisigInstructionData>;
  77. }
  78. export function getInitializeMultisigInstructionDataCodec(): FixedSizeCodec<
  79. InitializeMultisigInstructionDataArgs,
  80. InitializeMultisigInstructionData
  81. > {
  82. return combineCodec(
  83. getInitializeMultisigInstructionDataEncoder(),
  84. getInitializeMultisigInstructionDataDecoder()
  85. ) as FixedSizeCodec<
  86. InitializeMultisigInstructionDataArgs,
  87. InitializeMultisigInstructionData
  88. >;
  89. }
  90. export type InitializeMultisigInput<
  91. TAccountMultisig extends string = string,
  92. TAccountRent extends string = string,
  93. > = {
  94. /** The multisignature account to initialize. */
  95. multisig: Address<TAccountMultisig>;
  96. /** Rent sysvar. */
  97. rent?: Address<TAccountRent>;
  98. m: InitializeMultisigInstructionDataArgs['m'];
  99. signers: Array<Address>;
  100. };
  101. export function getInitializeMultisigInstruction<
  102. TAccountMultisig extends string,
  103. TAccountRent extends string,
  104. TProgramAddress extends Address = typeof TOKEN_PROGRAM_ADDRESS,
  105. >(
  106. input: InitializeMultisigInput<TAccountMultisig, TAccountRent>,
  107. config?: { programAddress?: TProgramAddress }
  108. ): InitializeMultisigInstruction<
  109. TProgramAddress,
  110. TAccountMultisig,
  111. TAccountRent
  112. > {
  113. // Program address.
  114. const programAddress = config?.programAddress ?? TOKEN_PROGRAM_ADDRESS;
  115. // Original accounts.
  116. const originalAccounts = {
  117. multisig: { value: input.multisig ?? null, isWritable: true },
  118. rent: { value: input.rent ?? null, isWritable: false },
  119. };
  120. const accounts = originalAccounts as Record<
  121. keyof typeof originalAccounts,
  122. ResolvedAccount
  123. >;
  124. // Original args.
  125. const args = { ...input };
  126. // Resolve default values.
  127. if (!accounts.rent.value) {
  128. accounts.rent.value =
  129. 'SysvarRent111111111111111111111111111111111' as Address<'SysvarRent111111111111111111111111111111111'>;
  130. }
  131. // Remaining accounts.
  132. const remainingAccounts: AccountMeta[] = args.signers.map((address) => ({
  133. address,
  134. role: AccountRole.READONLY,
  135. }));
  136. const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
  137. const instruction = {
  138. accounts: [
  139. getAccountMeta(accounts.multisig),
  140. getAccountMeta(accounts.rent),
  141. ...remainingAccounts,
  142. ],
  143. programAddress,
  144. data: getInitializeMultisigInstructionDataEncoder().encode(
  145. args as InitializeMultisigInstructionDataArgs
  146. ),
  147. } as InitializeMultisigInstruction<
  148. TProgramAddress,
  149. TAccountMultisig,
  150. TAccountRent
  151. >;
  152. return instruction;
  153. }
  154. export type ParsedInitializeMultisigInstruction<
  155. TProgram extends string = typeof TOKEN_PROGRAM_ADDRESS,
  156. TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],
  157. > = {
  158. programAddress: Address<TProgram>;
  159. accounts: {
  160. /** The multisignature account to initialize. */
  161. multisig: TAccountMetas[0];
  162. /** Rent sysvar. */
  163. rent: TAccountMetas[1];
  164. };
  165. data: InitializeMultisigInstructionData;
  166. };
  167. export function parseInitializeMultisigInstruction<
  168. TProgram extends string,
  169. TAccountMetas extends readonly AccountMeta[],
  170. >(
  171. instruction: Instruction<TProgram> &
  172. InstructionWithAccounts<TAccountMetas> &
  173. InstructionWithData<ReadonlyUint8Array>
  174. ): ParsedInitializeMultisigInstruction<TProgram, TAccountMetas> {
  175. if (instruction.accounts.length < 2) {
  176. // TODO: Coded error.
  177. throw new Error('Not enough accounts');
  178. }
  179. let accountIndex = 0;
  180. const getNextAccount = () => {
  181. const accountMeta = instruction.accounts![accountIndex]!;
  182. accountIndex += 1;
  183. return accountMeta;
  184. };
  185. return {
  186. programAddress: instruction.programAddress,
  187. accounts: {
  188. multisig: getNextAccount(),
  189. rent: getNextAccount(),
  190. },
  191. data: getInitializeMultisigInstructionDataDecoder().decode(
  192. instruction.data
  193. ),
  194. };
  195. }