@haven-fi/solauto-sdk 1.0.694 → 1.0.696

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.
@@ -6,15 +6,19 @@ export declare const MIN_BOOST_GAP_BPS = 50;
6
6
  export declare const MIN_USD_SUPPORTED_POSITION = 1000;
7
7
  export declare const OFFSET_FROM_MAX_LTV = 0.005;
8
8
  export declare const REFERRER_PERCENTAGE = 0.15;
9
+ interface PriceCache {
10
+ realtimePrice: number;
11
+ confInterval: number;
12
+ emaPrice: number;
13
+ emaConfInterval: number;
14
+ time: number;
15
+ }
9
16
  export declare const PRICES: {
10
- [key: string]: {
11
- realtimePrice: number;
12
- emaPrice: number;
13
- time: number;
14
- };
17
+ [key: string]: PriceCache;
15
18
  };
16
19
  export declare const CHORES_TX_NAME = "account chores";
17
20
  export declare const JITO_TIP_ACCOUNTS: string[];
18
21
  export declare const SOLAUTO_LUT = "8b7KefQDroVLGao71J5H3hFwABeyMCgCrLpXWssNFhk9";
19
22
  export declare const STANDARD_LUT_ACCOUNTS: string[];
23
+ export {};
20
24
  //# sourceMappingURL=solautoConstants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"solautoConstants.d.ts","sourceRoot":"","sources":["../../src/constants/solautoConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,SAAS,EACV,MAAM,iBAAiB,CAAC;AAQzB,eAAO,MAAM,oBAAoB,WAEhC,CAAC;AACF,eAAO,MAAM,oBAAoB,WAEhC,CAAC;AAIF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAO,CAAC;AAEvG,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,eAAO,MAAM,iBAAiB,UAS7B,CAAC;AAEF,eAAO,MAAM,WAAW,iDAAiD,CAAC;AAC1E,eAAO,MAAM,qBAAqB,UAYR,CAAC"}
1
+ {"version":3,"file":"solautoConstants.d.ts","sourceRoot":"","sources":["../../src/constants/solautoConstants.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,SAAS,EACV,MAAM,iBAAiB,CAAC;AAQzB,eAAO,MAAM,oBAAoB,WAEhC,CAAC;AACF,eAAO,MAAM,oBAAoB,WAEhC,CAAC;AAIF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,UAAU,UAAU;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AACD,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAO,CAAC;AAExD,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,eAAO,MAAM,iBAAiB,UAS7B,CAAC;AAEF,eAAO,MAAM,WAAW,iDAAiD,CAAC;AAC1E,eAAO,MAAM,qBAAqB,UAYR,CAAC"}
@@ -17,9 +17,9 @@ export declare class RebalanceSwapManager {
17
17
  constructor(client: SolautoClient, values: RebalanceValues, flRequirements?: FlashLoanRequirements | undefined, targetLiqUtilizationRateBps?: number | undefined, priceType?: PriceType | undefined);
18
18
  private isBoost;
19
19
  private usdToSwap;
20
+ private swapDetails;
20
21
  private postRebalanceLiqUtilizationRateBps;
21
22
  private findSufficientQuote;
22
- private swapDetails;
23
23
  private bigIntWithIncrement;
24
24
  setSwapParams(attemptNum: number): Promise<void>;
25
25
  getSwapTxData(): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"rebalanceSwapManager.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceSwapManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,UAAU,EAAa,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAU3E,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC;IAXb,UAAU,EAAG,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,cAAc,CAAkB;gBAG9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,qBAAqB,YAAA,EACtC,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,SAAS,CAAC,EAAE,SAAS,YAAA;IAK/B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kCAAkC;YA2B5B,mBAAmB;IAoCjC,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,mBAAmB;IAIrB,aAAa,CAAC,UAAU,EAAE,MAAM;IA4EhC,aAAa;;;;;;CAWpB"}
1
+ {"version":3,"file":"rebalanceSwapManager.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceSwapManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,UAAU,EAAa,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAS3E,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC;IAXb,UAAU,EAAG,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,cAAc,CAAkB;gBAG9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,qBAAqB,YAAA,EACtC,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,SAAS,CAAC,EAAE,SAAS,YAAA;IAK/B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,kCAAkC;YA4B5B,mBAAmB;IAoCjC,OAAO,CAAC,mBAAmB;IAIrB,aAAa,CAAC,UAAU,EAAE,MAAM;IAyEhC,aAAa;;;;;;CAWpB"}
@@ -20,16 +20,33 @@ class RebalanceSwapManager {
20
20
  usdToSwap() {
21
21
  return Math.abs(this.values.debtAdjustmentUsd);
22
22
  }
23
+ swapDetails() {
24
+ const input = this.isBoost()
25
+ ? this.client.pos.state.debt
26
+ : this.client.pos.state.supply;
27
+ const output = this.isBoost()
28
+ ? this.client.pos.state.supply
29
+ : this.client.pos.state.debt;
30
+ const supplyPrice = this.client.pos.supplyPrice(this.priceType);
31
+ const debtPrice = this.client.pos.debtPrice(this.priceType);
32
+ const inputPrice = this.isBoost() ? debtPrice : supplyPrice;
33
+ const outputPrice = this.isBoost() ? supplyPrice : debtPrice;
34
+ let inputAmount = (0, utils_1.toBaseUnit)(this.usdToSwap() / inputPrice, input.decimals);
35
+ return {
36
+ inputAmount,
37
+ input,
38
+ inputPrice,
39
+ output,
40
+ outputPrice,
41
+ };
42
+ }
23
43
  postRebalanceLiqUtilizationRateBps(swapOutputAmount) {
24
44
  let supplyUsd = this.client.pos.supplyUsd(this.priceType);
25
- // TODO: add token balance change
26
45
  let debtUsd = this.client.pos.debtUsd(this.priceType);
27
- const outputToken = this.isBoost()
28
- ? this.client.pos.supplyMint
29
- : this.client.pos.debtMint;
46
+ // TODO: add token balance change
47
+ const { output, outputPrice } = this.swapDetails();
30
48
  const swapOutputUsd = swapOutputAmount
31
- ? (0, utils_1.fromBaseUnit)(swapOutputAmount, (0, utils_1.tokenInfo)(outputToken).decimals) *
32
- ((0, utils_1.safeGetPrice)(outputToken, this.priceType) ?? 0)
49
+ ? (0, utils_1.fromBaseUnit)(swapOutputAmount, (0, utils_1.tokenInfo)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(output.mint)).decimals) * outputPrice
33
50
  : this.usdToSwap();
34
51
  supplyUsd = this.isBoost()
35
52
  ? supplyUsd + swapOutputUsd
@@ -62,32 +79,18 @@ class RebalanceSwapManager {
62
79
  }
63
80
  return swapQuote;
64
81
  }
65
- swapDetails() {
66
- const input = this.isBoost()
67
- ? this.client.pos.state.debt
68
- : this.client.pos.state.supply;
69
- const output = this.isBoost()
70
- ? this.client.pos.state.supply
71
- : this.client.pos.state.debt;
72
- let inputAmount = (0, utils_1.toBaseUnit)(this.usdToSwap() / (0, utils_1.safeGetPrice)(input.mint, this.priceType), input.decimals);
73
- return {
74
- input,
75
- output,
76
- inputAmount,
77
- };
78
- }
79
82
  bigIntWithIncrement(num, inc) {
80
83
  return num + BigInt(Math.round(Number(num) * inc));
81
84
  }
82
85
  async setSwapParams(attemptNum) {
83
86
  const rebalanceToZero = this.targetLiqUtilizationRateBps === 0;
84
- let { input, output, inputAmount } = this.swapDetails();
87
+ let { input, output, outputPrice, inputAmount } = this.swapDetails();
85
88
  let outputAmount = rebalanceToZero
86
89
  ? output.amountUsed.baseUnit +
87
90
  BigInt(Math.round(Number(output.amountUsed.baseUnit) *
88
91
  // Add this small percentage to account for the APR on the debt between now and the transaction
89
92
  0.0001))
90
- : (0, utils_1.toBaseUnit)(this.usdToSwap() / (0, utils_1.safeGetPrice)(output.mint, this.priceType), output.decimals);
93
+ : (0, utils_1.toBaseUnit)(this.usdToSwap() / outputPrice, output.decimals);
91
94
  const flashLoanRepayFromDebt = !this.isBoost() &&
92
95
  this.flRequirements &&
93
96
  this.flRequirements.liquiditySource === generated_1.TokenType.Debt;
@@ -1 +1 @@
1
- {"version":3,"file":"rebalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceTxBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAgCrB,qBAAa,kBAAkB;IAQ3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,YAAY,CAAC;IATvB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAwB;IAC/C,OAAO,CAAC,SAAS,CAAiC;gBAGxC,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,YAAY,CAAC,EAAE,OAAO,YAAA;IAGhC,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,oBAAoB;IAwC5B,OAAO,CAAC,iCAAiC;YAgC3B,qBAAqB;IA0CnC,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,yBAAyB;YAqBnB,mBAAmB;YAyBnB,sBAAsB;YAyBtB,mBAAmB;IA8EpB,gBAAgB,CAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;CAe9C"}
1
+ {"version":3,"file":"rebalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceTxBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AA8BrB,qBAAa,kBAAkB;IAQ3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,YAAY,CAAC;IATvB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAwB;IAC/C,OAAO,CAAC,SAAS,CAAiC;gBAGxC,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,YAAY,CAAC,EAAE,OAAO,YAAA;IAGhC,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,oBAAoB;IAwC5B,OAAO,CAAC,iCAAiC;YAgC3B,qBAAqB;IA0CnC,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,yBAAyB;YAqBnB,mBAAmB;YAyBnB,sBAAsB;YAyBtB,mBAAmB;IAwEpB,gBAAgB,CAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;CAe9C"}
@@ -199,13 +199,7 @@ class RebalanceTxBuilder {
199
199
  priceType: this.priceType,
200
200
  };
201
201
  (0, utils_1.consoleLog)("Rebalance details:", rebalanceDetails);
202
- (0, utils_1.consoleLog)("Prices:", (0, utils_1.safeGetPrice)(this.client.pos.supplyMint, this.priceType), (0, utils_1.safeGetPrice)(this.client.pos.debtMint, this.priceType));
203
- // TODO: remove me
204
- if ((0, utils_1.isMarginfiPosition)(this.client.pos)) {
205
- const weightedAssets = this.values.endResult.supplyUsd * (0, utils_1.bytesToI80F48)(this.client.pos.supplyBank.config.assetWeightInit.value);
206
- const weightedLiabs = this.values.endResult.debtUsd * (0, utils_1.bytesToI80F48)(this.client.pos.debtBank.config.liabilityWeightInit.value);
207
- (0, utils_1.consoleLog)("Weighted assets & liabs:", weightedAssets, weightedLiabs);
208
- }
202
+ (0, utils_1.consoleLog)("Prices:", this.client.pos.supplyPrice(this.priceType), this.client.pos.debtPrice(this.priceType));
209
203
  const firstRebalance = this.client.rebalanceIx(generated_1.RebalanceStep.PreSwap, rebalanceDetails);
210
204
  const lastRebalance = this.client.rebalanceIx(generated_1.RebalanceStep.PostSwap, rebalanceDetails);
211
205
  if (!flashLoanDetails) {
@@ -5,8 +5,10 @@ import { LendingPlatform, PriceType } from "../generated";
5
5
  export declare class MarginfiSolautoPositionEx extends SolautoPositionEx {
6
6
  lendingPlatform: LendingPlatform;
7
7
  maxLtvPriceType: PriceType;
8
- supplyBank: Bank | null;
9
- debtBank: Bank | null;
8
+ private supplyBank;
9
+ private debtBank;
10
+ supplyPrice(priceType?: PriceType): number | undefined;
11
+ debtPrice(priceType?: PriceType): number | undefined;
10
12
  private getBankAccounts;
11
13
  getBanks(): Promise<Bank[]>;
12
14
  priceOracles(): Promise<PublicKey[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"marginfiSolautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/marginfiSolautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAoB,MAAM,iBAAiB,CAAC;AAezD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D,eAAe,kBAA4B;IAC3C,eAAe,YAAiB;IAEzB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAQ;IAC/B,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEpC,OAAO,CAAC,eAAe;IAMjB,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAW3B,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IASpC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAa3D,OAAO,CAAC,6BAA6B;IAwBrC,gCAAgC,CAAC,KAAK,EAAE,IAAI,EAAE;IAK9C,4BAA4B,CAAC,KAAK,EAAE,IAAI,EAAE;IAQ1C,IAAI,eAAe,cAElB;IAED,IAAI,aAAa,cAEhB;IAED,IAAI,wBAAwB,IAAI,MAAM,CAKrC;IAEK,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BjE"}
1
+ {"version":3,"file":"marginfiSolautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/marginfiSolautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAA+B,MAAM,iBAAiB,CAAC;AAepE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D,eAAe,kBAA4B;IAC3C,eAAe,YAAiB;IAEhC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAqB;IAErC,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS;IAItD,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS;IAIpD,OAAO,CAAC,eAAe;IAMjB,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAW3B,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IASpC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAa3D,OAAO,CAAC,6BAA6B;IAwBrC,gCAAgC,CAAC,KAAK,EAAE,IAAI,EAAE;IAK9C,4BAA4B,CAAC,KAAK,EAAE,IAAI,EAAE;IAQ1C,IAAI,eAAe,cAElB;IAED,IAAI,aAAa,cAEhB;IAED,IAAI,wBAAwB,IAAI,MAAM,CAKrC;IAEK,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BjE"}
@@ -16,6 +16,12 @@ class MarginfiSolautoPositionEx extends solautoPositionEx_1.SolautoPositionEx {
16
16
  this.supplyBank = null;
17
17
  this.debtBank = null;
18
18
  }
19
+ supplyPrice(priceType) {
20
+ return this._supplyPrice ?? (0, utils_1.safeGetPrice)(this.supplyMint, priceType, marginfi_sdk_1.PriceBias.Low);
21
+ }
22
+ debtPrice(priceType) {
23
+ return this._debtPrice ?? (0, utils_1.safeGetPrice)(this.debtMint, priceType, marginfi_sdk_1.PriceBias.High);
24
+ }
19
25
  getBankAccounts(mint) {
20
26
  const group = this.lpPoolAccount.toString();
21
27
  const bankAccounts = (0, constants_1.getMarginfiAccounts)(this.lpEnv).bankAccounts;
@@ -39,8 +39,8 @@ export declare abstract class SolautoPositionEx {
39
39
  private _debtMint?;
40
40
  protected _data: SolautoPositionExData;
41
41
  private readonly firstState;
42
- private _supplyPrice?;
43
- private _debtPrice?;
42
+ protected _supplyPrice?: number;
43
+ protected _debtPrice?: number;
44
44
  rebalance: PositionRebalanceHelper;
45
45
  maxLtvPriceType: PriceType;
46
46
  constructor(args: PositionExArgs);
@@ -69,10 +69,10 @@ export declare abstract class SolautoPositionEx {
69
69
  netWorthUsd(priceType?: PriceType): number;
70
70
  get totalSupply(): number;
71
71
  supplyUsd(priceType?: PriceType): number;
72
- protected supplyPrice(priceType?: PriceType): number | undefined;
72
+ supplyPrice(priceType?: PriceType): number | undefined;
73
73
  get totalDebt(): number;
74
74
  debtUsd(priceType?: PriceType): number;
75
- protected debtPrice(priceType?: PriceType): number | undefined;
75
+ debtPrice(priceType?: PriceType): number | undefined;
76
76
  get supplyLiquidityDepositable(): number;
77
77
  get supplyLiquidityUsdDepositable(): number;
78
78
  get supplyLiquidityUsdAvailable(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"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"}
@@ -182,7 +182,7 @@ class SolautoPositionEx {
182
182
  const netWorthUsd = this.supplyUsd() - this.debtUsd();
183
183
  this._data.state.netWorth.baseAmountUsdValue =
184
184
  (0, utils_1.toRoundedUsdValue)(netWorthUsd);
185
- this._data.state.netWorth.baseUnit = (0, utils_1.toBaseUnit)(netWorthUsd / (supplyPrice ?? (0, utils_1.safeGetPrice)(this.supplyMint) ?? 0), this.supplyMintInfo.decimals);
185
+ this._data.state.netWorth.baseUnit = (0, utils_1.toBaseUnit)(netWorthUsd / (supplyPrice ?? this.supplyPrice()), this.supplyMintInfo.decimals);
186
186
  }
187
187
  updateLiqUtilizationRate(supplyUsd, debtUsd, priceType) {
188
188
  this._data.state.liqUtilizationRateBps = (0, utils_1.getLiqUtilzationRateBps)(supplyUsd ?? this.supplyUsd(priceType), debtUsd ?? this.debtUsd(priceType), this.state.liqThresholdBps);
@@ -1,14 +1,17 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
2
  import { PublicKey as UmiPublicKey } from "@metaplex-foundation/umi";
3
3
  import { PriceType } from "../generated";
4
+ import { PriceBias } from "../marginfi-sdk";
4
5
  interface PriceResult {
5
6
  realtimePrice: number;
7
+ confInterval?: number;
6
8
  emaPrice?: number;
9
+ emaConfInterval?: number;
7
10
  }
8
- export declare function fetchTokenPrices(mints: PublicKey[], priceType?: PriceType): Promise<number[]>;
11
+ export declare function fetchTokenPrices(mints: PublicKey[], priceType?: PriceType, priceBias?: PriceBias): Promise<number[]>;
9
12
  export declare function getPythPrices(mints: PublicKey[]): Promise<Record<string, PriceResult>>;
10
13
  export declare function getSwitchboardPrices(mints: PublicKey[]): Promise<Record<string, PriceResult>>;
11
14
  export declare function getJupTokenPrices(mints: PublicKey[]): Promise<Record<string, PriceResult>>;
12
- export declare function safeGetPrice(mint: PublicKey | UmiPublicKey | string | undefined, priceType?: PriceType): number | undefined;
15
+ export declare function safeGetPrice(mint: PublicKey | UmiPublicKey | string | undefined, priceType?: PriceType, priceBias?: PriceBias): number | undefined;
13
16
  export {};
14
17
  //# sourceMappingURL=priceUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAerE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAAE,EAClB,SAAS,GAAE,SAA8B,GACxC,OAAO,CAAC,MAAM,EAAE,CAAC,CAkDnB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAkDtC;AAkBD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CA+CtC;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAiBtC;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,EACnD,SAAS,GAAE,SAA8B,GACxC,MAAM,GAAG,SAAS,CAQpB"}
1
+ {"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAerE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAAE,EAClB,SAAS,GAAE,SAA8B,EACzC,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CA0CnB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAoDtC;AAkBD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CA+CtC;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAiBtC;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,EACnD,SAAS,GAAE,SAA8B,EACzC,SAAS,CAAC,EAAE,SAAS,GACpB,MAAM,GAAG,SAAS,CAsBpB"}
@@ -35,7 +35,8 @@ const numberUtils_1 = require("./numberUtils");
35
35
  const generalUtils_1 = require("./generalUtils");
36
36
  const jupiterUtils_1 = require("./jupiterUtils");
37
37
  const generated_1 = require("../generated");
38
- async function fetchTokenPrices(mints, priceType = generated_1.PriceType.Realtime) {
38
+ const marginfi_sdk_1 = require("../marginfi-sdk");
39
+ async function fetchTokenPrices(mints, priceType = generated_1.PriceType.Realtime, priceBias) {
39
40
  const currentTime = (0, generalUtils_1.currentUnixSeconds)();
40
41
  const mintStrs = mints.map((x) => x.toString());
41
42
  const cachedPrices = Object.fromEntries(Object.entries(constants_1.PRICES).filter(([mint, price]) => mintStrs.includes(mint) && currentTime - price.time <= 3));
@@ -51,24 +52,17 @@ async function fetchTokenPrices(mints, priceType = generated_1.PriceType.Realtim
51
52
  getJupTokenPrices(otherMints),
52
53
  ])));
53
54
  for (const mint of newMints) {
54
- const realtimePrice = newPrices[mint.toString()].realtimePrice;
55
+ const data = newPrices[mint.toString()];
56
+ const realtimePrice = data.realtimePrice;
55
57
  constants_1.PRICES[mint.toString()] = {
56
58
  realtimePrice,
57
- emaPrice: newPrices[mint.toString()].emaPrice ?? realtimePrice,
59
+ confInterval: data.confInterval ?? 0,
60
+ emaPrice: data.emaPrice ?? realtimePrice,
61
+ emaConfInterval: data.emaConfInterval ?? 0,
58
62
  time: (0, generalUtils_1.currentUnixSeconds)(),
59
63
  };
60
64
  }
61
- const prices = {
62
- ...constants_1.PRICES,
63
- ...newPrices,
64
- };
65
- return mints.map((x) => {
66
- const priceResult = prices[x.toString()];
67
- const realtimePrice = priceResult.realtimePrice;
68
- return priceType === generated_1.PriceType.Ema
69
- ? (priceResult.emaPrice ?? realtimePrice)
70
- : realtimePrice;
71
- });
65
+ return mints.map((x) => safeGetPrice(x, priceType, priceBias));
72
66
  }
73
67
  async function getPythPrices(mints) {
74
68
  if (mints.length === 0) {
@@ -76,7 +70,7 @@ async function getPythPrices(mints) {
76
70
  }
77
71
  const priceFeedIds = mints.map((mint) => constants_1.PYTH_PRICE_FEED_IDS[mint.toString()]);
78
72
  const getReq = async () => await fetch(`https://hermes.pyth.network/v2/updates/price/latest?${priceFeedIds.map((x) => `ids%5B%5D=${x}`).join("&")}`);
79
- const derivePrice = (price, exponent) => {
73
+ const deriveValue = (price, exponent) => {
80
74
  if (exponent > 0) {
81
75
  return Number((0, numberUtils_1.toBaseUnit)(Number(price), exponent));
82
76
  }
@@ -96,8 +90,10 @@ async function getPythPrices(mints) {
96
90
  const json = await resp.json();
97
91
  const prices = json.parsed.map((x) => {
98
92
  return {
99
- realtimePrice: derivePrice(x.price.price, x.price.expo),
100
- emaPrice: derivePrice(x.ema_price.price, x.ema_price.expo),
93
+ realtimePrice: deriveValue(x.price.price, x.price.expo),
94
+ confInterval: deriveValue(x.price.conf, x.price.expo),
95
+ emaPrice: deriveValue(x.ema_price.price, x.ema_price.expo),
96
+ emaConfInterval: deriveValue(x.ema_price.conf, x.ema_price.expo),
101
97
  };
102
98
  });
103
99
  return prices;
@@ -160,12 +156,23 @@ async function getJupTokenPrices(mints) {
160
156
  ]));
161
157
  return prices;
162
158
  }
163
- function safeGetPrice(mint, priceType = generated_1.PriceType.Realtime) {
159
+ function safeGetPrice(mint, priceType = generated_1.PriceType.Realtime, priceBias) {
164
160
  if (mint && mint?.toString() in constants_1.PRICES) {
165
161
  const priceData = constants_1.PRICES[mint.toString()];
166
- return priceType === generated_1.PriceType.Ema
162
+ let price = priceType === generated_1.PriceType.Ema
167
163
  ? priceData.emaPrice
168
164
  : priceData.realtimePrice;
165
+ if (priceBias !== undefined) {
166
+ const confInterval = priceType === generated_1.PriceType.Ema ? priceData.confInterval : priceData.emaConfInterval;
167
+ const conf = Math.min(confInterval * 1.96, price * 0.05);
168
+ if (priceBias === marginfi_sdk_1.PriceBias.Low) {
169
+ price = price - conf;
170
+ }
171
+ else {
172
+ price = price + conf;
173
+ }
174
+ }
175
+ return price;
169
176
  }
170
177
  return undefined;
171
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"switchboardUtils.d.ts","sourceRoot":"","sources":["../../src/utils/switchboardUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAsB,MAAM,0BAA0B,CAAC;AAGtE,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAC;AAIvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAOjD,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,SAAS,qBAuBnB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAkC5C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAuB/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,WAEzD"}
1
+ {"version":3,"file":"switchboardUtils.d.ts","sourceRoot":"","sources":["../../src/utils/switchboardUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAsB,MAAM,0BAA0B,CAAC;AAGtE,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAC;AAIvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAOjD,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,SAAS,qBAuBnB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAoC5C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAuB/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,WAEzD"}
@@ -68,7 +68,9 @@ async function buildSwbSubmitResponseTx(conn, signer, mint) {
68
68
  const price = responses[0].value.toNumber();
69
69
  constants_1.PRICES[mint.toString()] = {
70
70
  realtimePrice: price,
71
+ confInterval: price, // TODO: do we need to change if marginfi fixes their stuff?
71
72
  emaPrice: price,
73
+ emaConfInterval: 0,
72
74
  time: (0, generalUtils_1.currentUnixSeconds)(),
73
75
  };
74
76
  return {
@@ -1,22 +1,16 @@
1
1
  import { Keypair, PublicKey } from "@solana/web3.js";
2
- import { createSignerFromKeypair, publicKey } from "@metaplex-foundation/umi";
2
+ import { createSignerFromKeypair } from "@metaplex-foundation/umi";
3
3
  import { fromWeb3JsKeypair } from "@metaplex-foundation/umi-web3js-adapters";
4
4
  import {
5
- bytesToI80F48,
6
5
  ClientTransactionsManager,
7
6
  consoleLog,
8
- fetchBank,
9
- fetchMarginfiAccount,
10
7
  getBatches,
11
8
  getClient,
12
- getLiqUtilzationRateBps,
13
- getMaxLiqUtilizationRateBps,
14
9
  getPositionExBulk,
15
10
  getSolanaRpcConnection,
16
11
  getSolautoManagedPositions,
17
12
  LendingPlatform,
18
13
  LOCAL_IRONFORGE_API_URL,
19
- marginfiAccountEmpty,
20
14
  PriceType,
21
15
  PriorityFeeSetting,
22
16
  ProgramEnv,
@@ -29,7 +23,7 @@ import {
29
23
  import { getSecretKey } from "./shared";
30
24
 
31
25
  const payForTransaction = false;
32
- const testProgram = false;
26
+ const testProgram = true;
33
27
  const lpEnv: ProgramEnv = "Prod";
34
28
 
35
29
  let [, umi] = getSolanaRpcConnection(
@@ -53,8 +47,8 @@ export async function main() {
53
47
  });
54
48
 
55
49
  await client.initializeExistingSolautoPosition({
56
- positionId: 1,
57
- authority: new PublicKey("R8Nnj1UqK1BRPnfJYj7MvfPUK3GmEzmgh1CwFFtUNsF"),
50
+ positionId: 2,
51
+ authority: new PublicKey("rC5dMP5dmSsfQ66rynzfFzuc122Eex9h1RJHVDkeH6D"),
58
52
  // lpUserAccount: new PublicKey(
59
53
  // "GEokw9jqbh6d1xUNA3qaeYFFetbSR5Y1nt7C3chwwgSz"
60
54
  // ),
@@ -66,7 +60,7 @@ export async function main() {
66
60
  txHandler: client,
67
61
  txRunType: payForTransaction ? "normal" : "only-simulate",
68
62
  priorityFeeSetting: PriorityFeeSetting.Default,
69
- retryConfig: { totalRetries: 1 },
63
+ retryConfig: { totalRetries: 5 },
70
64
  });
71
65
  const statuses = await txManager.send(transactionItems);
72
66
  consoleLog(statuses);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.694",
3
+ "version": "1.0.696",
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",
@@ -29,7 +29,14 @@ export const OFFSET_FROM_MAX_LTV = 0.005;
29
29
 
30
30
  export const REFERRER_PERCENTAGE = 0.15;
31
31
 
32
- export const PRICES: { [key: string]: { realtimePrice: number; emaPrice: number; time: number } } = {};
32
+ interface PriceCache {
33
+ realtimePrice: number;
34
+ confInterval: number;
35
+ emaPrice: number;
36
+ emaConfInterval: number;
37
+ time: number;
38
+ }
39
+ export const PRICES: { [key: string]: PriceCache } = {};
33
40
 
34
41
  export const CHORES_TX_NAME = "account chores";
35
42
 
@@ -57,4 +64,4 @@ export const STANDARD_LUT_ACCOUNTS = [
57
64
  SYSVAR_RENT_PUBKEY,
58
65
  SYSVAR_INSTRUCTIONS_PUBKEY,
59
66
  JUPITER_PROGRAM_ID,
60
- ].map((x) => x.toString());
67
+ ].map((x) => x.toString());
@@ -9,7 +9,6 @@ import {
9
9
  consoleLog,
10
10
  fromBaseUnit,
11
11
  getLiqUtilzationRateBps,
12
- safeGetPrice,
13
12
  toBaseUnit,
14
13
  tokenInfo,
15
14
  } from "../../utils";
@@ -39,17 +38,45 @@ export class RebalanceSwapManager {
39
38
  return Math.abs(this.values.debtAdjustmentUsd);
40
39
  }
41
40
 
41
+ private swapDetails() {
42
+ const input = this.isBoost()
43
+ ? this.client.pos.state.debt
44
+ : this.client.pos.state.supply;
45
+ const output = this.isBoost()
46
+ ? this.client.pos.state.supply
47
+ : this.client.pos.state.debt;
48
+
49
+ const supplyPrice = this.client.pos.supplyPrice(this.priceType)!;
50
+ const debtPrice = this.client.pos.debtPrice(this.priceType)!;
51
+ const inputPrice = this.isBoost() ? debtPrice : supplyPrice;
52
+ const outputPrice = this.isBoost() ? supplyPrice : debtPrice;
53
+
54
+ let inputAmount = toBaseUnit(
55
+ this.usdToSwap() / inputPrice!,
56
+ input.decimals
57
+ );
58
+
59
+ return {
60
+ inputAmount,
61
+ input,
62
+ inputPrice,
63
+ output,
64
+ outputPrice,
65
+ };
66
+ }
67
+
42
68
  private postRebalanceLiqUtilizationRateBps(swapOutputAmount?: bigint) {
43
69
  let supplyUsd = this.client.pos.supplyUsd(this.priceType);
44
- // TODO: add token balance change
45
70
  let debtUsd = this.client.pos.debtUsd(this.priceType);
71
+ // TODO: add token balance change
72
+
73
+ const { output, outputPrice } = this.swapDetails();
46
74
 
47
- const outputToken = this.isBoost()
48
- ? this.client.pos.supplyMint
49
- : this.client.pos.debtMint;
50
75
  const swapOutputUsd = swapOutputAmount
51
- ? fromBaseUnit(swapOutputAmount, tokenInfo(outputToken).decimals) *
52
- (safeGetPrice(outputToken, this.priceType) ?? 0)
76
+ ? fromBaseUnit(
77
+ swapOutputAmount,
78
+ tokenInfo(toWeb3JsPublicKey(output.mint)).decimals
79
+ ) * outputPrice
53
80
  : this.usdToSwap();
54
81
 
55
82
  supplyUsd = this.isBoost()
@@ -102,33 +129,13 @@ export class RebalanceSwapManager {
102
129
  return swapQuote!;
103
130
  }
104
131
 
105
- private swapDetails() {
106
- const input = this.isBoost()
107
- ? this.client.pos.state.debt
108
- : this.client.pos.state.supply;
109
- const output = this.isBoost()
110
- ? this.client.pos.state.supply
111
- : this.client.pos.state.debt;
112
-
113
- let inputAmount = toBaseUnit(
114
- this.usdToSwap() / safeGetPrice(input.mint, this.priceType)!,
115
- input.decimals
116
- );
117
-
118
- return {
119
- input,
120
- output,
121
- inputAmount,
122
- };
123
- }
124
-
125
132
  private bigIntWithIncrement(num: bigint, inc: number) {
126
133
  return num + BigInt(Math.round(Number(num) * inc));
127
134
  }
128
135
 
129
136
  async setSwapParams(attemptNum: number) {
130
137
  const rebalanceToZero = this.targetLiqUtilizationRateBps === 0;
131
- let { input, output, inputAmount } = this.swapDetails();
138
+ let { input, output, outputPrice, inputAmount } = this.swapDetails();
132
139
 
133
140
  let outputAmount = rebalanceToZero
134
141
  ? output.amountUsed.baseUnit +
@@ -139,10 +146,7 @@ export class RebalanceSwapManager {
139
146
  0.0001
140
147
  )
141
148
  )
142
- : toBaseUnit(
143
- this.usdToSwap() / safeGetPrice(output.mint, this.priceType)!,
144
- output.decimals
145
- );
149
+ : toBaseUnit(this.usdToSwap() / outputPrice, output.decimals);
146
150
 
147
151
  const flashLoanRepayFromDebt =
148
152
  !this.isBoost() &&
@@ -8,7 +8,6 @@ import {
8
8
  TransactionItemInputs,
9
9
  } from "../../types";
10
10
  import {
11
- bytesToI80F48,
12
11
  consoleLog,
13
12
  fromBaseUnit,
14
13
  fromBps,
@@ -16,7 +15,6 @@ import {
16
15
  getTokenAccount,
17
16
  hasFirstRebalance,
18
17
  hasLastRebalance,
19
- isMarginfiPosition,
20
18
  safeGetPrice,
21
19
  tokenInfo,
22
20
  } from "../../utils";
@@ -344,15 +342,9 @@ export class RebalanceTxBuilder {
344
342
  consoleLog("Rebalance details:", rebalanceDetails);
345
343
  consoleLog(
346
344
  "Prices:",
347
- safeGetPrice(this.client.pos.supplyMint, this.priceType),
348
- safeGetPrice(this.client.pos.debtMint, this.priceType)
345
+ this.client.pos.supplyPrice(this.priceType),
346
+ this.client.pos.debtPrice(this.priceType)
349
347
  );
350
- // TODO: remove me
351
- if (isMarginfiPosition(this.client.pos)) {
352
- const weightedAssets = this.values.endResult.supplyUsd * bytesToI80F48(this.client.pos.supplyBank!.config.assetWeightInit.value);
353
- const weightedLiabs = this.values.endResult.debtUsd * bytesToI80F48(this.client.pos.debtBank!.config.liabilityWeightInit.value);
354
- consoleLog("Weighted assets & liabs:", weightedAssets, weightedLiabs);
355
- }
356
348
 
357
349
  const firstRebalance = this.client.rebalanceIx(
358
350
  RebalanceStep.PreSwap,
@@ -1,5 +1,5 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
- import { Bank, safeFetchAllBank } from "../marginfi-sdk";
2
+ import { Bank, PriceBias, safeFetchAllBank } from "../marginfi-sdk";
3
3
  import { publicKey } from "@metaplex-foundation/umi";
4
4
  import {
5
5
  calcMarginfiMaxLtvAndLiqThresholdBps,
@@ -21,8 +21,16 @@ export class MarginfiSolautoPositionEx extends SolautoPositionEx {
21
21
  lendingPlatform = LendingPlatform.Marginfi;
22
22
  maxLtvPriceType = PriceType.Ema;
23
23
 
24
- public supplyBank: Bank | null = null;
25
- public debtBank: Bank | null = null;
24
+ private supplyBank: Bank | null = null;
25
+ private debtBank: Bank | null = null;
26
+
27
+ supplyPrice(priceType?: PriceType): number | undefined {
28
+ return this._supplyPrice ?? safeGetPrice(this.supplyMint, priceType, PriceBias.Low);
29
+ }
30
+
31
+ debtPrice(priceType?: PriceType): number | undefined {
32
+ return this._debtPrice ?? safeGetPrice(this.debtMint, priceType, PriceBias.High);
33
+ }
26
34
 
27
35
  private getBankAccounts(mint: PublicKey) {
28
36
  const group = this.lpPoolAccount.toString();
@@ -87,8 +87,8 @@ export abstract class SolautoPositionEx {
87
87
 
88
88
  private readonly firstState!: PositionState;
89
89
 
90
- private _supplyPrice?: number;
91
- private _debtPrice?: number;
90
+ protected _supplyPrice?: number;
91
+ protected _debtPrice?: number;
92
92
 
93
93
  public rebalance!: PositionRebalanceHelper;
94
94
  public maxLtvPriceType!: PriceType;
@@ -236,7 +236,7 @@ export abstract class SolautoPositionEx {
236
236
  : calcSupplyUsd(this.state);
237
237
  }
238
238
 
239
- protected supplyPrice(priceType?: PriceType) {
239
+ supplyPrice(priceType?: PriceType) {
240
240
  return this._supplyPrice ?? safeGetPrice(this.supplyMint, priceType);
241
241
  }
242
242
 
@@ -251,7 +251,7 @@ export abstract class SolautoPositionEx {
251
251
  : calcDebtUsd(this.state);
252
252
  }
253
253
 
254
- protected debtPrice(priceType?: PriceType) {
254
+ debtPrice(priceType?: PriceType) {
255
255
  return this._debtPrice ?? safeGetPrice(this.debtMint, priceType);
256
256
  }
257
257
 
@@ -364,7 +364,7 @@ export abstract class SolautoPositionEx {
364
364
  this._data.state.netWorth.baseAmountUsdValue =
365
365
  toRoundedUsdValue(netWorthUsd);
366
366
  this._data.state.netWorth.baseUnit = toBaseUnit(
367
- netWorthUsd / (supplyPrice ?? safeGetPrice(this.supplyMint) ?? 0),
367
+ netWorthUsd / (supplyPrice ?? this.supplyPrice()!),
368
368
  this.supplyMintInfo.decimals
369
369
  );
370
370
  }
@@ -15,15 +15,19 @@ import {
15
15
  } from "./generalUtils";
16
16
  import { getJupPriceData } from "./jupiterUtils";
17
17
  import { PriceType } from "../generated";
18
+ import { PriceBias } from "../marginfi-sdk";
18
19
 
19
20
  interface PriceResult {
20
21
  realtimePrice: number;
22
+ confInterval?: number;
21
23
  emaPrice?: number;
24
+ emaConfInterval?: number;
22
25
  }
23
26
 
24
27
  export async function fetchTokenPrices(
25
28
  mints: PublicKey[],
26
- priceType: PriceType = PriceType.Realtime
29
+ priceType: PriceType = PriceType.Realtime,
30
+ priceBias?: PriceBias
27
31
  ): Promise<number[]> {
28
32
  const currentTime = currentUnixSeconds();
29
33
  const mintStrs = mints.map((x) => x.toString());
@@ -54,26 +58,18 @@ export async function fetchTokenPrices(
54
58
  );
55
59
 
56
60
  for (const mint of newMints) {
57
- const realtimePrice = newPrices[mint.toString()].realtimePrice;
61
+ const data = newPrices[mint.toString()];
62
+ const realtimePrice = data.realtimePrice;
58
63
  PRICES[mint.toString()] = {
59
64
  realtimePrice,
60
- emaPrice: newPrices[mint.toString()].emaPrice ?? realtimePrice,
65
+ confInterval: data.confInterval ?? 0,
66
+ emaPrice: data.emaPrice ?? realtimePrice,
67
+ emaConfInterval: data.emaConfInterval ?? 0,
61
68
  time: currentUnixSeconds(),
62
69
  };
63
70
  }
64
71
 
65
- const prices: Record<string, PriceResult> = {
66
- ...PRICES,
67
- ...newPrices,
68
- };
69
-
70
- return mints.map((x) => {
71
- const priceResult = prices[x.toString()];
72
- const realtimePrice = priceResult.realtimePrice;
73
- return priceType === PriceType.Ema
74
- ? (priceResult.emaPrice ?? realtimePrice)
75
- : realtimePrice;
76
- });
72
+ return mints.map((x) => safeGetPrice(x, priceType, priceBias)!);
77
73
  }
78
74
 
79
75
  export async function getPythPrices(
@@ -92,7 +88,7 @@ export async function getPythPrices(
92
88
  `https://hermes.pyth.network/v2/updates/price/latest?${priceFeedIds.map((x) => `ids%5B%5D=${x}`).join("&")}`
93
89
  );
94
90
 
95
- const derivePrice = (price: number, exponent: number) => {
91
+ const deriveValue = (price: number, exponent: number) => {
96
92
  if (exponent > 0) {
97
93
  return Number(toBaseUnit(Number(price), exponent));
98
94
  } else if (exponent < 0) {
@@ -113,8 +109,10 @@ export async function getPythPrices(
113
109
  const json = await resp.json();
114
110
  const prices = json.parsed.map((x: any) => {
115
111
  return {
116
- realtimePrice: derivePrice(x.price.price, x.price.expo),
117
- emaPrice: derivePrice(x.ema_price.price, x.ema_price.expo),
112
+ realtimePrice: deriveValue(x.price.price, x.price.expo),
113
+ confInterval: deriveValue(x.price.conf, x.price.expo),
114
+ emaPrice: deriveValue(x.ema_price.price, x.ema_price.expo),
115
+ emaConfInterval: deriveValue(x.ema_price.conf, x.ema_price.expo),
118
116
  };
119
117
  });
120
118
 
@@ -220,13 +218,28 @@ export async function getJupTokenPrices(
220
218
 
221
219
  export function safeGetPrice(
222
220
  mint: PublicKey | UmiPublicKey | string | undefined,
223
- priceType: PriceType = PriceType.Realtime
221
+ priceType: PriceType = PriceType.Realtime,
222
+ priceBias?: PriceBias
224
223
  ): number | undefined {
225
224
  if (mint && mint?.toString() in PRICES) {
226
225
  const priceData = PRICES[mint!.toString()];
227
- return priceType === PriceType.Ema
228
- ? priceData.emaPrice
229
- : priceData.realtimePrice;
226
+ let price =
227
+ priceType === PriceType.Ema
228
+ ? priceData.emaPrice
229
+ : priceData.realtimePrice;
230
+
231
+ if (priceBias !== undefined) {
232
+ const confInterval = priceType === PriceType.Ema ? priceData.confInterval : priceData.emaConfInterval;
233
+ const conf = Math.min(confInterval * 1.96, price * 0.05);
234
+
235
+ if (priceBias === PriceBias.Low) {
236
+ price = price - conf;
237
+ } else {
238
+ price = price + conf;
239
+ }
240
+ }
241
+
242
+ return price;
230
243
  }
231
244
  return undefined;
232
245
  }
@@ -74,7 +74,9 @@ export async function buildSwbSubmitResponseTx(
74
74
  const price = (responses[0].value as Big).toNumber();
75
75
  PRICES[mint.toString()] = {
76
76
  realtimePrice: price,
77
+ confInterval: price, // TODO: do we need to change if marginfi fixes their stuff?
77
78
  emaPrice: price,
79
+ emaConfInterval: 0,
78
80
  time: currentUnixSeconds(),
79
81
  };
80
82