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.
- package/dist/client.d.ts +110 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +690 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +59 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +71 -0
- package/dist/constants.js.map +1 -0
- package/dist/cranker.d.ts +71 -0
- package/dist/cranker.d.ts.map +1 -0
- package/dist/cranker.js +441 -0
- package/dist/cranker.js.map +1 -0
- package/dist/idl.json +3740 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/math.d.ts +60 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +330 -0
- package/dist/math.js.map +1 -0
- package/dist/oracle-cranker.d.ts +72 -0
- package/dist/oracle-cranker.d.ts.map +1 -0
- package/dist/oracle-cranker.js +434 -0
- package/dist/oracle-cranker.js.map +1 -0
- package/dist/pda.d.ts +15 -0
- package/dist/pda.d.ts.map +1 -0
- package/dist/pda.js +45 -0
- package/dist/pda.js.map +1 -0
- package/dist/types.d.ts +252 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
package/dist/cranker.js
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PerkCranker = void 0;
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
6
|
+
const client_1 = require("./client");
|
|
7
|
+
const math_1 = require("./math");
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
// ── Helpers ──
|
|
10
|
+
/** Check if an Anchor-deserialized enum matches a variant name. */
|
|
11
|
+
function isEnumVariant(anchorEnum, variant) {
|
|
12
|
+
if (typeof anchorEnum === "object" && anchorEnum !== null) {
|
|
13
|
+
return variant in anchorEnum;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
/** Get the trigger order type as a string from Anchor-deserialized enum. */
|
|
18
|
+
function getOrderType(anchorEnum) {
|
|
19
|
+
if (typeof anchorEnum === "object" && anchorEnum !== null) {
|
|
20
|
+
if ("limit" in anchorEnum)
|
|
21
|
+
return "limit";
|
|
22
|
+
if ("stopLoss" in anchorEnum)
|
|
23
|
+
return "stopLoss";
|
|
24
|
+
if ("takeProfit" in anchorEnum)
|
|
25
|
+
return "takeProfit";
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/** Check if order is on the long side (Anchor-deserialized). */
|
|
30
|
+
function isLongSide(anchorSide) {
|
|
31
|
+
if (typeof anchorSide === "object" && anchorSide !== null) {
|
|
32
|
+
return "long" in anchorSide;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
/** Check if a trigger order should execute given oracle price. */
|
|
37
|
+
function shouldTriggerExecute(order, oraclePrice) {
|
|
38
|
+
const triggerPrice = order.triggerPrice.toNumber();
|
|
39
|
+
const orderType = getOrderType(order.orderType);
|
|
40
|
+
const isLong = isLongSide(order.side);
|
|
41
|
+
switch (orderType) {
|
|
42
|
+
case "limit":
|
|
43
|
+
return isLong ? oraclePrice <= triggerPrice : oraclePrice >= triggerPrice;
|
|
44
|
+
case "stopLoss":
|
|
45
|
+
return isLong ? oraclePrice <= triggerPrice : oraclePrice >= triggerPrice;
|
|
46
|
+
case "takeProfit":
|
|
47
|
+
return isLong ? oraclePrice >= triggerPrice : oraclePrice <= triggerPrice;
|
|
48
|
+
default:
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Check if a trigger order would increase OI on a drain-only side. */
|
|
53
|
+
function wouldIncreaseOI(order, market) {
|
|
54
|
+
if (order.reduceOnly)
|
|
55
|
+
return false;
|
|
56
|
+
const isLong = isLongSide(order.side);
|
|
57
|
+
if (isLong && isEnumVariant(market.longState, "drainOnly"))
|
|
58
|
+
return true;
|
|
59
|
+
if (!isLong && isEnumVariant(market.shortState, "drainOnly"))
|
|
60
|
+
return true;
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/** Resolve fallback oracle account: use the market's configured address, or SystemProgram as sentinel. */
|
|
64
|
+
function resolveFallbackOracle(market) {
|
|
65
|
+
const addr = market.fallbackOracleAddress;
|
|
66
|
+
if (addr.equals(web3_js_1.PublicKey.default))
|
|
67
|
+
return web3_js_1.SystemProgram.programId;
|
|
68
|
+
return addr;
|
|
69
|
+
}
|
|
70
|
+
class PerkCranker {
|
|
71
|
+
constructor(config) {
|
|
72
|
+
this.running = false;
|
|
73
|
+
this.intervalId = null;
|
|
74
|
+
this.tickInProgress = false;
|
|
75
|
+
/** Cache: collateral mint → ATA address for this wallet. */
|
|
76
|
+
this.ataCache = new Map();
|
|
77
|
+
this.config = config;
|
|
78
|
+
// Build preInstructions for priority fees
|
|
79
|
+
const preInstructions = [];
|
|
80
|
+
if (config.priorityFeeMicroLamports && config.priorityFeeMicroLamports > 0) {
|
|
81
|
+
preInstructions.push(web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
|
|
82
|
+
microLamports: config.priorityFeeMicroLamports,
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
this.client = new client_1.PerkClient({
|
|
86
|
+
connection: config.connection,
|
|
87
|
+
wallet: config.wallet,
|
|
88
|
+
preInstructions,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// ── Logging ──
|
|
92
|
+
log(msg) {
|
|
93
|
+
if (this.config.onLog)
|
|
94
|
+
this.config.onLog(msg);
|
|
95
|
+
else
|
|
96
|
+
console.log(`[Cranker] ${msg}`);
|
|
97
|
+
}
|
|
98
|
+
handleError(err, context) {
|
|
99
|
+
if (this.config.onError)
|
|
100
|
+
this.config.onError(err, context);
|
|
101
|
+
else
|
|
102
|
+
console.error(`[Cranker] ${context}: ${err.message}`);
|
|
103
|
+
}
|
|
104
|
+
// ── Lifecycle ──
|
|
105
|
+
/** Start the cranker loop. */
|
|
106
|
+
start() {
|
|
107
|
+
if (this.running)
|
|
108
|
+
return;
|
|
109
|
+
this.running = true;
|
|
110
|
+
this.log("Starting cranker...");
|
|
111
|
+
const interval = this.config.pollIntervalMs ?? 5000;
|
|
112
|
+
this.tick();
|
|
113
|
+
this.intervalId = setInterval(() => this.tick(), interval);
|
|
114
|
+
}
|
|
115
|
+
/** Stop the cranker loop gracefully. Waits for current tick to finish (up to timeoutMs, default 30s). */
|
|
116
|
+
stop(timeoutMs = 30000) {
|
|
117
|
+
this.running = false;
|
|
118
|
+
if (this.intervalId) {
|
|
119
|
+
clearInterval(this.intervalId);
|
|
120
|
+
this.intervalId = null;
|
|
121
|
+
}
|
|
122
|
+
this.log("Cranker stopping...");
|
|
123
|
+
return new Promise((resolve) => {
|
|
124
|
+
const deadline = Date.now() + timeoutMs;
|
|
125
|
+
const check = () => {
|
|
126
|
+
if (!this.tickInProgress) {
|
|
127
|
+
this.log("Cranker stopped.");
|
|
128
|
+
resolve();
|
|
129
|
+
}
|
|
130
|
+
else if (Date.now() >= deadline) {
|
|
131
|
+
this.log("Cranker stop timed out — tick still in progress.");
|
|
132
|
+
resolve();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
setTimeout(check, 100);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
check();
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/** Returns true if the cranker is currently running. */
|
|
142
|
+
isRunning() {
|
|
143
|
+
return this.running;
|
|
144
|
+
}
|
|
145
|
+
// ── Tick ──
|
|
146
|
+
async tick() {
|
|
147
|
+
if (!this.running || this.tickInProgress)
|
|
148
|
+
return;
|
|
149
|
+
this.tickInProgress = true;
|
|
150
|
+
try {
|
|
151
|
+
return await this._tickInner();
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
this.tickInProgress = false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async _tickInner() {
|
|
158
|
+
const tickStart = Date.now();
|
|
159
|
+
const metrics = {
|
|
160
|
+
tickDurationMs: 0,
|
|
161
|
+
marketsProcessed: 0,
|
|
162
|
+
liquidationsAttempted: 0,
|
|
163
|
+
liquidationsSucceeded: 0,
|
|
164
|
+
triggerOrdersExecuted: 0,
|
|
165
|
+
fundingCranked: 0,
|
|
166
|
+
pegUpdates: 0,
|
|
167
|
+
reclaimsAttempted: 0,
|
|
168
|
+
errors: 0,
|
|
169
|
+
};
|
|
170
|
+
try {
|
|
171
|
+
// Fetch markets — use allSettled so one bad market doesn't kill everything
|
|
172
|
+
const markets = await this.fetchMarkets();
|
|
173
|
+
for (const { address, account: marketInit } of markets) {
|
|
174
|
+
let market = marketInit;
|
|
175
|
+
if (!market.active)
|
|
176
|
+
continue;
|
|
177
|
+
metrics.marketsProcessed++;
|
|
178
|
+
try {
|
|
179
|
+
// 1. Crank funding
|
|
180
|
+
if (this.config.enableFunding !== false) {
|
|
181
|
+
const cranked = await this.crankFunding(address, market);
|
|
182
|
+
if (cranked)
|
|
183
|
+
metrics.fundingCranked++;
|
|
184
|
+
}
|
|
185
|
+
// 2. Update AMM peg (refreshes oracle price on-chain)
|
|
186
|
+
if (this.config.enablePegUpdate !== false) {
|
|
187
|
+
const updated = await this.updatePeg(address, market);
|
|
188
|
+
if (updated) {
|
|
189
|
+
metrics.pegUpdates++;
|
|
190
|
+
// Re-fetch market after peg update so scans use fresh oracle price
|
|
191
|
+
try {
|
|
192
|
+
const freshMarket = await this.client.fetchMarketByAddress(address);
|
|
193
|
+
market = freshMarket;
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
this.handleError(err, `re-fetch after peg ${address.toBase58().slice(0, 8)}`);
|
|
197
|
+
metrics.errors++;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Check oracle staleness — skip scans if price is too stale
|
|
202
|
+
// (on-chain will use fresh oracle, so our client-side decisions
|
|
203
|
+
// based on stale lastOraclePrice would be unreliable)
|
|
204
|
+
const lastPegSlot = market.lastPegUpdateSlot?.toNumber?.() ?? 0;
|
|
205
|
+
let currentSlot;
|
|
206
|
+
try {
|
|
207
|
+
currentSlot = await this.config.connection.getSlot();
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
currentSlot = 0; // If we can't get slot, skip staleness check
|
|
211
|
+
}
|
|
212
|
+
// ~400ms per slot on Solana → convert staleness seconds to slots
|
|
213
|
+
const maxStaleSlots = Math.ceil(constants_1.ORACLE_STALENESS_SECONDS * 1000 / 400);
|
|
214
|
+
const oracleIsStale = currentSlot > 0 &&
|
|
215
|
+
lastPegSlot > 0 &&
|
|
216
|
+
currentSlot - lastPegSlot > maxStaleSlots;
|
|
217
|
+
if (oracleIsStale) {
|
|
218
|
+
this.log(`Skipping scans for ${address.toBase58().slice(0, 8)} — oracle stale by ${currentSlot - lastPegSlot} slots`);
|
|
219
|
+
}
|
|
220
|
+
// Fetch positions and trigger orders in parallel for this market
|
|
221
|
+
const [positions, orders] = await Promise.all([
|
|
222
|
+
this.config.enableLiquidations !== false ||
|
|
223
|
+
this.config.enableReclaim
|
|
224
|
+
? this.fetchPositions(address)
|
|
225
|
+
: Promise.resolve([]),
|
|
226
|
+
this.config.enableTriggerOrders !== false
|
|
227
|
+
? this.fetchTriggerOrders(address)
|
|
228
|
+
: Promise.resolve([]),
|
|
229
|
+
]);
|
|
230
|
+
// 3. Trigger orders FIRST (stop-losses can save positions from liquidation)
|
|
231
|
+
// Skip if oracle is stale — our price-based decisions would be unreliable
|
|
232
|
+
if (this.config.enableTriggerOrders !== false && !oracleIsStale) {
|
|
233
|
+
const executed = await this.scanTriggerOrders(address, market, orders);
|
|
234
|
+
metrics.triggerOrdersExecuted += executed;
|
|
235
|
+
}
|
|
236
|
+
// 4. Liquidations
|
|
237
|
+
if (this.config.enableLiquidations !== false && !oracleIsStale) {
|
|
238
|
+
const { attempted, succeeded } = await this.scanLiquidations(address, market, positions);
|
|
239
|
+
metrics.liquidationsAttempted += attempted;
|
|
240
|
+
metrics.liquidationsSucceeded += succeeded;
|
|
241
|
+
}
|
|
242
|
+
// 5. Reclaim empty accounts (any time, not just ResetPending)
|
|
243
|
+
if (this.config.enableReclaim) {
|
|
244
|
+
const reclaimed = await this.scanReclaims(address, market, positions);
|
|
245
|
+
metrics.reclaimsAttempted += reclaimed;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
metrics.errors++;
|
|
250
|
+
this.handleError(err, `market ${address.toBase58().slice(0, 8)}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
metrics.errors++;
|
|
256
|
+
this.handleError(err, "tick");
|
|
257
|
+
}
|
|
258
|
+
metrics.tickDurationMs = Date.now() - tickStart;
|
|
259
|
+
if (this.config.onMetrics) {
|
|
260
|
+
this.config.onMetrics(metrics);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// ── Market fetching with allSettled ──
|
|
264
|
+
async fetchMarkets() {
|
|
265
|
+
if (this.config.markets?.length) {
|
|
266
|
+
const results = await Promise.allSettled(this.config.markets.map(async (addr) => ({
|
|
267
|
+
address: addr,
|
|
268
|
+
account: await this.client.fetchMarketByAddress(addr),
|
|
269
|
+
})));
|
|
270
|
+
const markets = [];
|
|
271
|
+
for (let i = 0; i < results.length; i++) {
|
|
272
|
+
const r = results[i];
|
|
273
|
+
if (r.status === "fulfilled") {
|
|
274
|
+
markets.push(r.value);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
this.handleError(r.reason, `fetch market ${this.config.markets[i].toBase58().slice(0, 8)}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return markets;
|
|
281
|
+
}
|
|
282
|
+
return this.client.fetchAllMarkets();
|
|
283
|
+
}
|
|
284
|
+
// ── Position / order fetching ──
|
|
285
|
+
async fetchPositions(marketAddress) {
|
|
286
|
+
const raw = await this.client.accounts.userPosition.all([
|
|
287
|
+
{ memcmp: { offset: 8 + 32, bytes: marketAddress.toBase58() } },
|
|
288
|
+
]);
|
|
289
|
+
return raw.map((r) => ({
|
|
290
|
+
publicKey: r.publicKey,
|
|
291
|
+
account: r.account,
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
294
|
+
async fetchTriggerOrders(marketAddress) {
|
|
295
|
+
const raw = await this.client.accounts.triggerOrder.all([
|
|
296
|
+
{ memcmp: { offset: 8 + 32, bytes: marketAddress.toBase58() } },
|
|
297
|
+
]);
|
|
298
|
+
return raw.map((r) => ({
|
|
299
|
+
publicKey: r.publicKey,
|
|
300
|
+
account: r.account,
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
// ── ATA cache ──
|
|
304
|
+
async getRewardAccount(collateralMint) {
|
|
305
|
+
if (this.config.rewardTokenAccount)
|
|
306
|
+
return this.config.rewardTokenAccount;
|
|
307
|
+
const key = collateralMint.toBase58();
|
|
308
|
+
let cached = this.ataCache.get(key);
|
|
309
|
+
if (!cached) {
|
|
310
|
+
cached = await (0, spl_token_1.getAssociatedTokenAddress)(collateralMint, this.config.wallet.publicKey);
|
|
311
|
+
this.ataCache.set(key, cached);
|
|
312
|
+
}
|
|
313
|
+
return cached;
|
|
314
|
+
}
|
|
315
|
+
// ── Funding ──
|
|
316
|
+
async crankFunding(marketAddress, market) {
|
|
317
|
+
const now = Math.floor(Date.now() / 1000);
|
|
318
|
+
const elapsed = now - market.lastFundingTime.toNumber();
|
|
319
|
+
if (elapsed < market.fundingPeriodSeconds)
|
|
320
|
+
return false;
|
|
321
|
+
try {
|
|
322
|
+
const sig = await this.client.crankFunding(marketAddress, market.oracleAddress, resolveFallbackOracle(market));
|
|
323
|
+
this.log(`Cranked funding for ${marketAddress.toBase58().slice(0, 8)}: ${sig}`);
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
this.handleError(err, "crankFunding");
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// ── Peg update ──
|
|
332
|
+
async updatePeg(marketAddress, market) {
|
|
333
|
+
try {
|
|
334
|
+
const sig = await this.client.updateAmm(marketAddress, market.oracleAddress, resolveFallbackOracle(market));
|
|
335
|
+
this.log(`Updated AMM peg for ${marketAddress.toBase58().slice(0, 8)}: ${sig}`);
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
const msg = err?.message ?? "";
|
|
340
|
+
// Expected: cooldown not elapsed, drift within threshold
|
|
341
|
+
if (msg.includes("cooldown") || msg.includes("threshold")) {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
// Log all other errors (including Anchor error codes)
|
|
345
|
+
this.handleError(err, "updatePeg");
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// ── Liquidations ──
|
|
350
|
+
async scanLiquidations(marketAddress, market, positions) {
|
|
351
|
+
const oraclePrice = market.lastOraclePrice;
|
|
352
|
+
let attempted = 0;
|
|
353
|
+
let succeeded = 0;
|
|
354
|
+
// Collect liquidatable positions
|
|
355
|
+
const liquidatable = [];
|
|
356
|
+
for (const { account: pos } of positions) {
|
|
357
|
+
if (pos.baseSize.isZero() && pos.basis.isZero())
|
|
358
|
+
continue;
|
|
359
|
+
if ((0, math_1.isLiquidatable)(pos, market, oraclePrice)) {
|
|
360
|
+
liquidatable.push(pos);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (liquidatable.length === 0)
|
|
364
|
+
return { attempted: 0, succeeded: 0 };
|
|
365
|
+
const rewardAccount = await this.getRewardAccount(market.collateralMint);
|
|
366
|
+
// Execute liquidations (one per tx for now — batching requires
|
|
367
|
+
// building raw transactions with the program's instruction builder)
|
|
368
|
+
for (const pos of liquidatable) {
|
|
369
|
+
attempted++;
|
|
370
|
+
try {
|
|
371
|
+
const sig = await this.client.liquidate(marketAddress, market.oracleAddress, pos.authority, rewardAccount, resolveFallbackOracle(market));
|
|
372
|
+
succeeded++;
|
|
373
|
+
this.log(`Liquidated ${pos.authority.toBase58().slice(0, 8)} on ${marketAddress.toBase58().slice(0, 8)}: ${sig}`);
|
|
374
|
+
}
|
|
375
|
+
catch (err) {
|
|
376
|
+
this.handleError(err, `liquidate ${pos.authority.toBase58().slice(0, 8)}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return { attempted, succeeded };
|
|
380
|
+
}
|
|
381
|
+
// ── Trigger orders ──
|
|
382
|
+
async scanTriggerOrders(marketAddress, market, orders) {
|
|
383
|
+
const oraclePrice = market.lastOraclePrice.toNumber();
|
|
384
|
+
let executed = 0;
|
|
385
|
+
const now = Math.floor(Date.now() / 1000);
|
|
386
|
+
for (const { account: order } of orders) {
|
|
387
|
+
// Check expiry
|
|
388
|
+
if (order.expiry.toNumber() > 0 && now > order.expiry.toNumber()) {
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
// Check max age
|
|
392
|
+
const createdAt = order.createdAt?.toNumber?.() ?? 0;
|
|
393
|
+
if (createdAt > 0 &&
|
|
394
|
+
now - createdAt > constants_1.MAX_TRIGGER_ORDER_AGE_SECONDS) {
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
// Skip OI-increasing orders on drain-only sides (on-chain rejects them)
|
|
398
|
+
if (wouldIncreaseOI(order, market))
|
|
399
|
+
continue;
|
|
400
|
+
// Check if trigger condition is met
|
|
401
|
+
if (shouldTriggerExecute(order, oraclePrice)) {
|
|
402
|
+
try {
|
|
403
|
+
const rewardAccount = await this.getRewardAccount(market.collateralMint);
|
|
404
|
+
const sig = await this.client.executeTriggerOrder(marketAddress, market.oracleAddress, order.authority, order.orderId, rewardAccount, resolveFallbackOracle(market));
|
|
405
|
+
executed++;
|
|
406
|
+
this.log(`Executed trigger order ${order.orderId.toString()} for ${order.authority.toBase58().slice(0, 8)}: ${sig}`);
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
this.handleError(err, `executeTrigger ${order.orderId.toString()}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return executed;
|
|
414
|
+
}
|
|
415
|
+
// ── Reclaims ──
|
|
416
|
+
async scanReclaims(marketAddress, market, positions) {
|
|
417
|
+
let reclaimed = 0;
|
|
418
|
+
for (const { account: pos } of positions) {
|
|
419
|
+
// Match on-chain reclaim_empty_account requirements
|
|
420
|
+
if (!pos.baseSize.isZero() || !pos.basis.isZero())
|
|
421
|
+
continue;
|
|
422
|
+
if (pos.depositedCollateral.toNumber() > constants_1.DUST_THRESHOLD)
|
|
423
|
+
continue;
|
|
424
|
+
if (pos.openTriggerOrders > 0)
|
|
425
|
+
continue;
|
|
426
|
+
if (pos.feeCredits.isNeg())
|
|
427
|
+
continue; // Has fee debt — on-chain rejects
|
|
428
|
+
try {
|
|
429
|
+
const sig = await this.client.reclaimEmptyAccount(marketAddress, market.oracleAddress, pos.authority, resolveFallbackOracle(market));
|
|
430
|
+
reclaimed++;
|
|
431
|
+
this.log(`Reclaimed empty account for ${pos.authority.toBase58().slice(0, 8)}: ${sig}`);
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
this.handleError(err, `reclaim ${pos.authority.toBase58().slice(0, 8)}`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return reclaimed;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
exports.PerkCranker = PerkCranker;
|
|
441
|
+
//# sourceMappingURL=cranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cranker.js","sourceRoot":"","sources":["../src/cranker.ts"],"names":[],"mappings":"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"}
|