@epicentral/sos-sdk 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +239 -0
- package/accounts/fetchers.ts +140 -0
- package/accounts/list.ts +152 -0
- package/accounts/pdas.ts +308 -0
- package/client/lookup-table.ts +32 -0
- package/client/program.ts +13 -0
- package/client/types.ts +8 -0
- package/generated/accounts/collateralPool.ts +217 -0
- package/generated/accounts/config.ts +156 -0
- package/generated/accounts/dualSourceContract.ts +235 -0
- package/generated/accounts/escrowState.ts +183 -0
- package/generated/accounts/index.ts +24 -0
- package/generated/accounts/lenderPosition.ts +211 -0
- package/generated/accounts/liquidityRouter.ts +223 -0
- package/generated/accounts/makerCollateralShare.ts +229 -0
- package/generated/accounts/makerPoolShare.ts +203 -0
- package/generated/accounts/marketDataAccount.ts +176 -0
- package/generated/accounts/optionAccount.ts +247 -0
- package/generated/accounts/optionPool.ts +253 -0
- package/generated/accounts/poolLoan.ts +220 -0
- package/generated/accounts/positionAccount.ts +187 -0
- package/generated/accounts/priceUpdateV2.ts +163 -0
- package/generated/accounts/vault.ts +304 -0
- package/generated/accounts/writerPosition.ts +297 -0
- package/generated/errors/index.ts +9 -0
- package/generated/errors/optionProgram.ts +392 -0
- package/generated/index.ts +13 -0
- package/generated/instructions/acceptAdmin.ts +230 -0
- package/generated/instructions/autoExerciseAllExpired.ts +523 -0
- package/generated/instructions/autoExerciseExpired.ts +623 -0
- package/generated/instructions/borrowFromPool.ts +554 -0
- package/generated/instructions/buyFromPool.ts +684 -0
- package/generated/instructions/claimPremium.ts +377 -0
- package/generated/instructions/closeLongToPool.ts +716 -0
- package/generated/instructions/closeOption.ts +235 -0
- package/generated/instructions/createEscrowV2.ts +518 -0
- package/generated/instructions/createLiquidityRouter.ts +361 -0
- package/generated/instructions/depositCollateral.ts +624 -0
- package/generated/instructions/depositToPool.ts +497 -0
- package/generated/instructions/depositToPosition.ts +429 -0
- package/generated/instructions/index.ts +45 -0
- package/generated/instructions/initCollateralPool.ts +513 -0
- package/generated/instructions/initConfig.ts +279 -0
- package/generated/instructions/initOptionPool.ts +587 -0
- package/generated/instructions/initializeMarketData.ts +359 -0
- package/generated/instructions/liquidateWriterPosition.ts +592 -0
- package/generated/instructions/omlpCreateVault.ts +547 -0
- package/generated/instructions/omlpTakeOfferWithFailover.ts +606 -0
- package/generated/instructions/omlpUpdateMaxLeverage.ts +304 -0
- package/generated/instructions/omlpUpdateProtocolFee.ts +304 -0
- package/generated/instructions/omlpUpdateSupplyLimit.ts +304 -0
- package/generated/instructions/optionExercise.ts +540 -0
- package/generated/instructions/optionMint.ts +1349 -0
- package/generated/instructions/optionValidate.ts +255 -0
- package/generated/instructions/repayPoolLoan.ts +499 -0
- package/generated/instructions/repayPoolLoanFromCollateral.ts +514 -0
- package/generated/instructions/settleMakerCollateral.ts +472 -0
- package/generated/instructions/syncWriterPosition.ts +206 -0
- package/generated/instructions/transferAdmin.ts +245 -0
- package/generated/instructions/unwindWriterUnsold.ts +668 -0
- package/generated/instructions/updateImpliedVolatility.ts +226 -0
- package/generated/instructions/updateMarketData.ts +315 -0
- package/generated/instructions/withdrawFromPool.ts +429 -0
- package/generated/instructions/withdrawFromPosition.ts +405 -0
- package/generated/instructions/writeToPool.ts +594 -0
- package/generated/programs/index.ts +9 -0
- package/generated/programs/optionProgram.ts +832 -0
- package/generated/shared/index.ts +164 -0
- package/generated/types/borrowedFromSAP1.ts +75 -0
- package/generated/types/borrowedFromSAP2.ts +83 -0
- package/generated/types/failoverTriggered.ts +85 -0
- package/generated/types/impliedVolatilityUpdated.ts +73 -0
- package/generated/types/index.ts +32 -0
- package/generated/types/liquidationExecuted.ts +73 -0
- package/generated/types/liquidityMetrics.ts +69 -0
- package/generated/types/liquidityRouterCreated.ts +79 -0
- package/generated/types/marketDataInitialized.ts +61 -0
- package/generated/types/marketDataUpdated.ts +69 -0
- package/generated/types/optionClosed.ts +56 -0
- package/generated/types/optionExercised.ts +62 -0
- package/generated/types/optionExpired.ts +49 -0
- package/generated/types/optionMinted.ts +78 -0
- package/generated/types/optionType.ts +38 -0
- package/generated/types/optionValidated.ts +82 -0
- package/generated/types/poolLoanCreated.ts +74 -0
- package/generated/types/poolLoanRepaid.ts +74 -0
- package/generated/types/positionDeposited.ts +73 -0
- package/generated/types/positionWithdrawn.ts +81 -0
- package/generated/types/priceFeedMessage.ts +117 -0
- package/generated/types/protocolFeeUpdated.ts +69 -0
- package/generated/types/sap2Provider.ts +38 -0
- package/generated/types/vaultCreated.ts +60 -0
- package/generated/types/verificationLevel.ts +95 -0
- package/index.ts +25 -0
- package/long/builders.ts +126 -0
- package/long/exercise.ts +49 -0
- package/long/quotes.ts +48 -0
- package/omlp/builders.ts +74 -0
- package/omlp/service.ts +94 -0
- package/package.json +22 -0
- package/shared/amounts.ts +32 -0
- package/shared/errors.ts +12 -0
- package/shared/remaining-accounts.ts +41 -0
- package/shared/transactions.ts +49 -0
- package/short/builders.ts +268 -0
- package/short/claim-premium.ts +37 -0
- package/short/close-option.ts +34 -0
- package/short/pool.ts +224 -0
- package/tsconfig.json +12 -0
package/accounts/pdas.ts
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { address, getAddressEncoder, getProgramDerivedAddress, type Address } from "@solana/kit";
|
|
2
|
+
import { OptionType } from "../generated/types";
|
|
3
|
+
import { PROGRAM_ID, toAddress } from "../client/program";
|
|
4
|
+
import type { AddressLike } from "../client/types";
|
|
5
|
+
|
|
6
|
+
const METADATA_PROGRAM_ADDRESS = address("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
7
|
+
const ASSOCIATED_TOKEN_PROGRAM_ADDRESS = address("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
|
|
8
|
+
const TOKEN_PROGRAM_ADDRESS = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
|
|
9
|
+
|
|
10
|
+
function f64ToLeBytes(value: number): Uint8Array {
|
|
11
|
+
const bytes = new Uint8Array(8);
|
|
12
|
+
const view = new DataView(bytes.buffer);
|
|
13
|
+
view.setFloat64(0, value, true);
|
|
14
|
+
return bytes;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function i64ToLeBytes(value: bigint | number): Uint8Array {
|
|
18
|
+
const bytes = new Uint8Array(8);
|
|
19
|
+
const view = new DataView(bytes.buffer);
|
|
20
|
+
view.setBigInt64(0, BigInt(value), true);
|
|
21
|
+
return bytes;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function u64ToLeBytes(value: bigint | number): Uint8Array {
|
|
25
|
+
const bytes = new Uint8Array(8);
|
|
26
|
+
const view = new DataView(bytes.buffer);
|
|
27
|
+
view.setBigUint64(0, BigInt(value), true);
|
|
28
|
+
return bytes;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function optionTypeToU8(optionType: OptionType): number {
|
|
32
|
+
return optionType === OptionType.Call ? 0 : 1;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function deriveOptionAccountPda(params: {
|
|
36
|
+
underlyingAsset: AddressLike;
|
|
37
|
+
optionType: OptionType;
|
|
38
|
+
strikePrice: number;
|
|
39
|
+
expirationDate: bigint | number;
|
|
40
|
+
programId?: AddressLike;
|
|
41
|
+
}): Promise<readonly [Address, number]> {
|
|
42
|
+
const addressEncoder = getAddressEncoder();
|
|
43
|
+
const programAddress = params.programId ? toAddress(params.programId) : PROGRAM_ID;
|
|
44
|
+
return getProgramDerivedAddress({
|
|
45
|
+
programAddress,
|
|
46
|
+
seeds: [
|
|
47
|
+
new TextEncoder().encode("option"),
|
|
48
|
+
addressEncoder.encode(toAddress(params.underlyingAsset)),
|
|
49
|
+
Uint8Array.of(optionTypeToU8(params.optionType)),
|
|
50
|
+
f64ToLeBytes(params.strikePrice),
|
|
51
|
+
i64ToLeBytes(params.expirationDate),
|
|
52
|
+
],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function deriveLongMintPda(
|
|
57
|
+
optionAccount: AddressLike,
|
|
58
|
+
programId: AddressLike = PROGRAM_ID
|
|
59
|
+
): Promise<readonly [Address, number]> {
|
|
60
|
+
const addressEncoder = getAddressEncoder();
|
|
61
|
+
return getProgramDerivedAddress({
|
|
62
|
+
programAddress: toAddress(programId),
|
|
63
|
+
seeds: [
|
|
64
|
+
new TextEncoder().encode("long_mint"),
|
|
65
|
+
addressEncoder.encode(toAddress(optionAccount)),
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function deriveShortMintPda(
|
|
71
|
+
optionAccount: AddressLike,
|
|
72
|
+
programId: AddressLike = PROGRAM_ID
|
|
73
|
+
): Promise<readonly [Address, number]> {
|
|
74
|
+
const addressEncoder = getAddressEncoder();
|
|
75
|
+
return getProgramDerivedAddress({
|
|
76
|
+
programAddress: toAddress(programId),
|
|
77
|
+
seeds: [
|
|
78
|
+
new TextEncoder().encode("short_mint"),
|
|
79
|
+
addressEncoder.encode(toAddress(optionAccount)),
|
|
80
|
+
],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export async function deriveMintAuthorityPda(
|
|
85
|
+
programId: AddressLike = PROGRAM_ID
|
|
86
|
+
): Promise<readonly [Address, number]> {
|
|
87
|
+
return getProgramDerivedAddress({
|
|
88
|
+
programAddress: toAddress(programId),
|
|
89
|
+
seeds: [new TextEncoder().encode("mint_authority")],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export async function deriveConfigPda(
|
|
94
|
+
programId: AddressLike = PROGRAM_ID
|
|
95
|
+
): Promise<readonly [Address, number]> {
|
|
96
|
+
return getProgramDerivedAddress({
|
|
97
|
+
programAddress: toAddress(programId),
|
|
98
|
+
seeds: [new TextEncoder().encode("config")],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function deriveOptionPoolPda(
|
|
103
|
+
optionAccount: AddressLike,
|
|
104
|
+
programId: AddressLike = PROGRAM_ID
|
|
105
|
+
): Promise<readonly [Address, number]> {
|
|
106
|
+
const addressEncoder = getAddressEncoder();
|
|
107
|
+
return getProgramDerivedAddress({
|
|
108
|
+
programAddress: toAddress(programId),
|
|
109
|
+
seeds: [
|
|
110
|
+
new TextEncoder().encode("option_pool"),
|
|
111
|
+
addressEncoder.encode(toAddress(optionAccount)),
|
|
112
|
+
],
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export async function deriveCollateralPoolPda(
|
|
117
|
+
optionAccount: AddressLike,
|
|
118
|
+
programId: AddressLike = PROGRAM_ID
|
|
119
|
+
): Promise<readonly [Address, number]> {
|
|
120
|
+
const addressEncoder = getAddressEncoder();
|
|
121
|
+
return getProgramDerivedAddress({
|
|
122
|
+
programAddress: toAddress(programId),
|
|
123
|
+
seeds: [
|
|
124
|
+
new TextEncoder().encode("collateral_pool"),
|
|
125
|
+
addressEncoder.encode(toAddress(optionAccount)),
|
|
126
|
+
],
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export async function deriveWriterPositionPda(
|
|
131
|
+
optionPool: AddressLike,
|
|
132
|
+
writer: AddressLike,
|
|
133
|
+
programId: AddressLike = PROGRAM_ID
|
|
134
|
+
): Promise<readonly [Address, number]> {
|
|
135
|
+
const addressEncoder = getAddressEncoder();
|
|
136
|
+
return getProgramDerivedAddress({
|
|
137
|
+
programAddress: toAddress(programId),
|
|
138
|
+
seeds: [
|
|
139
|
+
new TextEncoder().encode("writer_position"),
|
|
140
|
+
addressEncoder.encode(toAddress(optionPool)),
|
|
141
|
+
addressEncoder.encode(toAddress(writer)),
|
|
142
|
+
],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export async function deriveMakerCollateralSharePda(
|
|
147
|
+
collateralPool: AddressLike,
|
|
148
|
+
maker: AddressLike,
|
|
149
|
+
programId: AddressLike = PROGRAM_ID
|
|
150
|
+
): Promise<readonly [Address, number]> {
|
|
151
|
+
const addressEncoder = getAddressEncoder();
|
|
152
|
+
return getProgramDerivedAddress({
|
|
153
|
+
programAddress: toAddress(programId),
|
|
154
|
+
seeds: [
|
|
155
|
+
new TextEncoder().encode("maker_collateral_share"),
|
|
156
|
+
addressEncoder.encode(toAddress(collateralPool)),
|
|
157
|
+
addressEncoder.encode(toAddress(maker)),
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export async function deriveMakerPoolSharePda(
|
|
163
|
+
optionPool: AddressLike,
|
|
164
|
+
maker: AddressLike,
|
|
165
|
+
programId: AddressLike = PROGRAM_ID
|
|
166
|
+
): Promise<readonly [Address, number]> {
|
|
167
|
+
const addressEncoder = getAddressEncoder();
|
|
168
|
+
return getProgramDerivedAddress({
|
|
169
|
+
programAddress: toAddress(programId),
|
|
170
|
+
seeds: [
|
|
171
|
+
new TextEncoder().encode("maker_pool_share"),
|
|
172
|
+
addressEncoder.encode(toAddress(optionPool)),
|
|
173
|
+
addressEncoder.encode(toAddress(maker)),
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export async function deriveBuyerPositionPda(
|
|
179
|
+
buyer: AddressLike,
|
|
180
|
+
optionAccount: AddressLike,
|
|
181
|
+
programId: AddressLike = PROGRAM_ID
|
|
182
|
+
): Promise<readonly [Address, number]> {
|
|
183
|
+
const addressEncoder = getAddressEncoder();
|
|
184
|
+
return getProgramDerivedAddress({
|
|
185
|
+
programAddress: toAddress(programId),
|
|
186
|
+
seeds: [
|
|
187
|
+
new TextEncoder().encode("position"),
|
|
188
|
+
addressEncoder.encode(toAddress(buyer)),
|
|
189
|
+
addressEncoder.encode(toAddress(optionAccount)),
|
|
190
|
+
],
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export async function deriveMetadataPda(mint: AddressLike): Promise<readonly [Address, number]> {
|
|
195
|
+
const addressEncoder = getAddressEncoder();
|
|
196
|
+
return getProgramDerivedAddress({
|
|
197
|
+
programAddress: METADATA_PROGRAM_ADDRESS,
|
|
198
|
+
seeds: [
|
|
199
|
+
new TextEncoder().encode("metadata"),
|
|
200
|
+
addressEncoder.encode(METADATA_PROGRAM_ADDRESS),
|
|
201
|
+
addressEncoder.encode(toAddress(mint)),
|
|
202
|
+
],
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export async function deriveMarketDataPda(
|
|
207
|
+
underlyingAsset: AddressLike,
|
|
208
|
+
programId: AddressLike = PROGRAM_ID
|
|
209
|
+
): Promise<readonly [Address, number]> {
|
|
210
|
+
const addressEncoder = getAddressEncoder();
|
|
211
|
+
return getProgramDerivedAddress({
|
|
212
|
+
programAddress: toAddress(programId),
|
|
213
|
+
seeds: [
|
|
214
|
+
new TextEncoder().encode("market_data"),
|
|
215
|
+
addressEncoder.encode(toAddress(underlyingAsset)),
|
|
216
|
+
],
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export async function deriveVaultPda(
|
|
221
|
+
mint: AddressLike,
|
|
222
|
+
programId: AddressLike = PROGRAM_ID
|
|
223
|
+
): Promise<readonly [Address, number]> {
|
|
224
|
+
const addressEncoder = getAddressEncoder();
|
|
225
|
+
return getProgramDerivedAddress({
|
|
226
|
+
programAddress: toAddress(programId),
|
|
227
|
+
seeds: [new TextEncoder().encode("vault"), addressEncoder.encode(toAddress(mint))],
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export async function deriveLenderPositionPda(
|
|
232
|
+
vault: AddressLike,
|
|
233
|
+
lender: AddressLike,
|
|
234
|
+
programId: AddressLike = PROGRAM_ID
|
|
235
|
+
): Promise<readonly [Address, number]> {
|
|
236
|
+
const addressEncoder = getAddressEncoder();
|
|
237
|
+
return getProgramDerivedAddress({
|
|
238
|
+
programAddress: toAddress(programId),
|
|
239
|
+
seeds: [
|
|
240
|
+
new TextEncoder().encode("lender_position"),
|
|
241
|
+
addressEncoder.encode(toAddress(vault)),
|
|
242
|
+
addressEncoder.encode(toAddress(lender)),
|
|
243
|
+
],
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export async function deriveEscrowStatePda(
|
|
248
|
+
maker: AddressLike,
|
|
249
|
+
collateralMint: AddressLike,
|
|
250
|
+
programId: AddressLike = PROGRAM_ID
|
|
251
|
+
): Promise<readonly [Address, number]> {
|
|
252
|
+
const addressEncoder = getAddressEncoder();
|
|
253
|
+
return getProgramDerivedAddress({
|
|
254
|
+
programAddress: toAddress(programId),
|
|
255
|
+
seeds: [
|
|
256
|
+
new TextEncoder().encode("escrow_v2"),
|
|
257
|
+
addressEncoder.encode(toAddress(maker)),
|
|
258
|
+
addressEncoder.encode(toAddress(collateralMint)),
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export async function deriveEscrowAuthorityPda(
|
|
264
|
+
escrowState: AddressLike,
|
|
265
|
+
programId: AddressLike = PROGRAM_ID
|
|
266
|
+
): Promise<readonly [Address, number]> {
|
|
267
|
+
const addressEncoder = getAddressEncoder();
|
|
268
|
+
return getProgramDerivedAddress({
|
|
269
|
+
programAddress: toAddress(programId),
|
|
270
|
+
seeds: [
|
|
271
|
+
new TextEncoder().encode("escrow_authority_v2"),
|
|
272
|
+
addressEncoder.encode(toAddress(escrowState)),
|
|
273
|
+
],
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export async function derivePoolLoanPda(
|
|
278
|
+
writerPosition: AddressLike,
|
|
279
|
+
nonce: bigint | number,
|
|
280
|
+
programId: AddressLike = PROGRAM_ID
|
|
281
|
+
): Promise<readonly [Address, number]> {
|
|
282
|
+
const addressEncoder = getAddressEncoder();
|
|
283
|
+
return getProgramDerivedAddress({
|
|
284
|
+
programAddress: toAddress(programId),
|
|
285
|
+
seeds: [
|
|
286
|
+
new TextEncoder().encode("pool_loan"),
|
|
287
|
+
addressEncoder.encode(toAddress(writerPosition)),
|
|
288
|
+
u64ToLeBytes(nonce),
|
|
289
|
+
],
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export async function deriveAssociatedTokenAddress(
|
|
294
|
+
owner: AddressLike,
|
|
295
|
+
mint: AddressLike,
|
|
296
|
+
_allowOwnerOffCurve = false
|
|
297
|
+
): Promise<Address> {
|
|
298
|
+
const addressEncoder = getAddressEncoder();
|
|
299
|
+
const [associatedTokenAddress] = await getProgramDerivedAddress({
|
|
300
|
+
programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
301
|
+
seeds: [
|
|
302
|
+
addressEncoder.encode(toAddress(owner)),
|
|
303
|
+
addressEncoder.encode(TOKEN_PROGRAM_ADDRESS),
|
|
304
|
+
addressEncoder.encode(toAddress(mint)),
|
|
305
|
+
],
|
|
306
|
+
});
|
|
307
|
+
return associatedTokenAddress;
|
|
308
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { address, type Address } from "@solana/kit";
|
|
2
|
+
import type { KitRpc } from "./types";
|
|
3
|
+
|
|
4
|
+
export const LOOKUP_TABLE_ADDRESSES: Record<"devnet" | "mainnet", Address | null> = {
|
|
5
|
+
devnet: address("HsoWoDfW4yXVaXE31tEz167cjQn79TeXYxggSrXvRvri"),
|
|
6
|
+
mainnet: null,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const LOOKUP_TABLE_ADDRESS: Address | null = LOOKUP_TABLE_ADDRESSES.devnet;
|
|
10
|
+
|
|
11
|
+
export function detectNetwork(rpcUrl: string): "devnet" | "mainnet" {
|
|
12
|
+
const lower = rpcUrl.toLowerCase();
|
|
13
|
+
return lower.includes("mainnet") ? "mainnet" : "devnet";
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function getLookupTableAddressForNetwork(
|
|
17
|
+
network: "devnet" | "mainnet"
|
|
18
|
+
): Address | null {
|
|
19
|
+
return LOOKUP_TABLE_ADDRESSES[network];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function getLookupTableAccount(
|
|
23
|
+
rpc: KitRpc,
|
|
24
|
+
lookupTableAddress: Address | null
|
|
25
|
+
): Promise<unknown | null> {
|
|
26
|
+
if (!lookupTableAddress) return null;
|
|
27
|
+
const rpcWithLookupTable = rpc as KitRpc & {
|
|
28
|
+
getAddressLookupTable: (address: Address) => { send: () => Promise<{ value: unknown | null }> };
|
|
29
|
+
};
|
|
30
|
+
const result = await rpcWithLookupTable.getAddressLookupTable(lookupTableAddress).send();
|
|
31
|
+
return result.value ?? null;
|
|
32
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { address, type Address } from "@solana/kit";
|
|
2
|
+
import { OPTION_PROGRAM_PROGRAM_ADDRESS } from "../generated/programs";
|
|
3
|
+
import type { AddressLike } from "./types";
|
|
4
|
+
|
|
5
|
+
export const PROGRAM_ADDRESS = OPTION_PROGRAM_PROGRAM_ADDRESS;
|
|
6
|
+
export const PROGRAM_ID = address(OPTION_PROGRAM_PROGRAM_ADDRESS);
|
|
7
|
+
export const getProgramId = (): Address => PROGRAM_ID;
|
|
8
|
+
export const getProgramIdString = (): string => PROGRAM_ID;
|
|
9
|
+
|
|
10
|
+
export function toAddress(value: AddressLike): Address {
|
|
11
|
+
return typeof value === "string" ? address(value) : value;
|
|
12
|
+
}
|
|
13
|
+
export { address };
|
package/client/types.ts
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
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
|
+
assertAccountExists,
|
|
11
|
+
assertAccountsExist,
|
|
12
|
+
combineCodec,
|
|
13
|
+
decodeAccount,
|
|
14
|
+
fetchEncodedAccount,
|
|
15
|
+
fetchEncodedAccounts,
|
|
16
|
+
fixDecoderSize,
|
|
17
|
+
fixEncoderSize,
|
|
18
|
+
getAddressDecoder,
|
|
19
|
+
getAddressEncoder,
|
|
20
|
+
getBooleanDecoder,
|
|
21
|
+
getBooleanEncoder,
|
|
22
|
+
getBytesDecoder,
|
|
23
|
+
getBytesEncoder,
|
|
24
|
+
getI64Decoder,
|
|
25
|
+
getI64Encoder,
|
|
26
|
+
getStructDecoder,
|
|
27
|
+
getStructEncoder,
|
|
28
|
+
getU32Decoder,
|
|
29
|
+
getU32Encoder,
|
|
30
|
+
getU64Decoder,
|
|
31
|
+
getU64Encoder,
|
|
32
|
+
getU8Decoder,
|
|
33
|
+
getU8Encoder,
|
|
34
|
+
transformEncoder,
|
|
35
|
+
type Account,
|
|
36
|
+
type Address,
|
|
37
|
+
type EncodedAccount,
|
|
38
|
+
type FetchAccountConfig,
|
|
39
|
+
type FetchAccountsConfig,
|
|
40
|
+
type FixedSizeCodec,
|
|
41
|
+
type FixedSizeDecoder,
|
|
42
|
+
type FixedSizeEncoder,
|
|
43
|
+
type MaybeAccount,
|
|
44
|
+
type MaybeEncodedAccount,
|
|
45
|
+
type ReadonlyUint8Array,
|
|
46
|
+
} from "@solana/kit";
|
|
47
|
+
|
|
48
|
+
export const COLLATERAL_POOL_DISCRIMINATOR = new Uint8Array([
|
|
49
|
+
186, 4, 253, 240, 93, 243, 212, 195,
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
export function getCollateralPoolDiscriminatorBytes() {
|
|
53
|
+
return fixEncoderSize(getBytesEncoder(), 8).encode(
|
|
54
|
+
COLLATERAL_POOL_DISCRIMINATOR,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type CollateralPool = {
|
|
59
|
+
discriminator: ReadonlyUint8Array;
|
|
60
|
+
optionAccount: Address;
|
|
61
|
+
collateralMint: Address;
|
|
62
|
+
collateralVault: Address;
|
|
63
|
+
totalCollateral: bigint;
|
|
64
|
+
totalMakerContribution: bigint;
|
|
65
|
+
totalBorrowed: bigint;
|
|
66
|
+
totalInterestOwed: bigint;
|
|
67
|
+
totalExercisedValue: bigint;
|
|
68
|
+
totalLenderRepaid: bigint;
|
|
69
|
+
totalMakerReturned: bigint;
|
|
70
|
+
makerCount: number;
|
|
71
|
+
isExercised: boolean;
|
|
72
|
+
isFullySettled: boolean;
|
|
73
|
+
createdAt: bigint;
|
|
74
|
+
lastUpdated: bigint;
|
|
75
|
+
bump: number;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export type CollateralPoolArgs = {
|
|
79
|
+
optionAccount: Address;
|
|
80
|
+
collateralMint: Address;
|
|
81
|
+
collateralVault: Address;
|
|
82
|
+
totalCollateral: number | bigint;
|
|
83
|
+
totalMakerContribution: number | bigint;
|
|
84
|
+
totalBorrowed: number | bigint;
|
|
85
|
+
totalInterestOwed: number | bigint;
|
|
86
|
+
totalExercisedValue: number | bigint;
|
|
87
|
+
totalLenderRepaid: number | bigint;
|
|
88
|
+
totalMakerReturned: number | bigint;
|
|
89
|
+
makerCount: number;
|
|
90
|
+
isExercised: boolean;
|
|
91
|
+
isFullySettled: boolean;
|
|
92
|
+
createdAt: number | bigint;
|
|
93
|
+
lastUpdated: number | bigint;
|
|
94
|
+
bump: number;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/** Gets the encoder for {@link CollateralPoolArgs} account data. */
|
|
98
|
+
export function getCollateralPoolEncoder(): FixedSizeEncoder<CollateralPoolArgs> {
|
|
99
|
+
return transformEncoder(
|
|
100
|
+
getStructEncoder([
|
|
101
|
+
["discriminator", fixEncoderSize(getBytesEncoder(), 8)],
|
|
102
|
+
["optionAccount", getAddressEncoder()],
|
|
103
|
+
["collateralMint", getAddressEncoder()],
|
|
104
|
+
["collateralVault", getAddressEncoder()],
|
|
105
|
+
["totalCollateral", getU64Encoder()],
|
|
106
|
+
["totalMakerContribution", getU64Encoder()],
|
|
107
|
+
["totalBorrowed", getU64Encoder()],
|
|
108
|
+
["totalInterestOwed", getU64Encoder()],
|
|
109
|
+
["totalExercisedValue", getU64Encoder()],
|
|
110
|
+
["totalLenderRepaid", getU64Encoder()],
|
|
111
|
+
["totalMakerReturned", getU64Encoder()],
|
|
112
|
+
["makerCount", getU32Encoder()],
|
|
113
|
+
["isExercised", getBooleanEncoder()],
|
|
114
|
+
["isFullySettled", getBooleanEncoder()],
|
|
115
|
+
["createdAt", getI64Encoder()],
|
|
116
|
+
["lastUpdated", getI64Encoder()],
|
|
117
|
+
["bump", getU8Encoder()],
|
|
118
|
+
]),
|
|
119
|
+
(value) => ({ ...value, discriminator: COLLATERAL_POOL_DISCRIMINATOR }),
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Gets the decoder for {@link CollateralPool} account data. */
|
|
124
|
+
export function getCollateralPoolDecoder(): FixedSizeDecoder<CollateralPool> {
|
|
125
|
+
return getStructDecoder([
|
|
126
|
+
["discriminator", fixDecoderSize(getBytesDecoder(), 8)],
|
|
127
|
+
["optionAccount", getAddressDecoder()],
|
|
128
|
+
["collateralMint", getAddressDecoder()],
|
|
129
|
+
["collateralVault", getAddressDecoder()],
|
|
130
|
+
["totalCollateral", getU64Decoder()],
|
|
131
|
+
["totalMakerContribution", getU64Decoder()],
|
|
132
|
+
["totalBorrowed", getU64Decoder()],
|
|
133
|
+
["totalInterestOwed", getU64Decoder()],
|
|
134
|
+
["totalExercisedValue", getU64Decoder()],
|
|
135
|
+
["totalLenderRepaid", getU64Decoder()],
|
|
136
|
+
["totalMakerReturned", getU64Decoder()],
|
|
137
|
+
["makerCount", getU32Decoder()],
|
|
138
|
+
["isExercised", getBooleanDecoder()],
|
|
139
|
+
["isFullySettled", getBooleanDecoder()],
|
|
140
|
+
["createdAt", getI64Decoder()],
|
|
141
|
+
["lastUpdated", getI64Decoder()],
|
|
142
|
+
["bump", getU8Decoder()],
|
|
143
|
+
]);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Gets the codec for {@link CollateralPool} account data. */
|
|
147
|
+
export function getCollateralPoolCodec(): FixedSizeCodec<
|
|
148
|
+
CollateralPoolArgs,
|
|
149
|
+
CollateralPool
|
|
150
|
+
> {
|
|
151
|
+
return combineCodec(getCollateralPoolEncoder(), getCollateralPoolDecoder());
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function decodeCollateralPool<TAddress extends string = string>(
|
|
155
|
+
encodedAccount: EncodedAccount<TAddress>,
|
|
156
|
+
): Account<CollateralPool, TAddress>;
|
|
157
|
+
export function decodeCollateralPool<TAddress extends string = string>(
|
|
158
|
+
encodedAccount: MaybeEncodedAccount<TAddress>,
|
|
159
|
+
): MaybeAccount<CollateralPool, TAddress>;
|
|
160
|
+
export function decodeCollateralPool<TAddress extends string = string>(
|
|
161
|
+
encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>,
|
|
162
|
+
): Account<CollateralPool, TAddress> | MaybeAccount<CollateralPool, TAddress> {
|
|
163
|
+
return decodeAccount(
|
|
164
|
+
encodedAccount as MaybeEncodedAccount<TAddress>,
|
|
165
|
+
getCollateralPoolDecoder(),
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export async function fetchCollateralPool<TAddress extends string = string>(
|
|
170
|
+
rpc: Parameters<typeof fetchEncodedAccount>[0],
|
|
171
|
+
address: Address<TAddress>,
|
|
172
|
+
config?: FetchAccountConfig,
|
|
173
|
+
): Promise<Account<CollateralPool, TAddress>> {
|
|
174
|
+
const maybeAccount = await fetchMaybeCollateralPool(rpc, address, config);
|
|
175
|
+
assertAccountExists(maybeAccount);
|
|
176
|
+
return maybeAccount;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export async function fetchMaybeCollateralPool<
|
|
180
|
+
TAddress extends string = string,
|
|
181
|
+
>(
|
|
182
|
+
rpc: Parameters<typeof fetchEncodedAccount>[0],
|
|
183
|
+
address: Address<TAddress>,
|
|
184
|
+
config?: FetchAccountConfig,
|
|
185
|
+
): Promise<MaybeAccount<CollateralPool, TAddress>> {
|
|
186
|
+
const maybeAccount = await fetchEncodedAccount(rpc, address, config);
|
|
187
|
+
return decodeCollateralPool(maybeAccount);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export async function fetchAllCollateralPool(
|
|
191
|
+
rpc: Parameters<typeof fetchEncodedAccounts>[0],
|
|
192
|
+
addresses: Array<Address>,
|
|
193
|
+
config?: FetchAccountsConfig,
|
|
194
|
+
): Promise<Account<CollateralPool>[]> {
|
|
195
|
+
const maybeAccounts = await fetchAllMaybeCollateralPool(
|
|
196
|
+
rpc,
|
|
197
|
+
addresses,
|
|
198
|
+
config,
|
|
199
|
+
);
|
|
200
|
+
assertAccountsExist(maybeAccounts);
|
|
201
|
+
return maybeAccounts;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export async function fetchAllMaybeCollateralPool(
|
|
205
|
+
rpc: Parameters<typeof fetchEncodedAccounts>[0],
|
|
206
|
+
addresses: Array<Address>,
|
|
207
|
+
config?: FetchAccountsConfig,
|
|
208
|
+
): Promise<MaybeAccount<CollateralPool>[]> {
|
|
209
|
+
const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);
|
|
210
|
+
return maybeAccounts.map((maybeAccount) =>
|
|
211
|
+
decodeCollateralPool(maybeAccount),
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function getCollateralPoolSize(): number {
|
|
216
|
+
return 183;
|
|
217
|
+
}
|