initializeMultisig.ts 5.9 KB

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