@gearbox-protocol/sdk 15.1.0-next.1 → 15.1.0-next.11

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 (436) hide show
  1. package/dist/cjs/abi/iExpirable.js +15 -0
  2. package/dist/cjs/common-utils/utils/apy/get-single-quota-borrow-rate.js +2 -0
  3. package/dist/cjs/common-utils/utils/creditAccount/calc-health-factor.js +24 -22
  4. package/dist/cjs/common-utils/utils/creditAccount/calc-quota-borrow-rate.js +2 -0
  5. package/dist/cjs/common-utils/utils/creditAccount/get-time-to-liquidation.js +8 -5
  6. package/dist/cjs/common-utils/utils/creditAccount/liquidation-price.js +21 -11
  7. package/dist/cjs/dev/AccountOpener.js +0 -1
  8. package/dist/cjs/dev/compareOpportunities.js +137 -0
  9. package/dist/cjs/dev/comparePositions.js +183 -0
  10. package/dist/cjs/dev/fieldDiff.js +241 -0
  11. package/dist/cjs/model/charts.js +147 -0
  12. package/dist/cjs/model/charts.schema.js +240 -0
  13. package/dist/cjs/model/index.js +35 -22
  14. package/dist/cjs/model/liquidations.schema.js +1 -1
  15. package/dist/cjs/model/notices.schema.js +25 -0
  16. package/dist/cjs/model/opportunities.schema.js +1 -1
  17. package/dist/cjs/model/positions.schema.js +48 -2
  18. package/dist/cjs/new-sdk/AbstractNamespace.js +34 -4
  19. package/dist/cjs/new-sdk/GearboxSDK.js +72 -3
  20. package/dist/cjs/new-sdk/execute/ExecuteApi.js +95 -0
  21. package/dist/cjs/new-sdk/execute/index.js +3 -0
  22. package/dist/cjs/new-sdk/index.js +7 -0
  23. package/dist/cjs/new-sdk/opportunities/OpportunitiesNamespace.js +29 -6
  24. package/dist/cjs/new-sdk/positions/PositionsNamespace.js +3 -6
  25. package/dist/cjs/new-sdk/simulate/SimulateApi.js +361 -0
  26. package/dist/cjs/new-sdk/simulate/index.js +4 -0
  27. package/dist/cjs/new-sdk/utils/index.js +0 -1
  28. package/dist/cjs/offchain/AbstractOffchainNamespace.js +10 -7
  29. package/dist/cjs/offchain/GearboxAPI.js +7 -0
  30. package/dist/cjs/offchain/index.js +3 -0
  31. package/dist/cjs/offchain/notices/OffchainNotices.js +27 -0
  32. package/dist/cjs/offchain/notices/index.js +3 -0
  33. package/dist/cjs/offchain/opportunities/OffchainOpportunities.js +4 -8
  34. package/dist/cjs/offchain/positions/OffchainPositions.js +12 -12
  35. package/dist/cjs/preview/preview/CreditAccountState.js +14 -1
  36. package/dist/cjs/preview/preview/buildDelayedPreview.js +16 -6
  37. package/dist/cjs/preview/preview/previewAdjustCreditAccount.js +9 -2
  38. package/dist/cjs/preview/preview/previewOpenCreditAccount.js +11 -3
  39. package/dist/cjs/preview/preview/previewOperation.js +1 -1
  40. package/dist/cjs/sdk/MultichainSDK.js +3 -4
  41. package/dist/cjs/sdk/OnchainSDK.js +42 -13
  42. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +2 -8
  43. package/dist/cjs/sdk/accounts/credit-account-compressor/CreditAccountCompressor.js +2 -90
  44. package/dist/cjs/sdk/accounts/index.js +5 -2
  45. package/dist/cjs/sdk/accounts/intents/guards.js +114 -0
  46. package/dist/cjs/sdk/accounts/intents/index.js +216 -358
  47. package/dist/cjs/sdk/accounts/intents/math.js +56 -0
  48. package/dist/cjs/sdk/accounts/intents/open-strategy.js +133 -0
  49. package/dist/cjs/sdk/accounts/intents/operations.js +165 -0
  50. package/dist/cjs/sdk/accounts/intents/plan.js +373 -0
  51. package/dist/cjs/sdk/accounts/intents/realize.js +301 -0
  52. package/dist/cjs/sdk/accounts/intents/testing/delayed.js +50 -0
  53. package/dist/cjs/sdk/accounts/intents/testing/market.js +166 -0
  54. package/dist/cjs/sdk/accounts/intents/testing/sdk-mock.js +194 -35
  55. package/dist/cjs/sdk/accounts/intents/tests/add-collateral.fixtures.js +123 -0
  56. package/dist/cjs/sdk/accounts/intents/tests/adjust-leverage.fixtures.js +254 -0
  57. package/dist/cjs/sdk/accounts/intents/tests/deposit.fixtures.js +324 -0
  58. package/dist/cjs/sdk/accounts/intents/tests/finish-decrease-leverage.fixtures.js +242 -0
  59. package/dist/cjs/sdk/accounts/intents/tests/finish-withdraw.fixtures.js +383 -0
  60. package/dist/cjs/sdk/accounts/intents/tests/open-strategy.fixtures.js +133 -0
  61. package/dist/cjs/sdk/accounts/intents/tests/withdraw-asset.fixtures.js +131 -0
  62. package/dist/cjs/sdk/accounts/intents/tests/withdraw.fixtures.js +426 -0
  63. package/dist/cjs/sdk/accounts/intents/types.js +16 -0
  64. package/dist/cjs/sdk/accounts/intents/utils/adjust-state-to-snapshot.js +18 -0
  65. package/dist/cjs/sdk/accounts/intents/utils/credit-account-slice.js +45 -0
  66. package/dist/cjs/sdk/accounts/intents/utils/index.js +17 -8
  67. package/dist/cjs/sdk/accounts/intents/utils/ledger.js +94 -0
  68. package/dist/cjs/sdk/accounts/intents/utils/pick-token.js +72 -0
  69. package/dist/cjs/sdk/accounts/intents/utils/quotas-for-update.js +27 -0
  70. package/dist/cjs/sdk/accounts/intents/utils/router-path.js +86 -0
  71. package/dist/cjs/sdk/accounts/intents/view.js +38 -0
  72. package/dist/cjs/sdk/accounts/liquidations/LiquidationsService.js +0 -3
  73. package/dist/cjs/sdk/accounts/withdrawal-compressor/AbstractWithdrawalCompressorContract.js +29 -18
  74. package/dist/cjs/sdk/base/BaseContract.js +1 -1
  75. package/dist/cjs/sdk/base/TokensMeta.js +78 -27
  76. package/dist/cjs/sdk/index.js +30 -7
  77. package/dist/cjs/sdk/market/MarketRegister.js +16 -7
  78. package/dist/cjs/sdk/market/ZapperRegister.js +56 -25
  79. package/dist/cjs/sdk/market/credit/CreditManagerV310Contract.js +1 -12
  80. package/dist/cjs/sdk/market/credit/CreditSuite.js +28 -9
  81. package/dist/cjs/sdk/market/credit/index.js +3 -0
  82. package/dist/cjs/sdk/market/credit/isStrategyCollateral.js +50 -0
  83. package/dist/cjs/sdk/market/index.js +17 -0
  84. package/dist/cjs/sdk/market/math.js +65 -45
  85. package/dist/cjs/sdk/market/oracle/PriceOracleBaseContract.js +10 -3
  86. package/dist/cjs/sdk/market/pool/PoolV310Contract.js +15 -1
  87. package/dist/cjs/sdk/market/rwa/RWARegistry.js +22 -0
  88. package/dist/cjs/sdk/opportunities/index.js +0 -13
  89. package/dist/cjs/sdk/options.js +1 -5
  90. package/dist/cjs/sdk/pools/PoolService.js +133 -4
  91. package/dist/cjs/sdk/pools/index.js +2 -0
  92. package/dist/cjs/sdk/positions/PositionsService.js +218 -1
  93. package/dist/cjs/sdk/positions/calcBorrowRate.js +43 -0
  94. package/dist/cjs/sdk/positions/calcHealthFactor.js +52 -0
  95. package/dist/cjs/sdk/positions/calcLiquidationPrice.js +23 -0
  96. package/dist/cjs/sdk/positions/calcLiquidationPriceForTarget.js +30 -0
  97. package/dist/cjs/sdk/positions/calcTimeToLiquidationMs.js +19 -0
  98. package/dist/cjs/sdk/positions/index.js +12 -1
  99. package/dist/cjs/sdk/positions/types.js +31 -0
  100. package/dist/cjs/sdk/utils/abi-decode.js +2 -2
  101. package/dist/cjs/sdk/utils/viem/executeMulticallBatches.js +32 -0
  102. package/dist/cjs/sdk/utils/viem/index.js +2 -0
  103. package/dist/esm/abi/iExpirable.js +14 -0
  104. package/dist/esm/common-utils/utils/apy/get-single-quota-borrow-rate.js +2 -0
  105. package/dist/esm/common-utils/utils/creditAccount/calc-health-factor.js +24 -22
  106. package/dist/esm/common-utils/utils/creditAccount/calc-quota-borrow-rate.js +2 -0
  107. package/dist/esm/common-utils/utils/creditAccount/get-time-to-liquidation.js +8 -5
  108. package/dist/esm/common-utils/utils/creditAccount/liquidation-price.js +21 -11
  109. package/dist/esm/dev/AccountOpener.js +0 -1
  110. package/dist/esm/dev/compareOpportunities.js +135 -0
  111. package/dist/esm/dev/comparePositions.js +181 -0
  112. package/dist/esm/dev/fieldDiff.js +224 -0
  113. package/dist/esm/model/charts.js +140 -0
  114. package/dist/esm/model/charts.schema.js +226 -0
  115. package/dist/esm/model/index.js +9 -7
  116. package/dist/esm/model/liquidations.schema.js +1 -1
  117. package/dist/esm/model/notices.schema.js +23 -0
  118. package/dist/esm/model/opportunities.schema.js +1 -1
  119. package/dist/esm/model/positions.schema.js +46 -4
  120. package/dist/esm/new-sdk/AbstractNamespace.js +34 -4
  121. package/dist/esm/new-sdk/GearboxSDK.js +72 -4
  122. package/dist/esm/new-sdk/execute/ExecuteApi.js +94 -0
  123. package/dist/esm/new-sdk/execute/index.js +2 -0
  124. package/dist/esm/new-sdk/index.js +6 -2
  125. package/dist/esm/new-sdk/opportunities/OpportunitiesNamespace.js +29 -6
  126. package/dist/esm/new-sdk/positions/PositionsNamespace.js +3 -6
  127. package/dist/esm/new-sdk/simulate/SimulateApi.js +360 -0
  128. package/dist/esm/new-sdk/simulate/index.js +3 -0
  129. package/dist/esm/new-sdk/utils/index.js +0 -1
  130. package/dist/esm/offchain/AbstractOffchainNamespace.js +10 -7
  131. package/dist/esm/offchain/GearboxAPI.js +7 -0
  132. package/dist/esm/offchain/index.js +3 -1
  133. package/dist/esm/offchain/notices/OffchainNotices.js +26 -0
  134. package/dist/esm/offchain/notices/index.js +2 -0
  135. package/dist/esm/offchain/opportunities/OffchainOpportunities.js +4 -8
  136. package/dist/esm/offchain/positions/OffchainPositions.js +12 -12
  137. package/dist/esm/preview/preview/CreditAccountState.js +14 -1
  138. package/dist/esm/preview/preview/buildDelayedPreview.js +16 -6
  139. package/dist/esm/preview/preview/previewAdjustCreditAccount.js +9 -2
  140. package/dist/esm/preview/preview/previewOpenCreditAccount.js +11 -3
  141. package/dist/esm/preview/preview/previewOperation.js +1 -1
  142. package/dist/esm/sdk/MultichainSDK.js +3 -4
  143. package/dist/esm/sdk/OnchainSDK.js +42 -13
  144. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +2 -8
  145. package/dist/esm/sdk/accounts/credit-account-compressor/CreditAccountCompressor.js +2 -90
  146. package/dist/esm/sdk/accounts/index.js +3 -2
  147. package/dist/esm/sdk/accounts/intents/guards.js +108 -0
  148. package/dist/esm/sdk/accounts/intents/index.js +214 -358
  149. package/dist/esm/sdk/accounts/intents/math.js +51 -0
  150. package/dist/esm/sdk/accounts/intents/open-strategy.js +132 -0
  151. package/dist/esm/sdk/accounts/intents/operations.js +153 -0
  152. package/dist/esm/sdk/accounts/intents/plan.js +361 -0
  153. package/dist/esm/sdk/accounts/intents/realize.js +300 -0
  154. package/dist/esm/sdk/accounts/intents/testing/delayed.js +38 -0
  155. package/dist/esm/sdk/accounts/intents/testing/market.js +148 -0
  156. package/dist/esm/sdk/accounts/intents/testing/sdk-mock.js +194 -35
  157. package/dist/esm/sdk/accounts/intents/tests/add-collateral.fixtures.js +110 -0
  158. package/dist/esm/sdk/accounts/intents/tests/adjust-leverage.fixtures.js +234 -0
  159. package/dist/esm/sdk/accounts/intents/tests/deposit.fixtures.js +302 -0
  160. package/dist/esm/sdk/accounts/intents/tests/finish-decrease-leverage.fixtures.js +220 -0
  161. package/dist/esm/sdk/accounts/intents/tests/finish-withdraw.fixtures.js +355 -0
  162. package/dist/esm/sdk/accounts/intents/tests/open-strategy.fixtures.js +119 -0
  163. package/dist/esm/sdk/accounts/intents/tests/withdraw-asset.fixtures.js +117 -0
  164. package/dist/esm/sdk/accounts/intents/tests/withdraw.fixtures.js +402 -0
  165. package/dist/esm/sdk/accounts/intents/types.js +16 -1
  166. package/dist/esm/sdk/accounts/intents/utils/adjust-state-to-snapshot.js +17 -0
  167. package/dist/esm/sdk/accounts/intents/utils/credit-account-slice.js +43 -0
  168. package/dist/esm/sdk/accounts/intents/utils/index.js +9 -7
  169. package/dist/esm/sdk/accounts/intents/utils/ledger.js +93 -0
  170. package/dist/esm/sdk/accounts/intents/utils/pick-token.js +68 -0
  171. package/dist/esm/sdk/accounts/intents/utils/quotas-for-update.js +27 -1
  172. package/dist/esm/sdk/accounts/intents/utils/router-path.js +85 -0
  173. package/dist/esm/sdk/accounts/intents/view.js +37 -0
  174. package/dist/esm/sdk/accounts/liquidations/LiquidationsService.js +0 -3
  175. package/dist/esm/sdk/accounts/withdrawal-compressor/AbstractWithdrawalCompressorContract.js +29 -18
  176. package/dist/esm/sdk/base/BaseContract.js +1 -1
  177. package/dist/esm/sdk/base/TokensMeta.js +78 -27
  178. package/dist/esm/sdk/index.js +13 -4
  179. package/dist/esm/sdk/market/MarketRegister.js +16 -7
  180. package/dist/esm/sdk/market/ZapperRegister.js +56 -25
  181. package/dist/esm/sdk/market/credit/CreditManagerV310Contract.js +2 -13
  182. package/dist/esm/sdk/market/credit/CreditSuite.js +29 -10
  183. package/dist/esm/sdk/market/credit/index.js +2 -1
  184. package/dist/esm/sdk/market/credit/isStrategyCollateral.js +48 -0
  185. package/dist/esm/sdk/market/index.js +3 -1
  186. package/dist/esm/sdk/market/math.js +60 -41
  187. package/dist/esm/sdk/market/oracle/PriceOracleBaseContract.js +10 -3
  188. package/dist/esm/sdk/market/pool/PoolV310Contract.js +16 -2
  189. package/dist/esm/sdk/market/rwa/RWARegistry.js +22 -0
  190. package/dist/esm/sdk/opportunities/index.js +1 -2
  191. package/dist/esm/sdk/options.js +1 -5
  192. package/dist/esm/sdk/pools/PoolService.js +133 -6
  193. package/dist/esm/sdk/pools/index.js +2 -2
  194. package/dist/esm/sdk/positions/PositionsService.js +218 -1
  195. package/dist/esm/sdk/positions/calcBorrowRate.js +42 -0
  196. package/dist/esm/sdk/positions/calcHealthFactor.js +51 -0
  197. package/dist/esm/sdk/positions/calcLiquidationPrice.js +22 -0
  198. package/dist/esm/sdk/positions/calcLiquidationPriceForTarget.js +29 -0
  199. package/dist/esm/sdk/positions/calcTimeToLiquidationMs.js +18 -0
  200. package/dist/esm/sdk/positions/index.js +7 -2
  201. package/dist/esm/sdk/positions/types.js +31 -1
  202. package/dist/esm/sdk/utils/abi-decode.js +2 -2
  203. package/dist/esm/sdk/utils/viem/executeMulticallBatches.js +31 -0
  204. package/dist/esm/sdk/utils/viem/index.js +2 -1
  205. package/dist/types/abi/iExpirable.d.ts +14 -0
  206. package/dist/types/common-utils/utils/apy/get-single-quota-borrow-rate.d.ts +2 -0
  207. package/dist/types/common-utils/utils/creditAccount/calc-health-factor.d.ts +3 -0
  208. package/dist/types/common-utils/utils/creditAccount/calc-quota-borrow-rate.d.ts +2 -0
  209. package/dist/types/common-utils/utils/creditAccount/get-time-to-liquidation.d.ts +6 -1
  210. package/dist/types/common-utils/utils/creditAccount/liquidation-price.d.ts +3 -0
  211. package/dist/types/dev/compareOpportunities.d.ts +105 -0
  212. package/dist/types/dev/comparePositions.d.ts +149 -0
  213. package/dist/types/dev/fieldDiff.d.ts +167 -0
  214. package/dist/types/model/charts.d.ts +349 -0
  215. package/dist/types/model/charts.schema.d.ts +364 -0
  216. package/dist/types/model/index.d.ts +8 -6
  217. package/dist/types/model/notices.d.ts +29 -0
  218. package/dist/types/model/notices.schema.d.ts +23 -0
  219. package/dist/types/model/opportunities.d.ts +9 -9
  220. package/dist/types/model/positions.d.ts +133 -7
  221. package/dist/types/model/positions.schema.d.ts +128 -1
  222. package/dist/types/new-sdk/AbstractNamespace.d.ts +15 -2
  223. package/dist/types/new-sdk/GearboxSDK.d.ts +14 -2
  224. package/dist/types/new-sdk/execute/ExecuteApi.d.ts +108 -0
  225. package/dist/types/new-sdk/execute/index.d.ts +2 -0
  226. package/dist/types/new-sdk/index.d.ts +8 -4
  227. package/dist/types/new-sdk/opportunities/OpportunitiesNamespace.d.ts +19 -7
  228. package/dist/types/new-sdk/opportunities/types.d.ts +30 -9
  229. package/dist/types/new-sdk/positions/PositionsNamespace.d.ts +4 -5
  230. package/dist/types/new-sdk/positions/types.d.ts +9 -9
  231. package/dist/types/new-sdk/simulate/SimulateApi.d.ts +90 -0
  232. package/dist/types/new-sdk/simulate/index.d.ts +3 -0
  233. package/dist/types/new-sdk/simulate/types.d.ts +508 -0
  234. package/dist/types/new-sdk/types.d.ts +35 -1
  235. package/dist/types/new-sdk/utils/index.d.ts +1 -2
  236. package/dist/types/offchain/AbstractOffchainNamespace.d.ts +5 -21
  237. package/dist/types/offchain/GearboxAPI.d.ts +6 -0
  238. package/dist/types/offchain/index.d.ts +4 -2
  239. package/dist/types/offchain/notices/OffchainNotices.d.ts +19 -0
  240. package/dist/types/offchain/notices/index.d.ts +2 -0
  241. package/dist/types/offchain/opportunities/OffchainOpportunities.d.ts +8 -4
  242. package/dist/types/offchain/positions/OffchainPositions.d.ts +8 -6
  243. package/dist/types/preview/preview/CreditAccountState.d.ts +6 -0
  244. package/dist/types/preview/preview/buildDelayedPreview.d.ts +5 -1
  245. package/dist/types/preview/preview/types.d.ts +4 -2
  246. package/dist/types/sdk/MultichainSDK.d.ts +0 -5
  247. package/dist/types/sdk/OnchainSDK.d.ts +1 -5
  248. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -7
  249. package/dist/types/sdk/accounts/credit-account-compressor/CreditAccountCompressor.d.ts +3 -12
  250. package/dist/types/sdk/accounts/credit-account-compressor/index.d.ts +2 -2
  251. package/dist/types/sdk/accounts/credit-account-compressor/types.d.ts +1 -19
  252. package/dist/types/sdk/accounts/index.d.ts +7 -5
  253. package/dist/types/sdk/accounts/intents/guards.d.ts +72 -0
  254. package/dist/types/sdk/accounts/intents/index.d.ts +130 -15
  255. package/dist/types/sdk/accounts/intents/math.d.ts +46 -0
  256. package/dist/types/sdk/accounts/intents/open-strategy.d.ts +64 -0
  257. package/dist/types/sdk/accounts/intents/operations.d.ts +215 -0
  258. package/dist/types/sdk/accounts/intents/plan.d.ts +189 -0
  259. package/dist/types/sdk/accounts/intents/realize.d.ts +35 -0
  260. package/dist/types/sdk/accounts/intents/testing/delayed.d.ts +50 -0
  261. package/dist/types/sdk/accounts/intents/testing/expect.d.ts +17 -21
  262. package/dist/types/sdk/accounts/intents/testing/market.d.ts +91 -0
  263. package/dist/types/sdk/accounts/intents/testing/sdk-mock.d.ts +64 -16
  264. package/dist/types/sdk/accounts/intents/tests/add-collateral.fixtures.d.ts +45 -0
  265. package/dist/types/sdk/accounts/intents/tests/adjust-leverage.fixtures.d.ts +56 -0
  266. package/dist/types/sdk/accounts/intents/tests/deposit.fixtures.d.ts +64 -0
  267. package/dist/types/sdk/accounts/intents/tests/finish-decrease-leverage.fixtures.d.ts +107 -0
  268. package/dist/types/sdk/accounts/intents/tests/finish-withdraw.fixtures.d.ts +136 -0
  269. package/dist/types/sdk/accounts/intents/tests/open-strategy.fixtures.d.ts +56 -0
  270. package/dist/types/sdk/accounts/intents/tests/withdraw-asset.fixtures.d.ts +60 -0
  271. package/dist/types/sdk/accounts/intents/tests/withdraw.fixtures.d.ts +79 -0
  272. package/dist/types/sdk/accounts/intents/types.d.ts +369 -43
  273. package/dist/types/sdk/accounts/intents/utils/adjust-state-to-snapshot.d.ts +13 -0
  274. package/dist/types/sdk/accounts/intents/utils/assemble-operation-calls.d.ts +1 -1
  275. package/dist/types/sdk/accounts/intents/utils/credit-account-slice.d.ts +29 -0
  276. package/dist/types/sdk/accounts/intents/utils/index.d.ts +7 -5
  277. package/dist/types/sdk/accounts/intents/utils/ledger.d.ts +41 -0
  278. package/dist/types/sdk/accounts/intents/utils/pick-token.d.ts +55 -0
  279. package/dist/types/sdk/accounts/intents/utils/quotas-for-update.d.ts +15 -4
  280. package/dist/types/sdk/accounts/intents/utils/router-path.d.ts +70 -0
  281. package/dist/types/sdk/accounts/intents/view.d.ts +15 -0
  282. package/dist/types/sdk/accounts/types.d.ts +17 -14
  283. package/dist/types/sdk/accounts/withdrawal-compressor/AbstractWithdrawalCompressorContract.d.ts +6 -0
  284. package/dist/types/sdk/accounts/withdrawal-compressor/types.d.ts +18 -0
  285. package/dist/types/sdk/base/TokensMeta.d.ts +44 -1
  286. package/dist/types/sdk/base/index.d.ts +2 -2
  287. package/dist/types/sdk/base/token-types.d.ts +12 -1
  288. package/dist/types/sdk/index.d.ts +28 -19
  289. package/dist/types/sdk/market/MarketRegister.d.ts +7 -3
  290. package/dist/types/sdk/market/ZapperRegister.d.ts +20 -2
  291. package/dist/types/sdk/market/credit/CreditManagerV310Contract.d.ts +0 -4
  292. package/dist/types/sdk/market/credit/CreditSuite.d.ts +6 -3
  293. package/dist/types/sdk/market/credit/index.d.ts +2 -1
  294. package/dist/types/sdk/market/credit/isStrategyCollateral.d.ts +74 -0
  295. package/dist/types/sdk/market/credit/types.d.ts +2 -9
  296. package/dist/types/sdk/market/index.d.ts +4 -2
  297. package/dist/types/sdk/market/math.d.ts +46 -34
  298. package/dist/types/sdk/market/oracle/PriceOracleBaseContract.d.ts +6 -2
  299. package/dist/types/sdk/market/oracle/types.d.ts +10 -2
  300. package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +5 -0
  301. package/dist/types/sdk/market/pool/types.d.ts +5 -0
  302. package/dist/types/sdk/market/rwa/RWARegistry.d.ts +13 -0
  303. package/dist/types/sdk/market/types.d.ts +5 -1
  304. package/dist/types/sdk/opportunities/index.d.ts +1 -2
  305. package/dist/types/sdk/options.d.ts +0 -1
  306. package/dist/types/sdk/pools/PoolService.d.ts +32 -2
  307. package/dist/types/sdk/pools/index.d.ts +3 -3
  308. package/dist/types/sdk/pools/types.d.ts +109 -4
  309. package/dist/types/sdk/positions/PositionsService.d.ts +33 -2
  310. package/dist/types/sdk/positions/calcBorrowRate.d.ts +40 -0
  311. package/dist/types/sdk/positions/calcHealthFactor.d.ts +55 -0
  312. package/dist/types/sdk/positions/calcLiquidationPrice.d.ts +12 -0
  313. package/dist/types/sdk/positions/calcLiquidationPriceForTarget.d.ts +43 -0
  314. package/dist/types/sdk/positions/calcTimeToLiquidationMs.d.ts +16 -0
  315. package/dist/types/sdk/positions/index.d.ts +7 -2
  316. package/dist/types/sdk/positions/types.d.ts +58 -1
  317. package/dist/types/sdk/types/state.d.ts +6 -0
  318. package/dist/types/sdk/utils/viem/executeMulticallBatches.d.ts +39 -0
  319. package/dist/types/sdk/utils/viem/index.d.ts +3 -2
  320. package/package.json +2 -1
  321. package/dist/cjs/model/history.js +0 -53
  322. package/dist/cjs/model/history.schema.js +0 -128
  323. package/dist/cjs/sdk/accounts/intents/intents/index.js +0 -14
  324. package/dist/cjs/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.fixtures.js +0 -121
  325. package/dist/cjs/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.js +0 -15
  326. package/dist/cjs/sdk/accounts/intents/intents/resume/close/close.fixtures.js +0 -108
  327. package/dist/cjs/sdk/accounts/intents/intents/resume/close/close.js +0 -51
  328. package/dist/cjs/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.fixtures.js +0 -130
  329. package/dist/cjs/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.js +0 -83
  330. package/dist/cjs/sdk/accounts/intents/intents/resume/deposit/deposit.fixtures.js +0 -117
  331. package/dist/cjs/sdk/accounts/intents/intents/resume/deposit/deposit.js +0 -15
  332. package/dist/cjs/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.fixtures.js +0 -95
  333. package/dist/cjs/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.js +0 -15
  334. package/dist/cjs/sdk/accounts/intents/intents/resume/index.js +0 -13
  335. package/dist/cjs/sdk/accounts/intents/intents/resume/withdraw/withdraw.fixtures.js +0 -138
  336. package/dist/cjs/sdk/accounts/intents/intents/resume/withdraw/withdraw.js +0 -161
  337. package/dist/cjs/sdk/accounts/intents/operations/add-collateral/index.js +0 -17
  338. package/dist/cjs/sdk/accounts/intents/operations/claim-delayed/index.js +0 -54
  339. package/dist/cjs/sdk/accounts/intents/operations/close-credit-account/index.js +0 -26
  340. package/dist/cjs/sdk/accounts/intents/operations/decrease-debt/index.js +0 -12
  341. package/dist/cjs/sdk/accounts/intents/operations/increase-debt/index.js +0 -12
  342. package/dist/cjs/sdk/accounts/intents/operations/index.js +0 -27
  343. package/dist/cjs/sdk/accounts/intents/operations/quota-update/index.js +0 -22
  344. package/dist/cjs/sdk/accounts/intents/operations/repay-credit-account/index.js +0 -22
  345. package/dist/cjs/sdk/accounts/intents/operations/start-delayed-withdrawal/index.js +0 -18
  346. package/dist/cjs/sdk/accounts/intents/operations/swap/index.js +0 -18
  347. package/dist/cjs/sdk/accounts/intents/operations/unwrap-rwa-collateral/index.js +0 -27
  348. package/dist/cjs/sdk/accounts/intents/operations/withdraw-collateral/index.js +0 -43
  349. package/dist/cjs/sdk/accounts/intents/operations/wrap-rwa-collateral/index.js +0 -27
  350. package/dist/cjs/sdk/accounts/intents/quoters/close.js +0 -58
  351. package/dist/cjs/sdk/accounts/intents/quoters/index.js +0 -7
  352. package/dist/cjs/sdk/accounts/intents/quoters/swap.js +0 -79
  353. package/dist/cjs/sdk/accounts/intents/testing/expect.js +0 -167
  354. package/dist/cjs/sdk/accounts/intents/testing/resume.js +0 -172
  355. package/dist/cjs/sdk/accounts/intents/utils/simulate-adjust-state.js +0 -39
  356. package/dist/cjs/sdk/accounts/intents/utils/simulate-assets.js +0 -69
  357. package/dist/cjs/sdk/accounts/intents/utils/with-quota-update.js +0 -13
  358. package/dist/esm/model/history.js +0 -49
  359. package/dist/esm/model/history.schema.js +0 -116
  360. package/dist/esm/sdk/accounts/intents/intents/index.js +0 -8
  361. package/dist/esm/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.fixtures.js +0 -107
  362. package/dist/esm/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.js +0 -14
  363. package/dist/esm/sdk/accounts/intents/intents/resume/close/close.fixtures.js +0 -94
  364. package/dist/esm/sdk/accounts/intents/intents/resume/close/close.js +0 -50
  365. package/dist/esm/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.fixtures.js +0 -114
  366. package/dist/esm/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.js +0 -82
  367. package/dist/esm/sdk/accounts/intents/intents/resume/deposit/deposit.fixtures.js +0 -110
  368. package/dist/esm/sdk/accounts/intents/intents/resume/deposit/deposit.js +0 -14
  369. package/dist/esm/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.fixtures.js +0 -88
  370. package/dist/esm/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.js +0 -14
  371. package/dist/esm/sdk/accounts/intents/intents/resume/index.js +0 -7
  372. package/dist/esm/sdk/accounts/intents/intents/resume/withdraw/withdraw.fixtures.js +0 -121
  373. package/dist/esm/sdk/accounts/intents/intents/resume/withdraw/withdraw.js +0 -160
  374. package/dist/esm/sdk/accounts/intents/operations/add-collateral/index.js +0 -16
  375. package/dist/esm/sdk/accounts/intents/operations/claim-delayed/index.js +0 -52
  376. package/dist/esm/sdk/accounts/intents/operations/close-credit-account/index.js +0 -25
  377. package/dist/esm/sdk/accounts/intents/operations/decrease-debt/index.js +0 -11
  378. package/dist/esm/sdk/accounts/intents/operations/increase-debt/index.js +0 -11
  379. package/dist/esm/sdk/accounts/intents/operations/index.js +0 -14
  380. package/dist/esm/sdk/accounts/intents/operations/quota-update/index.js +0 -21
  381. package/dist/esm/sdk/accounts/intents/operations/repay-credit-account/index.js +0 -21
  382. package/dist/esm/sdk/accounts/intents/operations/start-delayed-withdrawal/index.js +0 -17
  383. package/dist/esm/sdk/accounts/intents/operations/swap/index.js +0 -17
  384. package/dist/esm/sdk/accounts/intents/operations/unwrap-rwa-collateral/index.js +0 -26
  385. package/dist/esm/sdk/accounts/intents/operations/withdraw-collateral/index.js +0 -42
  386. package/dist/esm/sdk/accounts/intents/operations/wrap-rwa-collateral/index.js +0 -26
  387. package/dist/esm/sdk/accounts/intents/quoters/close.js +0 -56
  388. package/dist/esm/sdk/accounts/intents/quoters/index.js +0 -3
  389. package/dist/esm/sdk/accounts/intents/quoters/swap.js +0 -77
  390. package/dist/esm/sdk/accounts/intents/testing/expect.js +0 -162
  391. package/dist/esm/sdk/accounts/intents/testing/resume.js +0 -157
  392. package/dist/esm/sdk/accounts/intents/utils/simulate-adjust-state.js +0 -38
  393. package/dist/esm/sdk/accounts/intents/utils/simulate-assets.js +0 -68
  394. package/dist/esm/sdk/accounts/intents/utils/with-quota-update.js +0 -12
  395. package/dist/types/model/history.d.ts +0 -153
  396. package/dist/types/model/history.schema.d.ts +0 -95
  397. package/dist/types/new-sdk/utils/history.d.ts +0 -18
  398. package/dist/types/sdk/accounts/intents/intents/index.d.ts +0 -8
  399. package/dist/types/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.d.ts +0 -13
  400. package/dist/types/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.fixtures.d.ts +0 -38
  401. package/dist/types/sdk/accounts/intents/intents/resume/close/close.d.ts +0 -26
  402. package/dist/types/sdk/accounts/intents/intents/resume/close/close.fixtures.d.ts +0 -63
  403. package/dist/types/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.d.ts +0 -26
  404. package/dist/types/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.fixtures.d.ts +0 -86
  405. package/dist/types/sdk/accounts/intents/intents/resume/deposit/deposit.d.ts +0 -13
  406. package/dist/types/sdk/accounts/intents/intents/resume/deposit/deposit.fixtures.d.ts +0 -48
  407. package/dist/types/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.d.ts +0 -13
  408. package/dist/types/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.fixtures.d.ts +0 -46
  409. package/dist/types/sdk/accounts/intents/intents/resume/index.d.ts +0 -7
  410. package/dist/types/sdk/accounts/intents/intents/resume/withdraw/withdraw.d.ts +0 -33
  411. package/dist/types/sdk/accounts/intents/intents/resume/withdraw/withdraw.fixtures.d.ts +0 -68
  412. package/dist/types/sdk/accounts/intents/operations/add-collateral/index.d.ts +0 -23
  413. package/dist/types/sdk/accounts/intents/operations/claim-delayed/index.d.ts +0 -55
  414. package/dist/types/sdk/accounts/intents/operations/close-credit-account/index.d.ts +0 -22
  415. package/dist/types/sdk/accounts/intents/operations/decrease-debt/index.d.ts +0 -18
  416. package/dist/types/sdk/accounts/intents/operations/increase-debt/index.d.ts +0 -18
  417. package/dist/types/sdk/accounts/intents/operations/index.d.ts +0 -14
  418. package/dist/types/sdk/accounts/intents/operations/quota-update/index.d.ts +0 -24
  419. package/dist/types/sdk/accounts/intents/operations/repay-credit-account/index.d.ts +0 -31
  420. package/dist/types/sdk/accounts/intents/operations/start-delayed-withdrawal/index.d.ts +0 -23
  421. package/dist/types/sdk/accounts/intents/operations/swap/index.d.ts +0 -28
  422. package/dist/types/sdk/accounts/intents/operations/types.d.ts +0 -21
  423. package/dist/types/sdk/accounts/intents/operations/unwrap-rwa-collateral/index.d.ts +0 -30
  424. package/dist/types/sdk/accounts/intents/operations/withdraw-collateral/index.d.ts +0 -36
  425. package/dist/types/sdk/accounts/intents/operations/wrap-rwa-collateral/index.d.ts +0 -30
  426. package/dist/types/sdk/accounts/intents/quoters/close.d.ts +0 -43
  427. package/dist/types/sdk/accounts/intents/quoters/index.d.ts +0 -3
  428. package/dist/types/sdk/accounts/intents/quoters/swap.d.ts +0 -43
  429. package/dist/types/sdk/accounts/intents/testing/resume.d.ts +0 -84
  430. package/dist/types/sdk/accounts/intents/utils/simulate-adjust-state.d.ts +0 -19
  431. package/dist/types/sdk/accounts/intents/utils/simulate-assets.d.ts +0 -21
  432. package/dist/types/sdk/accounts/intents/utils/with-quota-update.d.ts +0 -16
  433. /package/dist/cjs/{new-sdk/utils/history.js → model/notices.js} +0 -0
  434. /package/dist/cjs/{sdk/accounts/intents/operations → new-sdk/simulate}/types.js +0 -0
  435. /package/dist/esm/{new-sdk/utils/history.js → model/notices.js} +0 -0
  436. /package/dist/esm/{sdk/accounts/intents/operations → new-sdk/simulate}/types.js +0 -0
@@ -1,5 +1,4 @@
1
- import { PERCENTAGE_DECIMALS, PERCENTAGE_FACTOR, SECONDS_PER_YEAR } from "../../../sdk/constants/math.js";
2
- import "../../../sdk/index.js";
1
+ import { calcTimeToLiquidationMs } from "../../../sdk/positions/calcTimeToLiquidationMs.js";
3
2
  //#region src/common-utils/utils/creditAccount/get-time-to-liquidation.ts
4
3
  /**
5
4
  * Estimates time remaining until health factor reaches liquidation level.
@@ -8,13 +7,17 @@ import "../../../sdk/index.js";
8
7
  * and returns a millisecond duration until `healthFactor` decays to `1.0`
9
8
  * (`PERCENTAGE_FACTOR` in internal scale).
10
9
  *
11
- * @param props Current health factor and `totalBorrowRate * debt` term.
10
+ * @param props Current health factor and `totalBorrowRate_debt`, both `Bps`
11
+ * (`10000` = 100%) — not the legacy `PERCENTAGE_FACTOR_1KK` (`1_000_000` =
12
+ * 100%) scale the pre-rewrite frontend fed this under the same name.
12
13
  * @returns Milliseconds to liquidation as `bigint`, or `null` when already at/under
13
14
  * liquidation threshold or when borrow-rate exposure is zero.
15
+ *
16
+ * @deprecated Use `calcTimeToLiquidationMs` from `sdk/positions` instead;
17
+ * this wrapper only forwards to the new implementation.
14
18
  */
15
19
  function getTimeToLiquidation({ healthFactor, totalBorrowRate_debt }) {
16
- if (healthFactor <= 10000n || totalBorrowRate_debt === 0n) return null;
17
- return (BigInt(healthFactor) - PERCENTAGE_FACTOR) * (BigInt(SECONDS_PER_YEAR) * PERCENTAGE_FACTOR * PERCENTAGE_DECIMALS / totalBorrowRate_debt) * 1000n / PERCENTAGE_FACTOR;
20
+ return calcTimeToLiquidationMs(healthFactor, totalBorrowRate_debt);
18
21
  }
19
22
  //#endregion
20
23
  export { getTimeToLiquidation };
@@ -1,5 +1,4 @@
1
- import { PERCENTAGE_FACTOR, PRICE_DECIMALS, WAD } from "../../../sdk/constants/math.js";
2
- import "../../../sdk/index.js";
1
+ import { calcLiquidationPriceForTarget } from "../../../sdk/positions/calcLiquidationPriceForTarget.js";
3
2
  //#region src/common-utils/utils/creditAccount/liquidation-price.ts
4
3
  /**
5
4
  * Calculates target token liquidation price for a credit account.
@@ -12,17 +11,28 @@ import "../../../sdk/index.js";
12
11
  * @param props Debt context, assets, thresholds, and token metadata.
13
12
  * @returns Target token price in `PRICE_DECIMALS` precision that corresponds
14
13
  * to liquidation boundary; returns `0n` when target balance or LT is non-positive.
14
+ *
15
+ * @deprecated Use `calcLiquidationPriceForTarget` from `sdk/positions`
16
+ * instead; this wrapper only maps the legacy props onto an `AccountSnapshot`.
15
17
  */
16
18
  function liquidationPrice({ liquidationThresholds, debt, underlyingToken, targetToken, assets, tokensList }) {
17
- const underlyingDecimals = tokensList[underlyingToken]?.decimals || 18;
18
- const { balance: underlyingBalance = 0n } = assets[underlyingToken] || {};
19
- const effectiveDebt = (debt - underlyingBalance * (liquidationThresholds[underlyingToken] || 0n) / PERCENTAGE_FACTOR) * WAD / 10n ** BigInt(underlyingDecimals);
20
- const targetDecimals = tokensList[targetToken]?.decimals || 18;
21
- const { balance: targetBalance = 0n } = assets[targetToken] || {};
22
- const effectiveTargetBalance = targetBalance * WAD / 10n ** BigInt(targetDecimals);
23
- const lpLT = liquidationThresholds[targetToken] || 0n;
24
- if (targetBalance <= 0n || lpLT <= 0n) return 0n;
25
- return effectiveDebt * PRICE_DECIMALS * PERCENTAGE_FACTOR / (effectiveTargetBalance * lpLT);
19
+ const decimals = {};
20
+ for (const [token, meta] of Object.entries(tokensList)) decimals[token] = meta.decimals;
21
+ const lts = {};
22
+ for (const [token, lt] of Object.entries(liquidationThresholds)) lts[token] = Number(lt);
23
+ return calcLiquidationPriceForTarget({
24
+ snapshot: {
25
+ creditManager: underlyingToken,
26
+ assets: Object.values(assets),
27
+ quotas: [],
28
+ totalDebt: debt,
29
+ totalValue: 0n
30
+ },
31
+ targetToken,
32
+ underlying: underlyingToken,
33
+ decimals,
34
+ liquidationThresholds: lts
35
+ });
26
36
  }
27
37
  //#endregion
28
38
  export { liquidationPrice };
@@ -86,7 +86,6 @@ var AccountOpener = class extends SDKConstruct {
86
86
  depositIntoPools,
87
87
  claimFromFaucet
88
88
  }, "opening credit accounts");
89
- await Promise.all([this.sdk.tokensMeta.loadTokenData(), this.sdk.marketRegister.loadZappers()]);
90
89
  let deposits = [];
91
90
  if (depositIntoPools) try {
92
91
  deposits = await this.#depositIntoPools(targets);
@@ -0,0 +1,135 @@
1
+ import { opportunityId } from "../model/opportunities.js";
2
+ import "../model/index.js";
3
+ import { countPaths, diffObjects, isAmountWithinTolerance, isBpsWithinTolerance, isUsdWithinTolerance, toCompareCounts, union, withExpected } from "./fieldDiff.js";
4
+ //#region src/dev/compareOpportunities.ts
5
+ /**
6
+ * Matches two opportunity listings by {@link opportunityId} and reports every
7
+ * field the two sources disagree on.
8
+ *
9
+ * Nothing is filtered out. A field only the backend can fill, or a USD value
10
+ * that drifted within snapshot-lag noise, is still reported — tagged
11
+ * {@link FieldDiff.expected} so that {@link CompareCounts.clean} can ignore it
12
+ * while {@link CompareCounts.identical} stays strict.
13
+ **/
14
+ function compareOpportunities(input) {
15
+ const onchainRows = indexById(input.onchain.data);
16
+ const offchainRows = indexById(input.offchain.data);
17
+ const onlyOnchain = [];
18
+ const onlyOffchain = [];
19
+ const matched = [];
20
+ for (const [id, row] of onchainRows) {
21
+ const counterpart = offchainRows.get(id);
22
+ if (!counterpart) {
23
+ onlyOnchain.push(toRef(row));
24
+ continue;
25
+ }
26
+ const diffs = diffOpportunity(row, counterpart);
27
+ matched.push({
28
+ id,
29
+ kind: row.kind,
30
+ chainId: row.chainId,
31
+ onchainName: row.name,
32
+ offchainName: counterpart.name,
33
+ identical: diffs.length === 0,
34
+ clean: diffs.every((diff) => diff.expected),
35
+ diffs
36
+ });
37
+ }
38
+ for (const [id, row] of offchainRows) if (!onchainRows.has(id)) onlyOffchain.push(toRef(row));
39
+ byId(onlyOnchain);
40
+ byId(onlyOffchain);
41
+ matched.sort((a, b) => a.id.localeCompare(b.id));
42
+ return {
43
+ generatedAt: input.generatedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
44
+ backendUrl: input.backendUrl,
45
+ networks: [...input.networks],
46
+ onchainChains: input.onchain.meta.chains,
47
+ offchainChains: input.offchain.meta.chains,
48
+ summary: summarize(input.onchain.data, input.offchain.data, onlyOnchain, onlyOffchain, matched),
49
+ onlyOnchain,
50
+ onlyOffchain,
51
+ matched
52
+ };
53
+ }
54
+ function indexById(rows) {
55
+ return new Map(rows.map((row) => [opportunityId(row), row]));
56
+ }
57
+ function byId(refs) {
58
+ refs.sort((a, b) => a.id.localeCompare(b.id));
59
+ }
60
+ function toRef(row) {
61
+ const base = {
62
+ id: opportunityId(row),
63
+ kind: row.kind,
64
+ chainId: row.chainId,
65
+ name: row.name
66
+ };
67
+ return row.kind === "pool" ? {
68
+ ...base,
69
+ pool: row.pool
70
+ } : {
71
+ ...base,
72
+ creditManager: row.creditManager,
73
+ targetCollateral: row.targetCollateral.address
74
+ };
75
+ }
76
+ /**
77
+ * Every field two versions of one opportunity disagree on.
78
+ **/
79
+ function diffOpportunity(onchain, offchain) {
80
+ return diffObjects(onchain, offchain).map((diff) => tagDiff(diff, onchain.kind));
81
+ }
82
+ /**
83
+ * Paths whose values are basis-point rates that routinely differ by ±1 from
84
+ * truncation vs rounding, plus pool `utilization` for the same reason.
85
+ **/
86
+ const BPS_RATE_PATHS = /* @__PURE__ */ new Set([
87
+ "borrowApy",
88
+ "supplyApy.organicApy",
89
+ "additionalBorrowApy",
90
+ "utilization"
91
+ ]);
92
+ /**
93
+ * Amount fields whose bigint `value` moves with expected-liquidity accrual
94
+ * between the backend's last sync and the current block. Strategy
95
+ * `totalBorrow.value` and `maxBorrowAmount.value` are not in this set: those
96
+ * disagreements are formula bugs, not lag.
97
+ **/
98
+ const LAG_AMOUNT_PATHS = /* @__PURE__ */ new Set(["totalSupply.value", "availableLiquidity.value"]);
99
+ /**
100
+ * Fields documented `@mode offchain` in the model: the chain has nothing to
101
+ * put there, so a presence (or nested) mismatch is expected. Strategy
102
+ * `utilization` is in this set; pool `utilization` is not.
103
+ **/
104
+ function isModeScoped(path, kind) {
105
+ if (path === "curator.url") return true;
106
+ if (path === "totalApy" || path.endsWith(".totalApy")) return true;
107
+ if (path === "rewards" || path.startsWith("rewards[") || path.includes(".rewards[") || path.endsWith(".rewards")) return true;
108
+ if (kind !== "strategy") return false;
109
+ return path === "utilization" || path === "collateralApy" || path.startsWith("collateralApy.") || path === "maxLeverageApy" || path.startsWith("maxLeverageApy.") || path === "totalValue" || path.startsWith("totalValue.");
110
+ }
111
+ function tagDiff(diff, kind) {
112
+ if (isModeScoped(diff.path, kind)) return withExpected(diff, "mode-scoped");
113
+ if (withinTolerance(diff)) return withExpected(diff, "tolerance");
114
+ return diff;
115
+ }
116
+ function withinTolerance(diff) {
117
+ if (diff.kind === "usd") return isUsdWithinTolerance(diff.onchain, diff.offchain);
118
+ if (diff.kind !== "numeric") return false;
119
+ if (BPS_RATE_PATHS.has(diff.path)) return isBpsWithinTolerance(diff.onchain, diff.offchain);
120
+ if (LAG_AMOUNT_PATHS.has(diff.path)) return isAmountWithinTolerance(diff.onchain, diff.offchain);
121
+ return false;
122
+ }
123
+ function summarize(onchain, offchain, onlyOnchain, onlyOffchain, matched) {
124
+ const byChain = union(onchain.map((row) => String(row.chainId)), offchain.map((row) => String(row.chainId))).map((chainId) => ({
125
+ chainId: Number(chainId),
126
+ ...toCompareCounts(onchain.filter((row) => String(row.chainId) === chainId).length, offchain.filter((row) => String(row.chainId) === chainId).length, onlyOnchain.filter((ref) => String(ref.chainId) === chainId).length, onlyOffchain.filter((ref) => String(ref.chainId) === chainId).length, matched.filter((match) => String(match.chainId) === chainId))
127
+ })).sort((a, b) => a.chainId - b.chainId);
128
+ return {
129
+ ...toCompareCounts(onchain.length, offchain.length, onlyOnchain.length, onlyOffchain.length, matched),
130
+ byChain,
131
+ diffsByPath: countPaths(matched.flatMap((match) => match.diffs))
132
+ };
133
+ }
134
+ //#endregion
135
+ export { compareOpportunities, diffOpportunity };
@@ -0,0 +1,181 @@
1
+ import { positionId } from "../model/positions.js";
2
+ import "../model/index.js";
3
+ import { USD_RELATIVE_EPSILON, asFiniteNumber, countPaths, diffObjects, isAmountWithinTolerance, isBpsWithinTolerance, isRecord, isUsdWithinTolerance, toCompareCounts, union, withExpected, withinRelative } from "./fieldDiff.js";
4
+ //#region src/dev/comparePositions.ts
5
+ /**
6
+ * Matches two position listings per wallet by {@link positionId} and reports
7
+ * every field the two sources disagree on.
8
+ *
9
+ * Nothing is filtered out. A field only one mode can fill, or a USD value that
10
+ * drifted within snapshot-lag noise, is still reported — tagged
11
+ * {@link FieldDiff.expected} so that {@link CompareCounts.clean} can ignore it
12
+ * while {@link CompareCounts.identical} stays strict.
13
+ **/
14
+ function comparePositions(input) {
15
+ const failures = input.failures ?? [];
16
+ const wallets = [...input.wallets.map(compareWallet), ...failures.map((failure) => ({
17
+ wallet: failure.wallet,
18
+ error: failure.error,
19
+ onlyOnchain: [],
20
+ onlyOffchain: [],
21
+ matched: []
22
+ }))];
23
+ wallets.sort((a, b) => a.wallet.localeCompare(b.wallet));
24
+ return {
25
+ generatedAt: input.generatedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
26
+ backendUrl: input.backendUrl,
27
+ networks: [...input.networks],
28
+ onchainChains: collectChains(input.wallets, "onchain"),
29
+ offchainChains: collectChains(input.wallets, "offchain"),
30
+ summary: summarize(input.wallets, wallets, failures.length),
31
+ wallets
32
+ };
33
+ }
34
+ /**
35
+ * Every field two versions of one position disagree on.
36
+ **/
37
+ function diffPosition(onchain, offchain) {
38
+ return diffObjects(onchain, offchain, { keyOf: keyOfPositionArray }).map((diff) => tagDiff(diff, onchain.kind));
39
+ }
40
+ function compareWallet(input) {
41
+ const onchainRows = indexById(input.onchain.data);
42
+ const offchainRows = indexById(input.offchain.data);
43
+ const onlyOnchain = [];
44
+ const onlyOffchain = [];
45
+ const matched = [];
46
+ for (const [id, row] of onchainRows) {
47
+ const counterpart = offchainRows.get(id);
48
+ if (!counterpart) {
49
+ onlyOnchain.push(toRef(row));
50
+ continue;
51
+ }
52
+ const diffs = diffPosition(row, counterpart);
53
+ matched.push({
54
+ id,
55
+ kind: row.kind,
56
+ chainId: row.chainId,
57
+ onchainName: row.name,
58
+ offchainName: counterpart.name,
59
+ identical: diffs.length === 0,
60
+ clean: diffs.every((diff) => diff.expected),
61
+ diffs
62
+ });
63
+ }
64
+ for (const [id, row] of offchainRows) if (!onchainRows.has(id)) onlyOffchain.push(toRef(row));
65
+ onlyOnchain.sort((a, b) => a.id.localeCompare(b.id));
66
+ onlyOffchain.sort((a, b) => a.id.localeCompare(b.id));
67
+ matched.sort((a, b) => a.id.localeCompare(b.id));
68
+ return {
69
+ wallet: input.wallet,
70
+ onlyOnchain,
71
+ onlyOffchain,
72
+ matched
73
+ };
74
+ }
75
+ function indexById(rows) {
76
+ return new Map(rows.map((row) => [positionId(row), row]));
77
+ }
78
+ function toRef(row) {
79
+ const base = {
80
+ id: positionId(row),
81
+ kind: row.kind,
82
+ chainId: row.chainId,
83
+ name: row.name
84
+ };
85
+ switch (row.kind) {
86
+ case "pool": return {
87
+ ...base,
88
+ pool: row.pool
89
+ };
90
+ case "strategy": return {
91
+ ...base,
92
+ creditAccount: row.creditAccount,
93
+ creditManager: row.creditManager
94
+ };
95
+ case "liquidation": return base;
96
+ }
97
+ }
98
+ /**
99
+ * `collaterals[]` is keyed by the collateral token, not by a top-level
100
+ * address. Rewards-points programs already identify themselves by `id`.
101
+ **/
102
+ function keyOfPositionArray(path, value) {
103
+ if (path !== "collaterals" || !isRecord(value) || !isRecord(value.collateral)) return;
104
+ const token = value.collateral.token;
105
+ return isRecord(token) && typeof token.address === "string" ? token.address : void 0;
106
+ }
107
+ const BPS_RATE_PATHS = /* @__PURE__ */ new Set([
108
+ "borrowApy",
109
+ "apy.organicApy",
110
+ "healthFactor"
111
+ ]);
112
+ /**
113
+ * Amount fields whose bigint `value` moves with interest accrual between the
114
+ * backend's last sync and the current block.
115
+ **/
116
+ function isLagAmountPath(path) {
117
+ return path === "totalDebt.value" || path === "totalValue.value" || path === "netValue.value" || path.endsWith(".collateral.value") || path.endsWith(".quota.value");
118
+ }
119
+ /**
120
+ * Fields documented `@mode offchain` or `@mode onchain` in the model.
121
+ **/
122
+ function isModeScoped(path, kind) {
123
+ if (path === "pnl" || path.startsWith("pnl.")) return true;
124
+ if (kind === "pool") return path === "apy.totalApy" || path.startsWith("apy.rewards");
125
+ if (kind === "strategy") return path === "netApy" || path.startsWith("netApy.") || path === "borrowRate" || path.startsWith("borrowRate.") || path === "timeToLiquidation" || path === "liquidationPrice";
126
+ return false;
127
+ }
128
+ function tagDiff(diff, kind) {
129
+ if (isModeScoped(diff.path, kind)) return withExpected(diff, "mode-scoped");
130
+ if (withinTolerance(diff)) return withExpected(diff, "tolerance");
131
+ return diff;
132
+ }
133
+ function withinTolerance(diff) {
134
+ if (diff.kind === "usd") return isUsdWithinTolerance(diff.onchain, diff.offchain);
135
+ if (diff.kind !== "numeric") return false;
136
+ if (diff.path === "leverage") return withinRelative(asFiniteNumber(diff.onchain), asFiniteNumber(diff.offchain), USD_RELATIVE_EPSILON);
137
+ if (BPS_RATE_PATHS.has(diff.path)) return isBpsWithinTolerance(diff.onchain, diff.offchain);
138
+ if (isLagAmountPath(diff.path)) return isAmountWithinTolerance(diff.onchain, diff.offchain);
139
+ return false;
140
+ }
141
+ function summarize(inputs, wallets, failed) {
142
+ const compared = wallets.filter((wallet) => !wallet.error);
143
+ const allOnchain = inputs.flatMap((input) => input.onchain.data);
144
+ const allOffchain = inputs.flatMap((input) => input.offchain.data);
145
+ const onlyOnchain = compared.flatMap((wallet) => wallet.onlyOnchain);
146
+ const onlyOffchain = compared.flatMap((wallet) => wallet.onlyOffchain);
147
+ const matched = compared.flatMap((wallet) => wallet.matched);
148
+ const byChain = union(allOnchain.map((row) => String(row.chainId)), allOffchain.map((row) => String(row.chainId))).map((chainId) => ({
149
+ chainId: Number(chainId),
150
+ ...toCompareCounts(allOnchain.filter((row) => String(row.chainId) === chainId).length, allOffchain.filter((row) => String(row.chainId) === chainId).length, onlyOnchain.filter((ref) => String(ref.chainId) === chainId).length, onlyOffchain.filter((ref) => String(ref.chainId) === chainId).length, matched.filter((match) => String(match.chainId) === chainId))
151
+ })).sort((a, b) => a.chainId - b.chainId);
152
+ const byWallet = wallets.map((wallet) => ({
153
+ wallet: wallet.wallet,
154
+ ...wallet.error ? { error: wallet.error } : {},
155
+ ...toCompareCounts(wallet.matched.length + wallet.onlyOnchain.length, wallet.matched.length + wallet.onlyOffchain.length, wallet.onlyOnchain.length, wallet.onlyOffchain.length, wallet.matched)
156
+ }));
157
+ const walletsClean = compared.filter((wallet) => wallet.onlyOnchain.length === 0 && wallet.onlyOffchain.length === 0 && wallet.matched.every((match) => match.clean)).length;
158
+ return {
159
+ ...toCompareCounts(allOnchain.length, allOffchain.length, onlyOnchain.length, onlyOffchain.length, matched),
160
+ wallets: wallets.length,
161
+ walletsClean,
162
+ walletsFailed: failed,
163
+ byChain,
164
+ byWallet,
165
+ diffsByPath: countPaths(matched.flatMap((match) => match.diffs))
166
+ };
167
+ }
168
+ /**
169
+ * One metadata entry per chain, preferring a success so the report names the
170
+ * block. Later wallets of the same chain are ignored.
171
+ **/
172
+ function collectChains(wallets, side) {
173
+ const byChain = /* @__PURE__ */ new Map();
174
+ for (const wallet of wallets) for (const chain of wallet[side].meta.chains) {
175
+ const existing = byChain.get(chain.chainId);
176
+ if (!existing || existing.status !== "success" && chain.status === "success") byChain.set(chain.chainId, chain);
177
+ }
178
+ return [...byChain.values()].sort((a, b) => a.chainId - b.chainId);
179
+ }
180
+ //#endregion
181
+ export { comparePositions, diffPosition };
@@ -0,0 +1,224 @@
1
+ //#region src/dev/fieldDiff.ts
2
+ /**
3
+ * Relative drift allowed on {@link Amount.valueUsd} before a USD float is a
4
+ * real disagreement: 0.1%.
5
+ **/
6
+ const USD_RELATIVE_EPSILON = .001;
7
+ /**
8
+ * Relative drift allowed on lag-bounded bigint amounts: 0.05%.
9
+ **/
10
+ const AMOUNT_RELATIVE_EPSILON = 5e-4;
11
+ /**
12
+ * Absolute drift allowed on bps rates before rounding and a one-block lag are
13
+ * no longer enough to explain it.
14
+ **/
15
+ const BPS_ABSOLUTE_EPSILON = 1;
16
+ /**
17
+ * Every field two versions of one value disagree on. Nothing is filtered or
18
+ * tagged: the caller marks expected diffs afterwards.
19
+ **/
20
+ function diffValue(path, onchain, offchain, out, options) {
21
+ if (isAbsent(onchain) && isAbsent(offchain)) return;
22
+ if (isAbsent(onchain) || isAbsent(offchain)) {
23
+ out.push({
24
+ path,
25
+ onchain,
26
+ offchain,
27
+ kind: "presence"
28
+ });
29
+ return;
30
+ }
31
+ if (Array.isArray(onchain) && Array.isArray(offchain)) {
32
+ diffArray(path, onchain, offchain, out, options);
33
+ return;
34
+ }
35
+ if (isRecord(onchain) && isRecord(offchain)) {
36
+ for (const key of union(Object.keys(onchain), Object.keys(offchain))) diffValue(join(path, key), onchain[key], offchain[key], out, options);
37
+ return;
38
+ }
39
+ if (!sameScalar(onchain, offchain)) out.push({
40
+ path,
41
+ onchain,
42
+ offchain,
43
+ kind: scalarKind(path, onchain)
44
+ });
45
+ }
46
+ /**
47
+ * Deep-diff two values and return the disagreements, in path order of
48
+ * discovery.
49
+ **/
50
+ function diffObjects(onchain, offchain, options) {
51
+ const diffs = [];
52
+ diffValue("", onchain, offchain, diffs, options);
53
+ return diffs;
54
+ }
55
+ /**
56
+ * Mark a diff expected, so a later `clean` count can ignore it.
57
+ **/
58
+ function withExpected(diff, reason) {
59
+ return {
60
+ ...diff,
61
+ expected: true,
62
+ reason
63
+ };
64
+ }
65
+ /**
66
+ * How often each field differed, with array keys collapsed so that the same
67
+ * field of a hundred collateral tokens counts as one path. Sorted so the
68
+ * unexpected disagreements come first.
69
+ **/
70
+ function countPaths(diffs) {
71
+ const counts = /* @__PURE__ */ new Map();
72
+ for (const diff of diffs) {
73
+ const path = collapseArrayKeys(diff.path);
74
+ const entry = counts.get(path) ?? {
75
+ path,
76
+ kinds: [],
77
+ count: 0,
78
+ expected: 0,
79
+ unexpected: 0
80
+ };
81
+ entry.count += 1;
82
+ if (diff.expected) entry.expected += 1;
83
+ else entry.unexpected += 1;
84
+ if (!entry.kinds.includes(diff.kind)) entry.kinds.push(diff.kind);
85
+ counts.set(path, entry);
86
+ }
87
+ return [...counts.values()].sort((a, b) => b.unexpected - a.unexpected || b.count - a.count || a.path.localeCompare(b.path));
88
+ }
89
+ /**
90
+ * Collapse `collateralTokens[0xa0b8...].symbol` to `collateralTokens[].symbol`.
91
+ **/
92
+ function collapseArrayKeys(path) {
93
+ return path.replace(/\[[^\]]*\]/g, "[]");
94
+ }
95
+ /**
96
+ * Membership and match totals of one comparison, from already-built lists.
97
+ **/
98
+ function toCompareCounts(onchainRows, offchainRows, onlyOnchain, onlyOffchain, matched) {
99
+ const identical = matched.filter((match) => match.identical).length;
100
+ const clean = matched.filter((match) => match.clean).length;
101
+ return {
102
+ onchainRows,
103
+ offchainRows,
104
+ matched: matched.length,
105
+ identical,
106
+ clean,
107
+ differing: matched.length - identical,
108
+ onlyOnchain,
109
+ onlyOffchain
110
+ };
111
+ }
112
+ /**
113
+ * USD floats within {@link USD_RELATIVE_EPSILON}.
114
+ **/
115
+ function isUsdWithinTolerance(onchain, offchain) {
116
+ return withinRelative(asFiniteNumber(onchain), asFiniteNumber(offchain), USD_RELATIVE_EPSILON);
117
+ }
118
+ /**
119
+ * Bps rates that differ by at most {@link BPS_ABSOLUTE_EPSILON}.
120
+ **/
121
+ function isBpsWithinTolerance(onchain, offchain) {
122
+ const left = asFiniteNumber(onchain);
123
+ const right = asFiniteNumber(offchain);
124
+ return left !== void 0 && right !== void 0 && Math.abs(left - right) <= 1;
125
+ }
126
+ /**
127
+ * Bigint amounts within {@link AMOUNT_RELATIVE_EPSILON}.
128
+ **/
129
+ function isAmountWithinTolerance(onchain, offchain) {
130
+ return typeof onchain === "bigint" && typeof offchain === "bigint" && withinRelativeBigint(onchain, offchain, 5e-4);
131
+ }
132
+ /**
133
+ * Finite numbers within a relative epsilon of each other.
134
+ **/
135
+ function withinRelative(onchain, offchain, epsilon) {
136
+ if (onchain === void 0 || offchain === void 0) return false;
137
+ const scale = Math.max(Math.abs(onchain), Math.abs(offchain));
138
+ return scale === 0 ? true : Math.abs(onchain - offchain) / scale <= epsilon;
139
+ }
140
+ /**
141
+ * `diff / max(|a|, |b|) <= epsilon`, computed in integer arithmetic so a
142
+ * 1e18-scale amount does not round through `Number`.
143
+ **/
144
+ function withinRelativeBigint(onchain, offchain, epsilon) {
145
+ if (onchain === offchain) return true;
146
+ const diff = onchain > offchain ? onchain - offchain : offchain - onchain;
147
+ const scale = abs(onchain) > abs(offchain) ? abs(onchain) : abs(offchain);
148
+ if (scale === 0n) return true;
149
+ return diff * BigInt(Math.round(1 / epsilon)) <= scale;
150
+ }
151
+ function asFiniteNumber(value) {
152
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
153
+ }
154
+ function union(left, right) {
155
+ return [.../* @__PURE__ */ new Set([...left, ...right])];
156
+ }
157
+ function isRecord(value) {
158
+ return typeof value === "object" && value !== null && !Array.isArray(value);
159
+ }
160
+ function diffArray(path, onchain, offchain, out, options) {
161
+ const onchainKeyed = keyElements(path, onchain, options?.keyOf);
162
+ const offchainKeyed = keyElements(path, offchain, options?.keyOf);
163
+ if (!onchainKeyed || !offchainKeyed) {
164
+ if (onchain.length !== offchain.length) {
165
+ out.push({
166
+ path,
167
+ onchain,
168
+ offchain,
169
+ kind: "other"
170
+ });
171
+ return;
172
+ }
173
+ onchain.forEach((element, index) => {
174
+ diffValue(`${path}[${index}]`, element, offchain[index], out, options);
175
+ });
176
+ return;
177
+ }
178
+ for (const key of union([...onchainKeyed.keys()], [...offchainKeyed.keys()])) diffValue(`${path}[${key}]`, onchainKeyed.get(key), offchainKeyed.get(key), out, options);
179
+ }
180
+ /**
181
+ * The array indexed by each element's own identity, or `undefined` when its
182
+ * elements have none and order is all there is to go by.
183
+ **/
184
+ function keyElements(path, values, keyOf) {
185
+ const keyed = /* @__PURE__ */ new Map();
186
+ for (const value of values) {
187
+ const identity = keyOf?.(path, value) ?? defaultIdentity(value);
188
+ if (typeof identity !== "string") return;
189
+ keyed.set(identity.toLowerCase(), value);
190
+ }
191
+ return keyed.size === values.length ? keyed : void 0;
192
+ }
193
+ function defaultIdentity(value) {
194
+ if (!isRecord(value)) return;
195
+ if (typeof value.address === "string") return value.address;
196
+ if (typeof value.id === "string") return value.id;
197
+ if (typeof value.token === "string") return value.token;
198
+ if (isRecord(value.token) && typeof value.token.address === "string") return value.token.address;
199
+ }
200
+ const ADDRESS = /^0x[0-9a-f]{40}$/i;
201
+ /**
202
+ * Only addresses are compared case-insensitively: the backend lowercases them
203
+ * while the chain hands out checksummed ones, which is not a disagreement. A
204
+ * symbol or a name spelled differently is.
205
+ **/
206
+ function sameScalar(onchain, offchain) {
207
+ if (typeof onchain === "string" && typeof offchain === "string" && ADDRESS.test(onchain) && ADDRESS.test(offchain)) return onchain.toLowerCase() === offchain.toLowerCase();
208
+ return onchain === offchain;
209
+ }
210
+ function scalarKind(path, onchain) {
211
+ if (path.endsWith("valueUsd")) return "usd";
212
+ return typeof onchain === "number" || typeof onchain === "bigint" ? "numeric" : "other";
213
+ }
214
+ function isAbsent(value) {
215
+ return value === void 0 || value === null;
216
+ }
217
+ function join(path, key) {
218
+ return path ? `${path}.${key}` : key;
219
+ }
220
+ function abs(value) {
221
+ return value < 0n ? -value : value;
222
+ }
223
+ //#endregion
224
+ export { AMOUNT_RELATIVE_EPSILON, BPS_ABSOLUTE_EPSILON, USD_RELATIVE_EPSILON, asFiniteNumber, collapseArrayKeys, countPaths, diffObjects, diffValue, isAmountWithinTolerance, isBpsWithinTolerance, isRecord, isUsdWithinTolerance, toCompareCounts, union, withExpected, withinRelative, withinRelativeBigint };