@haven-fi/solauto-sdk 1.0.761 → 1.0.763

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.
Files changed (35) hide show
  1. package/dist/services/flashLoans/marginfiFlProvider.d.ts.map +1 -1
  2. package/dist/services/flashLoans/marginfiFlProvider.js +1 -1
  3. package/dist/services/rebalance/rebalanceSwapManager.d.ts.map +1 -1
  4. package/dist/services/rebalance/rebalanceSwapManager.js +0 -13
  5. package/dist/services/rebalance/rebalanceTxBuilder.js +1 -1
  6. package/dist/services/rebalance/solautoFees.d.ts.map +1 -1
  7. package/dist/services/rebalance/solautoFees.js +6 -1
  8. package/dist/services/solauto/solautoMarginfiClient.d.ts +1 -1
  9. package/dist/services/solauto/solautoMarginfiClient.d.ts.map +1 -1
  10. package/dist/services/solauto/solautoMarginfiClient.js +12 -3
  11. package/dist/solautoPosition/marginfiSolautoPositionEx.js +1 -1
  12. package/dist/solautoPosition/positionUtils.js +1 -1
  13. package/dist/utils/generalUtils.d.ts.map +1 -1
  14. package/dist/utils/generalUtils.js +0 -2
  15. package/dist/utils/marginfi/general.d.ts +1 -0
  16. package/dist/utils/marginfi/general.d.ts.map +1 -1
  17. package/dist/utils/marginfi/general.js +7 -0
  18. package/dist/utils/numberUtils.d.ts +3 -0
  19. package/dist/utils/numberUtils.d.ts.map +1 -1
  20. package/dist/utils/numberUtils.js +16 -0
  21. package/local/.env +1 -1
  22. package/local/txSandbox.ts +18 -71
  23. package/package.json +1 -1
  24. package/src/services/flashLoans/marginfiFlProvider.ts +2 -1
  25. package/src/services/rebalance/rebalanceSwapManager.ts +0 -14
  26. package/src/services/rebalance/rebalanceTxBuilder.ts +1 -1
  27. package/src/services/rebalance/solautoFees.ts +5 -1
  28. package/src/services/solauto/solautoMarginfiClient.ts +21 -4
  29. package/src/solautoPosition/marginfiSolautoPositionEx.ts +1 -1
  30. package/src/solautoPosition/positionUtils.ts +1 -1
  31. package/src/utils/generalUtils.ts +0 -7
  32. package/src/utils/marginfi/general.ts +13 -0
  33. package/src/utils/numberUtils.ts +31 -0
  34. package/tests/transactions/shared.ts +5 -2
  35. package/tests/transactions/solautoMarginfi.ts +7 -3
@@ -1 +1 @@
1
- {"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,uBAAuB,CAAQ;IAEvC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,uBAAuB,CAAiB;IAChD,OAAO,CAAC,qBAAqB,CAAiB;IAExC,UAAU;YAiBF,iBAAiB;YA6CjB,sBAAsB;IAsD9B,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyC3D,gBAAgB,IAAI,SAAS,EAAE;IAY/B,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS;IAI7C,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAc9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAoCrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;IAgD3D,YAAY,CACV,eAAe,EAAE,SAAS,EAC1B,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,SAAS;CAW3B"}
1
+ {"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAkBlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,uBAAuB,CAAQ;IAEvC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,uBAAuB,CAAiB;IAChD,OAAO,CAAC,qBAAqB,CAAiB;IAExC,UAAU;YAiBF,iBAAiB;YA6CjB,sBAAsB;IAsD9B,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyC3D,gBAAgB,IAAI,SAAS,EAAE;IAY/B,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS;IAI7C,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAc9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAoCrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;IAgD3D,YAAY,CACV,eAAe,EAAE,SAAS,EAC1B,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,SAAS;CAW3B"}
@@ -198,7 +198,7 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
198
198
  .add((0, marginfi_1.lendingAccountEndFlashloan)(this.umi, {
199
199
  marginfiAccount: (0, umi_1.publicKey)(iMfiAccount.accountPk),
200
200
  signer: this.signer,
201
- }).addRemainingAccounts(remainingAccounts));
201
+ }).addRemainingAccounts((0, utils_1.composeRemainingAccounts)(remainingAccounts)));
202
202
  }
203
203
  closeBalance(marginfiAccount, bank, marginfiGroup) {
204
204
  return (0, umi_1.transactionBuilder)().add((0, marginfi_1.lendingAccountCloseBalance)(this.umi, {
@@ -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,EAA0B,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAY3E,qBAAa,oBAAoB;IAS7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC;IAZb,UAAU,EAAG,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAU;gBAGrB,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;IAU/B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,kCAAkC;YAsE5B,mBAAmB;IA4CjC,OAAO,CAAC,mBAAmB;IAIrB,aAAa,CAAC,UAAU,EAAE,MAAM;IAuEhC,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,EAA0B,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAY3E,qBAAa,oBAAoB;IAS7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC;IAZb,UAAU,EAAG,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAU;gBAGrB,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;IAU/B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,kCAAkC;YAwD5B,mBAAmB;IA4CjC,OAAO,CAAC,mBAAmB;IAIrB,aAAa,CAAC,UAAU,EAAE,MAAM;IAuEhC,aAAa;;;;;;CAWpB"}
@@ -74,19 +74,6 @@ class RebalanceSwapManager {
74
74
  flashLoan: this.flRequirements?.flFeeBps ?? 0,
75
75
  lpBorrow: this.client.pos.state.debt.borrowFeeBps,
76
76
  });
77
- // if (isMarginfiPosition(this.client.pos)) {
78
- // console.log(res.newPos.supplyUsd, res.newPos.debtUsd);
79
- // console.log(
80
- // res.newPos.supplyUsd *
81
- // bytesToI80F48(
82
- // this.client.pos.supplyBank!.config.assetWeightInit.value
83
- // ),
84
- // res.newPos.debtUsd *
85
- // bytesToI80F48(
86
- // this.client.pos.debtBank!.config.liabilityWeightInit.value
87
- // )
88
- // );
89
- // }
90
77
  return (0, utils_1.getLiqUtilzationRateBps)(res.newPos.supplyUsd, res.newPos.debtUsd, this.client.pos.state.liqThresholdBps ?? 0);
91
78
  }
92
79
  async findSufficientQuote(swapInput, criteria) {
@@ -18,7 +18,7 @@ class RebalanceTxBuilder {
18
18
  this.priceType = generated_1.PriceType.Realtime;
19
19
  }
20
20
  shouldProceedWithRebalance() {
21
- if (this.client.pos.selfManaged && !this.targetLiqUtilizationRateBps) {
21
+ if (this.client.pos.selfManaged && this.targetLiqUtilizationRateBps === undefined) {
22
22
  throw new Error("A target rate must be provided for self managed position rebalances");
23
23
  }
24
24
  return (this.client.pos.supplyUsd() > 0 &&
@@ -1 +1 @@
1
- {"version":3,"file":"solautoFees.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/solautoFees.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,qBAAa,cAAc;IAEvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,2BAA2B;IACnC,OAAO,CAAC,mBAAmB;gBAFnB,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,mBAAmB,EAAE,MAAM;IAGrC,MAAM,CAAC,MAAM,CACX,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,WAAW,EAAE,MAAM;IASrB,iBAAiB,CAAC,kBAAkB,EAAE,kBAAkB;;;;;CAqCzD"}
1
+ {"version":3,"file":"solautoFees.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/solautoFees.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,qBAAa,cAAc;IAEvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,2BAA2B;IACnC,OAAO,CAAC,mBAAmB;gBAFnB,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,mBAAmB,EAAE,MAAM;IAGrC,MAAM,CAAC,MAAM,CACX,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,WAAW,EAAE,MAAM;IASrB,iBAAiB,CAAC,kBAAkB,EAAE,kBAAkB;;;;;CAyCzD"}
@@ -20,7 +20,12 @@ class SolautoFeesBps {
20
20
  const k = 1.5;
21
21
  let feeBps = 0;
22
22
  if (this.targetLiqUtilizationRateBps !== undefined) {
23
- feeBps = 10;
23
+ if (this.targetLiqUtilizationRateBps === 0) {
24
+ feeBps = 15;
25
+ }
26
+ else {
27
+ feeBps = 10;
28
+ }
24
29
  }
25
30
  else if (rebalanceDirection === generated_1.RebalanceDirection.Repay) {
26
31
  feeBps = 25;
@@ -9,7 +9,7 @@ export declare class SolautoMarginfiClient extends SolautoClient {
9
9
  mfiAccounts: MarginfiProgramAccounts;
10
10
  marginfiAccount: PublicKey | Signer;
11
11
  marginfiAccountPk: PublicKey;
12
- healthCheckRemainingAccounts?: AccountMeta[];
12
+ healthCheckRemainingAccounts: AccountMeta[];
13
13
  marginfiGroup: PublicKey;
14
14
  marginfiSupplyAccounts: MarginfiAssetAccounts;
15
15
  marginfiDebtAccounts: MarginfiAssetAccounts;
@@ -1 +1 @@
1
- {"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,EAIlB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAuB,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EAEf,SAAS,EAET,aAAa,EACb,iBAAiB,EAEjB,gCAAgC,EAOjC,MAAM,iBAAiB,CAAC;AAmBzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMnE,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,kBAA4B;IAE3C,WAAW,EAAG,uBAAuB,CAAC;IAEtC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,4BAA4B,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7C,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAE7B,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA6ExC,mBAAmB,IAAI,MAAM,EAAE;IAO/B,gBAAgB,IAAI,SAAS,EAAE;IAI/B,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB;IAStE,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA0C9B,eAAe,IAAI,kBAAkB;IAYrC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,kBAAkB;IAepD,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUlE,OAAO,CAAC,6BAA6B;IAkFrC,OAAO,CAAC,oCAAoC;IA0D5C,WAAW,CACT,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CA4EtB"}
1
+ {"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,EAIlB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAuB,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EAEf,SAAS,EAET,aAAa,EACb,iBAAiB,EAEjB,gCAAgC,EAOjC,MAAM,iBAAiB,CAAC;AAoBzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMnE,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,kBAA4B;IAE3C,WAAW,EAAG,uBAAuB,CAAC;IAEtC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,4BAA4B,EAAG,WAAW,EAAE,CAAC;IAC7C,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAE7B,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA8ExC,mBAAmB,IAAI,MAAM,EAAE;IAO/B,gBAAgB,IAAI,SAAS,EAAE;IAI/B,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB;IAStE,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA0C9B,eAAe,IAAI,kBAAkB;IAYrC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,kBAAkB;IAepD,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUlE,OAAO,CAAC,6BAA6B;IAiGrC,OAAO,CAAC,oCAAoC;IA0D5C,WAAW,CACT,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CA4EtB"}
@@ -21,6 +21,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
21
21
  await super.initialize(args);
22
22
  this.mfiAccounts = (0, constants_1.getMarginfiAccounts)(this.lpEnv);
23
23
  this.marginfiGroup = this.pos.lpPoolAccount;
24
+ this.healthCheckRemainingAccounts = [];
24
25
  if (this.pos.selfManaged) {
25
26
  this.marginfiAccount =
26
27
  args.lpUserAccount ??
@@ -155,6 +156,14 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
155
156
  marginfiProtocolInteractionIx(args) {
156
157
  switch (args.__kind) {
157
158
  case "Deposit": {
159
+ if (!this.healthCheckRemainingAccounts
160
+ .map((x) => x.pubkey.toString())
161
+ .includes(this.marginfiSupplyAccounts.bank)) {
162
+ this.healthCheckRemainingAccounts.push(...[
163
+ (0, utils_1.getAccountMeta)(new web3_js_1.PublicKey(this.marginfiSupplyAccounts.bank)),
164
+ (0, utils_1.getAccountMeta)(this.supplyPriceOracle),
165
+ ]);
166
+ }
158
167
  return (0, marginfi_1.lendingAccountDeposit)(this.umi, {
159
168
  signer: this.signer,
160
169
  signerTokenAccount: (0, umi_1.publicKey)(this.signerSupplyTa),
@@ -167,7 +176,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
167
176
  });
168
177
  }
169
178
  case "Borrow": {
170
- const remainingAccounts = this.healthCheckRemainingAccounts ?? [];
179
+ const remainingAccounts = this.healthCheckRemainingAccounts;
171
180
  if (!remainingAccounts.find((x) => x.pubkey.toString() === this.marginfiDebtAccounts.bank.toString())) {
172
181
  remainingAccounts.push(...[
173
182
  (0, utils_1.getAccountMeta)(new web3_js_1.PublicKey(this.marginfiDebtAccounts.bank)),
@@ -183,7 +192,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
183
192
  bank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
184
193
  bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault),
185
194
  bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiDebtAccounts.vaultAuthority),
186
- }).addRemainingAccounts(remainingAccounts);
195
+ }).addRemainingAccounts((0, utils_1.composeRemainingAccounts)(remainingAccounts));
187
196
  }
188
197
  case "Repay": {
189
198
  return (0, marginfi_1.lendingAccountRepay)(this.umi, {
@@ -208,7 +217,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
208
217
  bank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
209
218
  bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault),
210
219
  bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority),
211
- }).addRemainingAccounts(this.healthCheckRemainingAccounts ?? []);
220
+ }).addRemainingAccounts((0, utils_1.composeRemainingAccounts)(this.healthCheckRemainingAccounts));
212
221
  }
213
222
  }
214
223
  }
@@ -79,7 +79,7 @@ class MarginfiSolautoPositionEx extends solautoPositionEx_1.SolautoPositionEx {
79
79
  get supplyUsdWithdrawable() {
80
80
  const deposits = (0, utils_1.fromBaseUnit)((0, utils_1.getBankLiquidityUsedBaseUnit)(this.supplyBank, true), this.supplyMintInfo.decimals);
81
81
  const borrows = (0, utils_1.fromBaseUnit)((0, utils_1.getBankLiquidityUsedBaseUnit)(this.supplyBank, false), this.supplyMintInfo.decimals);
82
- return Math.min((deposits - borrows), this.totalSupply) * this.supplyPrice();
82
+ return Math.min(deposits - borrows, this.totalSupply) * this.supplyPrice();
83
83
  }
84
84
  async refreshPositionState(priceType) {
85
85
  if (!this.canRefreshPositionState()) {
@@ -19,7 +19,7 @@ function createSolautoSettings(settings) {
19
19
  };
20
20
  }
21
21
  async function getPositionExBulk(umi, publicKeys) {
22
- const batches = (0, utils_1.getBatches)(publicKeys, 50);
22
+ const batches = (0, utils_1.getBatches)(publicKeys, 100);
23
23
  const data = (await Promise.all(batches.map(async (pubkeys) => {
24
24
  return (0, utils_1.retryWithExponentialBackoff)(async () => await (0, generated_1.safeFetchAllSolautoPosition)(umi, pubkeys.map((x) => (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(x))));
25
25
  }))).flat();
@@ -1 +1 @@
1
- {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAc,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AAED,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAErD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAW1D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,yBAQ/C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAMlE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAS1D;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CAqCZ;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,MAAM,GACZ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAUxB;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,gBAuBzE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAU5D;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,WAErE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,CAAC,EAAE,GACV,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAInB"}
1
+ {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAc,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AAED,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAErD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAW1D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,yBAQ/C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAMlE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAS1D;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,MAAM,GACZ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAUxB;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,gBAuBzE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAU5D;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,WAErE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,CAAC,EAAE,GACV,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAInB"}
@@ -116,8 +116,6 @@ function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToThrow
116
116
  .then(resolve)
117
117
  .catch((error) => {
118
118
  attemptNum++;
119
- console.log(error.name, error.message);
120
- console.log(errorsToThrow?.length, (errorsToThrow ?? []).some((errorType) => error instanceof errorType));
121
119
  if (errorsToThrow?.length &&
122
120
  errorsToThrow.some((errorType) => error instanceof errorType)) {
123
121
  reject(error);
@@ -23,5 +23,6 @@ export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetA
23
23
  export declare function getRemainingAccountsForMarginfiHealthCheck(umi: Umi, balance: Balance): Promise<AccountMeta[]>;
24
24
  export declare function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
25
25
  export declare function marginfiAccountEmpty(marginfiAccount: MarginfiAccount): boolean;
26
+ export declare function composeRemainingAccounts(accs: AccountMeta[]): AccountMeta[];
26
27
  export {};
27
28
  //# sourceMappingURL=general.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../../src/utils/marginfi/general.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAKhF,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAGL,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,OAAO,EACP,IAAI,EAIJ,eAAe,EAGhB,MAAM,6BAA6B,CAAC;AASrC,wBAAgB,4BAA4B,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CActE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,UAAU,OASxE;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,GAAG,EACR,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,SAAS,EAAE,CAAC,CAkCtB;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS;;;;;GAanE;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,sBAgBtC;AAED,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAyB1B;AAED,wBAAsB,0CAA0C,CAC9D,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAWxB;AAED,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,WASpE"}
1
+ {"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../../src/utils/marginfi/general.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAKhF,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAGL,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,OAAO,EACP,IAAI,EAIJ,eAAe,EAGhB,MAAM,6BAA6B,CAAC;AASrC,wBAAgB,4BAA4B,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CActE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,UAAU,OASxE;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,GAAG,EACR,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,SAAS,EAAE,CAAC,CAkCtB;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS;;;;;GAanE;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,sBAgBtC;AAED,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAyB1B;AAED,wBAAsB,0CAA0C,CAC9D,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAWxB;AAED,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,WASpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAW3E"}
@@ -9,6 +9,7 @@ exports.findMarginfiAccounts = findMarginfiAccounts;
9
9
  exports.getRemainingAccountsForMarginfiHealthCheck = getRemainingAccountsForMarginfiHealthCheck;
10
10
  exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
11
11
  exports.marginfiAccountEmpty = marginfiAccountEmpty;
12
+ exports.composeRemainingAccounts = composeRemainingAccounts;
12
13
  const web3_js_1 = require("@solana/web3.js");
13
14
  const umi_1 = require("@metaplex-foundation/umi");
14
15
  const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
@@ -144,3 +145,9 @@ function marginfiAccountEmpty(marginfiAccount) {
144
145
  ((0, numberUtils_1.bytesToI80F48)(x.assetShares.value) > 0.000001 ||
145
146
  (0, numberUtils_1.bytesToI80F48)(x.liabilityShares.value) > 0.000001)) === undefined);
146
147
  }
148
+ function composeRemainingAccounts(accs) {
149
+ const banksAndOracles = accs.reduce((acc, _, i) => i % 2 === 0 ? [...acc, [accs[i], accs[i + 1]]] : acc, []);
150
+ return banksAndOracles
151
+ .sort((a, b) => b[0].pubkey.toString().localeCompare(a[0].pubkey.toString()))
152
+ .flat();
153
+ }
@@ -1,6 +1,7 @@
1
1
  import { PublicKey } from "@solana/web3.js";
2
2
  import { PositionState } from "../generated";
3
3
  import { RoundAction } from "../types";
4
+ import { StrategyType } from "./stringUtils";
4
5
  export declare function calcNetWorthUsd(state?: PositionState): number;
5
6
  export declare function calcSupplyUsd(state?: PositionState): number;
6
7
  export declare function calcDebtUsd(state?: PositionState): number;
@@ -25,4 +26,6 @@ export declare function maxRepayFromBps(maxLtvBps: number, liqThresholdBps: numb
25
26
  export declare function maxRepayToBps(maxLtvBps: number, liqThresholdBps: number): number;
26
27
  export declare function maxBoostToBps(maxLtvBps: number, liqThresholdBps: number): number;
27
28
  export declare function realtimeUsdToEmaUsd(realtimeAmountUsd: number, mint: PublicKey): number;
29
+ export declare function boostSettingToLeverageFactor(supplyMint: PublicKey, debtMint: PublicKey, boostToBps: number, liqThresholdBps: number): number;
30
+ export declare function getLeverageFactor(strategyType: StrategyType, supplyUsd: number, debtUsd: number): number;
28
31
  //# sourceMappingURL=numberUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO5C,OAAO,EAAE,aAAa,EAAa,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,UAIhD;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,UAKjD;AAED,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAKpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAKlD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,aAAa,UAK3D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,aAAa,UAI9D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,CAAC,EAAE,aAAa,UAK/D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,UAEjD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,UAE/C;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,MAAM,CAMR;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,WAAqB,GACjC,MAAM,CAKR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAqB,GACjC,MAAM,CAGR;AAUD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBrD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAejE;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UASzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,SAAS,UAMhB"}
1
+ {"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO5C,OAAO,EAAE,aAAa,EAAa,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAG3D,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,UAIhD;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,UAKjD;AAED,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAKpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAKlD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,aAAa,UAK3D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,aAAa,UAI9D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,CAAC,EAAE,aAAa,UAK/D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,UAEjD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,UAE/C;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,MAAM,CAMR;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,WAAqB,GACjC,MAAM,CAKR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAqB,GACjC,MAAM,CAGR;AAUD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBrD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAejE;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UASzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,SAAS,UAMhB;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,UAUxB;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAOR"}
@@ -24,9 +24,13 @@ exports.maxRepayFromBps = maxRepayFromBps;
24
24
  exports.maxRepayToBps = maxRepayToBps;
25
25
  exports.maxBoostToBps = maxBoostToBps;
26
26
  exports.realtimeUsdToEmaUsd = realtimeUsdToEmaUsd;
27
+ exports.boostSettingToLeverageFactor = boostSettingToLeverageFactor;
28
+ exports.getLeverageFactor = getLeverageFactor;
27
29
  const constants_1 = require("../constants");
28
30
  const generated_1 = require("../generated");
29
31
  const priceUtils_1 = require("./priceUtils");
32
+ const stringUtils_1 = require("./stringUtils");
33
+ const services_1 = require("../services");
30
34
  function calcNetWorthUsd(state) {
31
35
  return fromRoundedUsdValue(state?.netWorth.baseAmountUsdValue ?? BigInt(0));
32
36
  }
@@ -138,3 +142,15 @@ function realtimeUsdToEmaUsd(realtimeAmountUsd, mint) {
138
142
  return ((realtimeAmountUsd / (0, priceUtils_1.safeGetPrice)(mint, generated_1.PriceType.Realtime)) *
139
143
  (0, priceUtils_1.safeGetPrice)(mint, generated_1.PriceType.Ema));
140
144
  }
145
+ function boostSettingToLeverageFactor(supplyMint, debtMint, boostToBps, liqThresholdBps) {
146
+ const strategy = (0, stringUtils_1.strategyType)(supplyMint, debtMint);
147
+ const supplyUsd = 100;
148
+ const debtUsd = (0, services_1.getDebtAdjustment)(liqThresholdBps, { supplyUsd: 100, debtUsd: 0 }, boostToBps).debtAdjustmentUsd;
149
+ return getLeverageFactor(strategy, supplyUsd + debtUsd, debtUsd);
150
+ }
151
+ function getLeverageFactor(strategyType, supplyUsd, debtUsd) {
152
+ return ((strategyType === "Long" || strategyType === "Ratio"
153
+ ? supplyUsd
154
+ : debtUsd) /
155
+ (supplyUsd - debtUsd));
156
+ }
package/local/.env CHANGED
@@ -1 +1 @@
1
- ADDRESS_WHITELIST=5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe,He4ka5Q3N1UvZikZvykdi47xyk5PoVP2tcQL5sVp31Sz,E5BBsR1sUToPc3jXVwhrK5ttSiy6xhWJDMdQLvkgNppe,DRP5cgM1JpnMySvwg3jqRP2VA2DXSWUjo6VGLkNZ2etb
1
+ ADDRESS_WHITELIST=5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe,He4ka5Q3N1UvZikZvykdi47xyk5PoVP2tcQL5sVp31Sz,E5BBsR1sUToPc3jXVwhrK5ttSiy6xhWJDMdQLvkgNppe,DRP5cgM1JpnMySvwg3jqRP2VA2DXSWUjo6VGLkNZ2etb,FtwMsLNn4kBy2kpawC4izM8oUPbmfmbjjKNTcTUUDPzN
@@ -2,40 +2,27 @@ import { Keypair, PublicKey } from "@solana/web3.js";
2
2
  import { createSignerFromKeypair, publicKey } 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
- fromBaseUnit,
11
- getBankLiquidityAvailableBaseUnit,
12
7
  getBatches,
13
8
  getClient,
14
- getMarginfiAccounts,
15
9
  getPositionExBulk,
16
10
  getSolanaRpcConnection,
17
11
  getSolautoManagedPositions,
18
- lendingAccountDeposit,
19
12
  LendingPlatform,
20
13
  LOCAL_IRONFORGE_API_URL,
21
14
  PriceType,
22
15
  PriorityFeeSetting,
23
16
  ProgramEnv,
24
17
  rebalance,
25
- SOLAUTO_MANAGER,
26
18
  SOLAUTO_PROD_PROGRAM,
27
19
  SOLAUTO_TEST_PROGRAM,
28
20
  SolautoClient,
29
- toBaseUnit,
30
21
  TransactionItem,
31
- TransactionsManager,
32
- TxHandler,
33
- USDC,
34
22
  } from "../src";
35
23
  import { getSecretKey } from "./shared";
36
- import { getTokenAccount, tokenInfo } from "../dist";
37
24
 
38
- const payForTransaction = true;
25
+ const payForTransaction = false;
39
26
  const testProgram = false;
40
27
  const lpEnv: ProgramEnv = "Prod";
41
28
 
@@ -51,66 +38,26 @@ const signer = createSignerFromKeypair(
51
38
  );
52
39
 
53
40
  export async function main() {
54
- const USDC_MINT = new PublicKey(USDC);
55
- const group = new PublicKey("DQ2jqDJw9uzTwttf6h6r217BQ7kws3jZbJXDkfbCJa1q");
56
- const accounts =
57
- getMarginfiAccounts("Prod").bankAccounts[group.toString()][
58
- USDC_MINT.toString()
59
- ];
60
-
61
- const bank = await fetchBank(umi, publicKey(accounts.bank));
62
-
63
- const assets =
64
- bytesToI80F48(bank.totalAssetShares.value) *
65
- bytesToI80F48(bank.assetShareValue.value);
66
- const liabs =
67
- bytesToI80F48(bank.totalLiabilityShares.value) *
68
- bytesToI80F48(bank.liabilityShareValue.value);
69
-
70
- console.log(fromBaseUnit(BigInt(Math.round(assets)), 6));
71
- console.log(fromBaseUnit(BigInt(Math.round(liabs)), 6));
72
- const missingLiquidity = getBankLiquidityAvailableBaseUnit(bank, false);
73
- console.log(fromBaseUnit(missingLiquidity, 6));
41
+ const client = getClient(LendingPlatform.Marginfi, {
42
+ signer,
43
+ showLogs: true,
44
+ rpcUrl: LOCAL_IRONFORGE_API_URL,
45
+ programId: testProgram ? SOLAUTO_TEST_PROGRAM : SOLAUTO_PROD_PROGRAM,
46
+ lpEnv,
47
+ });
74
48
 
75
- const marginfiAccount = await fetchMarginfiAccount(
76
- umi,
77
- publicKey("Fun9UD87tLCxqxoTvpGYAy6Uwk2eevFGDk1VvxpXbd5x")
78
- );
79
- const managerAssets =
80
- bytesToI80F48(
81
- marginfiAccount.lendingAccount.balances[0].assetShares.value
82
- ) * bytesToI80F48(bank.assetShareValue.value);
83
- console.log(fromBaseUnit(BigInt(Math.round(managerAssets)), 6));
49
+ await client.initializeExistingSolautoPosition({
50
+ positionId: 1,
51
+ authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
52
+ // lpUserAccount: new PublicKey(
53
+ // "GEokw9jqbh6d1xUNA3qaeYFFetbSR5Y1nt7C3chwwgSz"
54
+ // ),
55
+ });
84
56
 
85
- const depositAmt =
86
- missingLiquidity * BigInt(-1) + BigInt(toBaseUnit(620 + 20, 6));
87
- console.log("Depositing", fromBaseUnit(depositAmt, 6));
88
- const transactionItems = [
89
- new TransactionItem(
90
- async () => ({
91
- tx: lendingAccountDeposit(umi, {
92
- signer,
93
- signerTokenAccount: publicKey(
94
- getTokenAccount(SOLAUTO_MANAGER, USDC_MINT)
95
- ),
96
- marginfiAccount: marginfiAccount.publicKey,
97
- marginfiGroup: publicKey(group),
98
- bank: bank.publicKey,
99
- bankLiquidityVault: publicKey(accounts.liquidityVault),
100
- amount: depositAmt,
101
- depositUpToLimit: true,
102
- }),
103
- }),
104
- "deposit"
105
- ),
106
- ];
57
+ const transactionItems = [rebalance(client)];
107
58
 
108
- const txManager = new TransactionsManager({
109
- txHandler: new TxHandler({
110
- signer,
111
- rpcUrl: LOCAL_IRONFORGE_API_URL,
112
- showLogs: true,
113
- }),
59
+ const txManager = new ClientTransactionsManager({
60
+ txHandler: client,
114
61
  txRunType: payForTransaction ? "normal" : "only-simulate",
115
62
  priorityFeeSetting: PriorityFeeSetting.Default,
116
63
  retryConfig: { totalRetries: 2 },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.761",
3
+ "version": "1.0.763",
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",
@@ -23,6 +23,7 @@ import {
23
23
  import { FlProviderBase } from "./flProviderBase";
24
24
  import {
25
25
  bytesToI80F48,
26
+ composeRemainingAccounts,
26
27
  consoleLog,
27
28
  fetchTokenPrices,
28
29
  findMarginfiAccounts,
@@ -342,7 +343,7 @@ export class MarginfiFlProvider extends FlProviderBase {
342
343
  lendingAccountEndFlashloan(this.umi, {
343
344
  marginfiAccount: publicKey(iMfiAccount.accountPk),
344
345
  signer: this.signer,
345
- }).addRemainingAccounts(remainingAccounts)
346
+ }).addRemainingAccounts(composeRemainingAccounts(remainingAccounts))
346
347
  );
347
348
  }
348
349
 
@@ -134,20 +134,6 @@ export class RebalanceSwapManager {
134
134
  }
135
135
  );
136
136
 
137
- // if (isMarginfiPosition(this.client.pos)) {
138
- // console.log(res.newPos.supplyUsd, res.newPos.debtUsd);
139
- // console.log(
140
- // res.newPos.supplyUsd *
141
- // bytesToI80F48(
142
- // this.client.pos.supplyBank!.config.assetWeightInit.value
143
- // ),
144
- // res.newPos.debtUsd *
145
- // bytesToI80F48(
146
- // this.client.pos.debtBank!.config.liabilityWeightInit.value
147
- // )
148
- // );
149
- // }
150
-
151
137
  return getLiqUtilzationRateBps(
152
138
  res.newPos.supplyUsd,
153
139
  res.newPos.debtUsd,
@@ -53,7 +53,7 @@ export class RebalanceTxBuilder {
53
53
  ) {}
54
54
 
55
55
  private shouldProceedWithRebalance() {
56
- if (this.client.pos.selfManaged && !this.targetLiqUtilizationRateBps) {
56
+ if (this.client.pos.selfManaged && this.targetLiqUtilizationRateBps === undefined) {
57
57
  throw new Error(
58
58
  "A target rate must be provided for self managed position rebalances"
59
59
  );
@@ -29,7 +29,11 @@ export class SolautoFeesBps {
29
29
 
30
30
  let feeBps: number = 0;
31
31
  if (this.targetLiqUtilizationRateBps !== undefined) {
32
- feeBps = 10;
32
+ if (this.targetLiqUtilizationRateBps === 0) {
33
+ feeBps = 15;
34
+ } else {
35
+ feeBps = 10;
36
+ }
33
37
  } else if (rebalanceDirection === RebalanceDirection.Repay) {
34
38
  feeBps = 25;
35
39
  } else if (this.positionNetWorthUsd <= minSize) {
@@ -37,6 +37,7 @@ import {
37
37
  hasFirstRebalance,
38
38
  getRemainingAccountsForMarginfiHealthCheck,
39
39
  getAccountMeta,
40
+ composeRemainingAccounts,
40
41
  } from "../../utils";
41
42
  import {
42
43
  Bank,
@@ -61,7 +62,7 @@ export class SolautoMarginfiClient extends SolautoClient {
61
62
 
62
63
  public marginfiAccount!: PublicKey | Signer;
63
64
  public marginfiAccountPk!: PublicKey;
64
- public healthCheckRemainingAccounts?: AccountMeta[];
65
+ public healthCheckRemainingAccounts!: AccountMeta[];
65
66
  public marginfiGroup!: PublicKey;
66
67
 
67
68
  public marginfiSupplyAccounts!: MarginfiAssetAccounts;
@@ -76,6 +77,7 @@ export class SolautoMarginfiClient extends SolautoClient {
76
77
  this.mfiAccounts = getMarginfiAccounts(this.lpEnv);
77
78
 
78
79
  this.marginfiGroup = this.pos.lpPoolAccount;
80
+ this.healthCheckRemainingAccounts = [];
79
81
 
80
82
  if (this.pos.selfManaged) {
81
83
  this.marginfiAccount =
@@ -258,6 +260,18 @@ export class SolautoMarginfiClient extends SolautoClient {
258
260
  private marginfiProtocolInteractionIx(args: SolautoActionArgs) {
259
261
  switch (args.__kind) {
260
262
  case "Deposit": {
263
+ if (
264
+ !this.healthCheckRemainingAccounts
265
+ .map((x) => x.pubkey.toString())
266
+ .includes(this.marginfiSupplyAccounts.bank)
267
+ ) {
268
+ this.healthCheckRemainingAccounts.push(
269
+ ...[
270
+ getAccountMeta(new PublicKey(this.marginfiSupplyAccounts.bank)),
271
+ getAccountMeta(this.supplyPriceOracle),
272
+ ]
273
+ );
274
+ }
261
275
  return lendingAccountDeposit(this.umi, {
262
276
  signer: this.signer,
263
277
  signerTokenAccount: publicKey(this.signerSupplyTa),
@@ -272,7 +286,7 @@ export class SolautoMarginfiClient extends SolautoClient {
272
286
  });
273
287
  }
274
288
  case "Borrow": {
275
- const remainingAccounts = this.healthCheckRemainingAccounts ?? [];
289
+ const remainingAccounts = this.healthCheckRemainingAccounts;
276
290
  if (
277
291
  !remainingAccounts.find(
278
292
  (x) =>
@@ -286,6 +300,7 @@ export class SolautoMarginfiClient extends SolautoClient {
286
300
  ]
287
301
  );
288
302
  }
303
+
289
304
  return lendingAccountBorrow(this.umi, {
290
305
  amount: args.fields[0],
291
306
  signer: this.signer,
@@ -299,7 +314,7 @@ export class SolautoMarginfiClient extends SolautoClient {
299
314
  bankLiquidityVaultAuthority: publicKey(
300
315
  this.marginfiDebtAccounts.vaultAuthority
301
316
  ),
302
- }).addRemainingAccounts(remainingAccounts);
317
+ }).addRemainingAccounts(composeRemainingAccounts(remainingAccounts));
303
318
  }
304
319
  case "Repay": {
305
320
  return lendingAccountRepay(this.umi, {
@@ -332,7 +347,9 @@ export class SolautoMarginfiClient extends SolautoClient {
332
347
  bankLiquidityVaultAuthority: publicKey(
333
348
  this.marginfiSupplyAccounts.vaultAuthority
334
349
  ),
335
- }).addRemainingAccounts(this.healthCheckRemainingAccounts ?? []);
350
+ }).addRemainingAccounts(
351
+ composeRemainingAccounts(this.healthCheckRemainingAccounts)
352
+ );
336
353
  }
337
354
  }
338
355
  }
@@ -138,7 +138,7 @@ export class MarginfiSolautoPositionEx extends SolautoPositionEx {
138
138
  getBankLiquidityUsedBaseUnit(this.supplyBank, false),
139
139
  this.supplyMintInfo.decimals
140
140
  );
141
- return Math.min((deposits - borrows), this.totalSupply) * this.supplyPrice()!;
141
+ return Math.min(deposits - borrows, this.totalSupply) * this.supplyPrice()!;
142
142
  }
143
143
 
144
144
  async refreshPositionState(priceType?: PriceType): Promise<void> {
@@ -46,7 +46,7 @@ export async function getPositionExBulk(
46
46
  umi: Umi,
47
47
  publicKeys: PublicKey[]
48
48
  ): Promise<SolautoPositionEx[]> {
49
- const batches = getBatches(publicKeys, 50);
49
+ const batches = getBatches(publicKeys, 100);
50
50
 
51
51
  const data = (
52
52
  await Promise.all(
@@ -126,13 +126,6 @@ export function retryWithExponentialBackoff<T>(
126
126
  .catch((error: Error) => {
127
127
  attemptNum++;
128
128
 
129
- console.log(error.name, error.message);
130
- console.log(
131
- errorsToThrow?.length,
132
- (errorsToThrow ?? []).some(
133
- (errorType) => error instanceof errorType
134
- )
135
- );
136
129
  if (
137
130
  errorsToThrow?.length &&
138
131
  errorsToThrow.some((errorType) => error instanceof errorType)
@@ -224,3 +224,16 @@ export function marginfiAccountEmpty(marginfiAccount: MarginfiAccount) {
224
224
  ) === undefined
225
225
  );
226
226
  }
227
+
228
+ export function composeRemainingAccounts(accs: AccountMeta[]): AccountMeta[] {
229
+ const banksAndOracles: [AccountMeta, AccountMeta][] = accs.reduce(
230
+ (acc: [AccountMeta, AccountMeta][], _, i) =>
231
+ i % 2 === 0 ? [...acc, [accs[i], accs[i + 1]]] : acc,
232
+ []
233
+ );
234
+ return banksAndOracles
235
+ .sort((a, b) =>
236
+ b[0].pubkey.toString().localeCompare(a[0].pubkey.toString())
237
+ )
238
+ .flat();
239
+ }
@@ -8,6 +8,8 @@ import {
8
8
  import { PositionState, PriceType } from "../generated";
9
9
  import { RoundAction } from "../types";
10
10
  import { safeGetPrice } from "./priceUtils";
11
+ import { StrategyType, strategyType } from "./stringUtils";
12
+ import { getDebtAdjustment } from "../services";
11
13
 
12
14
  export function calcNetWorthUsd(state?: PositionState) {
13
15
  return fromRoundedUsdValue(state?.netWorth.baseAmountUsdValue ?? BigInt(0));
@@ -215,3 +217,32 @@ export function realtimeUsdToEmaUsd(
215
217
  safeGetPrice(mint, PriceType.Ema)!
216
218
  );
217
219
  }
220
+
221
+ export function boostSettingToLeverageFactor(
222
+ supplyMint: PublicKey,
223
+ debtMint: PublicKey,
224
+ boostToBps: number,
225
+ liqThresholdBps: number
226
+ ) {
227
+ const strategy = strategyType(supplyMint, debtMint);
228
+ const supplyUsd = 100;
229
+ const debtUsd = getDebtAdjustment(
230
+ liqThresholdBps,
231
+ { supplyUsd: 100, debtUsd: 0 },
232
+ boostToBps
233
+ ).debtAdjustmentUsd;
234
+ return getLeverageFactor(strategy, supplyUsd + debtUsd, debtUsd);
235
+ }
236
+
237
+ export function getLeverageFactor(
238
+ strategyType: StrategyType,
239
+ supplyUsd: number,
240
+ debtUsd: number
241
+ ): number {
242
+ return (
243
+ (strategyType === "Long" || strategyType === "Ratio"
244
+ ? supplyUsd
245
+ : debtUsd) /
246
+ (supplyUsd - debtUsd)
247
+ );
248
+ }
@@ -22,6 +22,7 @@ import {
22
22
  closeSolautoPosition,
23
23
  getMarginfiAccounts,
24
24
  ClientTransactionsManager,
25
+ ProgramEnv,
25
26
  } from "../../src";
26
27
 
27
28
  export async function e2eTransactionTest(
@@ -29,13 +30,15 @@ export async function e2eTransactionTest(
29
30
  testProgram: boolean,
30
31
  lendingPlatform: LendingPlatform,
31
32
  withFlashLoan: boolean,
32
- showLogs?: boolean
33
+ showLogs?: boolean,
34
+ lpEnv?: ProgramEnv
33
35
  ) {
34
36
  const client = getClient(lendingPlatform, {
35
37
  signer,
36
38
  showLogs,
37
39
  rpcUrl: LOCAL_IRONFORGE_API_URL,
38
40
  programId: testProgram ? SOLAUTO_TEST_PROGRAM : SOLAUTO_PROD_PROGRAM,
41
+ lpEnv,
39
42
  });
40
43
 
41
44
  const supplyMint = new PublicKey(NATIVE_MINT);
@@ -43,7 +46,7 @@ export async function e2eTransactionTest(
43
46
 
44
47
  await client.initializeNewSolautoPosition({
45
48
  positionId: 1,
46
- lpPoolAccount: getMarginfiAccounts().defaultGroup,
49
+ lpPoolAccount: getMarginfiAccounts(lpEnv).defaultGroup,
47
50
  supplyMint,
48
51
  debtMint,
49
52
  });
@@ -1,11 +1,13 @@
1
1
  import { describe, it } from "mocha";
2
- import { LendingPlatform } from "../../src";
2
+ import { LendingPlatform, ProgramEnv } from "../../src";
3
3
  import { setupTest } from "../shared";
4
4
  import { e2eTransactionTest } from "./shared";
5
5
 
6
6
  describe("Solauto Marginfi tests", async () => {
7
7
  const signer = setupTest();
8
8
  const testProgram = false;
9
+ const showLogs = false;
10
+ const lpEnv: ProgramEnv = "Prod";
9
11
 
10
12
  it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
11
13
  await e2eTransactionTest(
@@ -13,7 +15,8 @@ describe("Solauto Marginfi tests", async () => {
13
15
  testProgram,
14
16
  LendingPlatform.Marginfi,
15
17
  false,
16
- false
18
+ showLogs,
19
+ lpEnv
17
20
  );
18
21
  });
19
22
 
@@ -23,7 +26,8 @@ describe("Solauto Marginfi tests", async () => {
23
26
  testProgram,
24
27
  LendingPlatform.Marginfi,
25
28
  true,
26
- false
29
+ showLogs,
30
+ lpEnv
27
31
  );
28
32
  });
29
33
  });