@gearbox-protocol/sdk 14.10.1 → 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 (206) 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/sdk/constants/math.js +3 -0
  68. package/dist/esm/common-utils/test-utils/index.js +104 -0
  69. package/dist/esm/common-utils/utils/apy/calculate-borrow-rate-from-utilization.js +35 -0
  70. package/dist/esm/common-utils/utils/apy/calculate-borrow-rate-from-utilization.spec.js +31 -0
  71. package/dist/esm/common-utils/utils/apy/calculate-earnings.js +35 -0
  72. package/dist/esm/common-utils/utils/apy/calculate-earnings.spec.js +65 -0
  73. package/dist/esm/common-utils/utils/apy/calculate-safe-borrow-rate.js +34 -0
  74. package/dist/esm/common-utils/utils/apy/calculate-safe-borrow-rate.spec.js +38 -0
  75. package/dist/esm/common-utils/utils/apy/get-safe-base-borrow-rate.js +16 -0
  76. package/dist/esm/common-utils/utils/constants.js +8 -0
  77. package/dist/esm/common-utils/utils/strategies/assets/assets.js +6 -0
  78. package/dist/esm/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.js +38 -0
  79. package/dist/esm/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.spec.js +115 -0
  80. package/dist/esm/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.js +51 -0
  81. package/dist/esm/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.spec.js +96 -0
  82. package/dist/esm/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.js +42 -0
  83. package/dist/esm/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.spec.js +332 -0
  84. package/dist/esm/common-utils/utils/strategies/leverage/get-collateral-by-debt.js +10 -0
  85. package/dist/esm/common-utils/utils/strategies/leverage/get-collateral-by-debt.spec.js +29 -0
  86. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-debt.js +61 -0
  87. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-debt.spec.js +226 -0
  88. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.js +9 -0
  89. package/dist/esm/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.spec.js +22 -0
  90. package/dist/esm/common-utils/utils/strategies/leverage/max-leverage.js +2 -2
  91. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-apy.js +88 -0
  92. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-apy.spec.js +187 -0
  93. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-points.js +54 -0
  94. package/dist/esm/common-utils/utils/strategies/strategy-info/calculate-total-points.spec.js +139 -0
  95. package/dist/esm/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.js +389 -0
  96. package/dist/esm/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.spec.js +278 -0
  97. package/dist/esm/common-utils/utils/strategies/strategy-info/get-strategy-you-can-earn.js +84 -0
  98. package/dist/esm/common-utils/utils/strategies/tokens/add-amount-in-target.js +17 -0
  99. package/dist/esm/common-utils/utils/strategies/tokens/add-amount-in-target.spec.js +41 -0
  100. package/dist/esm/common-utils/utils/strategies/tokens/get-chain-phantom-tokens.js +11 -0
  101. package/dist/esm/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.js +18 -0
  102. package/dist/esm/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.spec.js +36 -0
  103. package/dist/esm/common-utils/utils/strategies/tokens/get-native-token-address.js +7 -0
  104. package/dist/esm/common-utils/utils/strategies/tokens/is-apy-with-points-exception.js +11 -0
  105. package/dist/esm/common-utils/utils/strategies/tokens/is-collateral-token.js +35 -0
  106. package/dist/esm/common-utils/utils/strategies/tokens/is-collateral-token.spec.js +137 -0
  107. package/dist/esm/common-utils/utils/strategies/tokens/is-obtainable-token.js +18 -0
  108. package/dist/esm/common-utils/utils/strategies/tokens/is-obtainable-token.spec.js +161 -0
  109. package/dist/esm/common-utils/utils/strategies/tokens/is-valid-extra-collateral-token.js +27 -0
  110. package/dist/esm/common-utils/utils/strategies/tokens/wrap-token-address.js +9 -0
  111. package/dist/esm/common-utils/utils/strategies/tokens/wrap-token-address.spec.js +12 -0
  112. package/dist/esm/common-utils/utils/strategies/types/strategy-data.js +0 -0
  113. package/dist/esm/common-utils/utils/strategies/types/strategy-earnings.js +0 -0
  114. package/dist/esm/common-utils/utils/validation/is-zero-balance.js +6 -0
  115. package/dist/esm/common-utils/utils/validation/validate-balance.js +23 -0
  116. package/dist/esm/common-utils/utils/validation/validate-balance.spec.js +51 -0
  117. package/dist/esm/common-utils/utils/validation/validate-balances.js +20 -0
  118. package/dist/esm/common-utils/utils/validation/validate-balances.spec.js +36 -0
  119. package/dist/esm/common-utils/utils/validation/validate-credit-manager.js +10 -0
  120. package/dist/esm/common-utils/utils/validation/validate-credit-manager.spec.js +35 -0
  121. package/dist/esm/common-utils/utils/validation/validate-hf.js +13 -0
  122. package/dist/esm/common-utils/utils/validation/validate-hf.spec.js +23 -0
  123. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-quota-status.js +13 -0
  124. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-quota-status.spec.js +46 -0
  125. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-status.js +54 -0
  126. package/dist/esm/common-utils/utils/validation/validate-open-account-pool-status.spec.js +102 -0
  127. package/dist/esm/common-utils/utils/validation/validate-open-account.js +17 -0
  128. package/dist/esm/common-utils/utils/validation/validate-open-account.spec.js +56 -0
  129. package/dist/esm/common-utils/utils/validation/validate-quota.js +25 -0
  130. package/dist/esm/common-utils/utils/validation/validate-quota.spec.js +83 -0
  131. package/dist/esm/common-utils/utils/validation/validate-token-to-obtain.js +18 -0
  132. package/dist/esm/common-utils/utils/validation/validate-token-to-obtain.spec.js +34 -0
  133. package/dist/esm/common-utils/utils/validation/validation-types.js +0 -0
  134. package/dist/esm/sdk/constants/math.js +2 -0
  135. package/dist/types/common-utils/test-utils/index.d.ts +16 -0
  136. package/dist/types/common-utils/utils/apy/calculate-borrow-rate-from-utilization.d.ts +2 -0
  137. package/dist/types/common-utils/utils/apy/calculate-borrow-rate-from-utilization.spec.d.ts +1 -0
  138. package/dist/types/common-utils/utils/apy/calculate-earnings.d.ts +16 -0
  139. package/dist/types/common-utils/utils/apy/calculate-earnings.spec.d.ts +1 -0
  140. package/dist/types/common-utils/utils/apy/calculate-safe-borrow-rate.d.ts +11 -0
  141. package/dist/types/common-utils/utils/apy/calculate-safe-borrow-rate.spec.d.ts +1 -0
  142. package/dist/types/common-utils/utils/apy/get-safe-base-borrow-rate.d.ts +4 -0
  143. package/dist/types/common-utils/utils/constants.d.ts +4 -0
  144. package/dist/types/common-utils/utils/strategies/assets/assets.d.ts +3 -0
  145. package/dist/types/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.d.ts +20 -0
  146. package/dist/types/common-utils/utils/strategies/credit-managers/get-cm-allowed-collaterals.spec.d.ts +1 -0
  147. package/dist/types/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.d.ts +13 -0
  148. package/dist/types/common-utils/utils/strategies/credit-managers/get-wallet-balances-allowed-on-cm.spec.d.ts +1 -0
  149. package/dist/types/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.d.ts +11 -0
  150. package/dist/types/common-utils/utils/strategies/leverage/calculate-max-strategy-debt.spec.d.ts +1 -0
  151. package/dist/types/common-utils/utils/strategies/leverage/get-collateral-by-debt.d.ts +2 -0
  152. package/dist/types/common-utils/utils/strategies/leverage/get-collateral-by-debt.spec.d.ts +1 -0
  153. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-debt.d.ts +21 -0
  154. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-debt.spec.d.ts +1 -0
  155. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.d.ts +4 -0
  156. package/dist/types/common-utils/utils/strategies/leverage/get-recommended-leverage-factor.spec.d.ts +1 -0
  157. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-apy.d.ts +28 -0
  158. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-apy.spec.d.ts +1 -0
  159. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-points.d.ts +22 -0
  160. package/dist/types/common-utils/utils/strategies/strategy-info/calculate-total-points.spec.d.ts +1 -0
  161. package/dist/types/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.d.ts +19 -0
  162. package/dist/types/common-utils/utils/strategies/strategy-info/get-cm-you-can-earn.spec.d.ts +1 -0
  163. package/dist/types/common-utils/utils/strategies/strategy-info/get-strategy-you-can-earn.d.ts +29 -0
  164. package/dist/types/common-utils/utils/strategies/tokens/add-amount-in-target.d.ts +6 -0
  165. package/dist/types/common-utils/utils/strategies/tokens/add-amount-in-target.spec.d.ts +1 -0
  166. package/dist/types/common-utils/utils/strategies/tokens/get-chain-phantom-tokens.d.ts +6 -0
  167. package/dist/types/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.d.ts +12 -0
  168. package/dist/types/common-utils/utils/strategies/tokens/get-list-with-amount-in-target.spec.d.ts +1 -0
  169. package/dist/types/common-utils/utils/strategies/tokens/get-native-token-address.d.ts +1 -0
  170. package/dist/types/common-utils/utils/strategies/tokens/is-apy-with-points-exception.d.ts +3 -0
  171. package/dist/types/common-utils/utils/strategies/tokens/is-collateral-token.d.ts +16 -0
  172. package/dist/types/common-utils/utils/strategies/tokens/is-collateral-token.spec.d.ts +1 -0
  173. package/dist/types/common-utils/utils/strategies/tokens/is-obtainable-token.d.ts +14 -0
  174. package/dist/types/common-utils/utils/strategies/tokens/is-obtainable-token.spec.d.ts +1 -0
  175. package/dist/types/common-utils/utils/strategies/tokens/is-valid-extra-collateral-token.d.ts +20 -0
  176. package/dist/types/common-utils/utils/strategies/tokens/wrap-token-address.d.ts +2 -0
  177. package/dist/types/common-utils/utils/strategies/tokens/wrap-token-address.spec.d.ts +1 -0
  178. package/dist/types/common-utils/utils/strategies/types/index.d.ts +2 -1
  179. package/dist/types/common-utils/utils/strategies/types/strategy-data.d.ts +64 -0
  180. package/dist/types/common-utils/utils/strategies/types/strategy-earnings.d.ts +43 -0
  181. package/dist/types/common-utils/utils/validation/is-zero-balance.d.ts +1 -0
  182. package/dist/types/common-utils/utils/validation/validate-balance.d.ts +22 -0
  183. package/dist/types/common-utils/utils/validation/validate-balance.spec.d.ts +1 -0
  184. package/dist/types/common-utils/utils/validation/validate-balances.d.ts +9 -0
  185. package/dist/types/common-utils/utils/validation/validate-balances.spec.d.ts +1 -0
  186. package/dist/types/common-utils/utils/validation/validate-credit-manager.d.ts +10 -0
  187. package/dist/types/common-utils/utils/validation/validate-credit-manager.spec.d.ts +1 -0
  188. package/dist/types/common-utils/utils/validation/validate-hf.d.ts +9 -0
  189. package/dist/types/common-utils/utils/validation/validate-hf.spec.d.ts +1 -0
  190. package/dist/types/common-utils/utils/validation/validate-open-account-pool-quota-status.d.ts +7 -0
  191. package/dist/types/common-utils/utils/validation/validate-open-account-pool-quota-status.spec.d.ts +1 -0
  192. package/dist/types/common-utils/utils/validation/validate-open-account-pool-status.d.ts +23 -0
  193. package/dist/types/common-utils/utils/validation/validate-open-account-pool-status.spec.d.ts +1 -0
  194. package/dist/types/common-utils/utils/validation/validate-open-account.d.ts +21 -0
  195. package/dist/types/common-utils/utils/validation/validate-open-account.spec.d.ts +1 -0
  196. package/dist/types/common-utils/utils/validation/validate-quota.d.ts +20 -0
  197. package/dist/types/common-utils/utils/validation/validate-quota.spec.d.ts +1 -0
  198. package/dist/types/common-utils/utils/validation/validate-token-to-obtain.d.ts +13 -0
  199. package/dist/types/common-utils/utils/validation/validate-token-to-obtain.spec.d.ts +1 -0
  200. package/dist/types/common-utils/utils/validation/validation-types.d.ts +14 -0
  201. package/dist/types/dev/RevolverTransport.d.ts +4 -4
  202. package/dist/types/sdk/constants/math.d.ts +1 -0
  203. package/package.json +1 -1
  204. package/dist/cjs/common-utils/utils/strategies/__test-utils.js +0 -95
  205. package/dist/esm/common-utils/utils/strategies/__test-utils.js +0 -65
  206. package/dist/types/common-utils/utils/strategies/__test-utils.d.ts +0 -11
@@ -0,0 +1,51 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { mockToken1 } from "../../test-utils/index.js";
3
+ import { validateBalance } from "./validate-balance.js";
4
+ describe("validateBalance", () => {
5
+ it("returns null when all conditions are met", () => {
6
+ const result = validateBalance({
7
+ amount: 1000n,
8
+ tokenAddress: mockToken1,
9
+ maxAmount: 2000n,
10
+ zeroCheck: true,
11
+ single: false
12
+ });
13
+ expect(result).toBeNull();
14
+ });
15
+ it("returns error when amount exceeds maxAmount", () => {
16
+ const result = validateBalance({
17
+ amount: 3000n,
18
+ tokenAddress: mockToken1,
19
+ maxAmount: 2000n,
20
+ zeroCheck: true,
21
+ single: false
22
+ });
23
+ expect(result).toEqual({
24
+ message: "insufficientFunds",
25
+ token: mockToken1
26
+ });
27
+ });
28
+ it("returns error when amount is too small with zeroCheck", () => {
29
+ const result = validateBalance({
30
+ amount: 5n,
31
+ tokenAddress: mockToken1,
32
+ maxAmount: 2000n,
33
+ zeroCheck: true,
34
+ single: false
35
+ });
36
+ expect(result).toEqual({
37
+ message: "zeroBalance",
38
+ token: mockToken1
39
+ });
40
+ });
41
+ it("returns null when zeroCheck is false and amount is small", () => {
42
+ const result = validateBalance({
43
+ amount: 5n,
44
+ tokenAddress: mockToken1,
45
+ maxAmount: 2000n,
46
+ zeroCheck: false,
47
+ single: false
48
+ });
49
+ expect(result).toBeNull();
50
+ });
51
+ });
@@ -0,0 +1,20 @@
1
+ import { validateBalance } from "./validate-balance.js";
2
+ function validateBalances({
3
+ balances,
4
+ assets,
5
+ zeroCheck = true
6
+ }) {
7
+ for (const { token: tokenAddress, balance: amount } of assets) {
8
+ const e = validateBalance({
9
+ tokenAddress,
10
+ amount,
11
+ maxAmount: balances[(tokenAddress || "").toLowerCase()] || 0n,
12
+ zeroCheck
13
+ });
14
+ if (e !== null) return e;
15
+ }
16
+ return null;
17
+ }
18
+ export {
19
+ validateBalances
20
+ };
@@ -0,0 +1,36 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { mockToken1, mockToken2 } from "../../test-utils/index.js";
3
+ import { validateBalances } from "./validate-balances.js";
4
+ describe("validateBalances", () => {
5
+ it("returns null when all balances are valid", () => {
6
+ const result = validateBalances({
7
+ balances: {
8
+ [mockToken1]: 2000n,
9
+ [mockToken2]: 3000n
10
+ },
11
+ assets: [
12
+ { token: mockToken1, balance: 1000n },
13
+ { token: mockToken2, balance: 2000n }
14
+ ],
15
+ zeroCheck: true
16
+ });
17
+ expect(result).toBeNull();
18
+ });
19
+ it("returns error when any balance is invalid", () => {
20
+ const result = validateBalances({
21
+ balances: {
22
+ [mockToken1]: 500n,
23
+ [mockToken2]: 3000n
24
+ },
25
+ assets: [
26
+ { token: mockToken1, balance: 1000n },
27
+ { token: mockToken2, balance: 2000n }
28
+ ],
29
+ zeroCheck: true
30
+ });
31
+ expect(result).toEqual({
32
+ message: "insufficientFunds",
33
+ token: mockToken1
34
+ });
35
+ });
36
+ });
@@ -0,0 +1,10 @@
1
+ function validateCreditManager({
2
+ creditManager,
3
+ allowPausedCm
4
+ }) {
5
+ if (creditManager.isPaused && !allowPausedCm) return { message: "paused" };
6
+ return null;
7
+ }
8
+ export {
9
+ validateCreditManager
10
+ };
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildCreditManager } from "../../test-utils/index.js";
3
+ import { validateCreditManager } from "./validate-credit-manager.js";
4
+ const mockCreditManager = buildCreditManager({
5
+ isPaused: false
6
+ });
7
+ describe("validateCreditManager", () => {
8
+ it("returns null when credit manager is not paused", () => {
9
+ const result = validateCreditManager({
10
+ creditManager: mockCreditManager,
11
+ allowPausedCm: false
12
+ });
13
+ expect(result).toBeNull();
14
+ });
15
+ it("returns null when credit manager is paused but allowed", () => {
16
+ const result = validateCreditManager({
17
+ creditManager: buildCreditManager({
18
+ ...mockCreditManager,
19
+ isPaused: true
20
+ }),
21
+ allowPausedCm: true
22
+ });
23
+ expect(result).toBeNull();
24
+ });
25
+ it("returns error when credit manager is paused and not allowed", () => {
26
+ const result = validateCreditManager({
27
+ creditManager: buildCreditManager({
28
+ ...mockCreditManager,
29
+ isPaused: true
30
+ }),
31
+ allowPausedCm: false
32
+ });
33
+ expect(result).toEqual({ message: "paused" });
34
+ });
35
+ });
@@ -0,0 +1,13 @@
1
+ const MIN_HF_LIMITED = 10100n;
2
+ function validateHF({
3
+ hf,
4
+ hfCheck = true
5
+ }) {
6
+ if (hfCheck && (hf === void 0 || hf <= MIN_HF_LIMITED))
7
+ return { message: "hfTooLow" };
8
+ return null;
9
+ }
10
+ export {
11
+ MIN_HF_LIMITED,
12
+ validateHF
13
+ };
@@ -0,0 +1,23 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { MIN_HF_LIMITED, validateHF } from "./validate-hf.js";
3
+ describe("validateHF", () => {
4
+ it("returns null when HF is above minimum", () => {
5
+ const result = validateHF({ hf: 15e3 });
6
+ expect(result).toBeNull();
7
+ });
8
+ it("returns error when HF is undefined", () => {
9
+ const result = validateHF({ hf: void 0 });
10
+ expect(result).toEqual({ message: "hfTooLow" });
11
+ });
12
+ it("returns error when HF is too low", () => {
13
+ const result = validateHF({ hf: Number(MIN_HF_LIMITED) });
14
+ expect(result).toEqual({ message: "hfTooLow" });
15
+ });
16
+ it("returns null when hfCheck is false and HF is too low", () => {
17
+ const result = validateHF({
18
+ hf: Number(MIN_HF_LIMITED - 1n),
19
+ hfCheck: false
20
+ });
21
+ expect(result).toBeNull();
22
+ });
23
+ });
@@ -0,0 +1,13 @@
1
+ function validateOpenAccountPoolQuotaStatus(targetToken, creditManager, amountToBorrow) {
2
+ const quota = creditManager.quotas[targetToken];
3
+ if (quota) {
4
+ const realLimit = quota.isActive ? quota.limit : 0n;
5
+ const quotaLeft = realLimit - quota.totalQuoted;
6
+ if (quotaLeft < amountToBorrow)
7
+ return { message: "insufficientQuota", token: targetToken };
8
+ }
9
+ return null;
10
+ }
11
+ export {
12
+ validateOpenAccountPoolQuotaStatus
13
+ };
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ buildCreditManager,
4
+ buildQuota,
5
+ mockToken1
6
+ } from "../../test-utils/index.js";
7
+ import { validateOpenAccountPoolQuotaStatus } from "./validate-open-account-pool-quota-status.js";
8
+ const mockCreditManager = buildCreditManager({
9
+ quotas: {
10
+ [mockToken1]: buildQuota({
11
+ token: mockToken1,
12
+ limit: 1000000n,
13
+ totalQuoted: 500000n,
14
+ rate: 0n
15
+ })
16
+ }
17
+ });
18
+ describe("validateOpenAccountPoolQuotaStatus", () => {
19
+ it("returns null when quota is sufficient", () => {
20
+ const result = validateOpenAccountPoolQuotaStatus(
21
+ mockToken1,
22
+ mockCreditManager,
23
+ 100000n
24
+ );
25
+ expect(result).toBeNull();
26
+ });
27
+ it("returns error when quota is insufficient", () => {
28
+ const result = validateOpenAccountPoolQuotaStatus(
29
+ mockToken1,
30
+ mockCreditManager,
31
+ 600000n
32
+ );
33
+ expect(result).toEqual({
34
+ message: "insufficientQuota",
35
+ token: mockToken1
36
+ });
37
+ });
38
+ it("returns null when token has no quota", () => {
39
+ const result = validateOpenAccountPoolQuotaStatus(
40
+ "0x9999999999999999999999999999999999999999",
41
+ mockCreditManager,
42
+ 100000n
43
+ );
44
+ expect(result).toBeNull();
45
+ });
46
+ });
@@ -0,0 +1,54 @@
1
+ import { BigIntMath } from "../bigint-math.js";
2
+ import {
3
+ validateOpenAccountPoolQuotaStatus
4
+ } from "./validate-open-account-pool-quota-status.js";
5
+ function validateOpenAccountPoolStatus(props) {
6
+ const { debt, creditManager, pool, targetToken } = props;
7
+ const effectiveDebt = BigIntMath.max(creditManager.minDebt, debt);
8
+ const hasDebtLimit = creditManager.totalDebtLimit >= 0n;
9
+ const debtLimitLeft = BigIntMath.max(
10
+ creditManager.totalDebtLimit - creditManager.totalDebt,
11
+ 0n
12
+ );
13
+ const { totalDebtLimit = 0n, totalBorrowed = 0n } = pool || {};
14
+ const hasPoolDebtLimit = totalDebtLimit > 0n;
15
+ const poolDebtLimitLeft = totalDebtLimit - totalBorrowed;
16
+ const canOpenMinDebt = creditManager.minDebt <= debtLimitLeft && creditManager.minDebt <= poolDebtLimitLeft && creditManager.minDebt <= creditManager.availableToBorrow;
17
+ const minPositionSize = BigIntMath.min(
18
+ BigIntMath.min(debtLimitLeft, poolDebtLimitLeft),
19
+ creditManager.availableToBorrow
20
+ );
21
+ if (hasDebtLimit && effectiveDebt > debtLimitLeft) {
22
+ return {
23
+ message: "insufficientDebtLimit",
24
+ amount: debtLimitLeft,
25
+ solutionAmount: canOpenMinDebt ? minPositionSize : void 0
26
+ };
27
+ }
28
+ if (hasPoolDebtLimit && effectiveDebt > poolDebtLimitLeft) {
29
+ return {
30
+ message: "insufficientPoolDebtLimit",
31
+ amount: poolDebtLimitLeft,
32
+ solutionAmount: canOpenMinDebt ? minPositionSize : void 0
33
+ };
34
+ }
35
+ if (effectiveDebt > creditManager.availableToBorrow) {
36
+ return {
37
+ message: "insufficientPoolLiquidity",
38
+ amount: creditManager.availableToBorrow,
39
+ solutionAmount: canOpenMinDebt ? minPositionSize : void 0
40
+ };
41
+ }
42
+ if (targetToken !== null) {
43
+ const quotaError = validateOpenAccountPoolQuotaStatus(
44
+ targetToken,
45
+ creditManager,
46
+ effectiveDebt
47
+ );
48
+ if (quotaError) return quotaError;
49
+ }
50
+ return null;
51
+ }
52
+ export {
53
+ validateOpenAccountPoolStatus
54
+ };
@@ -0,0 +1,102 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ buildCreditManager,
4
+ buildPool,
5
+ buildQuota,
6
+ mockToken1
7
+ } from "../../test-utils/index.js";
8
+ import { validateOpenAccountPoolStatus } from "./validate-open-account-pool-status.js";
9
+ const mockCreditManager = buildCreditManager({
10
+ minDebt: 1000n,
11
+ maxDebt: 1000000n,
12
+ totalDebtLimit: 5000000n,
13
+ totalDebt: 2000000n,
14
+ availableToBorrow: 3000000n,
15
+ quotas: {
16
+ [mockToken1]: buildQuota({
17
+ token: mockToken1,
18
+ limit: 1000000n,
19
+ totalQuoted: 500000n,
20
+ rate: 0n
21
+ })
22
+ }
23
+ });
24
+ const mockPool = buildPool({
25
+ totalDebtLimit: 10000000n,
26
+ totalBorrowed: 5000000n
27
+ });
28
+ describe("validateOpenAccountPoolStatus", () => {
29
+ it("returns null when all conditions are met", () => {
30
+ const result = validateOpenAccountPoolStatus({
31
+ debt: 50000n,
32
+ creditManager: mockCreditManager,
33
+ pool: mockPool,
34
+ targetToken: mockToken1
35
+ });
36
+ expect(result).toBeNull();
37
+ });
38
+ it("returns error when debt exceeds debt limit", () => {
39
+ const result = validateOpenAccountPoolStatus({
40
+ debt: 4000000n,
41
+ creditManager: mockCreditManager,
42
+ pool: mockPool,
43
+ targetToken: mockToken1
44
+ });
45
+ expect(result).toEqual({
46
+ message: "insufficientDebtLimit",
47
+ amount: 3000000n,
48
+ solutionAmount: 3000000n
49
+ });
50
+ });
51
+ it("returns error when debt exceeds pool debt limit", () => {
52
+ const result = validateOpenAccountPoolStatus({
53
+ debt: 6000000n,
54
+ creditManager: buildCreditManager({
55
+ ...mockCreditManager,
56
+ totalDebtLimit: -1n
57
+ }),
58
+ pool: mockPool,
59
+ targetToken: mockToken1
60
+ });
61
+ expect(result).toEqual({
62
+ message: "insufficientPoolDebtLimit",
63
+ amount: 5000000n
64
+ });
65
+ });
66
+ it("returns error when debt exceeds available liquidity", () => {
67
+ const result = validateOpenAccountPoolStatus({
68
+ debt: 4000000n,
69
+ creditManager: buildCreditManager({
70
+ ...mockCreditManager,
71
+ totalDebtLimit: -1n
72
+ }),
73
+ pool: buildPool({ totalDebtLimit: -1n }),
74
+ targetToken: mockToken1
75
+ });
76
+ expect(result).toEqual({
77
+ message: "insufficientPoolLiquidity",
78
+ amount: 3000000n
79
+ });
80
+ });
81
+ it("returns error when quota is insufficient", () => {
82
+ const result = validateOpenAccountPoolStatus({
83
+ debt: 600000n,
84
+ creditManager: mockCreditManager,
85
+ pool: mockPool,
86
+ targetToken: mockToken1
87
+ });
88
+ expect(result).toEqual({
89
+ message: "insufficientQuota",
90
+ token: mockToken1
91
+ });
92
+ });
93
+ it("returns null when targetToken is null", () => {
94
+ const result = validateOpenAccountPoolStatus({
95
+ debt: 50000n,
96
+ creditManager: mockCreditManager,
97
+ pool: mockPool,
98
+ targetToken: null
99
+ });
100
+ expect(result).toBeNull();
101
+ });
102
+ });
@@ -0,0 +1,17 @@
1
+ import { validateQuota } from "./validate-quota.js";
2
+ function validateOpenAccount(props) {
3
+ const { debt, creditManager, loading } = props;
4
+ if (loading) {
5
+ return { message: "loading" };
6
+ }
7
+ if (debt < creditManager.minDebt) {
8
+ return { message: "amountLessMin", amount: creditManager.minDebt };
9
+ }
10
+ if (debt > creditManager.maxDebt) {
11
+ return { message: "debtGreaterMax", amount: creditManager.maxDebt };
12
+ }
13
+ return validateQuota(props);
14
+ }
15
+ export {
16
+ validateOpenAccount
17
+ };
@@ -0,0 +1,56 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ buildCreditManager,
4
+ mockUnderlyingToken
5
+ } from "../../test-utils/index.js";
6
+ import { validateOpenAccount } from "./validate-open-account.js";
7
+ const mockCreditManager = buildCreditManager({
8
+ minDebt: 1000n,
9
+ maxDebt: 1000000n,
10
+ underlyingToken: mockUnderlyingToken
11
+ });
12
+ describe("validateOpenAccount", () => {
13
+ it("returns null when all conditions are met", () => {
14
+ const result = validateOpenAccount({
15
+ debt: 50000n,
16
+ creditManager: mockCreditManager,
17
+ desiredQuota: {},
18
+ quotaUpdate: []
19
+ });
20
+ expect(result).toBeNull();
21
+ });
22
+ it("returns loading error when loading is true", () => {
23
+ const result = validateOpenAccount({
24
+ debt: 50000n,
25
+ creditManager: mockCreditManager,
26
+ desiredQuota: {},
27
+ quotaUpdate: [],
28
+ loading: true
29
+ });
30
+ expect(result).toEqual({ message: "loading" });
31
+ });
32
+ it("returns error when debt is less than min", () => {
33
+ const result = validateOpenAccount({
34
+ debt: 500n,
35
+ creditManager: mockCreditManager,
36
+ desiredQuota: {},
37
+ quotaUpdate: []
38
+ });
39
+ expect(result).toEqual({
40
+ message: "amountLessMin",
41
+ amount: 1000n
42
+ });
43
+ });
44
+ it("returns error when debt is greater than max", () => {
45
+ const result = validateOpenAccount({
46
+ debt: 2000000n,
47
+ creditManager: mockCreditManager,
48
+ desiredQuota: {},
49
+ quotaUpdate: []
50
+ });
51
+ expect(result).toEqual({
52
+ message: "debtGreaterMax",
53
+ amount: 1000000n
54
+ });
55
+ });
56
+ });
@@ -0,0 +1,25 @@
1
+ function validateQuota(props) {
2
+ const desiredQuotasList = Object.values(props.desiredQuota).filter(
3
+ (a) => a.balance > 0n
4
+ );
5
+ if (desiredQuotasList.length > props.creditManager.maxEnabledTokensLength)
6
+ return {
7
+ message: "maxQuotasLengthReached",
8
+ count: desiredQuotasList.length,
9
+ max: props.creditManager.maxEnabledTokensLength
10
+ };
11
+ if (props.quotaUpdate.length === 0 && props.throwOnZeroQuotaUpdate)
12
+ return { message: "quotaShouldBeUpdated" };
13
+ for (const { token, balance: updateBy } of props.quotaUpdate) {
14
+ const quota = props.creditManager.quotas[token];
15
+ if (updateBy > 0 && quota) {
16
+ const realLimit = quota.isActive ? quota.limit : 0n;
17
+ const quotaLeft = realLimit - quota.totalQuoted;
18
+ if (quotaLeft < updateBy) return { message: "insufficientQuota", token };
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ export {
24
+ validateQuota
25
+ };
@@ -0,0 +1,83 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ buildCreditManager,
4
+ buildQuota,
5
+ mockToken1,
6
+ mockToken2
7
+ } from "../../test-utils/index.js";
8
+ import { validateQuota } from "./validate-quota.js";
9
+ const mockCreditManager = buildCreditManager({
10
+ minDebt: 1000n,
11
+ maxDebt: 1000000n,
12
+ totalDebtLimit: 5000000n,
13
+ totalDebt: 2000000n,
14
+ availableToBorrow: 3000000n,
15
+ quotas: {
16
+ [mockToken1]: buildQuota({
17
+ token: mockToken1,
18
+ limit: 1000000n,
19
+ totalQuoted: 500000n,
20
+ rate: 0n
21
+ }),
22
+ [mockToken2]: buildQuota({
23
+ token: mockToken2,
24
+ limit: 2000000n,
25
+ totalQuoted: 1000000n,
26
+ rate: 0n
27
+ })
28
+ },
29
+ maxEnabledTokensLength: 2
30
+ });
31
+ describe("validateQuota", () => {
32
+ it("returns null when all conditions are met", () => {
33
+ const result = validateQuota({
34
+ desiredQuota: {},
35
+ quotaUpdate: [],
36
+ creditManager: mockCreditManager,
37
+ throwOnZeroQuotaUpdate: false
38
+ });
39
+ expect(result).toBeNull();
40
+ });
41
+ it("returns error when max quotas length is reached", () => {
42
+ const result = validateQuota({
43
+ desiredQuota: {
44
+ [mockToken1]: { token: mockToken1, balance: 1000n },
45
+ [mockToken2]: { token: mockToken2, balance: 1000n }
46
+ },
47
+ quotaUpdate: [],
48
+ creditManager: buildCreditManager({
49
+ ...mockCreditManager,
50
+ maxEnabledTokensLength: 1
51
+ }),
52
+ throwOnZeroQuotaUpdate: false
53
+ });
54
+ expect(result).toEqual({
55
+ message: "maxQuotasLengthReached",
56
+ count: 2,
57
+ max: 1
58
+ });
59
+ });
60
+ it("returns error when quota update is empty and throwOnZeroQuotaUpdate is true", () => {
61
+ const result = validateQuota({
62
+ desiredQuota: {},
63
+ quotaUpdate: [],
64
+ creditManager: mockCreditManager,
65
+ throwOnZeroQuotaUpdate: true
66
+ });
67
+ expect(result).toEqual({
68
+ message: "quotaShouldBeUpdated"
69
+ });
70
+ });
71
+ it("returns error when quota is insufficient", () => {
72
+ const result = validateQuota({
73
+ desiredQuota: {},
74
+ quotaUpdate: [{ token: mockToken1, balance: 600000n }],
75
+ creditManager: mockCreditManager,
76
+ throwOnZeroQuotaUpdate: false
77
+ });
78
+ expect(result).toEqual({
79
+ message: "insufficientQuota",
80
+ token: mockToken1
81
+ });
82
+ });
83
+ });
@@ -0,0 +1,18 @@
1
+ function validateTokenToObtain({
2
+ creditManager,
3
+ targetToken
4
+ }) {
5
+ if (Array.isArray(targetToken)) {
6
+ for (const asset of targetToken) {
7
+ if (creditManager.forbiddenTokens[asset.token])
8
+ return { message: "tokenIsForbidden", token: asset.token };
9
+ }
10
+ return null;
11
+ }
12
+ if (targetToken !== null && creditManager.forbiddenTokens[targetToken])
13
+ return { message: "tokenIsForbidden", token: targetToken };
14
+ return null;
15
+ }
16
+ export {
17
+ validateTokenToObtain
18
+ };
@@ -0,0 +1,34 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildCreditManager, mockToken1 } from "../../test-utils/index.js";
3
+ import { validateTokenToObtain } from "./validate-token-to-obtain.js";
4
+ const mockCreditManager = buildCreditManager({
5
+ forbiddenTokens: {}
6
+ });
7
+ describe("validateTokenToObtain", () => {
8
+ it("returns null when targetToken is null", () => {
9
+ const result = validateTokenToObtain({
10
+ targetToken: null,
11
+ creditManager: mockCreditManager
12
+ });
13
+ expect(result).toBeNull();
14
+ });
15
+ it("returns null when targetToken is not forbidden", () => {
16
+ const result = validateTokenToObtain({
17
+ targetToken: mockToken1,
18
+ creditManager: mockCreditManager
19
+ });
20
+ expect(result).toBeNull();
21
+ });
22
+ it("returns error when targetToken is forbidden", () => {
23
+ const result = validateTokenToObtain({
24
+ targetToken: mockToken1,
25
+ creditManager: buildCreditManager({
26
+ ...mockCreditManager,
27
+ forbiddenTokens: {
28
+ [mockToken1]: true
29
+ }
30
+ })
31
+ });
32
+ expect(result).toEqual({ message: "tokenIsForbidden", token: mockToken1 });
33
+ });
34
+ });
@@ -14,6 +14,7 @@ const PRICE_DECIMALS = 10n ** BigInt(PRICE_DECIMALS_POW);
14
14
  const SECONDS_PER_YEAR = 365 * 24 * 3600;
15
15
  const PERCENTAGE_DECIMALS = 100n;
16
16
  const PERCENTAGE_FACTOR = 10000n;
17
+ const PERCENTAGE_FACTOR_1KK = PERCENTAGE_FACTOR * PERCENTAGE_DECIMALS;
17
18
  const LEVERAGE_DECIMALS = 100n;
18
19
  const SLIPPAGE_DECIMALS = 100n;
19
20
  export {
@@ -24,6 +25,7 @@ export {
24
25
  MIN_INT96,
25
26
  PERCENTAGE_DECIMALS,
26
27
  PERCENTAGE_FACTOR,
28
+ PERCENTAGE_FACTOR_1KK,
27
29
  PRICE_DECIMALS,
28
30
  PRICE_DECIMALS_POW,
29
31
  RAY,