@gearbox-protocol/sdk 14.10.0 → 14.10.2-next.1

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 (209) hide show
  1. package/dist/cjs/common-utils/test-utils/index.js +139 -0
  2. package/dist/cjs/common-utils/utils/apy/calculate-borrow-rate-from-utilization.js +59 -0
  3. package/dist/cjs/common-utils/utils/apy/calculate-borrow-rate-from-utilization.spec.js +32 -0
  4. package/dist/cjs/common-utils/utils/apy/calculate-earnings.js +59 -0
  5. package/dist/cjs/common-utils/utils/apy/calculate-earnings.spec.js +62 -0
  6. package/dist/cjs/common-utils/utils/apy/calculate-safe-borrow-rate.js +55 -0
  7. package/dist/cjs/common-utils/utils/apy/calculate-safe-borrow-rate.spec.js +39 -0
  8. package/dist/cjs/common-utils/utils/apy/get-safe-base-borrow-rate.js +38 -0
  9. package/dist/cjs/common-utils/utils/constants.js +34 -0
  10. package/dist/cjs/common-utils/utils/strategies/assets/assets.js +30 -0
  11. package/dist/cjs/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.js +62 -0
  12. package/dist/cjs/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.spec.js +109 -0
  13. package/dist/cjs/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.js +75 -0
  14. package/dist/cjs/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.spec.js +93 -0
  15. package/dist/cjs/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.js +63 -0
  16. package/dist/cjs/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.spec.js +330 -0
  17. package/dist/cjs/common-utils/utils/strategies/leverage/get-collateral-by-debt.js +34 -0
  18. package/dist/cjs/common-utils/utils/strategies/leverage/get-collateral-by-debt.spec.js +30 -0
  19. package/dist/cjs/common-utils/utils/strategies/leverage/get-recommended-debt.js +85 -0
  20. package/dist/cjs/common-utils/utils/strategies/leverage/get-recommended-debt.spec.js +227 -0
  21. package/dist/cjs/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.js +33 -0
  22. package/dist/cjs/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.spec.js +23 -0
  23. package/dist/cjs/common-utils/utils/strategies/leverage/max-leverage.js +2 -2
  24. package/dist/cjs/common-utils/utils/strategies/strategy-info/calculate-total-apy.js +112 -0
  25. package/dist/cjs/common-utils/utils/strategies/strategy-info/calculate-total-apy.spec.js +183 -0
  26. package/dist/cjs/common-utils/utils/strategies/strategy-info/calculate-total-points.js +74 -0
  27. package/dist/cjs/common-utils/utils/strategies/strategy-info/calculate-total-points.spec.js +131 -0
  28. package/dist/cjs/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.js +410 -0
  29. package/dist/cjs/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.spec.js +274 -0
  30. package/dist/cjs/common-utils/utils/strategies/strategy-info/get-strategy-you-can-earn.js +108 -0
  31. package/dist/cjs/common-utils/utils/strategies/tokens/add-amount-in-target.js +41 -0
  32. package/dist/cjs/common-utils/utils/strategies/tokens/add-amount-in-target.spec.js +38 -0
  33. package/dist/cjs/common-utils/utils/strategies/tokens/get-chain-phantom-tokens.js +35 -0
  34. package/dist/cjs/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.js +42 -0
  35. package/dist/cjs/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.spec.js +32 -0
  36. package/dist/cjs/common-utils/utils/strategies/tokens/get-native-token-address.js +31 -0
  37. package/dist/cjs/common-utils/utils/strategies/tokens/is-apy-with-points-exception.js +36 -0
  38. package/dist/cjs/common-utils/utils/strategies/tokens/is-collateral-token.js +59 -0
  39. package/dist/cjs/common-utils/utils/strategies/tokens/is-collateral-token.spec.js +135 -0
  40. package/dist/cjs/common-utils/utils/strategies/tokens/is-obtainable-token.js +42 -0
  41. package/dist/cjs/common-utils/utils/strategies/tokens/is-obtainable-token.spec.js +162 -0
  42. package/dist/cjs/common-utils/utils/strategies/tokens/is-valid-extra-collateral-token.js +51 -0
  43. package/dist/cjs/common-utils/utils/strategies/tokens/wrap-token-address.js +33 -0
  44. package/dist/cjs/common-utils/utils/strategies/tokens/wrap-token-address.spec.js +13 -0
  45. package/dist/cjs/common-utils/utils/strategies/types/strategy-data.js +16 -0
  46. package/dist/cjs/common-utils/utils/strategies/types/strategy-earnings.js +16 -0
  47. package/dist/cjs/common-utils/utils/validation/is-zero-balance.js +30 -0
  48. package/dist/cjs/common-utils/utils/validation/validate-balance.js +47 -0
  49. package/dist/cjs/common-utils/utils/validation/validate-balance.spec.js +52 -0
  50. package/dist/cjs/common-utils/utils/validation/validate-balances.js +44 -0
  51. package/dist/cjs/common-utils/utils/validation/validate-balances.spec.js +37 -0
  52. package/dist/cjs/common-utils/utils/validation/validate-credit-manager.js +34 -0
  53. package/dist/cjs/common-utils/utils/validation/validate-credit-manager.spec.js +36 -0
  54. package/dist/cjs/common-utils/utils/validation/validate-hf.js +38 -0
  55. package/dist/cjs/common-utils/utils/validation/validate-hf.spec.js +24 -0
  56. package/dist/cjs/common-utils/utils/validation/validate-open-account-pool-quota-status.js +37 -0
  57. package/dist/cjs/common-utils/utils/validation/validate-open-account-pool-quota-status.spec.js +43 -0
  58. package/dist/cjs/common-utils/utils/validation/validate-open-account-pool-status.js +76 -0
  59. package/dist/cjs/common-utils/utils/validation/validate-open-account-pool-status.spec.js +98 -0
  60. package/dist/cjs/common-utils/utils/validation/validate-open-account.js +41 -0
  61. package/dist/cjs/common-utils/utils/validation/validate-open-account.spec.js +54 -0
  62. package/dist/cjs/common-utils/utils/validation/validate-quota.js +49 -0
  63. package/dist/cjs/common-utils/utils/validation/validate-quota.spec.js +79 -0
  64. package/dist/cjs/common-utils/utils/validation/validate-token-to-obtain.js +42 -0
  65. package/dist/cjs/common-utils/utils/validation/validate-token-to-obtain.spec.js +35 -0
  66. package/dist/cjs/common-utils/utils/validation/validation-types.js +16 -0
  67. package/dist/cjs/dev/claimFromFaucet.js +17 -7
  68. package/dist/cjs/sdk/constants/math.js +3 -0
  69. package/dist/esm/common-utils/test-utils/index.js +104 -0
  70. package/dist/esm/common-utils/utils/apy/calculate-borrow-rate-from-utilization.js +35 -0
  71. package/dist/esm/common-utils/utils/apy/calculate-borrow-rate-from-utilization.spec.js +31 -0
  72. package/dist/esm/common-utils/utils/apy/calculate-earnings.js +35 -0
  73. package/dist/esm/common-utils/utils/apy/calculate-earnings.spec.js +65 -0
  74. package/dist/esm/common-utils/utils/apy/calculate-safe-borrow-rate.js +34 -0
  75. package/dist/esm/common-utils/utils/apy/calculate-safe-borrow-rate.spec.js +38 -0
  76. package/dist/esm/common-utils/utils/apy/get-safe-base-borrow-rate.js +16 -0
  77. package/dist/esm/common-utils/utils/constants.js +8 -0
  78. package/dist/esm/common-utils/utils/strategies/assets/assets.js +6 -0
  79. package/dist/esm/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.js +38 -0
  80. package/dist/esm/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.spec.js +115 -0
  81. package/dist/esm/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.js +51 -0
  82. package/dist/esm/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.spec.js +96 -0
  83. package/dist/esm/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.js +42 -0
  84. package/dist/esm/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.spec.js +332 -0
  85. package/dist/esm/common-utils/utils/strategies/leverage/get-collateral-by-debt.js +10 -0
  86. package/dist/esm/common-utils/utils/strategies/leverage/get-collateral-by-debt.spec.js +29 -0
  87. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-debt.js +61 -0
  88. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-debt.spec.js +226 -0
  89. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.js +9 -0
  90. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.spec.js +22 -0
  91. package/dist/esm/common-utils/utils/strategies/leverage/max-leverage.js +2 -2
  92. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-apy.js +88 -0
  93. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-apy.spec.js +187 -0
  94. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-points.js +54 -0
  95. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-points.spec.js +139 -0
  96. package/dist/esm/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.js +389 -0
  97. package/dist/esm/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.spec.js +278 -0
  98. package/dist/esm/common-utils/utils/strategies/strategy-info/get-strategy-you-can-earn.js +84 -0
  99. package/dist/esm/common-utils/utils/strategies/tokens/add-amount-in-target.js +17 -0
  100. package/dist/esm/common-utils/utils/strategies/tokens/add-amount-in-target.spec.js +41 -0
  101. package/dist/esm/common-utils/utils/strategies/tokens/get-chain-phantom-tokens.js +11 -0
  102. package/dist/esm/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.js +18 -0
  103. package/dist/esm/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.spec.js +36 -0
  104. package/dist/esm/common-utils/utils/strategies/tokens/get-native-token-address.js +7 -0
  105. package/dist/esm/common-utils/utils/strategies/tokens/is-apy-with-points-exception.js +11 -0
  106. package/dist/esm/common-utils/utils/strategies/tokens/is-collateral-token.js +35 -0
  107. package/dist/esm/common-utils/utils/strategies/tokens/is-collateral-token.spec.js +137 -0
  108. package/dist/esm/common-utils/utils/strategies/tokens/is-obtainable-token.js +18 -0
  109. package/dist/esm/common-utils/utils/strategies/tokens/is-obtainable-token.spec.js +161 -0
  110. package/dist/esm/common-utils/utils/strategies/tokens/is-valid-extra-collateral-token.js +27 -0
  111. package/dist/esm/common-utils/utils/strategies/tokens/wrap-token-address.js +9 -0
  112. package/dist/esm/common-utils/utils/strategies/tokens/wrap-token-address.spec.js +12 -0
  113. package/dist/esm/common-utils/utils/strategies/types/strategy-data.js +0 -0
  114. package/dist/esm/common-utils/utils/strategies/types/strategy-earnings.js +0 -0
  115. package/dist/esm/common-utils/utils/validation/is-zero-balance.js +6 -0
  116. package/dist/esm/common-utils/utils/validation/validate-balance.js +23 -0
  117. package/dist/esm/common-utils/utils/validation/validate-balance.spec.js +51 -0
  118. package/dist/esm/common-utils/utils/validation/validate-balances.js +20 -0
  119. package/dist/esm/common-utils/utils/validation/validate-balances.spec.js +36 -0
  120. package/dist/esm/common-utils/utils/validation/validate-credit-manager.js +10 -0
  121. package/dist/esm/common-utils/utils/validation/validate-credit-manager.spec.js +35 -0
  122. package/dist/esm/common-utils/utils/validation/validate-hf.js +13 -0
  123. package/dist/esm/common-utils/utils/validation/validate-hf.spec.js +23 -0
  124. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-quota-status.js +13 -0
  125. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-quota-status.spec.js +46 -0
  126. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-status.js +54 -0
  127. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-status.spec.js +102 -0
  128. package/dist/esm/common-utils/utils/validation/validate-open-account.js +17 -0
  129. package/dist/esm/common-utils/utils/validation/validate-open-account.spec.js +56 -0
  130. package/dist/esm/common-utils/utils/validation/validate-quota.js +25 -0
  131. package/dist/esm/common-utils/utils/validation/validate-quota.spec.js +83 -0
  132. package/dist/esm/common-utils/utils/validation/validate-token-to-obtain.js +18 -0
  133. package/dist/esm/common-utils/utils/validation/validate-token-to-obtain.spec.js +34 -0
  134. package/dist/esm/common-utils/utils/validation/validation-types.js +0 -0
  135. package/dist/esm/dev/claimFromFaucet.js +17 -7
  136. package/dist/esm/sdk/constants/math.js +2 -0
  137. package/dist/types/common-utils/test-utils/index.d.ts +16 -0
  138. package/dist/types/common-utils/utils/apy/calculate-borrow-rate-from-utilization.d.ts +2 -0
  139. package/dist/types/common-utils/utils/apy/calculate-borrow-rate-from-utilization.spec.d.ts +1 -0
  140. package/dist/types/common-utils/utils/apy/calculate-earnings.d.ts +16 -0
  141. package/dist/types/common-utils/utils/apy/calculate-earnings.spec.d.ts +1 -0
  142. package/dist/types/common-utils/utils/apy/calculate-safe-borrow-rate.d.ts +11 -0
  143. package/dist/types/common-utils/utils/apy/calculate-safe-borrow-rate.spec.d.ts +1 -0
  144. package/dist/types/common-utils/utils/apy/get-safe-base-borrow-rate.d.ts +4 -0
  145. package/dist/types/common-utils/utils/constants.d.ts +4 -0
  146. package/dist/types/common-utils/utils/strategies/assets/assets.d.ts +3 -0
  147. package/dist/types/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.d.ts +20 -0
  148. package/dist/types/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.spec.d.ts +1 -0
  149. package/dist/types/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.d.ts +13 -0
  150. package/dist/types/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.spec.d.ts +1 -0
  151. package/dist/types/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.d.ts +11 -0
  152. package/dist/types/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.spec.d.ts +1 -0
  153. package/dist/types/common-utils/utils/strategies/leverage/get-collateral-by-debt.d.ts +2 -0
  154. package/dist/types/common-utils/utils/strategies/leverage/get-collateral-by-debt.spec.d.ts +1 -0
  155. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-debt.d.ts +21 -0
  156. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-debt.spec.d.ts +1 -0
  157. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.d.ts +4 -0
  158. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.spec.d.ts +1 -0
  159. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-apy.d.ts +28 -0
  160. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-apy.spec.d.ts +1 -0
  161. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-points.d.ts +22 -0
  162. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-points.spec.d.ts +1 -0
  163. package/dist/types/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.d.ts +19 -0
  164. package/dist/types/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.spec.d.ts +1 -0
  165. package/dist/types/common-utils/utils/strategies/strategy-info/get-strategy-you-can-earn.d.ts +29 -0
  166. package/dist/types/common-utils/utils/strategies/tokens/add-amount-in-target.d.ts +6 -0
  167. package/dist/types/common-utils/utils/strategies/tokens/add-amount-in-target.spec.d.ts +1 -0
  168. package/dist/types/common-utils/utils/strategies/tokens/get-chain-phantom-tokens.d.ts +6 -0
  169. package/dist/types/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.d.ts +12 -0
  170. package/dist/types/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.spec.d.ts +1 -0
  171. package/dist/types/common-utils/utils/strategies/tokens/get-native-token-address.d.ts +1 -0
  172. package/dist/types/common-utils/utils/strategies/tokens/is-apy-with-points-exception.d.ts +3 -0
  173. package/dist/types/common-utils/utils/strategies/tokens/is-collateral-token.d.ts +16 -0
  174. package/dist/types/common-utils/utils/strategies/tokens/is-collateral-token.spec.d.ts +1 -0
  175. package/dist/types/common-utils/utils/strategies/tokens/is-obtainable-token.d.ts +14 -0
  176. package/dist/types/common-utils/utils/strategies/tokens/is-obtainable-token.spec.d.ts +1 -0
  177. package/dist/types/common-utils/utils/strategies/tokens/is-valid-extra-collateral-token.d.ts +20 -0
  178. package/dist/types/common-utils/utils/strategies/tokens/wrap-token-address.d.ts +2 -0
  179. package/dist/types/common-utils/utils/strategies/tokens/wrap-token-address.spec.d.ts +1 -0
  180. package/dist/types/common-utils/utils/strategies/types/index.d.ts +2 -1
  181. package/dist/types/common-utils/utils/strategies/types/strategy-data.d.ts +64 -0
  182. package/dist/types/common-utils/utils/strategies/types/strategy-earnings.d.ts +43 -0
  183. package/dist/types/common-utils/utils/validation/is-zero-balance.d.ts +1 -0
  184. package/dist/types/common-utils/utils/validation/validate-balance.d.ts +22 -0
  185. package/dist/types/common-utils/utils/validation/validate-balance.spec.d.ts +1 -0
  186. package/dist/types/common-utils/utils/validation/validate-balances.d.ts +9 -0
  187. package/dist/types/common-utils/utils/validation/validate-balances.spec.d.ts +1 -0
  188. package/dist/types/common-utils/utils/validation/validate-credit-manager.d.ts +10 -0
  189. package/dist/types/common-utils/utils/validation/validate-credit-manager.spec.d.ts +1 -0
  190. package/dist/types/common-utils/utils/validation/validate-hf.d.ts +9 -0
  191. package/dist/types/common-utils/utils/validation/validate-hf.spec.d.ts +1 -0
  192. package/dist/types/common-utils/utils/validation/validate-open-account-pool-quota-status.d.ts +7 -0
  193. package/dist/types/common-utils/utils/validation/validate-open-account-pool-quota-status.spec.d.ts +1 -0
  194. package/dist/types/common-utils/utils/validation/validate-open-account-pool-status.d.ts +23 -0
  195. package/dist/types/common-utils/utils/validation/validate-open-account-pool-status.spec.d.ts +1 -0
  196. package/dist/types/common-utils/utils/validation/validate-open-account.d.ts +21 -0
  197. package/dist/types/common-utils/utils/validation/validate-open-account.spec.d.ts +1 -0
  198. package/dist/types/common-utils/utils/validation/validate-quota.d.ts +20 -0
  199. package/dist/types/common-utils/utils/validation/validate-quota.spec.d.ts +1 -0
  200. package/dist/types/common-utils/utils/validation/validate-token-to-obtain.d.ts +13 -0
  201. package/dist/types/common-utils/utils/validation/validate-token-to-obtain.spec.d.ts +1 -0
  202. package/dist/types/common-utils/utils/validation/validation-types.d.ts +14 -0
  203. package/dist/types/dev/RevolverTransport.d.ts +4 -4
  204. package/dist/types/dev/claimFromFaucet.d.ts +1 -0
  205. package/dist/types/sdk/constants/math.d.ts +1 -0
  206. package/package.json +1 -1
  207. package/dist/cjs/common-utils/utils/strategies/__test-utils.js +0 -95
  208. package/dist/esm/common-utils/utils/strategies/__test-utils.js +0 -65
  209. package/dist/types/common-utils/utils/strategies/__test-utils.d.ts +0 -11
@@ -0,0 +1,42 @@
1
+ import {
2
+ LEVERAGE_DECIMALS,
3
+ PERCENTAGE_FACTOR
4
+ } from "../../../../sdk/constants/math.js";
5
+ import { BigIntMath } from "../../bigint-math.js";
6
+ import { calculateLossCoefficient } from "./calculate-loss-coefficient.js";
7
+ import { maxLeverage } from "./max-leverage.js";
8
+ const DEFAULT_DEBT_CONSTANT_LOSS = 1500n;
9
+ function calculateMaxStrategyDebt({
10
+ targetToken,
11
+ amount,
12
+ creditManager,
13
+ slippage,
14
+ constantLoss = DEFAULT_DEBT_CONSTANT_LOSS,
15
+ swapCollateral = true
16
+ }) {
17
+ const targetQuota = creditManager.quotas[targetToken];
18
+ const quotaLeft = swapCollateral && targetQuota ? BigIntMath.max(0n, targetQuota.limit - targetQuota.totalQuoted) : void 0;
19
+ if (quotaLeft === 0n) {
20
+ return creditManager.minDebt;
21
+ }
22
+ const availableLiquidity = quotaLeft !== void 0 ? BigIntMath.min(quotaLeft, creditManager.availableToBorrow) : creditManager.availableToBorrow;
23
+ const coefficient = calculateLossCoefficient(slippage, constantLoss);
24
+ const effectiveMaxDebt = BigIntMath.max(
25
+ BigIntMath.min(availableLiquidity, creditManager.maxDebt),
26
+ creditManager.minDebt
27
+ );
28
+ if (amount === 0n) {
29
+ return effectiveMaxDebt;
30
+ }
31
+ const maxPossibleLeverage = maxLeverage(targetToken, [creditManager]);
32
+ const debt = amount * BigInt(maxPossibleLeverage) / LEVERAGE_DECIMALS;
33
+ const effectiveDebt = debt * coefficient / PERCENTAGE_FACTOR;
34
+ const result = BigIntMath.max(
35
+ BigIntMath.min(effectiveDebt, effectiveMaxDebt),
36
+ creditManager.minDebt
37
+ );
38
+ return result;
39
+ }
40
+ export {
41
+ calculateMaxStrategyDebt
42
+ };
@@ -0,0 +1,332 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import {
3
+ LEVERAGE_DECIMALS,
4
+ PERCENTAGE_FACTOR
5
+ } from "../../../../sdk/constants/math.js";
6
+ import { buildCreditManager, mockToken1 } from "../../../test-utils/index.js";
7
+ import { calculateLossCoefficient } from "./calculate-loss-coefficient.js";
8
+ import { calculateMaxStrategyDebt } from "./calculate-max-strategy-debt.js";
9
+ import { maxLeverage } from "./max-leverage.js";
10
+ vi.mock("./max-leverage");
11
+ vi.mock(
12
+ "../../utils/strategies/leverage/calculate-loss-coefficient.js",
13
+ async () => {
14
+ const actual = await vi.importActual(
15
+ "../../utils/strategies/leverage/calculate-loss-coefficient.js"
16
+ );
17
+ return {
18
+ ...actual,
19
+ calculateLossCoefficient: vi.fn(
20
+ actual.calculateLossCoefficient
21
+ )
22
+ };
23
+ }
24
+ );
25
+ const mockMaxLeverage = vi.mocked(maxLeverage);
26
+ const mockCalculateLossCoefficient = vi.mocked(calculateLossCoefficient);
27
+ describe("calculateMaxStrategyDebt", () => {
28
+ const mockCreditManager = buildCreditManager({});
29
+ beforeEach(() => {
30
+ mockMaxLeverage.mockReturnValue(
31
+ 10n * LEVERAGE_DECIMALS
32
+ );
33
+ vi.clearAllMocks();
34
+ });
35
+ it("should return effectiveMaxDebt when amount is zero without calling maxLeverage", () => {
36
+ const result = calculateMaxStrategyDebt({
37
+ targetToken: mockToken1,
38
+ amount: 0n,
39
+ creditManager: mockCreditManager,
40
+ slippage: 100,
41
+ constantLoss: 30n
42
+ });
43
+ expect(mockMaxLeverage).not.toHaveBeenCalled();
44
+ expect(result).toEqual(900000n);
45
+ });
46
+ it("should calculate max debt correctly with mocked maxLeverage", () => {
47
+ const maxLeverageValue = 5n * LEVERAGE_DECIMALS;
48
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
49
+ const targetToken = mockToken1;
50
+ const amount = 10000n;
51
+ const slippage = 100;
52
+ const constantLoss = 30n;
53
+ const result = calculateMaxStrategyDebt({
54
+ targetToken: mockToken1,
55
+ amount,
56
+ creditManager: mockCreditManager,
57
+ slippage,
58
+ constantLoss
59
+ });
60
+ expect(mockMaxLeverage).toHaveBeenCalledWith(targetToken, [
61
+ mockCreditManager
62
+ ]);
63
+ expect(mockMaxLeverage).toHaveBeenCalledTimes(1);
64
+ expect(result).toEqual(49350n);
65
+ });
66
+ it("should handle case where effectiveDebt exceeds effectiveMaxDebt", () => {
67
+ const veryHighLeverage = 100n * LEVERAGE_DECIMALS;
68
+ mockMaxLeverage.mockReturnValue(veryHighLeverage);
69
+ const amount = 100000000000000000000000n;
70
+ const creditManager = buildCreditManager({
71
+ availableToBorrow: 1000n
72
+ });
73
+ const result = calculateMaxStrategyDebt({
74
+ targetToken: mockToken1,
75
+ amount,
76
+ creditManager,
77
+ slippage: 100,
78
+ constantLoss: 30n
79
+ });
80
+ expect(result).toEqual(creditManager.availableToBorrow);
81
+ });
82
+ it("should ensure result is at least minDebt", () => {
83
+ mockMaxLeverage.mockReturnValue(1n);
84
+ const amount = 10000n;
85
+ const result = calculateMaxStrategyDebt({
86
+ targetToken: mockToken1,
87
+ amount,
88
+ creditManager: mockCreditManager,
89
+ slippage: 100,
90
+ constantLoss: 30n
91
+ });
92
+ expect(result).toEqual(mockCreditManager.minDebt);
93
+ });
94
+ it("should handle different slippage values correctly", () => {
95
+ const maxLeverageValue = 10n * LEVERAGE_DECIMALS;
96
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
97
+ const amount = 10000n;
98
+ const highSlippage = 500;
99
+ const result = calculateMaxStrategyDebt({
100
+ targetToken: mockToken1,
101
+ amount,
102
+ creditManager: mockCreditManager,
103
+ slippage: highSlippage,
104
+ constantLoss: 30n
105
+ });
106
+ expect(result).toEqual(94700n);
107
+ });
108
+ it("should handle different constantLoss values correctly", () => {
109
+ const maxLeverageValue = 10n * LEVERAGE_DECIMALS;
110
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
111
+ const amount = 10000n;
112
+ const highConstantLoss = 500n;
113
+ const result = calculateMaxStrategyDebt({
114
+ targetToken: mockToken1,
115
+ amount,
116
+ creditManager: mockCreditManager,
117
+ slippage: 100,
118
+ constantLoss: highConstantLoss
119
+ });
120
+ expect(result).toEqual(94000n);
121
+ });
122
+ it("should respect quota limit when quotaLeft is less than availableToBorrow", () => {
123
+ const maxLeverageValue = 10n * LEVERAGE_DECIMALS;
124
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
125
+ const quotaLimit = 50000n;
126
+ const totalQuoted = 40000n;
127
+ const amount = 10000n;
128
+ const availableToBorrow = 100000n;
129
+ const creditManagerWithQuota = buildCreditManager({
130
+ availableToBorrow,
131
+ quotas: {
132
+ ...mockCreditManager.quotas,
133
+ [mockToken1]: {
134
+ ...mockCreditManager.quotas[mockToken1],
135
+ limit: quotaLimit,
136
+ totalQuoted
137
+ }
138
+ }
139
+ });
140
+ const result = calculateMaxStrategyDebt({
141
+ targetToken: mockToken1,
142
+ amount,
143
+ creditManager: creditManagerWithQuota,
144
+ slippage: 100,
145
+ constantLoss: 30n
146
+ });
147
+ expect(result).toEqual(quotaLimit - totalQuoted);
148
+ });
149
+ it("should use availableToBorrow when quota does not exist for target token", () => {
150
+ const maxLeverageValue = 10n * LEVERAGE_DECIMALS;
151
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
152
+ const availableToBorrow = 75000n;
153
+ const tokenWithoutQuota = "0x9999999999999999999999999999999999999999";
154
+ const creditManagerWithoutQuota = buildCreditManager({
155
+ availableToBorrow
156
+ });
157
+ const result = calculateMaxStrategyDebt({
158
+ targetToken: tokenWithoutQuota,
159
+ amount: 10000n,
160
+ creditManager: creditManagerWithoutQuota,
161
+ slippage: 100,
162
+ constantLoss: 30n
163
+ });
164
+ expect(result).toEqual(creditManagerWithoutQuota.availableToBorrow);
165
+ });
166
+ it("should respect quotaLeft", () => {
167
+ const maxLeverageValue = 10n * LEVERAGE_DECIMALS;
168
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
169
+ const quotaLimit = 50000n;
170
+ const totalQuoted = 10000n;
171
+ const amount = 20000n;
172
+ const availableToBorrow = 100000n;
173
+ const creditManagerWithQuota = buildCreditManager({
174
+ availableToBorrow,
175
+ quotas: {
176
+ ...mockCreditManager.quotas,
177
+ [mockToken1]: {
178
+ ...mockCreditManager.quotas[mockToken1],
179
+ limit: quotaLimit,
180
+ totalQuoted
181
+ }
182
+ }
183
+ });
184
+ const result = calculateMaxStrategyDebt({
185
+ targetToken: mockToken1,
186
+ amount,
187
+ creditManager: creditManagerWithQuota,
188
+ slippage: 100,
189
+ constantLoss: 30n
190
+ });
191
+ expect(result).toEqual(quotaLimit - totalQuoted);
192
+ });
193
+ it("returns minDebt when quotaLeft would be negative (clamped to 0)", () => {
194
+ const maxLeverageValue = 10n * LEVERAGE_DECIMALS;
195
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
196
+ const quotaLimit = 50000n;
197
+ const totalQuoted = 50001n;
198
+ const amount = 20000n;
199
+ const availableToBorrow = 100000n;
200
+ const creditManagerWithQuota = buildCreditManager({
201
+ availableToBorrow,
202
+ quotas: {
203
+ ...mockCreditManager.quotas,
204
+ [mockToken1]: {
205
+ ...mockCreditManager.quotas[mockToken1],
206
+ limit: quotaLimit,
207
+ totalQuoted
208
+ }
209
+ }
210
+ });
211
+ const result = calculateMaxStrategyDebt({
212
+ targetToken: mockToken1,
213
+ amount,
214
+ creditManager: creditManagerWithQuota,
215
+ slippage: 100,
216
+ constantLoss: 30n
217
+ });
218
+ expect(result).toEqual(mockCreditManager.minDebt);
219
+ expect(mockMaxLeverage).not.toHaveBeenCalled();
220
+ });
221
+ it("returns minDebt when quotaLimit is zero", () => {
222
+ const maxLeverageValue = 10n * LEVERAGE_DECIMALS;
223
+ mockMaxLeverage.mockReturnValue(maxLeverageValue);
224
+ const quotaLimit = 0n;
225
+ const totalQuoted = 30000n;
226
+ const amount = 20000n;
227
+ const availableToBorrow = 100000n;
228
+ const creditManagerWithQuota = buildCreditManager({
229
+ availableToBorrow,
230
+ quotas: {
231
+ ...mockCreditManager.quotas,
232
+ [mockToken1]: {
233
+ ...mockCreditManager.quotas[mockToken1],
234
+ limit: quotaLimit,
235
+ totalQuoted
236
+ }
237
+ }
238
+ });
239
+ const result = calculateMaxStrategyDebt({
240
+ targetToken: mockToken1,
241
+ amount,
242
+ creditManager: creditManagerWithQuota,
243
+ slippage: 100,
244
+ constantLoss: 30n
245
+ });
246
+ expect(result).toEqual(mockCreditManager.minDebt);
247
+ expect(mockMaxLeverage).not.toHaveBeenCalled();
248
+ });
249
+ it("returns minDebt when effectiveMaxDebt is below minDebt", () => {
250
+ mockCalculateLossCoefficient.mockReturnValueOnce(PERCENTAGE_FACTOR);
251
+ const creditManager = buildCreditManager({
252
+ minDebt: 500n,
253
+ availableToBorrow: 50n,
254
+ maxDebt: 200n
255
+ });
256
+ const result = calculateMaxStrategyDebt({
257
+ targetToken: mockToken1,
258
+ amount: 0n,
259
+ creditManager,
260
+ slippage: 0,
261
+ constantLoss: 0n
262
+ });
263
+ expect(result).toEqual(creditManager.minDebt);
264
+ expect(mockMaxLeverage).not.toHaveBeenCalled();
265
+ });
266
+ it("clamps leveraged result to minDebt when effective debt is smaller", () => {
267
+ mockCalculateLossCoefficient.mockReturnValueOnce(PERCENTAGE_FACTOR);
268
+ const creditManager = buildCreditManager({
269
+ minDebt: 500n,
270
+ availableToBorrow: 2000n,
271
+ maxDebt: 2000n
272
+ });
273
+ mockMaxLeverage.mockReturnValue(1n);
274
+ const result = calculateMaxStrategyDebt({
275
+ targetToken: mockToken1,
276
+ amount: 100n,
277
+ creditManager,
278
+ slippage: 0,
279
+ constantLoss: 0n
280
+ });
281
+ expect(result).toEqual(creditManager.minDebt);
282
+ expect(mockMaxLeverage).toHaveBeenCalledTimes(1);
283
+ });
284
+ it("ignores quota when swapCollateral is false", () => {
285
+ const creditManagerWithQuota = buildCreditManager({
286
+ availableToBorrow: 100000n,
287
+ quotas: {
288
+ ...mockCreditManager.quotas,
289
+ [mockToken1]: {
290
+ ...mockCreditManager.quotas[mockToken1],
291
+ limit: 50000n,
292
+ totalQuoted: 40000n
293
+ }
294
+ }
295
+ });
296
+ const result = calculateMaxStrategyDebt({
297
+ targetToken: mockToken1,
298
+ amount: 0n,
299
+ creditManager: creditManagerWithQuota,
300
+ slippage: 100,
301
+ constantLoss: 30n,
302
+ swapCollateral: false
303
+ });
304
+ expect(result).toEqual(creditManagerWithQuota.availableToBorrow);
305
+ expect(mockMaxLeverage).not.toHaveBeenCalled();
306
+ });
307
+ it("should respect quota limit when amount is zero", () => {
308
+ const quotaLimit = 50000n;
309
+ const totalQuoted = 20000n;
310
+ const availableToBorrow = 100000n;
311
+ const creditManagerWithQuota = buildCreditManager({
312
+ availableToBorrow,
313
+ quotas: {
314
+ ...mockCreditManager.quotas,
315
+ [mockToken1]: {
316
+ ...mockCreditManager.quotas[mockToken1],
317
+ limit: quotaLimit,
318
+ totalQuoted
319
+ }
320
+ }
321
+ });
322
+ const result = calculateMaxStrategyDebt({
323
+ targetToken: mockToken1,
324
+ amount: 0n,
325
+ creditManager: creditManagerWithQuota,
326
+ slippage: 100,
327
+ constantLoss: 30n
328
+ });
329
+ expect(result).toBe(30000n);
330
+ expect(mockMaxLeverage).not.toHaveBeenCalled();
331
+ });
332
+ });
@@ -0,0 +1,10 @@
1
+ import { PERCENTAGE_FACTOR } from "../../../../sdk/constants/math.js";
2
+ function getCollateralByDebt(debt, lt, targetHF = PERCENTAGE_FACTOR) {
3
+ if (lt === 0n) return 0n;
4
+ if (targetHF === lt) return 0n;
5
+ const a = debt * (targetHF - lt) / lt;
6
+ return a;
7
+ }
8
+ export {
9
+ getCollateralByDebt
10
+ };
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { PERCENTAGE_FACTOR, WAD } from "../../../../sdk/constants/math.js";
3
+ import { toBN } from "../../../../sdk/utils/formatter.js";
4
+ import { getCollateralByDebt } from "./get-collateral-by-debt.js";
5
+ describe("getCollateralByDebt", () => {
6
+ it("returns full debt when target HF equals 1 and LT is 0.5", () => {
7
+ const debt = 1000000n;
8
+ const lt = toBN("0.5", 4);
9
+ const result = getCollateralByDebt(debt, lt);
10
+ expect(result).toBe(debt);
11
+ });
12
+ it("returns 0 when lt = hf", () => {
13
+ const debt = 1000000n;
14
+ const result = getCollateralByDebt(debt, PERCENTAGE_FACTOR);
15
+ expect(result).toBe(0n);
16
+ });
17
+ it("returns when lt = 0", () => {
18
+ const debt = 1000000n;
19
+ const result = getCollateralByDebt(debt, 0n);
20
+ expect(result).toBe(0n);
21
+ });
22
+ it("handles fractional LT and target HF values", () => {
23
+ const debt = 35n * WAD / 2n;
24
+ const lt = toBN("0.93", 4);
25
+ const targetHF = toBN("1.035", 4);
26
+ const result = getCollateralByDebt(debt, lt, targetHF);
27
+ expect(result).toBe(1975806451612903225n);
28
+ });
29
+ });
@@ -0,0 +1,61 @@
1
+ import { LEVERAGE_DECIMALS } from "../../../../sdk/constants/math.js";
2
+ import { calculateMaxLeverageFactor } from "./calculate-max-leverage-factor.js";
3
+ import { calculateMaxStrategyDebt } from "./calculate-max-strategy-debt.js";
4
+ import { getRecommendedLeverageFactor } from "./get-recommended-leverage-factor.js";
5
+ function getRecommendedDebt({
6
+ targetToken,
7
+ amount,
8
+ creditManager,
9
+ slippage,
10
+ maxLeverageConstantLoss,
11
+ maxDebtConstantLoss,
12
+ recommendedDebtConstantLoss = 3400n,
13
+ swapCollateral,
14
+ leverageLimit
15
+ }) {
16
+ const maxDebt = calculateMaxStrategyDebt({
17
+ targetToken,
18
+ amount,
19
+ creditManager,
20
+ slippage,
21
+ constantLoss: maxDebtConstantLoss,
22
+ swapCollateral
23
+ });
24
+ const recommendedLeverageFactor = getRecommendedLeverageFactor({
25
+ maxLeverageFactor: calculateMaxLeverageFactor({
26
+ targetToken,
27
+ creditManagers: [creditManager],
28
+ slippage,
29
+ leverageLimit,
30
+ constantLoss: maxLeverageConstantLoss
31
+ })
32
+ });
33
+ if (maxDebt === 0n || amount === 0n) {
34
+ return {
35
+ maxDebt,
36
+ recommended: {
37
+ factor: recommendedLeverageFactor,
38
+ debt: maxDebt
39
+ }
40
+ };
41
+ }
42
+ const recommendedMaxDebt = calculateMaxStrategyDebt({
43
+ targetToken,
44
+ amount,
45
+ creditManager,
46
+ slippage,
47
+ constantLoss: recommendedDebtConstantLoss,
48
+ swapCollateral
49
+ });
50
+ const leverageFactorOfMaxDebt = recommendedMaxDebt * LEVERAGE_DECIMALS / amount;
51
+ return {
52
+ maxDebt,
53
+ recommended: {
54
+ factor: leverageFactorOfMaxDebt,
55
+ debt: recommendedMaxDebt
56
+ }
57
+ };
58
+ }
59
+ export {
60
+ getRecommendedDebt
61
+ };
@@ -0,0 +1,226 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { LEVERAGE_DECIMALS } from "../../../../sdk/constants/math.js";
3
+ import { buildCreditManager, mockToken1 } from "../../../test-utils/index.js";
4
+ import { calculateMaxLeverageFactor } from "./calculate-max-leverage-factor.js";
5
+ import { calculateMaxStrategyDebt } from "./calculate-max-strategy-debt.js";
6
+ import { getRecommendedDebt } from "./get-recommended-debt.js";
7
+ vi.mock("./calculate-max-strategy-debt");
8
+ vi.mock(
9
+ "../../utils/strategies/leverage/calculate-max-leverage-factor.js",
10
+ async () => {
11
+ const actual = await vi.importActual(
12
+ "../../utils/strategies/leverage/calculate-max-leverage-factor.js"
13
+ );
14
+ return {
15
+ ...actual,
16
+ calculateMaxLeverageFactor: vi.fn(
17
+ actual.calculateMaxLeverageFactor
18
+ )
19
+ };
20
+ }
21
+ );
22
+ const mockCalculateMaxStrategyDebt = vi.mocked(calculateMaxStrategyDebt);
23
+ const mockCalculateMaxLeverageFactor = vi.mocked(calculateMaxLeverageFactor);
24
+ describe("getRecommendedDebt", () => {
25
+ const mockCreditManager = buildCreditManager({});
26
+ beforeEach(() => {
27
+ mockCalculateMaxStrategyDebt.mockReset();
28
+ mockCalculateMaxLeverageFactor.mockReset();
29
+ });
30
+ it("returns zero max debt with recommended factor when maxDebt is zero", () => {
31
+ const maxDebt = 0n;
32
+ mockCalculateMaxStrategyDebt.mockReturnValue(maxDebt);
33
+ mockCalculateMaxLeverageFactor.mockReturnValue(300n);
34
+ const result = getRecommendedDebt({
35
+ targetToken: mockToken1,
36
+ amount: 1000n,
37
+ creditManager: mockCreditManager,
38
+ slippage: 100,
39
+ maxDebtConstantLoss: 30n,
40
+ swapCollateral: true,
41
+ leverageLimit: void 0
42
+ });
43
+ expect(mockCalculateMaxStrategyDebt).toHaveBeenCalledWith({
44
+ targetToken: mockToken1,
45
+ amount: 1000n,
46
+ creditManager: mockCreditManager,
47
+ slippage: 100,
48
+ constantLoss: 30n,
49
+ swapCollateral: true
50
+ });
51
+ expect(mockCalculateMaxLeverageFactor).toHaveBeenCalledWith({
52
+ targetToken: mockToken1,
53
+ creditManagers: [mockCreditManager],
54
+ slippage: 100,
55
+ leverageLimit: void 0
56
+ });
57
+ expect(result).toEqual({
58
+ maxDebt,
59
+ recommended: {
60
+ factor: 210n,
61
+ debt: maxDebt
62
+ }
63
+ });
64
+ });
65
+ it("returns zero max debt with recommended factor when amount is zero", () => {
66
+ const maxDebt = 500n;
67
+ mockCalculateMaxStrategyDebt.mockReturnValue(maxDebt);
68
+ mockCalculateMaxLeverageFactor.mockReturnValue(300n);
69
+ const result = getRecommendedDebt({
70
+ targetToken: mockToken1,
71
+ amount: 0n,
72
+ creditManager: mockCreditManager,
73
+ slippage: 100,
74
+ maxDebtConstantLoss: 30n,
75
+ swapCollateral: true,
76
+ leverageLimit: void 0
77
+ });
78
+ expect(mockCalculateMaxStrategyDebt).toHaveBeenCalledWith({
79
+ targetToken: mockToken1,
80
+ amount: 0n,
81
+ creditManager: mockCreditManager,
82
+ slippage: 100,
83
+ constantLoss: 30n,
84
+ swapCollateral: true
85
+ });
86
+ expect(mockCalculateMaxLeverageFactor).toHaveBeenCalledWith({
87
+ targetToken: mockToken1,
88
+ creditManagers: [mockCreditManager],
89
+ slippage: 100,
90
+ leverageLimit: void 0
91
+ });
92
+ expect(result).toEqual({
93
+ maxDebt,
94
+ recommended: {
95
+ factor: 210n,
96
+ debt: maxDebt
97
+ }
98
+ });
99
+ });
100
+ it("returns recommended debt using adjusted constant loss when amount and maxDebt are positive", () => {
101
+ const maxDebt = 5000n;
102
+ const recommendedMaxDebt = 3500n;
103
+ const amount = 1000n;
104
+ const leverageLimit = Number(4n * LEVERAGE_DECIMALS);
105
+ mockCalculateMaxStrategyDebt.mockReturnValueOnce(maxDebt).mockReturnValueOnce(recommendedMaxDebt);
106
+ mockCalculateMaxLeverageFactor.mockReturnValue(450n);
107
+ const result = getRecommendedDebt({
108
+ targetToken: mockToken1,
109
+ amount,
110
+ creditManager: mockCreditManager,
111
+ slippage: 50,
112
+ maxDebtConstantLoss: 75n,
113
+ swapCollateral: false,
114
+ leverageLimit
115
+ });
116
+ expect(mockCalculateMaxStrategyDebt).toHaveBeenNthCalledWith(1, {
117
+ targetToken: mockToken1,
118
+ amount,
119
+ creditManager: mockCreditManager,
120
+ slippage: 50,
121
+ constantLoss: 75n,
122
+ swapCollateral: false
123
+ });
124
+ expect(mockCalculateMaxStrategyDebt).toHaveBeenNthCalledWith(2, {
125
+ targetToken: mockToken1,
126
+ amount,
127
+ creditManager: mockCreditManager,
128
+ slippage: 50,
129
+ constantLoss: 3400n,
130
+ swapCollateral: false
131
+ });
132
+ expect(mockCalculateMaxLeverageFactor).toHaveBeenCalledWith({
133
+ targetToken: mockToken1,
134
+ creditManagers: [mockCreditManager],
135
+ slippage: 50,
136
+ leverageLimit
137
+ });
138
+ expect(result).toEqual({
139
+ maxDebt,
140
+ recommended: {
141
+ factor: recommendedMaxDebt * LEVERAGE_DECIMALS / amount,
142
+ debt: recommendedMaxDebt
143
+ }
144
+ });
145
+ });
146
+ it("passes maxLeverageConstantLoss through to leverage calculation", () => {
147
+ const maxDebt = 2000n;
148
+ const recommendedMaxDebt = 1000n;
149
+ const amount = 500n;
150
+ const maxLeverageConstantLoss = 999n;
151
+ const maxDebtConstantLoss = 55n;
152
+ const recommendedDebtConstantLoss = 777n;
153
+ mockCalculateMaxStrategyDebt.mockReturnValueOnce(maxDebt).mockReturnValueOnce(recommendedMaxDebt);
154
+ mockCalculateMaxLeverageFactor.mockReturnValue(420n);
155
+ const result = getRecommendedDebt({
156
+ targetToken: mockToken1,
157
+ amount,
158
+ creditManager: mockCreditManager,
159
+ slippage: 25,
160
+ maxLeverageConstantLoss,
161
+ maxDebtConstantLoss,
162
+ recommendedDebtConstantLoss,
163
+ swapCollateral: true,
164
+ leverageLimit: 123
165
+ });
166
+ expect(mockCalculateMaxStrategyDebt).toHaveBeenNthCalledWith(1, {
167
+ targetToken: mockToken1,
168
+ amount,
169
+ creditManager: mockCreditManager,
170
+ slippage: 25,
171
+ constantLoss: maxDebtConstantLoss,
172
+ swapCollateral: true
173
+ });
174
+ expect(mockCalculateMaxLeverageFactor).toHaveBeenCalledWith({
175
+ targetToken: mockToken1,
176
+ creditManagers: [mockCreditManager],
177
+ slippage: 25,
178
+ leverageLimit: 123,
179
+ constantLoss: maxLeverageConstantLoss
180
+ });
181
+ expect(mockCalculateMaxStrategyDebt).toHaveBeenNthCalledWith(2, {
182
+ targetToken: mockToken1,
183
+ amount,
184
+ creditManager: mockCreditManager,
185
+ slippage: 25,
186
+ constantLoss: recommendedDebtConstantLoss,
187
+ swapCollateral: true
188
+ });
189
+ expect(result).toEqual({
190
+ maxDebt,
191
+ recommended: {
192
+ factor: 200n,
193
+ debt: recommendedMaxDebt
194
+ }
195
+ });
196
+ });
197
+ it("uses custom recommendedDebtConstantLoss when provided", () => {
198
+ const maxDebt = 10000n;
199
+ const recommendedMaxDebt = 6000n;
200
+ const amount = 2000n;
201
+ const recommendedDebtConstantLoss = 1234n;
202
+ mockCalculateMaxStrategyDebt.mockReturnValueOnce(maxDebt).mockReturnValueOnce(recommendedMaxDebt);
203
+ mockCalculateMaxLeverageFactor.mockReturnValue(800n);
204
+ const result = getRecommendedDebt({
205
+ targetToken: mockToken1,
206
+ amount,
207
+ creditManager: mockCreditManager,
208
+ slippage: 15,
209
+ maxDebtConstantLoss: 60n,
210
+ maxLeverageConstantLoss: 70n,
211
+ recommendedDebtConstantLoss,
212
+ swapCollateral: false,
213
+ leverageLimit: void 0
214
+ });
215
+ expect(mockCalculateMaxStrategyDebt).toHaveBeenNthCalledWith(2, {
216
+ targetToken: mockToken1,
217
+ amount,
218
+ creditManager: mockCreditManager,
219
+ slippage: 15,
220
+ constantLoss: recommendedDebtConstantLoss,
221
+ swapCollateral: false
222
+ });
223
+ expect(result.recommended.debt).toBe(recommendedMaxDebt);
224
+ expect(result.recommended.factor).toBe(300n);
225
+ });
226
+ });