@epicentral/sos-sdk 0.9.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.env.example +1 -0
  2. package/AGENTS.md +7 -0
  3. package/LICENSE +21 -0
  4. package/README.md +568 -0
  5. package/accounts/fetchers.ts +196 -0
  6. package/accounts/list.ts +184 -0
  7. package/accounts/pdas.ts +325 -0
  8. package/accounts/resolve-option.ts +104 -0
  9. package/client/lookup-table.ts +114 -0
  10. package/client/program.ts +13 -0
  11. package/client/types.ts +9 -0
  12. package/generated/accounts/collateralPool.ts +217 -0
  13. package/generated/accounts/config.ts +156 -0
  14. package/generated/accounts/escrowState.ts +183 -0
  15. package/generated/accounts/index.ts +20 -0
  16. package/generated/accounts/lenderPosition.ts +211 -0
  17. package/generated/accounts/makerCollateralShare.ts +229 -0
  18. package/generated/accounts/marketDataAccount.ts +176 -0
  19. package/generated/accounts/optionAccount.ts +247 -0
  20. package/generated/accounts/optionPool.ts +285 -0
  21. package/generated/accounts/poolLoan.ts +232 -0
  22. package/generated/accounts/positionAccount.ts +201 -0
  23. package/generated/accounts/vault.ts +366 -0
  24. package/generated/accounts/writerPosition.ts +327 -0
  25. package/generated/errors/index.ts +9 -0
  26. package/generated/errors/optionProgram.ts +476 -0
  27. package/generated/index.ts +13 -0
  28. package/generated/instructions/acceptAdmin.ts +230 -0
  29. package/generated/instructions/autoExerciseAllExpired.ts +685 -0
  30. package/generated/instructions/autoExerciseExpired.ts +754 -0
  31. package/generated/instructions/borrowFromPool.ts +619 -0
  32. package/generated/instructions/buyFromPool.ts +761 -0
  33. package/generated/instructions/closeLongToPool.ts +762 -0
  34. package/generated/instructions/closeOption.ts +235 -0
  35. package/generated/instructions/createEscrowV2.ts +518 -0
  36. package/generated/instructions/depositCollateral.ts +624 -0
  37. package/generated/instructions/depositToPosition.ts +429 -0
  38. package/generated/instructions/index.ts +47 -0
  39. package/generated/instructions/initCollateralPool.ts +513 -0
  40. package/generated/instructions/initConfig.ts +279 -0
  41. package/generated/instructions/initOptionPool.ts +587 -0
  42. package/generated/instructions/initializeMarketData.ts +359 -0
  43. package/generated/instructions/liquidateWriterPosition.ts +750 -0
  44. package/generated/instructions/liquidateWriterPositionRescue.ts +623 -0
  45. package/generated/instructions/omlpCreateVault.ts +553 -0
  46. package/generated/instructions/omlpUpdateFeeWallet.ts +473 -0
  47. package/generated/instructions/omlpUpdateInterestModel.ts +322 -0
  48. package/generated/instructions/omlpUpdateLiquidationThreshold.ts +304 -0
  49. package/generated/instructions/omlpUpdateMaintenanceBuffer.ts +304 -0
  50. package/generated/instructions/omlpUpdateMaxBorrowCap.ts +304 -0
  51. package/generated/instructions/omlpUpdateMaxLeverage.ts +304 -0
  52. package/generated/instructions/omlpUpdateProtocolFee.ts +304 -0
  53. package/generated/instructions/omlpUpdateSupplyLimit.ts +304 -0
  54. package/generated/instructions/optionExercise.ts +617 -0
  55. package/generated/instructions/optionMint.ts +1373 -0
  56. package/generated/instructions/optionValidate.ts +302 -0
  57. package/generated/instructions/repayPoolLoan.ts +558 -0
  58. package/generated/instructions/repayPoolLoanFromCollateral.ts +514 -0
  59. package/generated/instructions/repayPoolLoanFromWallet.ts +542 -0
  60. package/generated/instructions/settleMakerCollateral.ts +509 -0
  61. package/generated/instructions/syncWriterPosition.ts +206 -0
  62. package/generated/instructions/transferAdmin.ts +245 -0
  63. package/generated/instructions/unwindWriterUnsold.ts +764 -0
  64. package/generated/instructions/updateImpliedVolatility.ts +226 -0
  65. package/generated/instructions/updateMarketData.ts +315 -0
  66. package/generated/instructions/withdrawFromPosition.ts +405 -0
  67. package/generated/instructions/writeToPool.ts +619 -0
  68. package/generated/programs/index.ts +9 -0
  69. package/generated/programs/optionProgram.ts +1144 -0
  70. package/generated/shared/index.ts +164 -0
  71. package/generated/types/impliedVolatilityUpdated.ts +73 -0
  72. package/generated/types/index.ts +28 -0
  73. package/generated/types/liquidationExecuted.ts +73 -0
  74. package/generated/types/liquidationRescueEvent.ts +82 -0
  75. package/generated/types/marketDataInitialized.ts +61 -0
  76. package/generated/types/marketDataUpdated.ts +69 -0
  77. package/generated/types/optionClosed.ts +56 -0
  78. package/generated/types/optionExercised.ts +62 -0
  79. package/generated/types/optionExpired.ts +49 -0
  80. package/generated/types/optionMinted.ts +78 -0
  81. package/generated/types/optionType.ts +38 -0
  82. package/generated/types/optionValidated.ts +82 -0
  83. package/generated/types/poolLoanCreated.ts +74 -0
  84. package/generated/types/poolLoanRepaid.ts +74 -0
  85. package/generated/types/positionDeposited.ts +73 -0
  86. package/generated/types/positionWithdrawn.ts +81 -0
  87. package/generated/types/protocolFeeUpdated.ts +69 -0
  88. package/generated/types/vaultCreated.ts +60 -0
  89. package/generated/types/vaultFeeWalletUpdated.ts +67 -0
  90. package/generated/types/vaultInterestModelUpdated.ts +77 -0
  91. package/generated/types/vaultLiquidationThresholdUpdated.ts +69 -0
  92. package/index.ts +68 -0
  93. package/long/builders.ts +690 -0
  94. package/long/exercise.ts +123 -0
  95. package/long/preflight.ts +214 -0
  96. package/long/quotes.ts +48 -0
  97. package/long/remaining-accounts.ts +111 -0
  98. package/omlp/builders.ts +94 -0
  99. package/omlp/service.ts +136 -0
  100. package/oracle/switchboard.ts +315 -0
  101. package/package.json +34 -0
  102. package/shared/amounts.ts +53 -0
  103. package/shared/balances.ts +57 -0
  104. package/shared/errors.ts +12 -0
  105. package/shared/remaining-accounts.ts +41 -0
  106. package/shared/trade-config.ts +27 -0
  107. package/shared/transactions.ts +121 -0
  108. package/short/builders.ts +874 -0
  109. package/short/close-option.ts +34 -0
  110. package/short/pool.ts +189 -0
  111. package/short/preflight.ts +619 -0
  112. package/tsconfig.json +13 -0
  113. package/wsol/instructions.ts +247 -0
@@ -0,0 +1,1373 @@
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
+
9
+ import {
10
+ addDecoderSizePrefix,
11
+ addEncoderSizePrefix,
12
+ combineCodec,
13
+ fixDecoderSize,
14
+ fixEncoderSize,
15
+ getAddressDecoder,
16
+ getAddressEncoder,
17
+ getBytesDecoder,
18
+ getBytesEncoder,
19
+ getF64Decoder,
20
+ getF64Encoder,
21
+ getI64Decoder,
22
+ getI64Encoder,
23
+ getProgramDerivedAddress,
24
+ getStructDecoder,
25
+ getStructEncoder,
26
+ getU32Decoder,
27
+ getU32Encoder,
28
+ getU64Decoder,
29
+ getU64Encoder,
30
+ getUtf8Decoder,
31
+ getUtf8Encoder,
32
+ transformEncoder,
33
+ type AccountMeta,
34
+ type AccountSignerMeta,
35
+ type Address,
36
+ type Codec,
37
+ type Decoder,
38
+ type Encoder,
39
+ type Instruction,
40
+ type InstructionWithAccounts,
41
+ type InstructionWithData,
42
+ type ReadonlyAccount,
43
+ type ReadonlyUint8Array,
44
+ type TransactionSigner,
45
+ type WritableAccount,
46
+ type WritableSignerAccount,
47
+ } from "@solana/kit";
48
+ import { OPTION_PROGRAM_PROGRAM_ADDRESS } from "../programs";
49
+ import {
50
+ expectAddress,
51
+ expectSome,
52
+ getAccountMetaFactory,
53
+ type ResolvedAccount,
54
+ } from "../shared";
55
+ import {
56
+ getOptionTypeDecoder,
57
+ getOptionTypeEncoder,
58
+ type OptionType,
59
+ type OptionTypeArgs,
60
+ } from "../types";
61
+
62
+ export const OPTION_MINT_DISCRIMINATOR = new Uint8Array([
63
+ 210, 192, 217, 89, 138, 0, 94, 90,
64
+ ]);
65
+
66
+ export function getOptionMintDiscriminatorBytes() {
67
+ return fixEncoderSize(getBytesEncoder(), 8).encode(OPTION_MINT_DISCRIMINATOR);
68
+ }
69
+
70
+ export type OptionMintInstruction<
71
+ TProgram extends string = typeof OPTION_PROGRAM_PROGRAM_ADDRESS,
72
+ TAccountOptionAccount extends string | AccountMeta<string> = string,
73
+ TAccountLongMint extends string | AccountMeta<string> = string,
74
+ TAccountShortMint extends string | AccountMeta<string> = string,
75
+ TAccountMintAuthority extends string | AccountMeta<string> = string,
76
+ TAccountMakerLongAccount extends string | AccountMeta<string> = string,
77
+ TAccountMakerShortAccount extends string | AccountMeta<string> = string,
78
+ TAccountLongMetadataAccount extends string | AccountMeta<string> = string,
79
+ TAccountShortMetadataAccount extends string | AccountMeta<string> = string,
80
+ TAccountMarketData extends string | AccountMeta<string> = string,
81
+ TAccountUnderlyingMint extends string | AccountMeta<string> = string,
82
+ TAccountCollateralMint extends string | AccountMeta<string> = string,
83
+ TAccountOptionPool extends string | AccountMeta<string> = string,
84
+ TAccountEscrowLongAccount extends string | AccountMeta<string> = string,
85
+ TAccountPremiumVault extends string | AccountMeta<string> = string,
86
+ TAccountCollateralPool extends string | AccountMeta<string> = string,
87
+ TAccountCollateralVault extends string | AccountMeta<string> = string,
88
+ TAccountMakerCollateralAccount extends string | AccountMeta<string> = string,
89
+ TAccountWriterPosition extends string | AccountMeta<string> = string,
90
+ TAccountVault extends string | AccountMeta<string> = string,
91
+ TAccountVaultTokenAccount extends string | AccountMeta<string> = string,
92
+ TAccountEscrowState extends string | AccountMeta<string> = string,
93
+ TAccountEscrowAuthority extends string | AccountMeta<string> = string,
94
+ TAccountEscrowTokenAccount extends string | AccountMeta<string> = string,
95
+ TAccountPoolLoan extends string | AccountMeta<string> = string,
96
+ TAccountMaker extends string | AccountMeta<string> = string,
97
+ TAccountTokenProgram extends string | AccountMeta<string> =
98
+ "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
99
+ TAccountAssociatedTokenProgram extends string | AccountMeta<string> =
100
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
101
+ TAccountTokenMetadataProgram extends string | AccountMeta<string> =
102
+ "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",
103
+ TAccountSystemProgram extends string | AccountMeta<string> =
104
+ "11111111111111111111111111111111",
105
+ TAccountRent extends string | AccountMeta<string> =
106
+ "SysvarRent111111111111111111111111111111111",
107
+ TRemainingAccounts extends readonly AccountMeta<string>[] = [],
108
+ > = Instruction<TProgram> &
109
+ InstructionWithData<ReadonlyUint8Array> &
110
+ InstructionWithAccounts<
111
+ [
112
+ TAccountOptionAccount extends string
113
+ ? WritableAccount<TAccountOptionAccount>
114
+ : TAccountOptionAccount,
115
+ TAccountLongMint extends string
116
+ ? WritableAccount<TAccountLongMint>
117
+ : TAccountLongMint,
118
+ TAccountShortMint extends string
119
+ ? WritableAccount<TAccountShortMint>
120
+ : TAccountShortMint,
121
+ TAccountMintAuthority extends string
122
+ ? ReadonlyAccount<TAccountMintAuthority>
123
+ : TAccountMintAuthority,
124
+ TAccountMakerLongAccount extends string
125
+ ? WritableAccount<TAccountMakerLongAccount>
126
+ : TAccountMakerLongAccount,
127
+ TAccountMakerShortAccount extends string
128
+ ? WritableAccount<TAccountMakerShortAccount>
129
+ : TAccountMakerShortAccount,
130
+ TAccountLongMetadataAccount extends string
131
+ ? WritableAccount<TAccountLongMetadataAccount>
132
+ : TAccountLongMetadataAccount,
133
+ TAccountShortMetadataAccount extends string
134
+ ? WritableAccount<TAccountShortMetadataAccount>
135
+ : TAccountShortMetadataAccount,
136
+ TAccountMarketData extends string
137
+ ? ReadonlyAccount<TAccountMarketData>
138
+ : TAccountMarketData,
139
+ TAccountUnderlyingMint extends string
140
+ ? ReadonlyAccount<TAccountUnderlyingMint>
141
+ : TAccountUnderlyingMint,
142
+ TAccountCollateralMint extends string
143
+ ? ReadonlyAccount<TAccountCollateralMint>
144
+ : TAccountCollateralMint,
145
+ TAccountOptionPool extends string
146
+ ? WritableAccount<TAccountOptionPool>
147
+ : TAccountOptionPool,
148
+ TAccountEscrowLongAccount extends string
149
+ ? WritableAccount<TAccountEscrowLongAccount>
150
+ : TAccountEscrowLongAccount,
151
+ TAccountPremiumVault extends string
152
+ ? WritableAccount<TAccountPremiumVault>
153
+ : TAccountPremiumVault,
154
+ TAccountCollateralPool extends string
155
+ ? WritableAccount<TAccountCollateralPool>
156
+ : TAccountCollateralPool,
157
+ TAccountCollateralVault extends string
158
+ ? WritableAccount<TAccountCollateralVault>
159
+ : TAccountCollateralVault,
160
+ TAccountMakerCollateralAccount extends string
161
+ ? WritableAccount<TAccountMakerCollateralAccount>
162
+ : TAccountMakerCollateralAccount,
163
+ TAccountWriterPosition extends string
164
+ ? WritableAccount<TAccountWriterPosition>
165
+ : TAccountWriterPosition,
166
+ TAccountVault extends string
167
+ ? WritableAccount<TAccountVault>
168
+ : TAccountVault,
169
+ TAccountVaultTokenAccount extends string
170
+ ? WritableAccount<TAccountVaultTokenAccount>
171
+ : TAccountVaultTokenAccount,
172
+ TAccountEscrowState extends string
173
+ ? WritableAccount<TAccountEscrowState>
174
+ : TAccountEscrowState,
175
+ TAccountEscrowAuthority extends string
176
+ ? ReadonlyAccount<TAccountEscrowAuthority>
177
+ : TAccountEscrowAuthority,
178
+ TAccountEscrowTokenAccount extends string
179
+ ? WritableAccount<TAccountEscrowTokenAccount>
180
+ : TAccountEscrowTokenAccount,
181
+ TAccountPoolLoan extends string
182
+ ? WritableAccount<TAccountPoolLoan>
183
+ : TAccountPoolLoan,
184
+ TAccountMaker extends string
185
+ ? WritableSignerAccount<TAccountMaker> &
186
+ AccountSignerMeta<TAccountMaker>
187
+ : TAccountMaker,
188
+ TAccountTokenProgram extends string
189
+ ? ReadonlyAccount<TAccountTokenProgram>
190
+ : TAccountTokenProgram,
191
+ TAccountAssociatedTokenProgram extends string
192
+ ? ReadonlyAccount<TAccountAssociatedTokenProgram>
193
+ : TAccountAssociatedTokenProgram,
194
+ TAccountTokenMetadataProgram extends string
195
+ ? ReadonlyAccount<TAccountTokenMetadataProgram>
196
+ : TAccountTokenMetadataProgram,
197
+ TAccountSystemProgram extends string
198
+ ? ReadonlyAccount<TAccountSystemProgram>
199
+ : TAccountSystemProgram,
200
+ TAccountRent extends string
201
+ ? ReadonlyAccount<TAccountRent>
202
+ : TAccountRent,
203
+ ...TRemainingAccounts,
204
+ ]
205
+ >;
206
+
207
+ export type OptionMintInstructionData = {
208
+ discriminator: ReadonlyUint8Array;
209
+ optionType: OptionType;
210
+ strikePrice: number;
211
+ expirationDate: bigint;
212
+ quantity: bigint;
213
+ underlyingAsset: Address;
214
+ underlyingSymbol: string;
215
+ collateralMint: Address;
216
+ makerCollateralAmount: bigint;
217
+ borrowedAmount: bigint;
218
+ maxRequiredCollateralAmount: bigint;
219
+ };
220
+
221
+ export type OptionMintInstructionDataArgs = {
222
+ optionType: OptionTypeArgs;
223
+ strikePrice: number;
224
+ expirationDate: number | bigint;
225
+ quantity: number | bigint;
226
+ underlyingAsset: Address;
227
+ underlyingSymbol: string;
228
+ collateralMint: Address;
229
+ makerCollateralAmount: number | bigint;
230
+ borrowedAmount: number | bigint;
231
+ maxRequiredCollateralAmount: number | bigint;
232
+ };
233
+
234
+ export function getOptionMintInstructionDataEncoder(): Encoder<OptionMintInstructionDataArgs> {
235
+ return transformEncoder(
236
+ getStructEncoder([
237
+ ["discriminator", fixEncoderSize(getBytesEncoder(), 8)],
238
+ ["optionType", getOptionTypeEncoder()],
239
+ ["strikePrice", getF64Encoder()],
240
+ ["expirationDate", getI64Encoder()],
241
+ ["quantity", getU64Encoder()],
242
+ ["underlyingAsset", getAddressEncoder()],
243
+ [
244
+ "underlyingSymbol",
245
+ addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()),
246
+ ],
247
+ ["collateralMint", getAddressEncoder()],
248
+ ["makerCollateralAmount", getU64Encoder()],
249
+ ["borrowedAmount", getU64Encoder()],
250
+ ["maxRequiredCollateralAmount", getU64Encoder()],
251
+ ]),
252
+ (value) => ({ ...value, discriminator: OPTION_MINT_DISCRIMINATOR }),
253
+ );
254
+ }
255
+
256
+ export function getOptionMintInstructionDataDecoder(): Decoder<OptionMintInstructionData> {
257
+ return getStructDecoder([
258
+ ["discriminator", fixDecoderSize(getBytesDecoder(), 8)],
259
+ ["optionType", getOptionTypeDecoder()],
260
+ ["strikePrice", getF64Decoder()],
261
+ ["expirationDate", getI64Decoder()],
262
+ ["quantity", getU64Decoder()],
263
+ ["underlyingAsset", getAddressDecoder()],
264
+ [
265
+ "underlyingSymbol",
266
+ addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder()),
267
+ ],
268
+ ["collateralMint", getAddressDecoder()],
269
+ ["makerCollateralAmount", getU64Decoder()],
270
+ ["borrowedAmount", getU64Decoder()],
271
+ ["maxRequiredCollateralAmount", getU64Decoder()],
272
+ ]);
273
+ }
274
+
275
+ export function getOptionMintInstructionDataCodec(): Codec<
276
+ OptionMintInstructionDataArgs,
277
+ OptionMintInstructionData
278
+ > {
279
+ return combineCodec(
280
+ getOptionMintInstructionDataEncoder(),
281
+ getOptionMintInstructionDataDecoder(),
282
+ );
283
+ }
284
+
285
+ export type OptionMintAsyncInput<
286
+ TAccountOptionAccount extends string = string,
287
+ TAccountLongMint extends string = string,
288
+ TAccountShortMint extends string = string,
289
+ TAccountMintAuthority extends string = string,
290
+ TAccountMakerLongAccount extends string = string,
291
+ TAccountMakerShortAccount extends string = string,
292
+ TAccountLongMetadataAccount extends string = string,
293
+ TAccountShortMetadataAccount extends string = string,
294
+ TAccountMarketData extends string = string,
295
+ TAccountUnderlyingMint extends string = string,
296
+ TAccountCollateralMint extends string = string,
297
+ TAccountOptionPool extends string = string,
298
+ TAccountEscrowLongAccount extends string = string,
299
+ TAccountPremiumVault extends string = string,
300
+ TAccountCollateralPool extends string = string,
301
+ TAccountCollateralVault extends string = string,
302
+ TAccountMakerCollateralAccount extends string = string,
303
+ TAccountWriterPosition extends string = string,
304
+ TAccountVault extends string = string,
305
+ TAccountVaultTokenAccount extends string = string,
306
+ TAccountEscrowState extends string = string,
307
+ TAccountEscrowAuthority extends string = string,
308
+ TAccountEscrowTokenAccount extends string = string,
309
+ TAccountPoolLoan extends string = string,
310
+ TAccountMaker extends string = string,
311
+ TAccountTokenProgram extends string = string,
312
+ TAccountAssociatedTokenProgram extends string = string,
313
+ TAccountTokenMetadataProgram extends string = string,
314
+ TAccountSystemProgram extends string = string,
315
+ TAccountRent extends string = string,
316
+ > = {
317
+ /**
318
+ * Option account - derived from option parameters (NOT maker)
319
+ * Uses init_if_needed so multiple makers can use the same option
320
+ */
321
+ optionAccount?: Address<TAccountOptionAccount>;
322
+ /**
323
+ * LONG token mint - one per unique option parameters (buyers hold these)
324
+ * Uses init_if_needed so multiple makers share the same token
325
+ */
326
+ longMint?: Address<TAccountLongMint>;
327
+ /**
328
+ * SHORT token mint - one per unique option parameters (writers hold these)
329
+ * Uses init_if_needed so multiple makers share the same token
330
+ */
331
+ shortMint?: Address<TAccountShortMint>;
332
+ mintAuthority?: Address<TAccountMintAuthority>;
333
+ /** Maker's LONG token account (receives LONG tokens to deposit in pool) */
334
+ makerLongAccount?: Address<TAccountMakerLongAccount>;
335
+ /** Maker's SHORT token account (receives SHORT tokens as proof of writing) */
336
+ makerShortAccount?: Address<TAccountMakerShortAccount>;
337
+ longMetadataAccount: Address<TAccountLongMetadataAccount>;
338
+ shortMetadataAccount: Address<TAccountShortMetadataAccount>;
339
+ /** Market data account - provides baseline historical volatility for initial IV */
340
+ marketData?: Address<TAccountMarketData>;
341
+ /** Underlying asset mint (e.g., WSOL) - required for pricing and pool initialization */
342
+ underlyingMint: Address<TAccountUnderlyingMint>;
343
+ /**
344
+ * Collateral mint (e.g., USDC, BTC, SOL) - Writer's choice for backing the position
345
+ * Can differ from underlying_mint - enables multi-collateral settlement
346
+ * OMLP vault routing is based on this mint
347
+ */
348
+ collateralMint: Address<TAccountCollateralMint>;
349
+ /** Option pool - aggregated liquidity pool for this option */
350
+ optionPool?: Address<TAccountOptionPool>;
351
+ /** Pool's escrow for holding LONG tokens (for buyers to purchase) */
352
+ escrowLongAccount?: Address<TAccountEscrowLongAccount>;
353
+ /** Pool's vault for collecting premiums (in underlying asset) */
354
+ premiumVault?: Address<TAccountPremiumVault>;
355
+ /** Collateral pool for this option */
356
+ collateralPool?: Address<TAccountCollateralPool>;
357
+ /** Collateral vault (ATA holding collateral) */
358
+ collateralVault?: Address<TAccountCollateralVault>;
359
+ /** Maker's collateral account (source of maker's own collateral) */
360
+ makerCollateralAccount: Address<TAccountMakerCollateralAccount>;
361
+ /** Writer's unified position account (single source of truth) */
362
+ writerPosition?: Address<TAccountWriterPosition>;
363
+ /** OMLP vault (optional - only required if borrowing) */
364
+ vault?: Address<TAccountVault>;
365
+ /** Vault's token account (optional - only required if borrowing) */
366
+ vaultTokenAccount?: Address<TAccountVaultTokenAccount>;
367
+ /** Escrow state PDA (optional - only required if borrowing) */
368
+ escrowState?: Address<TAccountEscrowState>;
369
+ /** Escrow authority PDA (optional - only required if borrowing) */
370
+ escrowAuthority?: Address<TAccountEscrowAuthority>;
371
+ /** Escrow token account (optional - only required if borrowing) */
372
+ escrowTokenAccount?: Address<TAccountEscrowTokenAccount>;
373
+ /** Pool loan account (optional - only required if borrowing) */
374
+ poolLoan?: Address<TAccountPoolLoan>;
375
+ maker: TransactionSigner<TAccountMaker>;
376
+ tokenProgram?: Address<TAccountTokenProgram>;
377
+ associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;
378
+ tokenMetadataProgram?: Address<TAccountTokenMetadataProgram>;
379
+ systemProgram?: Address<TAccountSystemProgram>;
380
+ rent?: Address<TAccountRent>;
381
+ optionType: OptionMintInstructionDataArgs["optionType"];
382
+ strikePrice: OptionMintInstructionDataArgs["strikePrice"];
383
+ expirationDate: OptionMintInstructionDataArgs["expirationDate"];
384
+ quantity: OptionMintInstructionDataArgs["quantity"];
385
+ underlyingAsset: OptionMintInstructionDataArgs["underlyingAsset"];
386
+ underlyingSymbol: OptionMintInstructionDataArgs["underlyingSymbol"];
387
+ collateralMintArg: OptionMintInstructionDataArgs["collateralMint"];
388
+ makerCollateralAmount: OptionMintInstructionDataArgs["makerCollateralAmount"];
389
+ borrowedAmount: OptionMintInstructionDataArgs["borrowedAmount"];
390
+ maxRequiredCollateralAmount: OptionMintInstructionDataArgs["maxRequiredCollateralAmount"];
391
+ };
392
+
393
+ export async function getOptionMintInstructionAsync<
394
+ TAccountOptionAccount extends string,
395
+ TAccountLongMint extends string,
396
+ TAccountShortMint extends string,
397
+ TAccountMintAuthority extends string,
398
+ TAccountMakerLongAccount extends string,
399
+ TAccountMakerShortAccount extends string,
400
+ TAccountLongMetadataAccount extends string,
401
+ TAccountShortMetadataAccount extends string,
402
+ TAccountMarketData extends string,
403
+ TAccountUnderlyingMint extends string,
404
+ TAccountCollateralMint extends string,
405
+ TAccountOptionPool extends string,
406
+ TAccountEscrowLongAccount extends string,
407
+ TAccountPremiumVault extends string,
408
+ TAccountCollateralPool extends string,
409
+ TAccountCollateralVault extends string,
410
+ TAccountMakerCollateralAccount extends string,
411
+ TAccountWriterPosition extends string,
412
+ TAccountVault extends string,
413
+ TAccountVaultTokenAccount extends string,
414
+ TAccountEscrowState extends string,
415
+ TAccountEscrowAuthority extends string,
416
+ TAccountEscrowTokenAccount extends string,
417
+ TAccountPoolLoan extends string,
418
+ TAccountMaker extends string,
419
+ TAccountTokenProgram extends string,
420
+ TAccountAssociatedTokenProgram extends string,
421
+ TAccountTokenMetadataProgram extends string,
422
+ TAccountSystemProgram extends string,
423
+ TAccountRent extends string,
424
+ TProgramAddress extends Address = typeof OPTION_PROGRAM_PROGRAM_ADDRESS,
425
+ >(
426
+ input: OptionMintAsyncInput<
427
+ TAccountOptionAccount,
428
+ TAccountLongMint,
429
+ TAccountShortMint,
430
+ TAccountMintAuthority,
431
+ TAccountMakerLongAccount,
432
+ TAccountMakerShortAccount,
433
+ TAccountLongMetadataAccount,
434
+ TAccountShortMetadataAccount,
435
+ TAccountMarketData,
436
+ TAccountUnderlyingMint,
437
+ TAccountCollateralMint,
438
+ TAccountOptionPool,
439
+ TAccountEscrowLongAccount,
440
+ TAccountPremiumVault,
441
+ TAccountCollateralPool,
442
+ TAccountCollateralVault,
443
+ TAccountMakerCollateralAccount,
444
+ TAccountWriterPosition,
445
+ TAccountVault,
446
+ TAccountVaultTokenAccount,
447
+ TAccountEscrowState,
448
+ TAccountEscrowAuthority,
449
+ TAccountEscrowTokenAccount,
450
+ TAccountPoolLoan,
451
+ TAccountMaker,
452
+ TAccountTokenProgram,
453
+ TAccountAssociatedTokenProgram,
454
+ TAccountTokenMetadataProgram,
455
+ TAccountSystemProgram,
456
+ TAccountRent
457
+ >,
458
+ config?: { programAddress?: TProgramAddress },
459
+ ): Promise<
460
+ OptionMintInstruction<
461
+ TProgramAddress,
462
+ TAccountOptionAccount,
463
+ TAccountLongMint,
464
+ TAccountShortMint,
465
+ TAccountMintAuthority,
466
+ TAccountMakerLongAccount,
467
+ TAccountMakerShortAccount,
468
+ TAccountLongMetadataAccount,
469
+ TAccountShortMetadataAccount,
470
+ TAccountMarketData,
471
+ TAccountUnderlyingMint,
472
+ TAccountCollateralMint,
473
+ TAccountOptionPool,
474
+ TAccountEscrowLongAccount,
475
+ TAccountPremiumVault,
476
+ TAccountCollateralPool,
477
+ TAccountCollateralVault,
478
+ TAccountMakerCollateralAccount,
479
+ TAccountWriterPosition,
480
+ TAccountVault,
481
+ TAccountVaultTokenAccount,
482
+ TAccountEscrowState,
483
+ TAccountEscrowAuthority,
484
+ TAccountEscrowTokenAccount,
485
+ TAccountPoolLoan,
486
+ TAccountMaker,
487
+ TAccountTokenProgram,
488
+ TAccountAssociatedTokenProgram,
489
+ TAccountTokenMetadataProgram,
490
+ TAccountSystemProgram,
491
+ TAccountRent
492
+ >
493
+ > {
494
+ // Program address.
495
+ const programAddress =
496
+ config?.programAddress ?? OPTION_PROGRAM_PROGRAM_ADDRESS;
497
+
498
+ // Original accounts.
499
+ const originalAccounts = {
500
+ optionAccount: { value: input.optionAccount ?? null, isWritable: true },
501
+ longMint: { value: input.longMint ?? null, isWritable: true },
502
+ shortMint: { value: input.shortMint ?? null, isWritable: true },
503
+ mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },
504
+ makerLongAccount: {
505
+ value: input.makerLongAccount ?? null,
506
+ isWritable: true,
507
+ },
508
+ makerShortAccount: {
509
+ value: input.makerShortAccount ?? null,
510
+ isWritable: true,
511
+ },
512
+ longMetadataAccount: {
513
+ value: input.longMetadataAccount ?? null,
514
+ isWritable: true,
515
+ },
516
+ shortMetadataAccount: {
517
+ value: input.shortMetadataAccount ?? null,
518
+ isWritable: true,
519
+ },
520
+ marketData: { value: input.marketData ?? null, isWritable: false },
521
+ underlyingMint: { value: input.underlyingMint ?? null, isWritable: false },
522
+ collateralMint: { value: input.collateralMint ?? null, isWritable: false },
523
+ optionPool: { value: input.optionPool ?? null, isWritable: true },
524
+ escrowLongAccount: {
525
+ value: input.escrowLongAccount ?? null,
526
+ isWritable: true,
527
+ },
528
+ premiumVault: { value: input.premiumVault ?? null, isWritable: true },
529
+ collateralPool: { value: input.collateralPool ?? null, isWritable: true },
530
+ collateralVault: { value: input.collateralVault ?? null, isWritable: true },
531
+ makerCollateralAccount: {
532
+ value: input.makerCollateralAccount ?? null,
533
+ isWritable: true,
534
+ },
535
+ writerPosition: { value: input.writerPosition ?? null, isWritable: true },
536
+ vault: { value: input.vault ?? null, isWritable: true },
537
+ vaultTokenAccount: {
538
+ value: input.vaultTokenAccount ?? null,
539
+ isWritable: true,
540
+ },
541
+ escrowState: { value: input.escrowState ?? null, isWritable: true },
542
+ escrowAuthority: {
543
+ value: input.escrowAuthority ?? null,
544
+ isWritable: false,
545
+ },
546
+ escrowTokenAccount: {
547
+ value: input.escrowTokenAccount ?? null,
548
+ isWritable: true,
549
+ },
550
+ poolLoan: { value: input.poolLoan ?? null, isWritable: true },
551
+ maker: { value: input.maker ?? null, isWritable: true },
552
+ tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },
553
+ associatedTokenProgram: {
554
+ value: input.associatedTokenProgram ?? null,
555
+ isWritable: false,
556
+ },
557
+ tokenMetadataProgram: {
558
+ value: input.tokenMetadataProgram ?? null,
559
+ isWritable: false,
560
+ },
561
+ systemProgram: { value: input.systemProgram ?? null, isWritable: false },
562
+ rent: { value: input.rent ?? null, isWritable: false },
563
+ };
564
+ const accounts = originalAccounts as Record<
565
+ keyof typeof originalAccounts,
566
+ ResolvedAccount
567
+ >;
568
+
569
+ // Original args.
570
+ const args = { ...input, collateralMint: input.collateralMintArg };
571
+
572
+ // Resolve default values.
573
+ if (!accounts.optionAccount.value) {
574
+ accounts.optionAccount.value = await getProgramDerivedAddress({
575
+ programAddress,
576
+ seeds: [
577
+ getBytesEncoder().encode(
578
+ new Uint8Array([111, 112, 116, 105, 111, 110]),
579
+ ),
580
+ getAddressEncoder().encode(expectSome(args.underlyingAsset)),
581
+ getOptionTypeEncoder().encode(expectSome(args.optionType)),
582
+ getF64Encoder().encode(expectSome(args.strikePrice)),
583
+ getI64Encoder().encode(expectSome(args.expirationDate)),
584
+ ],
585
+ });
586
+ }
587
+ if (!accounts.longMint.value) {
588
+ accounts.longMint.value = await getProgramDerivedAddress({
589
+ programAddress,
590
+ seeds: [
591
+ getBytesEncoder().encode(
592
+ new Uint8Array([108, 111, 110, 103, 95, 109, 105, 110, 116]),
593
+ ),
594
+ getAddressEncoder().encode(expectAddress(accounts.optionAccount.value)),
595
+ ],
596
+ });
597
+ }
598
+ if (!accounts.shortMint.value) {
599
+ accounts.shortMint.value = await getProgramDerivedAddress({
600
+ programAddress,
601
+ seeds: [
602
+ getBytesEncoder().encode(
603
+ new Uint8Array([115, 104, 111, 114, 116, 95, 109, 105, 110, 116]),
604
+ ),
605
+ getAddressEncoder().encode(expectAddress(accounts.optionAccount.value)),
606
+ ],
607
+ });
608
+ }
609
+ if (!accounts.mintAuthority.value) {
610
+ accounts.mintAuthority.value = await getProgramDerivedAddress({
611
+ programAddress,
612
+ seeds: [
613
+ getBytesEncoder().encode(
614
+ new Uint8Array([
615
+ 109, 105, 110, 116, 95, 97, 117, 116, 104, 111, 114, 105, 116, 121,
616
+ ]),
617
+ ),
618
+ ],
619
+ });
620
+ }
621
+ if (!accounts.makerLongAccount.value) {
622
+ accounts.makerLongAccount.value = await getProgramDerivedAddress({
623
+ programAddress:
624
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">,
625
+ seeds: [
626
+ getAddressEncoder().encode(expectAddress(accounts.maker.value)),
627
+ getBytesEncoder().encode(
628
+ new Uint8Array([
629
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235,
630
+ 121, 172, 28, 180, 133, 237, 95, 91, 55, 145, 58, 140, 245, 133,
631
+ 126, 255, 0, 169,
632
+ ]),
633
+ ),
634
+ getAddressEncoder().encode(expectAddress(accounts.longMint.value)),
635
+ ],
636
+ });
637
+ }
638
+ if (!accounts.makerShortAccount.value) {
639
+ accounts.makerShortAccount.value = await getProgramDerivedAddress({
640
+ programAddress:
641
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">,
642
+ seeds: [
643
+ getAddressEncoder().encode(expectAddress(accounts.maker.value)),
644
+ getBytesEncoder().encode(
645
+ new Uint8Array([
646
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235,
647
+ 121, 172, 28, 180, 133, 237, 95, 91, 55, 145, 58, 140, 245, 133,
648
+ 126, 255, 0, 169,
649
+ ]),
650
+ ),
651
+ getAddressEncoder().encode(expectAddress(accounts.shortMint.value)),
652
+ ],
653
+ });
654
+ }
655
+ if (!accounts.marketData.value) {
656
+ accounts.marketData.value = await getProgramDerivedAddress({
657
+ programAddress,
658
+ seeds: [
659
+ getBytesEncoder().encode(
660
+ new Uint8Array([109, 97, 114, 107, 101, 116, 95, 100, 97, 116, 97]),
661
+ ),
662
+ getAddressEncoder().encode(expectSome(args.underlyingAsset)),
663
+ ],
664
+ });
665
+ }
666
+ if (!accounts.optionPool.value) {
667
+ accounts.optionPool.value = await getProgramDerivedAddress({
668
+ programAddress,
669
+ seeds: [
670
+ getBytesEncoder().encode(
671
+ new Uint8Array([
672
+ 111, 112, 116, 105, 111, 110, 95, 112, 111, 111, 108,
673
+ ]),
674
+ ),
675
+ getAddressEncoder().encode(expectAddress(accounts.optionAccount.value)),
676
+ ],
677
+ });
678
+ }
679
+ if (!accounts.escrowLongAccount.value) {
680
+ accounts.escrowLongAccount.value = await getProgramDerivedAddress({
681
+ programAddress:
682
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">,
683
+ seeds: [
684
+ getAddressEncoder().encode(expectAddress(accounts.optionPool.value)),
685
+ getBytesEncoder().encode(
686
+ new Uint8Array([
687
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235,
688
+ 121, 172, 28, 180, 133, 237, 95, 91, 55, 145, 58, 140, 245, 133,
689
+ 126, 255, 0, 169,
690
+ ]),
691
+ ),
692
+ getAddressEncoder().encode(expectAddress(accounts.longMint.value)),
693
+ ],
694
+ });
695
+ }
696
+ if (!accounts.premiumVault.value) {
697
+ accounts.premiumVault.value = await getProgramDerivedAddress({
698
+ programAddress:
699
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">,
700
+ seeds: [
701
+ getAddressEncoder().encode(expectAddress(accounts.optionPool.value)),
702
+ getBytesEncoder().encode(
703
+ new Uint8Array([
704
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235,
705
+ 121, 172, 28, 180, 133, 237, 95, 91, 55, 145, 58, 140, 245, 133,
706
+ 126, 255, 0, 169,
707
+ ]),
708
+ ),
709
+ getAddressEncoder().encode(
710
+ expectAddress(accounts.underlyingMint.value),
711
+ ),
712
+ ],
713
+ });
714
+ }
715
+ if (!accounts.collateralPool.value) {
716
+ accounts.collateralPool.value = await getProgramDerivedAddress({
717
+ programAddress,
718
+ seeds: [
719
+ getBytesEncoder().encode(
720
+ new Uint8Array([
721
+ 99, 111, 108, 108, 97, 116, 101, 114, 97, 108, 95, 112, 111, 111,
722
+ 108,
723
+ ]),
724
+ ),
725
+ getAddressEncoder().encode(expectAddress(accounts.optionAccount.value)),
726
+ ],
727
+ });
728
+ }
729
+ if (!accounts.collateralVault.value) {
730
+ accounts.collateralVault.value = await getProgramDerivedAddress({
731
+ programAddress:
732
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">,
733
+ seeds: [
734
+ getAddressEncoder().encode(
735
+ expectAddress(accounts.collateralPool.value),
736
+ ),
737
+ getBytesEncoder().encode(
738
+ new Uint8Array([
739
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235,
740
+ 121, 172, 28, 180, 133, 237, 95, 91, 55, 145, 58, 140, 245, 133,
741
+ 126, 255, 0, 169,
742
+ ]),
743
+ ),
744
+ getAddressEncoder().encode(
745
+ expectAddress(accounts.collateralMint.value),
746
+ ),
747
+ ],
748
+ });
749
+ }
750
+ if (!accounts.writerPosition.value) {
751
+ accounts.writerPosition.value = await getProgramDerivedAddress({
752
+ programAddress,
753
+ seeds: [
754
+ getBytesEncoder().encode(
755
+ new Uint8Array([
756
+ 119, 114, 105, 116, 101, 114, 95, 112, 111, 115, 105, 116, 105, 111,
757
+ 110,
758
+ ]),
759
+ ),
760
+ getAddressEncoder().encode(expectAddress(accounts.optionPool.value)),
761
+ getAddressEncoder().encode(expectAddress(accounts.maker.value)),
762
+ ],
763
+ });
764
+ }
765
+ if (!accounts.tokenProgram.value) {
766
+ accounts.tokenProgram.value =
767
+ "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">;
768
+ }
769
+ if (!accounts.associatedTokenProgram.value) {
770
+ accounts.associatedTokenProgram.value =
771
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">;
772
+ }
773
+ if (!accounts.tokenMetadataProgram.value) {
774
+ accounts.tokenMetadataProgram.value =
775
+ "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" as Address<"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s">;
776
+ }
777
+ if (!accounts.systemProgram.value) {
778
+ accounts.systemProgram.value =
779
+ "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">;
780
+ }
781
+ if (!accounts.rent.value) {
782
+ accounts.rent.value =
783
+ "SysvarRent111111111111111111111111111111111" as Address<"SysvarRent111111111111111111111111111111111">;
784
+ }
785
+
786
+ const getAccountMeta = getAccountMetaFactory(programAddress, "programId");
787
+ return Object.freeze({
788
+ accounts: [
789
+ getAccountMeta(accounts.optionAccount),
790
+ getAccountMeta(accounts.longMint),
791
+ getAccountMeta(accounts.shortMint),
792
+ getAccountMeta(accounts.mintAuthority),
793
+ getAccountMeta(accounts.makerLongAccount),
794
+ getAccountMeta(accounts.makerShortAccount),
795
+ getAccountMeta(accounts.longMetadataAccount),
796
+ getAccountMeta(accounts.shortMetadataAccount),
797
+ getAccountMeta(accounts.marketData),
798
+ getAccountMeta(accounts.underlyingMint),
799
+ getAccountMeta(accounts.collateralMint),
800
+ getAccountMeta(accounts.optionPool),
801
+ getAccountMeta(accounts.escrowLongAccount),
802
+ getAccountMeta(accounts.premiumVault),
803
+ getAccountMeta(accounts.collateralPool),
804
+ getAccountMeta(accounts.collateralVault),
805
+ getAccountMeta(accounts.makerCollateralAccount),
806
+ getAccountMeta(accounts.writerPosition),
807
+ getAccountMeta(accounts.vault),
808
+ getAccountMeta(accounts.vaultTokenAccount),
809
+ getAccountMeta(accounts.escrowState),
810
+ getAccountMeta(accounts.escrowAuthority),
811
+ getAccountMeta(accounts.escrowTokenAccount),
812
+ getAccountMeta(accounts.poolLoan),
813
+ getAccountMeta(accounts.maker),
814
+ getAccountMeta(accounts.tokenProgram),
815
+ getAccountMeta(accounts.associatedTokenProgram),
816
+ getAccountMeta(accounts.tokenMetadataProgram),
817
+ getAccountMeta(accounts.systemProgram),
818
+ getAccountMeta(accounts.rent),
819
+ ],
820
+ data: getOptionMintInstructionDataEncoder().encode(
821
+ args as OptionMintInstructionDataArgs,
822
+ ),
823
+ programAddress,
824
+ } as OptionMintInstruction<
825
+ TProgramAddress,
826
+ TAccountOptionAccount,
827
+ TAccountLongMint,
828
+ TAccountShortMint,
829
+ TAccountMintAuthority,
830
+ TAccountMakerLongAccount,
831
+ TAccountMakerShortAccount,
832
+ TAccountLongMetadataAccount,
833
+ TAccountShortMetadataAccount,
834
+ TAccountMarketData,
835
+ TAccountUnderlyingMint,
836
+ TAccountCollateralMint,
837
+ TAccountOptionPool,
838
+ TAccountEscrowLongAccount,
839
+ TAccountPremiumVault,
840
+ TAccountCollateralPool,
841
+ TAccountCollateralVault,
842
+ TAccountMakerCollateralAccount,
843
+ TAccountWriterPosition,
844
+ TAccountVault,
845
+ TAccountVaultTokenAccount,
846
+ TAccountEscrowState,
847
+ TAccountEscrowAuthority,
848
+ TAccountEscrowTokenAccount,
849
+ TAccountPoolLoan,
850
+ TAccountMaker,
851
+ TAccountTokenProgram,
852
+ TAccountAssociatedTokenProgram,
853
+ TAccountTokenMetadataProgram,
854
+ TAccountSystemProgram,
855
+ TAccountRent
856
+ >);
857
+ }
858
+
859
+ export type OptionMintInput<
860
+ TAccountOptionAccount extends string = string,
861
+ TAccountLongMint extends string = string,
862
+ TAccountShortMint extends string = string,
863
+ TAccountMintAuthority extends string = string,
864
+ TAccountMakerLongAccount extends string = string,
865
+ TAccountMakerShortAccount extends string = string,
866
+ TAccountLongMetadataAccount extends string = string,
867
+ TAccountShortMetadataAccount extends string = string,
868
+ TAccountMarketData extends string = string,
869
+ TAccountUnderlyingMint extends string = string,
870
+ TAccountCollateralMint extends string = string,
871
+ TAccountOptionPool extends string = string,
872
+ TAccountEscrowLongAccount extends string = string,
873
+ TAccountPremiumVault extends string = string,
874
+ TAccountCollateralPool extends string = string,
875
+ TAccountCollateralVault extends string = string,
876
+ TAccountMakerCollateralAccount extends string = string,
877
+ TAccountWriterPosition extends string = string,
878
+ TAccountVault extends string = string,
879
+ TAccountVaultTokenAccount extends string = string,
880
+ TAccountEscrowState extends string = string,
881
+ TAccountEscrowAuthority extends string = string,
882
+ TAccountEscrowTokenAccount extends string = string,
883
+ TAccountPoolLoan extends string = string,
884
+ TAccountMaker extends string = string,
885
+ TAccountTokenProgram extends string = string,
886
+ TAccountAssociatedTokenProgram extends string = string,
887
+ TAccountTokenMetadataProgram extends string = string,
888
+ TAccountSystemProgram extends string = string,
889
+ TAccountRent extends string = string,
890
+ > = {
891
+ /**
892
+ * Option account - derived from option parameters (NOT maker)
893
+ * Uses init_if_needed so multiple makers can use the same option
894
+ */
895
+ optionAccount: Address<TAccountOptionAccount>;
896
+ /**
897
+ * LONG token mint - one per unique option parameters (buyers hold these)
898
+ * Uses init_if_needed so multiple makers share the same token
899
+ */
900
+ longMint: Address<TAccountLongMint>;
901
+ /**
902
+ * SHORT token mint - one per unique option parameters (writers hold these)
903
+ * Uses init_if_needed so multiple makers share the same token
904
+ */
905
+ shortMint: Address<TAccountShortMint>;
906
+ mintAuthority: Address<TAccountMintAuthority>;
907
+ /** Maker's LONG token account (receives LONG tokens to deposit in pool) */
908
+ makerLongAccount: Address<TAccountMakerLongAccount>;
909
+ /** Maker's SHORT token account (receives SHORT tokens as proof of writing) */
910
+ makerShortAccount: Address<TAccountMakerShortAccount>;
911
+ longMetadataAccount: Address<TAccountLongMetadataAccount>;
912
+ shortMetadataAccount: Address<TAccountShortMetadataAccount>;
913
+ /** Market data account - provides baseline historical volatility for initial IV */
914
+ marketData: Address<TAccountMarketData>;
915
+ /** Underlying asset mint (e.g., WSOL) - required for pricing and pool initialization */
916
+ underlyingMint: Address<TAccountUnderlyingMint>;
917
+ /**
918
+ * Collateral mint (e.g., USDC, BTC, SOL) - Writer's choice for backing the position
919
+ * Can differ from underlying_mint - enables multi-collateral settlement
920
+ * OMLP vault routing is based on this mint
921
+ */
922
+ collateralMint: Address<TAccountCollateralMint>;
923
+ /** Option pool - aggregated liquidity pool for this option */
924
+ optionPool: Address<TAccountOptionPool>;
925
+ /** Pool's escrow for holding LONG tokens (for buyers to purchase) */
926
+ escrowLongAccount: Address<TAccountEscrowLongAccount>;
927
+ /** Pool's vault for collecting premiums (in underlying asset) */
928
+ premiumVault: Address<TAccountPremiumVault>;
929
+ /** Collateral pool for this option */
930
+ collateralPool: Address<TAccountCollateralPool>;
931
+ /** Collateral vault (ATA holding collateral) */
932
+ collateralVault: Address<TAccountCollateralVault>;
933
+ /** Maker's collateral account (source of maker's own collateral) */
934
+ makerCollateralAccount: Address<TAccountMakerCollateralAccount>;
935
+ /** Writer's unified position account (single source of truth) */
936
+ writerPosition: Address<TAccountWriterPosition>;
937
+ /** OMLP vault (optional - only required if borrowing) */
938
+ vault?: Address<TAccountVault>;
939
+ /** Vault's token account (optional - only required if borrowing) */
940
+ vaultTokenAccount?: Address<TAccountVaultTokenAccount>;
941
+ /** Escrow state PDA (optional - only required if borrowing) */
942
+ escrowState?: Address<TAccountEscrowState>;
943
+ /** Escrow authority PDA (optional - only required if borrowing) */
944
+ escrowAuthority?: Address<TAccountEscrowAuthority>;
945
+ /** Escrow token account (optional - only required if borrowing) */
946
+ escrowTokenAccount?: Address<TAccountEscrowTokenAccount>;
947
+ /** Pool loan account (optional - only required if borrowing) */
948
+ poolLoan?: Address<TAccountPoolLoan>;
949
+ maker: TransactionSigner<TAccountMaker>;
950
+ tokenProgram?: Address<TAccountTokenProgram>;
951
+ associatedTokenProgram?: Address<TAccountAssociatedTokenProgram>;
952
+ tokenMetadataProgram?: Address<TAccountTokenMetadataProgram>;
953
+ systemProgram?: Address<TAccountSystemProgram>;
954
+ rent?: Address<TAccountRent>;
955
+ optionType: OptionMintInstructionDataArgs["optionType"];
956
+ strikePrice: OptionMintInstructionDataArgs["strikePrice"];
957
+ expirationDate: OptionMintInstructionDataArgs["expirationDate"];
958
+ quantity: OptionMintInstructionDataArgs["quantity"];
959
+ underlyingAsset: OptionMintInstructionDataArgs["underlyingAsset"];
960
+ underlyingSymbol: OptionMintInstructionDataArgs["underlyingSymbol"];
961
+ collateralMintArg: OptionMintInstructionDataArgs["collateralMint"];
962
+ makerCollateralAmount: OptionMintInstructionDataArgs["makerCollateralAmount"];
963
+ borrowedAmount: OptionMintInstructionDataArgs["borrowedAmount"];
964
+ maxRequiredCollateralAmount: OptionMintInstructionDataArgs["maxRequiredCollateralAmount"];
965
+ };
966
+
967
+ export function getOptionMintInstruction<
968
+ TAccountOptionAccount extends string,
969
+ TAccountLongMint extends string,
970
+ TAccountShortMint extends string,
971
+ TAccountMintAuthority extends string,
972
+ TAccountMakerLongAccount extends string,
973
+ TAccountMakerShortAccount extends string,
974
+ TAccountLongMetadataAccount extends string,
975
+ TAccountShortMetadataAccount extends string,
976
+ TAccountMarketData extends string,
977
+ TAccountUnderlyingMint extends string,
978
+ TAccountCollateralMint extends string,
979
+ TAccountOptionPool extends string,
980
+ TAccountEscrowLongAccount extends string,
981
+ TAccountPremiumVault extends string,
982
+ TAccountCollateralPool extends string,
983
+ TAccountCollateralVault extends string,
984
+ TAccountMakerCollateralAccount extends string,
985
+ TAccountWriterPosition extends string,
986
+ TAccountVault extends string,
987
+ TAccountVaultTokenAccount extends string,
988
+ TAccountEscrowState extends string,
989
+ TAccountEscrowAuthority extends string,
990
+ TAccountEscrowTokenAccount extends string,
991
+ TAccountPoolLoan extends string,
992
+ TAccountMaker extends string,
993
+ TAccountTokenProgram extends string,
994
+ TAccountAssociatedTokenProgram extends string,
995
+ TAccountTokenMetadataProgram extends string,
996
+ TAccountSystemProgram extends string,
997
+ TAccountRent extends string,
998
+ TProgramAddress extends Address = typeof OPTION_PROGRAM_PROGRAM_ADDRESS,
999
+ >(
1000
+ input: OptionMintInput<
1001
+ TAccountOptionAccount,
1002
+ TAccountLongMint,
1003
+ TAccountShortMint,
1004
+ TAccountMintAuthority,
1005
+ TAccountMakerLongAccount,
1006
+ TAccountMakerShortAccount,
1007
+ TAccountLongMetadataAccount,
1008
+ TAccountShortMetadataAccount,
1009
+ TAccountMarketData,
1010
+ TAccountUnderlyingMint,
1011
+ TAccountCollateralMint,
1012
+ TAccountOptionPool,
1013
+ TAccountEscrowLongAccount,
1014
+ TAccountPremiumVault,
1015
+ TAccountCollateralPool,
1016
+ TAccountCollateralVault,
1017
+ TAccountMakerCollateralAccount,
1018
+ TAccountWriterPosition,
1019
+ TAccountVault,
1020
+ TAccountVaultTokenAccount,
1021
+ TAccountEscrowState,
1022
+ TAccountEscrowAuthority,
1023
+ TAccountEscrowTokenAccount,
1024
+ TAccountPoolLoan,
1025
+ TAccountMaker,
1026
+ TAccountTokenProgram,
1027
+ TAccountAssociatedTokenProgram,
1028
+ TAccountTokenMetadataProgram,
1029
+ TAccountSystemProgram,
1030
+ TAccountRent
1031
+ >,
1032
+ config?: { programAddress?: TProgramAddress },
1033
+ ): OptionMintInstruction<
1034
+ TProgramAddress,
1035
+ TAccountOptionAccount,
1036
+ TAccountLongMint,
1037
+ TAccountShortMint,
1038
+ TAccountMintAuthority,
1039
+ TAccountMakerLongAccount,
1040
+ TAccountMakerShortAccount,
1041
+ TAccountLongMetadataAccount,
1042
+ TAccountShortMetadataAccount,
1043
+ TAccountMarketData,
1044
+ TAccountUnderlyingMint,
1045
+ TAccountCollateralMint,
1046
+ TAccountOptionPool,
1047
+ TAccountEscrowLongAccount,
1048
+ TAccountPremiumVault,
1049
+ TAccountCollateralPool,
1050
+ TAccountCollateralVault,
1051
+ TAccountMakerCollateralAccount,
1052
+ TAccountWriterPosition,
1053
+ TAccountVault,
1054
+ TAccountVaultTokenAccount,
1055
+ TAccountEscrowState,
1056
+ TAccountEscrowAuthority,
1057
+ TAccountEscrowTokenAccount,
1058
+ TAccountPoolLoan,
1059
+ TAccountMaker,
1060
+ TAccountTokenProgram,
1061
+ TAccountAssociatedTokenProgram,
1062
+ TAccountTokenMetadataProgram,
1063
+ TAccountSystemProgram,
1064
+ TAccountRent
1065
+ > {
1066
+ // Program address.
1067
+ const programAddress =
1068
+ config?.programAddress ?? OPTION_PROGRAM_PROGRAM_ADDRESS;
1069
+
1070
+ // Original accounts.
1071
+ const originalAccounts = {
1072
+ optionAccount: { value: input.optionAccount ?? null, isWritable: true },
1073
+ longMint: { value: input.longMint ?? null, isWritable: true },
1074
+ shortMint: { value: input.shortMint ?? null, isWritable: true },
1075
+ mintAuthority: { value: input.mintAuthority ?? null, isWritable: false },
1076
+ makerLongAccount: {
1077
+ value: input.makerLongAccount ?? null,
1078
+ isWritable: true,
1079
+ },
1080
+ makerShortAccount: {
1081
+ value: input.makerShortAccount ?? null,
1082
+ isWritable: true,
1083
+ },
1084
+ longMetadataAccount: {
1085
+ value: input.longMetadataAccount ?? null,
1086
+ isWritable: true,
1087
+ },
1088
+ shortMetadataAccount: {
1089
+ value: input.shortMetadataAccount ?? null,
1090
+ isWritable: true,
1091
+ },
1092
+ marketData: { value: input.marketData ?? null, isWritable: false },
1093
+ underlyingMint: { value: input.underlyingMint ?? null, isWritable: false },
1094
+ collateralMint: { value: input.collateralMint ?? null, isWritable: false },
1095
+ optionPool: { value: input.optionPool ?? null, isWritable: true },
1096
+ escrowLongAccount: {
1097
+ value: input.escrowLongAccount ?? null,
1098
+ isWritable: true,
1099
+ },
1100
+ premiumVault: { value: input.premiumVault ?? null, isWritable: true },
1101
+ collateralPool: { value: input.collateralPool ?? null, isWritable: true },
1102
+ collateralVault: { value: input.collateralVault ?? null, isWritable: true },
1103
+ makerCollateralAccount: {
1104
+ value: input.makerCollateralAccount ?? null,
1105
+ isWritable: true,
1106
+ },
1107
+ writerPosition: { value: input.writerPosition ?? null, isWritable: true },
1108
+ vault: { value: input.vault ?? null, isWritable: true },
1109
+ vaultTokenAccount: {
1110
+ value: input.vaultTokenAccount ?? null,
1111
+ isWritable: true,
1112
+ },
1113
+ escrowState: { value: input.escrowState ?? null, isWritable: true },
1114
+ escrowAuthority: {
1115
+ value: input.escrowAuthority ?? null,
1116
+ isWritable: false,
1117
+ },
1118
+ escrowTokenAccount: {
1119
+ value: input.escrowTokenAccount ?? null,
1120
+ isWritable: true,
1121
+ },
1122
+ poolLoan: { value: input.poolLoan ?? null, isWritable: true },
1123
+ maker: { value: input.maker ?? null, isWritable: true },
1124
+ tokenProgram: { value: input.tokenProgram ?? null, isWritable: false },
1125
+ associatedTokenProgram: {
1126
+ value: input.associatedTokenProgram ?? null,
1127
+ isWritable: false,
1128
+ },
1129
+ tokenMetadataProgram: {
1130
+ value: input.tokenMetadataProgram ?? null,
1131
+ isWritable: false,
1132
+ },
1133
+ systemProgram: { value: input.systemProgram ?? null, isWritable: false },
1134
+ rent: { value: input.rent ?? null, isWritable: false },
1135
+ };
1136
+ const accounts = originalAccounts as Record<
1137
+ keyof typeof originalAccounts,
1138
+ ResolvedAccount
1139
+ >;
1140
+
1141
+ // Original args.
1142
+ const args = { ...input, collateralMint: input.collateralMintArg };
1143
+
1144
+ // Resolve default values.
1145
+ if (!accounts.tokenProgram.value) {
1146
+ accounts.tokenProgram.value =
1147
+ "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">;
1148
+ }
1149
+ if (!accounts.associatedTokenProgram.value) {
1150
+ accounts.associatedTokenProgram.value =
1151
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">;
1152
+ }
1153
+ if (!accounts.tokenMetadataProgram.value) {
1154
+ accounts.tokenMetadataProgram.value =
1155
+ "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" as Address<"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s">;
1156
+ }
1157
+ if (!accounts.systemProgram.value) {
1158
+ accounts.systemProgram.value =
1159
+ "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">;
1160
+ }
1161
+ if (!accounts.rent.value) {
1162
+ accounts.rent.value =
1163
+ "SysvarRent111111111111111111111111111111111" as Address<"SysvarRent111111111111111111111111111111111">;
1164
+ }
1165
+
1166
+ const getAccountMeta = getAccountMetaFactory(programAddress, "programId");
1167
+ return Object.freeze({
1168
+ accounts: [
1169
+ getAccountMeta(accounts.optionAccount),
1170
+ getAccountMeta(accounts.longMint),
1171
+ getAccountMeta(accounts.shortMint),
1172
+ getAccountMeta(accounts.mintAuthority),
1173
+ getAccountMeta(accounts.makerLongAccount),
1174
+ getAccountMeta(accounts.makerShortAccount),
1175
+ getAccountMeta(accounts.longMetadataAccount),
1176
+ getAccountMeta(accounts.shortMetadataAccount),
1177
+ getAccountMeta(accounts.marketData),
1178
+ getAccountMeta(accounts.underlyingMint),
1179
+ getAccountMeta(accounts.collateralMint),
1180
+ getAccountMeta(accounts.optionPool),
1181
+ getAccountMeta(accounts.escrowLongAccount),
1182
+ getAccountMeta(accounts.premiumVault),
1183
+ getAccountMeta(accounts.collateralPool),
1184
+ getAccountMeta(accounts.collateralVault),
1185
+ getAccountMeta(accounts.makerCollateralAccount),
1186
+ getAccountMeta(accounts.writerPosition),
1187
+ getAccountMeta(accounts.vault),
1188
+ getAccountMeta(accounts.vaultTokenAccount),
1189
+ getAccountMeta(accounts.escrowState),
1190
+ getAccountMeta(accounts.escrowAuthority),
1191
+ getAccountMeta(accounts.escrowTokenAccount),
1192
+ getAccountMeta(accounts.poolLoan),
1193
+ getAccountMeta(accounts.maker),
1194
+ getAccountMeta(accounts.tokenProgram),
1195
+ getAccountMeta(accounts.associatedTokenProgram),
1196
+ getAccountMeta(accounts.tokenMetadataProgram),
1197
+ getAccountMeta(accounts.systemProgram),
1198
+ getAccountMeta(accounts.rent),
1199
+ ],
1200
+ data: getOptionMintInstructionDataEncoder().encode(
1201
+ args as OptionMintInstructionDataArgs,
1202
+ ),
1203
+ programAddress,
1204
+ } as OptionMintInstruction<
1205
+ TProgramAddress,
1206
+ TAccountOptionAccount,
1207
+ TAccountLongMint,
1208
+ TAccountShortMint,
1209
+ TAccountMintAuthority,
1210
+ TAccountMakerLongAccount,
1211
+ TAccountMakerShortAccount,
1212
+ TAccountLongMetadataAccount,
1213
+ TAccountShortMetadataAccount,
1214
+ TAccountMarketData,
1215
+ TAccountUnderlyingMint,
1216
+ TAccountCollateralMint,
1217
+ TAccountOptionPool,
1218
+ TAccountEscrowLongAccount,
1219
+ TAccountPremiumVault,
1220
+ TAccountCollateralPool,
1221
+ TAccountCollateralVault,
1222
+ TAccountMakerCollateralAccount,
1223
+ TAccountWriterPosition,
1224
+ TAccountVault,
1225
+ TAccountVaultTokenAccount,
1226
+ TAccountEscrowState,
1227
+ TAccountEscrowAuthority,
1228
+ TAccountEscrowTokenAccount,
1229
+ TAccountPoolLoan,
1230
+ TAccountMaker,
1231
+ TAccountTokenProgram,
1232
+ TAccountAssociatedTokenProgram,
1233
+ TAccountTokenMetadataProgram,
1234
+ TAccountSystemProgram,
1235
+ TAccountRent
1236
+ >);
1237
+ }
1238
+
1239
+ export type ParsedOptionMintInstruction<
1240
+ TProgram extends string = typeof OPTION_PROGRAM_PROGRAM_ADDRESS,
1241
+ TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[],
1242
+ > = {
1243
+ programAddress: Address<TProgram>;
1244
+ accounts: {
1245
+ /**
1246
+ * Option account - derived from option parameters (NOT maker)
1247
+ * Uses init_if_needed so multiple makers can use the same option
1248
+ */
1249
+ optionAccount: TAccountMetas[0];
1250
+ /**
1251
+ * LONG token mint - one per unique option parameters (buyers hold these)
1252
+ * Uses init_if_needed so multiple makers share the same token
1253
+ */
1254
+ longMint: TAccountMetas[1];
1255
+ /**
1256
+ * SHORT token mint - one per unique option parameters (writers hold these)
1257
+ * Uses init_if_needed so multiple makers share the same token
1258
+ */
1259
+ shortMint: TAccountMetas[2];
1260
+ mintAuthority: TAccountMetas[3];
1261
+ /** Maker's LONG token account (receives LONG tokens to deposit in pool) */
1262
+ makerLongAccount: TAccountMetas[4];
1263
+ /** Maker's SHORT token account (receives SHORT tokens as proof of writing) */
1264
+ makerShortAccount: TAccountMetas[5];
1265
+ longMetadataAccount: TAccountMetas[6];
1266
+ shortMetadataAccount: TAccountMetas[7];
1267
+ /** Market data account - provides baseline historical volatility for initial IV */
1268
+ marketData: TAccountMetas[8];
1269
+ /** Underlying asset mint (e.g., WSOL) - required for pricing and pool initialization */
1270
+ underlyingMint: TAccountMetas[9];
1271
+ /**
1272
+ * Collateral mint (e.g., USDC, BTC, SOL) - Writer's choice for backing the position
1273
+ * Can differ from underlying_mint - enables multi-collateral settlement
1274
+ * OMLP vault routing is based on this mint
1275
+ */
1276
+ collateralMint: TAccountMetas[10];
1277
+ /** Option pool - aggregated liquidity pool for this option */
1278
+ optionPool: TAccountMetas[11];
1279
+ /** Pool's escrow for holding LONG tokens (for buyers to purchase) */
1280
+ escrowLongAccount: TAccountMetas[12];
1281
+ /** Pool's vault for collecting premiums (in underlying asset) */
1282
+ premiumVault: TAccountMetas[13];
1283
+ /** Collateral pool for this option */
1284
+ collateralPool: TAccountMetas[14];
1285
+ /** Collateral vault (ATA holding collateral) */
1286
+ collateralVault: TAccountMetas[15];
1287
+ /** Maker's collateral account (source of maker's own collateral) */
1288
+ makerCollateralAccount: TAccountMetas[16];
1289
+ /** Writer's unified position account (single source of truth) */
1290
+ writerPosition: TAccountMetas[17];
1291
+ /** OMLP vault (optional - only required if borrowing) */
1292
+ vault?: TAccountMetas[18] | undefined;
1293
+ /** Vault's token account (optional - only required if borrowing) */
1294
+ vaultTokenAccount?: TAccountMetas[19] | undefined;
1295
+ /** Escrow state PDA (optional - only required if borrowing) */
1296
+ escrowState?: TAccountMetas[20] | undefined;
1297
+ /** Escrow authority PDA (optional - only required if borrowing) */
1298
+ escrowAuthority?: TAccountMetas[21] | undefined;
1299
+ /** Escrow token account (optional - only required if borrowing) */
1300
+ escrowTokenAccount?: TAccountMetas[22] | undefined;
1301
+ /** Pool loan account (optional - only required if borrowing) */
1302
+ poolLoan?: TAccountMetas[23] | undefined;
1303
+ maker: TAccountMetas[24];
1304
+ tokenProgram: TAccountMetas[25];
1305
+ associatedTokenProgram: TAccountMetas[26];
1306
+ tokenMetadataProgram: TAccountMetas[27];
1307
+ systemProgram: TAccountMetas[28];
1308
+ rent: TAccountMetas[29];
1309
+ };
1310
+ data: OptionMintInstructionData;
1311
+ };
1312
+
1313
+ export function parseOptionMintInstruction<
1314
+ TProgram extends string,
1315
+ TAccountMetas extends readonly AccountMeta[],
1316
+ >(
1317
+ instruction: Instruction<TProgram> &
1318
+ InstructionWithAccounts<TAccountMetas> &
1319
+ InstructionWithData<ReadonlyUint8Array>,
1320
+ ): ParsedOptionMintInstruction<TProgram, TAccountMetas> {
1321
+ if (instruction.accounts.length < 30) {
1322
+ // TODO: Coded error.
1323
+ throw new Error("Not enough accounts");
1324
+ }
1325
+ let accountIndex = 0;
1326
+ const getNextAccount = () => {
1327
+ const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;
1328
+ accountIndex += 1;
1329
+ return accountMeta;
1330
+ };
1331
+ const getNextOptionalAccount = () => {
1332
+ const accountMeta = getNextAccount();
1333
+ return accountMeta.address === OPTION_PROGRAM_PROGRAM_ADDRESS
1334
+ ? undefined
1335
+ : accountMeta;
1336
+ };
1337
+ return {
1338
+ programAddress: instruction.programAddress,
1339
+ accounts: {
1340
+ optionAccount: getNextAccount(),
1341
+ longMint: getNextAccount(),
1342
+ shortMint: getNextAccount(),
1343
+ mintAuthority: getNextAccount(),
1344
+ makerLongAccount: getNextAccount(),
1345
+ makerShortAccount: getNextAccount(),
1346
+ longMetadataAccount: getNextAccount(),
1347
+ shortMetadataAccount: getNextAccount(),
1348
+ marketData: getNextAccount(),
1349
+ underlyingMint: getNextAccount(),
1350
+ collateralMint: getNextAccount(),
1351
+ optionPool: getNextAccount(),
1352
+ escrowLongAccount: getNextAccount(),
1353
+ premiumVault: getNextAccount(),
1354
+ collateralPool: getNextAccount(),
1355
+ collateralVault: getNextAccount(),
1356
+ makerCollateralAccount: getNextAccount(),
1357
+ writerPosition: getNextAccount(),
1358
+ vault: getNextOptionalAccount(),
1359
+ vaultTokenAccount: getNextOptionalAccount(),
1360
+ escrowState: getNextOptionalAccount(),
1361
+ escrowAuthority: getNextOptionalAccount(),
1362
+ escrowTokenAccount: getNextOptionalAccount(),
1363
+ poolLoan: getNextOptionalAccount(),
1364
+ maker: getNextAccount(),
1365
+ tokenProgram: getNextAccount(),
1366
+ associatedTokenProgram: getNextAccount(),
1367
+ tokenMetadataProgram: getNextAccount(),
1368
+ systemProgram: getNextAccount(),
1369
+ rent: getNextAccount(),
1370
+ },
1371
+ data: getOptionMintInstructionDataDecoder().decode(instruction.data),
1372
+ };
1373
+ }