perk-protocol 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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle-cranker.d.ts","sourceRoot":"","sources":["../src/oracle-cranker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAOV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAM,MAAM,mBAAmB,CAAC;AAM/C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC;;mGAE+F;IAC/F,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;kGAC8F;IAC9F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;6EACyE;IACzE,IAAI,CAAC,EAAE;QACL,gDAAgD;QAChD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,+EAA+E;QAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;+EACuE;QACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,4BAA4B;IAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,4BAA4B;IAC5B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAgOD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,cAAc,CAAS;gBAGnB,MAAM,EAAE,mBAAmB;IAwBvC;;;OAGG;YACW,WAAW;IAgFzB,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,WAAW;IAOnB,qCAAqC;IACrC,KAAK;IAUL,gHAAgH;IAChH,IAAI,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B/C,+DAA+D;IAC/D,SAAS,IAAI,OAAO;YAMN,IAAI;YAUJ,UAAU;CAkJzB"}
@@ -0,0 +1,434 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PerkOracleCranker = void 0;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ const anchor_1 = require("@coral-xyz/anchor");
6
+ const client_1 = require("./client");
7
+ const constants_1 = require("./constants");
8
+ // ── Helpers ──
9
+ /** Fetch with timeout using AbortController. Prevents hung connections from freezing the cranker. */
10
+ async function fetchWithTimeout(url, opts) {
11
+ const controller = new AbortController();
12
+ const timer = setTimeout(() => controller.abort(), opts.timeoutMs);
13
+ try {
14
+ return await fetch(url, { ...opts, signal: controller.signal });
15
+ }
16
+ finally {
17
+ clearTimeout(timer);
18
+ }
19
+ }
20
+ // ── Price Source Fetchers ──
21
+ /**
22
+ * Fetch prices from Jupiter Price API v2.
23
+ * Batches all mints in a single request.
24
+ */
25
+ async function fetchJupiterPrices(mints, timeoutMs) {
26
+ const results = new Map();
27
+ if (mints.length === 0)
28
+ return results;
29
+ const ids = mints.map((m) => m.toBase58()).join(",");
30
+ const url = `https://api.jup.ag/price/v2?ids=${ids}`;
31
+ const res = await fetchWithTimeout(url, { timeoutMs });
32
+ if (!res.ok) {
33
+ throw new Error(`Jupiter API returned ${res.status}: ${res.statusText}`);
34
+ }
35
+ const json = (await res.json());
36
+ // Schema validation: ensure data is an object
37
+ if (!json.data || typeof json.data !== "object") {
38
+ throw new Error("Jupiter API returned unexpected schema (missing data)");
39
+ }
40
+ const now = Math.floor(Date.now() / 1000);
41
+ for (const mint of mints) {
42
+ const key = mint.toBase58();
43
+ const entry = json.data[key];
44
+ if (!entry?.price || typeof entry.price !== "string")
45
+ continue;
46
+ const price = parseFloat(entry.price);
47
+ if (!isFinite(price) || price <= 0)
48
+ continue;
49
+ results.set(key, {
50
+ name: "jupiter",
51
+ price,
52
+ confidence: 0,
53
+ timestamp: now, // Jupiter doesn't provide timestamps — known limitation (M-03)
54
+ });
55
+ }
56
+ return results;
57
+ }
58
+ /**
59
+ * Fetch prices from Birdeye Token Price API.
60
+ * Batches all mints in a single request.
61
+ */
62
+ async function fetchBirdeyePrices(mints, apiKey, timeoutMs) {
63
+ const results = new Map();
64
+ if (mints.length === 0)
65
+ return results;
66
+ const addresses = mints.map((m) => m.toBase58()).join(",");
67
+ const url = `https://public-api.birdeye.so/defi/multi_price?list_address=${addresses}`;
68
+ const res = await fetchWithTimeout(url, {
69
+ timeoutMs,
70
+ headers: {
71
+ "X-API-KEY": apiKey,
72
+ "x-chain": "solana",
73
+ },
74
+ });
75
+ if (!res.ok) {
76
+ throw new Error(`Birdeye API returned ${res.status}: ${res.statusText}`);
77
+ }
78
+ const json = (await res.json());
79
+ // Schema validation
80
+ if (!json.data || typeof json.data !== "object") {
81
+ throw new Error("Birdeye API returned unexpected schema (missing data)");
82
+ }
83
+ const now = Math.floor(Date.now() / 1000);
84
+ for (const mint of mints) {
85
+ const key = mint.toBase58();
86
+ const entry = json.data[key];
87
+ if (!entry?.value || typeof entry.value !== "number")
88
+ continue;
89
+ const price = entry.value;
90
+ if (!isFinite(price) || price <= 0)
91
+ continue;
92
+ // M-03 mitigation: reject prices with timestamps older than 60s
93
+ const ts = entry.updateUnixTime ?? now;
94
+ if (now - ts > 60)
95
+ continue;
96
+ results.set(key, {
97
+ name: "birdeye",
98
+ price,
99
+ confidence: 0,
100
+ timestamp: ts,
101
+ });
102
+ }
103
+ return results;
104
+ }
105
+ /**
106
+ * Fetch prices from on-chain Raydium AMM pools.
107
+ * STUB — returns empty map. Will read from Raydium AMM accounts directly
108
+ * using on-chain reserves and TWAP (not spot) to resist flash-loan manipulation.
109
+ */
110
+ async function fetchRaydiumPrices(_mints, _connection) {
111
+ // TODO: Implement on-chain Raydium pool reads.
112
+ // Will deserialize Raydium AMM accounts, compute price from reserves,
113
+ // and use TWAP observations for manipulation resistance.
114
+ return new Map();
115
+ }
116
+ // ── Aggregation ──
117
+ function computeMedian(values) {
118
+ const sorted = [...values].sort((a, b) => a - b);
119
+ const mid = Math.floor(sorted.length / 2);
120
+ if (sorted.length % 2 === 0) {
121
+ return (sorted[mid - 1] + sorted[mid]) / 2;
122
+ }
123
+ return sorted[mid];
124
+ }
125
+ function aggregatePrice(sources, minSources, maxDeviationPct) {
126
+ // 1. Filter out null/zero/negative prices
127
+ const valid = sources.filter((s) => isFinite(s.price) && s.price > 0);
128
+ // 2. If fewer than minSources, return null
129
+ if (valid.length < minSources) {
130
+ return { result: null, outlierRejections: 0 };
131
+ }
132
+ // 3. Compute median
133
+ const prices = valid.map((s) => s.price);
134
+ const median = computeMedian(prices);
135
+ // 4. Outlier rejection: remove any source that deviates > maxDeviationPct from median
136
+ let outlierRejections = 0;
137
+ const accepted = valid.filter((s) => {
138
+ const deviation = Math.abs(s.price - median) / median;
139
+ if (deviation > maxDeviationPct) {
140
+ outlierRejections++;
141
+ return false;
142
+ }
143
+ return true;
144
+ });
145
+ // 5. Re-compute median with remaining sources
146
+ // 6. If fewer than minSources after rejection, return null
147
+ if (accepted.length < minSources) {
148
+ return { result: null, outlierRejections };
149
+ }
150
+ const acceptedPrices = accepted.map((s) => s.price);
151
+ const finalMedian = computeMedian(acceptedPrices);
152
+ // 7. Confidence = max_price - min_price across valid sources
153
+ const minPrice = Math.min(...acceptedPrices);
154
+ const maxPrice = Math.max(...acceptedPrices);
155
+ const confidence = maxPrice - minPrice;
156
+ // 8. Return { price, confidence, numSources }
157
+ return {
158
+ result: {
159
+ price: finalMedian,
160
+ confidence,
161
+ numSources: accepted.length,
162
+ },
163
+ outlierRejections,
164
+ };
165
+ }
166
+ // ── Oracle Cranker ──
167
+ class PerkOracleCranker {
168
+ constructor(config) {
169
+ this.running = false;
170
+ this.intervalId = null;
171
+ this.tickInProgress = false;
172
+ this.config = config;
173
+ // Build preInstructions for priority fees
174
+ const preInstructions = [];
175
+ const priorityFee = config.priorityFeeMicroLamports ?? 50000;
176
+ if (priorityFee > 0) {
177
+ preInstructions.push(web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
178
+ microLamports: priorityFee,
179
+ }));
180
+ }
181
+ this.client = new client_1.PerkClient({
182
+ connection: config.connection,
183
+ wallet: config.wallet,
184
+ preInstructions,
185
+ });
186
+ }
187
+ // ── Jito Bundle Submission ──
188
+ /**
189
+ * Submit a transaction as a Jito bundle for private, front-run-resistant submission.
190
+ * Falls back to normal RPC submission if Jito fails.
191
+ */
192
+ async sendViaJito(instructions) {
193
+ const jitoCfg = this.config.jito;
194
+ const blockEngineUrl = jitoCfg.blockEngineUrl ?? "https://mainnet.block-engine.jito.wtf";
195
+ const tipLamports = jitoCfg.tipLamports ?? 10000;
196
+ const connection = this.config.connection;
197
+ const payer = this.config.wallet.payer;
198
+ // Add Jito tip transfer to a known tip account
199
+ // Jito tip accounts rotate — use their API to get current one, fallback to known address
200
+ const JITO_TIP_ACCOUNTS = [
201
+ "96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5",
202
+ "HFqU5x63VTqvQss8hp11i4bPqSNjEBkNwR5PLRK73o5h",
203
+ "Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY",
204
+ "ADaUMid9yfUytqMBgopwjb2DTLSLJYfyDiSnwToYUJ1R",
205
+ "DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh",
206
+ "ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt",
207
+ "DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL",
208
+ "3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT",
209
+ ];
210
+ const tipAccount = new web3_js_1.PublicKey(JITO_TIP_ACCOUNTS[Math.floor(Math.random() * JITO_TIP_ACCOUNTS.length)]);
211
+ const tipIx = web3_js_1.SystemProgram.transfer({
212
+ fromPubkey: payer.publicKey,
213
+ toPubkey: tipAccount,
214
+ lamports: tipLamports,
215
+ });
216
+ const allIx = [...instructions, tipIx];
217
+ // Build versioned transaction
218
+ const { blockhash } = await connection.getLatestBlockhash("confirmed");
219
+ const messageV0 = new web3_js_1.TransactionMessage({
220
+ payerKey: payer.publicKey,
221
+ recentBlockhash: blockhash,
222
+ instructions: allIx,
223
+ }).compileToV0Message();
224
+ const tx = new web3_js_1.VersionedTransaction(messageV0);
225
+ tx.sign([payer]);
226
+ // Submit bundle to Jito
227
+ const serialized = Buffer.from(tx.serialize()).toString("base64");
228
+ const bundleRes = await fetchWithTimeout(`${blockEngineUrl}/api/v1/bundles`, {
229
+ timeoutMs: 5000,
230
+ method: "POST",
231
+ headers: { "Content-Type": "application/json" },
232
+ body: JSON.stringify({
233
+ jsonrpc: "2.0",
234
+ id: 1,
235
+ method: "sendBundle",
236
+ params: [[serialized]],
237
+ }),
238
+ });
239
+ if (!bundleRes.ok) {
240
+ throw new Error(`Jito bundle submission failed: ${bundleRes.status}`);
241
+ }
242
+ const bundleJson = (await bundleRes.json());
243
+ if (bundleJson.error) {
244
+ throw new Error(`Jito bundle error: ${bundleJson.error.message}`);
245
+ }
246
+ return bundleJson.result ?? "jito-bundle-submitted";
247
+ }
248
+ // ── Logging ──
249
+ log(msg) {
250
+ if (this.config.onLog)
251
+ this.config.onLog(msg);
252
+ else
253
+ console.log(`[OracleCranker] ${msg}`);
254
+ }
255
+ handleError(err, context) {
256
+ if (this.config.onError)
257
+ this.config.onError(err, context);
258
+ else
259
+ console.error(`[OracleCranker] ${context}: ${err.message}`);
260
+ }
261
+ // ── Lifecycle ──
262
+ /** Start the oracle cranker loop. */
263
+ start() {
264
+ if (this.running)
265
+ return;
266
+ this.running = true;
267
+ this.log("Starting oracle cranker...");
268
+ const interval = this.config.updateIntervalMs ?? 3000;
269
+ this.tick();
270
+ this.intervalId = setInterval(() => this.tick(), interval);
271
+ }
272
+ /** Stop the oracle cranker loop gracefully. Waits for current tick to finish (up to timeoutMs, default 30s). */
273
+ stop(timeoutMs = 30000) {
274
+ this.running = false;
275
+ if (this.intervalId) {
276
+ clearInterval(this.intervalId);
277
+ this.intervalId = null;
278
+ }
279
+ this.log("Oracle cranker stopping...");
280
+ return new Promise((resolve) => {
281
+ const deadline = Date.now() + timeoutMs;
282
+ const check = () => {
283
+ if (!this.tickInProgress) {
284
+ this.log("Oracle cranker stopped.");
285
+ resolve();
286
+ }
287
+ else if (Date.now() >= deadline) {
288
+ this.log("Oracle cranker stop timed out — tick still in progress.");
289
+ resolve();
290
+ }
291
+ else {
292
+ setTimeout(check, 100);
293
+ }
294
+ };
295
+ check();
296
+ });
297
+ }
298
+ /** Returns true if the oracle cranker is currently running. */
299
+ isRunning() {
300
+ return this.running;
301
+ }
302
+ // ── Tick ──
303
+ async tick() {
304
+ if (!this.running || this.tickInProgress)
305
+ return;
306
+ this.tickInProgress = true;
307
+ try {
308
+ return await this._tickInner();
309
+ }
310
+ finally {
311
+ this.tickInProgress = false;
312
+ }
313
+ }
314
+ async _tickInner() {
315
+ const tickStart = Date.now();
316
+ const metrics = {
317
+ tickDurationMs: 0,
318
+ mintsProcessed: 0,
319
+ updatesPosted: 0,
320
+ sourcesFetched: 0,
321
+ outlierRejections: 0,
322
+ errors: 0,
323
+ };
324
+ const mints = this.config.tokenMints;
325
+ const minSources = this.config.minSources ?? 1;
326
+ const maxDeviationPct = this.config.maxSourceDeviationPct ?? 0.01;
327
+ const fetchTimeout = this.config.fetchTimeoutMs ?? 5000;
328
+ try {
329
+ // Batch-fetch prices from all sources in parallel
330
+ const [jupiterPrices, birdeyePrices, raydiumPrices] = await Promise.all([
331
+ fetchJupiterPrices(mints, fetchTimeout).catch((err) => {
332
+ this.handleError(err, "fetchJupiterPrices");
333
+ metrics.errors++;
334
+ return new Map();
335
+ }),
336
+ this.config.birdeyeApiKey
337
+ ? fetchBirdeyePrices(mints, this.config.birdeyeApiKey, fetchTimeout).catch((err) => {
338
+ this.handleError(err, "fetchBirdeyePrices");
339
+ metrics.errors++;
340
+ return new Map();
341
+ })
342
+ : Promise.resolve(new Map()),
343
+ fetchRaydiumPrices(mints, this.config.connection).catch((err) => {
344
+ this.handleError(err, "fetchRaydiumPrices");
345
+ metrics.errors++;
346
+ return new Map();
347
+ }),
348
+ ]);
349
+ // Count total sources fetched
350
+ metrics.sourcesFetched =
351
+ jupiterPrices.size + birdeyePrices.size + raydiumPrices.size;
352
+ // Process each mint individually
353
+ for (const mint of mints) {
354
+ metrics.mintsProcessed++;
355
+ const mintKey = mint.toBase58();
356
+ try {
357
+ // Collect sources for this mint
358
+ const sources = [];
359
+ const jupPrice = jupiterPrices.get(mintKey);
360
+ if (jupPrice)
361
+ sources.push(jupPrice);
362
+ const birdPrice = birdeyePrices.get(mintKey);
363
+ if (birdPrice)
364
+ sources.push(birdPrice);
365
+ const rayPrice = raydiumPrices.get(mintKey);
366
+ if (rayPrice)
367
+ sources.push(rayPrice);
368
+ // Aggregate
369
+ const { result, outlierRejections } = aggregatePrice(sources, minSources, maxDeviationPct);
370
+ metrics.outlierRejections += outlierRejections;
371
+ if (!result) {
372
+ this.log(`Skipping ${mintKey.slice(0, 8)} — insufficient sources (${sources.length} fetched, ${minSources} required)`);
373
+ continue;
374
+ }
375
+ // Scale to on-chain representation
376
+ const scaledPrice = Math.round(result.price * constants_1.PRICE_SCALE);
377
+ const scaledConfidence = Math.round(result.confidence * constants_1.PRICE_SCALE);
378
+ // Post on-chain — via Jito bundle (private) or normal RPC
379
+ let sig;
380
+ if (this.config.jito) {
381
+ try {
382
+ const ix = await this.client.buildUpdatePerkOracleIx(mint, {
383
+ price: new anchor_1.BN(scaledPrice),
384
+ confidence: new anchor_1.BN(scaledConfidence),
385
+ numSources: result.numSources,
386
+ });
387
+ sig = await this.sendViaJito(ix);
388
+ this.log(`Posted price for ${mintKey.slice(0, 8)} via Jito: $${result.price.toFixed(6)} (${result.numSources} sources, conf=${result.confidence.toFixed(6)}): ${sig}`);
389
+ }
390
+ catch (jitoErr) {
391
+ if (this.config.jito.jitoOnly) {
392
+ // jitoOnly mode: do NOT leak to public mempool — skip this update
393
+ this.handleError(jitoErr, "jito-only-failed");
394
+ this.log(`⚠️ Jito failed for ${mintKey.slice(0, 8)}, jitoOnly=true — skipping to prevent mempool leak`);
395
+ continue;
396
+ }
397
+ // Fallback to normal RPC if Jito fails
398
+ this.handleError(jitoErr, "jito-fallback");
399
+ sig = await this.client.updatePerkOracle(mint, {
400
+ price: new anchor_1.BN(scaledPrice),
401
+ confidence: new anchor_1.BN(scaledConfidence),
402
+ numSources: result.numSources,
403
+ });
404
+ this.log(`Posted price for ${mintKey.slice(0, 8)} via RPC (Jito fallback): $${result.price.toFixed(6)} (${result.numSources} sources): ${sig}`);
405
+ }
406
+ }
407
+ else {
408
+ sig = await this.client.updatePerkOracle(mint, {
409
+ price: new anchor_1.BN(scaledPrice),
410
+ confidence: new anchor_1.BN(scaledConfidence),
411
+ numSources: result.numSources,
412
+ });
413
+ this.log(`Posted price for ${mintKey.slice(0, 8)}: $${result.price.toFixed(6)} (${result.numSources} sources, conf=${result.confidence.toFixed(6)}): ${sig}`);
414
+ }
415
+ metrics.updatesPosted++;
416
+ }
417
+ catch (err) {
418
+ metrics.errors++;
419
+ this.handleError(err, `mint ${mintKey.slice(0, 8)}`);
420
+ }
421
+ }
422
+ }
423
+ catch (err) {
424
+ metrics.errors++;
425
+ this.handleError(err, "tick");
426
+ }
427
+ metrics.tickDurationMs = Date.now() - tickStart;
428
+ if (this.config.onMetrics) {
429
+ this.config.onMetrics(metrics);
430
+ }
431
+ }
432
+ }
433
+ exports.PerkOracleCranker = PerkOracleCranker;
434
+ //# sourceMappingURL=oracle-cranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle-cranker.js","sourceRoot":"","sources":["../src/oracle-cranker.ts"],"names":[],"mappings":"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"}
package/dist/pda.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import BN from "bn.js";
3
+ /** Derive the protocol PDA. */
4
+ export declare function findProtocolAddress(programId?: PublicKey): [PublicKey, number];
5
+ /** Derive a market PDA from its token mint. */
6
+ export declare function findMarketAddress(tokenMint: PublicKey, programId?: PublicKey): [PublicKey, number];
7
+ /** Derive a user position PDA. */
8
+ export declare function findPositionAddress(market: PublicKey, user: PublicKey, programId?: PublicKey): [PublicKey, number];
9
+ /** Derive the vault PDA for a market. */
10
+ export declare function findVaultAddress(market: PublicKey, programId?: PublicKey): [PublicKey, number];
11
+ /** Derive the PerkOracle PDA for a token mint. */
12
+ export declare function findPerkOracleAddress(tokenMint: PublicKey, programId?: PublicKey): [PublicKey, number];
13
+ /** Derive a trigger order PDA. */
14
+ export declare function findTriggerOrderAddress(market: PublicKey, user: PublicKey, orderId: number | BN, programId?: PublicKey): [PublicKey, number];
15
+ //# sourceMappingURL=pda.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pda.d.ts","sourceRoot":"","sources":["../src/pda.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,OAAO,CAAC;AAWvB,+BAA+B;AAC/B,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,SAA2B,GACrC,CAAC,SAAS,EAAE,MAAM,CAAC,CAErB;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,EACpB,SAAS,GAAE,SAA2B,GACrC,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,kCAAkC;AAClC,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,GAAE,SAA2B,GACrC,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,SAAS,GAAE,SAA2B,GACrC,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,kDAAkD;AAClD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,EACpB,SAAS,GAAE,SAA2B,GACrC,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,kCAAkC;AAClC,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,GAAG,EAAE,EACpB,SAAS,GAAE,SAA2B,GACrC,CAAC,SAAS,EAAE,MAAM,CAAC,CAWrB"}
package/dist/pda.js ADDED
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.findProtocolAddress = findProtocolAddress;
7
+ exports.findMarketAddress = findMarketAddress;
8
+ exports.findPositionAddress = findPositionAddress;
9
+ exports.findVaultAddress = findVaultAddress;
10
+ exports.findPerkOracleAddress = findPerkOracleAddress;
11
+ exports.findTriggerOrderAddress = findTriggerOrderAddress;
12
+ const web3_js_1 = require("@solana/web3.js");
13
+ const bn_js_1 = __importDefault(require("bn.js"));
14
+ const constants_1 = require("./constants");
15
+ /** Derive the protocol PDA. */
16
+ function findProtocolAddress(programId = constants_1.PERK_PROGRAM_ID) {
17
+ return web3_js_1.PublicKey.findProgramAddressSync([constants_1.PROTOCOL_SEED], programId);
18
+ }
19
+ /** Derive a market PDA from its token mint. */
20
+ function findMarketAddress(tokenMint, programId = constants_1.PERK_PROGRAM_ID) {
21
+ return web3_js_1.PublicKey.findProgramAddressSync([constants_1.MARKET_SEED, tokenMint.toBuffer()], programId);
22
+ }
23
+ /** Derive a user position PDA. */
24
+ function findPositionAddress(market, user, programId = constants_1.PERK_PROGRAM_ID) {
25
+ return web3_js_1.PublicKey.findProgramAddressSync([constants_1.POSITION_SEED, market.toBuffer(), user.toBuffer()], programId);
26
+ }
27
+ /** Derive the vault PDA for a market. */
28
+ function findVaultAddress(market, programId = constants_1.PERK_PROGRAM_ID) {
29
+ return web3_js_1.PublicKey.findProgramAddressSync([constants_1.VAULT_SEED, market.toBuffer()], programId);
30
+ }
31
+ /** Derive the PerkOracle PDA for a token mint. */
32
+ function findPerkOracleAddress(tokenMint, programId = constants_1.PERK_PROGRAM_ID) {
33
+ return web3_js_1.PublicKey.findProgramAddressSync([constants_1.PERK_ORACLE_SEED, tokenMint.toBuffer()], programId);
34
+ }
35
+ /** Derive a trigger order PDA. */
36
+ function findTriggerOrderAddress(market, user, orderId, programId = constants_1.PERK_PROGRAM_ID) {
37
+ const orderIdBn = bn_js_1.default.isBN(orderId) ? orderId : new bn_js_1.default(orderId);
38
+ return web3_js_1.PublicKey.findProgramAddressSync([
39
+ constants_1.TRIGGER_SEED,
40
+ market.toBuffer(),
41
+ user.toBuffer(),
42
+ orderIdBn.toArrayLike(Buffer, "le", 8),
43
+ ], programId);
44
+ }
45
+ //# sourceMappingURL=pda.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pda.js","sourceRoot":"","sources":["../src/pda.ts"],"names":[],"mappings":";;;;;AAaA,kDAIC;AAGD,8CAQC;AAGD,kDASC;AAGD,4CAQC;AAGD,sDAQC;AAGD,0DAgBC;AAjFD,6CAA4C;AAC5C,kDAAuB;AACvB,2CAQqB;AAErB,+BAA+B;AAC/B,SAAgB,mBAAmB,CACjC,YAAuB,2BAAe;IAEtC,OAAO,mBAAS,CAAC,sBAAsB,CAAC,CAAC,yBAAa,CAAC,EAAE,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,+CAA+C;AAC/C,SAAgB,iBAAiB,CAC/B,SAAoB,EACpB,YAAuB,2BAAe;IAEtC,OAAO,mBAAS,CAAC,sBAAsB,CACrC,CAAC,uBAAW,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,EACnC,SAAS,CACV,CAAC;AACJ,CAAC;AAED,kCAAkC;AAClC,SAAgB,mBAAmB,CACjC,MAAiB,EACjB,IAAe,EACf,YAAuB,2BAAe;IAEtC,OAAO,mBAAS,CAAC,sBAAsB,CACrC,CAAC,yBAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EACnD,SAAS,CACV,CAAC;AACJ,CAAC;AAED,yCAAyC;AACzC,SAAgB,gBAAgB,CAC9B,MAAiB,EACjB,YAAuB,2BAAe;IAEtC,OAAO,mBAAS,CAAC,sBAAsB,CACrC,CAAC,sBAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAC/B,SAAS,CACV,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,SAAgB,qBAAqB,CACnC,SAAoB,EACpB,YAAuB,2BAAe;IAEtC,OAAO,mBAAS,CAAC,sBAAsB,CACrC,CAAC,4BAAgB,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,EACxC,SAAS,CACV,CAAC;AACJ,CAAC;AAED,kCAAkC;AAClC,SAAgB,uBAAuB,CACrC,MAAiB,EACjB,IAAe,EACf,OAAoB,EACpB,YAAuB,2BAAe;IAEtC,MAAM,SAAS,GAAG,eAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,eAAE,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,mBAAS,CAAC,sBAAsB,CACrC;QACE,wBAAY;QACZ,MAAM,CAAC,QAAQ,EAAE;QACjB,IAAI,CAAC,QAAQ,EAAE;QACf,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;KACvC,EACD,SAAS,CACV,CAAC;AACJ,CAAC"}