@haven-fi/solauto-sdk 1.0.530 → 1.0.532

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.
@@ -1 +1 @@
1
- {"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAgBD,wBAAsB,WAAW,CAAC,WAAW,EAAE,YAAY,0BAsB1D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmF7B;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO;;GA0B5E"}
1
+ {"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAgBD,wBAAsB,WAAW,CAAC,WAAW,EAAE,YAAY,0BAsB1D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmF7B;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO;;GA6B5E"}
@@ -91,16 +91,16 @@ async function getJupPriceData(mints, extraInfo) {
91
91
  mints.map((x) => x.toString()).join(",") +
92
92
  (extraInfo ? "&showExtraInfo=true" : ""))).json();
93
93
  const result = res.data;
94
- if (!result ||
95
- result === null ||
96
- (typeof result === "object" &&
97
- Boolean(Object.values(result).filter((x) => x === null).length)) ||
98
- (typeof result === "object" &&
99
- Object.values(result)
100
- .map((x) => parseFloat(x.price))
101
- .includes(0))) {
94
+ if (!result || result === null || typeof result !== "object") {
102
95
  throw new Error("Failed to get token prices using Jupiter");
103
96
  }
97
+ const invalidValues = Boolean(Object.values(result).filter((x) => x === null).length) ||
98
+ Boolean(Object.values(result)
99
+ .map((x) => parseFloat(x.price))
100
+ .filter((x) => x <= 0).length);
101
+ if (invalidValues) {
102
+ throw new Error("Invalid price values");
103
+ }
104
104
  return result;
105
105
  }, 8);
106
106
  return data;
@@ -99,7 +99,7 @@ async function getSwitchboardPrices(mints) {
99
99
  prices = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => {
100
100
  const res = await crossbar.simulateSolanaFeeds("mainnet", mints.map((x) => switchboardConstants_1.SWITCHBOARD_PRICE_FEED_IDS[x.toString()]));
101
101
  const p = res.flatMap((x) => x.results[0]);
102
- if (p.filter((x) => !x || isNaN(Number(x))).length > 0) {
102
+ if (p.filter((x) => !x || isNaN(Number(x)) || Number(x) < 0).length > 0) {
103
103
  throw new Error("Unable to fetch Switchboard prices");
104
104
  }
105
105
  return p;
@@ -138,14 +138,14 @@ function postRebalanceLiqUtilizationRateBps(client, values, swapOutputAmount) {
138
138
  ? (0, numberUtils_1.fromBaseUnit)(swapOutputAmount, (0, generalUtils_2.tokenInfo)(outputToken).decimals) *
139
139
  ((0, priceUtils_1.safeGetPrice)(outputToken) ?? 0)
140
140
  : debtAdjustmentUsdAbs;
141
- supplyUsd = !boost
142
- ? supplyUsd - debtAdjustmentUsdAbs
143
- : supplyUsd + swapOutputUsd;
141
+ supplyUsd = boost
142
+ ? supplyUsd + swapOutputUsd
143
+ : supplyUsd - debtAdjustmentUsdAbs;
144
144
  debtUsd = boost ? debtUsd + debtAdjustmentUsdAbs : debtUsd - swapOutputUsd;
145
145
  return (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, client.solautoPositionState?.liqThresholdBps ?? 0);
146
146
  }
147
- function insufficientLiquidity(amountNeeded, liquidity, tokenDecimals, tokenPrice) {
148
- return amountNeeded > (0, numberUtils_1.fromBaseUnit)(liquidity, tokenDecimals) * tokenPrice;
147
+ function insufficientLiquidity(amountNeededUsd, liquidity, tokenDecimals, tokenPrice) {
148
+ return amountNeededUsd > (0, numberUtils_1.fromBaseUnit)(liquidity, tokenDecimals) * tokenPrice;
149
149
  }
150
150
  async function getFlashLoanRequirements(client, values, attemptNum) {
151
151
  let supplyUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
@@ -171,7 +171,7 @@ async function getFlashLoanRequirements(client, values, attemptNum) {
171
171
  let useDebtLiquidity = values.rebalanceDirection === generated_1.RebalanceDirection.Boost ||
172
172
  insufficientSupplyLiquidity;
173
173
  let signerFlashLoan = false;
174
- if ((attemptNum ?? 0) > 3 ||
174
+ if ((attemptNum ?? 0) >= 3 ||
175
175
  (insufficientSupplyLiquidity && insufficientDebtLiquidity)) {
176
176
  const { supplyBalance, debtBalance } = await client.signerBalances();
177
177
  const sufficientSignerSupplyLiquidity = !insufficientLiquidity(debtAdjustmentUsd, supplyBalance, (0, generalUtils_2.tokenInfo)(client.supplyMint).decimals, supplyPrice);
@@ -216,21 +216,21 @@ function getFlashLoanDetails(client, flRequirements, values, jupQuote) {
216
216
  async function findSufficientQuote(client, values, jupSwapInput, criteria) {
217
217
  let jupQuote;
218
218
  let insufficient = false;
219
- for (let i = 0; i < 5; i++) {
219
+ for (let i = 0; i < 10; i++) {
220
220
  (0, generalUtils_2.consoleLog)("Finding sufficient quote...");
221
221
  jupQuote = await (0, jupiterUtils_1.getJupQuote)(jupSwapInput);
222
222
  const outputAmount = parseInt(jupQuote.outAmount);
223
- const postRebalanceRate = postRebalanceLiqUtilizationRateBps(client, values);
223
+ const postRebalanceRate = postRebalanceLiqUtilizationRateBps(client, values, BigInt(outputAmount));
224
224
  insufficient = criteria.minOutputAmount
225
225
  ? outputAmount < Number(criteria.minOutputAmount)
226
226
  : criteria.minLiqUtilizationRateBps
227
227
  ? postRebalanceRate < criteria.minLiqUtilizationRateBps
228
228
  : postRebalanceRate > criteria.maxLiqUtilizationRateBps;
229
229
  if (insufficient) {
230
+ (0, generalUtils_2.consoleLog)(jupQuote);
230
231
  jupSwapInput.amount =
231
232
  jupSwapInput.amount +
232
- BigInt(Math.round(Number(jupSwapInput.amount) * 0.005));
233
- (0, generalUtils_2.consoleLog)(jupQuote);
233
+ BigInt(Math.round(Number(jupSwapInput.amount) * 0.01));
234
234
  }
235
235
  else {
236
236
  break;
@@ -276,7 +276,7 @@ async function getJupSwapRebalanceDetails(client, values, flRequirements, target
276
276
  jupQuote = await findSufficientQuote(client, values, jupSwapInput, {
277
277
  minOutputAmount: rebalanceToZero ? outputAmount : undefined,
278
278
  maxLiqUtilizationRateBps: values.repayingCloseToMaxLtv
279
- ? (0, numberUtils_1.maxRepayToBps)(client.solautoPositionState?.maxLtvBps ?? 0, client.solautoPositionState?.liqThresholdBps ?? 0)
279
+ ? (0, numberUtils_1.maxRepayToBps)(client.solautoPositionState?.maxLtvBps ?? 0, client.solautoPositionState?.liqThresholdBps ?? 0) - 15
280
280
  : undefined,
281
281
  });
282
282
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.530",
3
+ "version": "1.0.532",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "description": "Typescript SDK for the Solauto program on the Solana blockchain",
@@ -181,18 +181,21 @@ export async function getJupPriceData(mints: PublicKey[], extraInfo?: boolean) {
181
181
  )
182
182
  ).json();
183
183
  const result = res.data;
184
- if (
185
- !result ||
186
- result === null ||
187
- (typeof result === "object" &&
188
- Boolean(Object.values(result).filter((x) => x === null).length)) ||
189
- (typeof result === "object" &&
184
+ if (!result || result === null || typeof result !== "object") {
185
+ throw new Error("Failed to get token prices using Jupiter");
186
+ }
187
+
188
+ const invalidValues =
189
+ Boolean(Object.values(result).filter((x) => x === null).length) ||
190
+ Boolean(
190
191
  Object.values(result)
191
192
  .map((x) => parseFloat((x as any).price))
192
- .includes(0))
193
- ) {
194
- throw new Error("Failed to get token prices using Jupiter");
193
+ .filter((x) => x <= 0).length
194
+ );
195
+ if (invalidValues) {
196
+ throw new Error("Invalid price values");
195
197
  }
198
+
196
199
  return result;
197
200
  }, 8);
198
201
 
@@ -115,7 +115,7 @@ export async function getSwitchboardPrices(
115
115
  );
116
116
 
117
117
  const p = res.flatMap((x) => x.results[0]);
118
- if (p.filter((x) => !x || isNaN(Number(x))).length > 0) {
118
+ if (p.filter((x) => !x || isNaN(Number(x)) || Number(x) < 0).length > 0) {
119
119
  throw new Error("Unable to fetch Switchboard prices");
120
120
  }
121
121
 
@@ -289,9 +289,9 @@ function postRebalanceLiqUtilizationRateBps(
289
289
  (safeGetPrice(outputToken) ?? 0)
290
290
  : debtAdjustmentUsdAbs;
291
291
 
292
- supplyUsd = !boost
293
- ? supplyUsd - debtAdjustmentUsdAbs
294
- : supplyUsd + swapOutputUsd;
292
+ supplyUsd = boost
293
+ ? supplyUsd + swapOutputUsd
294
+ : supplyUsd - debtAdjustmentUsdAbs;
295
295
  debtUsd = boost ? debtUsd + debtAdjustmentUsdAbs : debtUsd - swapOutputUsd;
296
296
 
297
297
  return getLiqUtilzationRateBps(
@@ -302,12 +302,12 @@ function postRebalanceLiqUtilizationRateBps(
302
302
  }
303
303
 
304
304
  function insufficientLiquidity(
305
- amountNeeded: number,
305
+ amountNeededUsd: number,
306
306
  liquidity: bigint,
307
307
  tokenDecimals: number,
308
308
  tokenPrice: number
309
309
  ) {
310
- return amountNeeded > fromBaseUnit(liquidity, tokenDecimals) * tokenPrice;
310
+ return amountNeededUsd > fromBaseUnit(liquidity, tokenDecimals) * tokenPrice;
311
311
  }
312
312
 
313
313
  export interface FlashLoanRequirements {
@@ -377,7 +377,7 @@ export async function getFlashLoanRequirements(
377
377
 
378
378
  let signerFlashLoan = false;
379
379
  if (
380
- (attemptNum ?? 0) > 3 ||
380
+ (attemptNum ?? 0) >= 3 ||
381
381
  (insufficientSupplyLiquidity && insufficientDebtLiquidity)
382
382
  ) {
383
383
  const { supplyBalance, debtBalance } = await client.signerBalances();
@@ -471,14 +471,15 @@ async function findSufficientQuote(
471
471
  let jupQuote: QuoteResponse;
472
472
  let insufficient: boolean = false;
473
473
 
474
- for (let i = 0; i < 5; i++) {
474
+ for (let i = 0; i < 10; i++) {
475
475
  consoleLog("Finding sufficient quote...");
476
476
  jupQuote = await getJupQuote(jupSwapInput);
477
477
 
478
478
  const outputAmount = parseInt(jupQuote.outAmount);
479
479
  const postRebalanceRate = postRebalanceLiqUtilizationRateBps(
480
480
  client,
481
- values
481
+ values,
482
+ BigInt(outputAmount)
482
483
  );
483
484
  insufficient = criteria.minOutputAmount
484
485
  ? outputAmount < Number(criteria.minOutputAmount)
@@ -487,11 +488,10 @@ async function findSufficientQuote(
487
488
  : postRebalanceRate > criteria.maxLiqUtilizationRateBps!;
488
489
 
489
490
  if (insufficient) {
491
+ consoleLog(jupQuote);
490
492
  jupSwapInput.amount =
491
493
  jupSwapInput.amount +
492
- BigInt(Math.round(Number(jupSwapInput.amount) * 0.005));
493
-
494
- consoleLog(jupQuote);
494
+ BigInt(Math.round(Number(jupSwapInput.amount) * 0.01));
495
495
  } else {
496
496
  break;
497
497
  }
@@ -565,7 +565,7 @@ export async function getJupSwapRebalanceDetails(
565
565
  ? maxRepayToBps(
566
566
  client.solautoPositionState?.maxLtvBps ?? 0,
567
567
  client.solautoPositionState?.liqThresholdBps ?? 0
568
- )
568
+ ) - 15
569
569
  : undefined,
570
570
  });
571
571
  }
@@ -42,7 +42,6 @@ import {
42
42
  } from "../../src/utils";
43
43
  import { PriorityFeeSetting } from "../../src/types";
44
44
  import { buildIronforgeApiUrl, fromBaseUnit, tokenInfo, USD_DECIMALS } from "../../dist";
45
- import { JUPITER_PROGRAM_ID } from "../../src/jupiter-sdk";
46
45
 
47
46
  describe("Solauto Marginfi tests", async () => {
48
47
  // const signer = setupTest();
@@ -50,7 +49,7 @@ describe("Solauto Marginfi tests", async () => {
50
49
 
51
50
  const payForTransactions = true;
52
51
  const testProgram = false;
53
- const positionId = 1;
52
+ const positionId = 3;
54
53
 
55
54
  it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
56
55
  const client = new SolautoMarginfiClient(
@@ -66,7 +65,7 @@ describe("Solauto Marginfi tests", async () => {
66
65
  await client.initialize({
67
66
  signer,
68
67
  positionId,
69
- authority: new PublicKey("EBhRj7jbF2EVE21i19JSuCX1BAbnZFYhoKW64HnaZ3kf"),
68
+ authority: new PublicKey("FKYQs7KgRvaKQHxXwb8HKfoBcFdSxLL3JvHWpPdVQ16v"),
70
69
  // new: true,
71
70
  // marginfiAccount: new PublicKey(
72
71
  // ""