@lidofinance/lsv-cli 1.5.0 → 1.6.0

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 (293) hide show
  1. package/dist/abi/AccessControlConfirmable.js.map +1 -1
  2. package/dist/abi/Dashboard.js.map +1 -1
  3. package/dist/abi/LazyOracle.js.map +1 -1
  4. package/dist/abi/LidoLocator.js.map +1 -1
  5. package/dist/abi/OperatorGrid.js.map +1 -1
  6. package/dist/abi/PredepositGuarantee.js.map +1 -1
  7. package/dist/abi/StEth.js.map +1 -1
  8. package/dist/abi/StakingVault.js.map +1 -1
  9. package/dist/abi/ValidatorConsolidationRequests.js.map +1 -1
  10. package/dist/abi/VaultFactory.js.map +1 -1
  11. package/dist/abi/VaultHub.js.map +1 -1
  12. package/dist/abi/VaultViewer.js.map +1 -1
  13. package/dist/abi/WstEth.js.map +1 -1
  14. package/dist/abi/defi-wrapper/Distributor.js.map +1 -1
  15. package/dist/abi/defi-wrapper/Factory.js.map +1 -1
  16. package/dist/abi/defi-wrapper/OssifiableProxy.js.map +1 -1
  17. package/dist/abi/defi-wrapper/StrategyFactory.d.ts +59 -0
  18. package/dist/abi/defi-wrapper/StrategyFactory.js +37 -0
  19. package/dist/abi/defi-wrapper/StrategyFactory.js.map +1 -0
  20. package/dist/abi/defi-wrapper/StvPool.js.map +1 -1
  21. package/dist/abi/defi-wrapper/StvStETHPool.js.map +1 -1
  22. package/dist/abi/defi-wrapper/TimeLock.js.map +1 -1
  23. package/dist/abi/defi-wrapper/WithdrawalQueue.js.map +1 -1
  24. package/dist/abi/defi-wrapper/index.d.ts +1 -0
  25. package/dist/abi/defi-wrapper/index.js +1 -0
  26. package/dist/abi/defi-wrapper/index.js.map +1 -1
  27. package/dist/command/index.js +11 -0
  28. package/dist/command/index.js.map +1 -1
  29. package/dist/configs/constants.d.ts +4 -4
  30. package/dist/contracts/dashboard-impl.d.ts +4 -3
  31. package/dist/contracts/dashboard-impl.js +5 -8
  32. package/dist/contracts/dashboard-impl.js.map +1 -1
  33. package/dist/contracts/dashboard.d.ts +4 -3
  34. package/dist/contracts/dashboard.js +1 -1
  35. package/dist/contracts/dashboard.js.map +1 -1
  36. package/dist/contracts/defi-wrapper/distributor.d.ts +5 -4
  37. package/dist/contracts/defi-wrapper/distributor.js +2 -2
  38. package/dist/contracts/defi-wrapper/distributor.js.map +1 -1
  39. package/dist/contracts/defi-wrapper/factory.d.ts +5 -4
  40. package/dist/contracts/defi-wrapper/factory.js +2 -2
  41. package/dist/contracts/defi-wrapper/factory.js.map +1 -1
  42. package/dist/contracts/defi-wrapper/index.d.ts +1 -0
  43. package/dist/contracts/defi-wrapper/index.js +1 -0
  44. package/dist/contracts/defi-wrapper/index.js.map +1 -1
  45. package/dist/contracts/defi-wrapper/ossifiable-proxy.d.ts +5 -4
  46. package/dist/contracts/defi-wrapper/ossifiable-proxy.js +2 -2
  47. package/dist/contracts/defi-wrapper/ossifiable-proxy.js.map +1 -1
  48. package/dist/contracts/defi-wrapper/strategy-factory.d.ts +5 -0
  49. package/dist/contracts/defi-wrapper/strategy-factory.js +12 -0
  50. package/dist/contracts/defi-wrapper/strategy-factory.js.map +1 -0
  51. package/dist/contracts/defi-wrapper/stv-pool.d.ts +5 -4
  52. package/dist/contracts/defi-wrapper/stv-pool.js +2 -2
  53. package/dist/contracts/defi-wrapper/stv-pool.js.map +1 -1
  54. package/dist/contracts/defi-wrapper/stv-steth-pool.d.ts +5 -4
  55. package/dist/contracts/defi-wrapper/stv-steth-pool.js +2 -2
  56. package/dist/contracts/defi-wrapper/stv-steth-pool.js.map +1 -1
  57. package/dist/contracts/defi-wrapper/timelock.d.ts +5 -4
  58. package/dist/contracts/defi-wrapper/timelock.js +2 -2
  59. package/dist/contracts/defi-wrapper/timelock.js.map +1 -1
  60. package/dist/contracts/defi-wrapper/withdrawal-queue.d.ts +5 -4
  61. package/dist/contracts/defi-wrapper/withdrawal-queue.js +2 -2
  62. package/dist/contracts/defi-wrapper/withdrawal-queue.js.map +1 -1
  63. package/dist/contracts/lazy-oracle.d.ts +5 -3
  64. package/dist/contracts/lazy-oracle.js +5 -9
  65. package/dist/contracts/lazy-oracle.js.map +1 -1
  66. package/dist/contracts/locator.d.ts +4 -2
  67. package/dist/contracts/locator.js +5 -8
  68. package/dist/contracts/locator.js.map +1 -1
  69. package/dist/contracts/operator-grid.d.ts +5 -4
  70. package/dist/contracts/operator-grid.js +5 -8
  71. package/dist/contracts/operator-grid.js.map +1 -1
  72. package/dist/contracts/pdg.d.ts +5 -4
  73. package/dist/contracts/pdg.js +5 -8
  74. package/dist/contracts/pdg.js.map +1 -1
  75. package/dist/contracts/steth.d.ts +5 -4
  76. package/dist/contracts/steth.js +5 -9
  77. package/dist/contracts/steth.js.map +1 -1
  78. package/dist/contracts/validator-consolidation-requests.d.ts +3 -3
  79. package/dist/contracts/validator-consolidation-requests.js.map +1 -1
  80. package/dist/contracts/vault-factory.d.ts +5 -3
  81. package/dist/contracts/vault-factory.js +6 -8
  82. package/dist/contracts/vault-factory.js.map +1 -1
  83. package/dist/contracts/vault-hub.d.ts +5 -3
  84. package/dist/contracts/vault-hub.js +5 -9
  85. package/dist/contracts/vault-hub.js.map +1 -1
  86. package/dist/contracts/vault-viewer.d.ts +4 -2
  87. package/dist/contracts/vault-viewer.js +6 -9
  88. package/dist/contracts/vault-viewer.js.map +1 -1
  89. package/dist/contracts/vault.d.ts +5 -4
  90. package/dist/contracts/vault.js +2 -2
  91. package/dist/contracts/vault.js.map +1 -1
  92. package/dist/contracts/wsteth.d.ts +5 -3
  93. package/dist/contracts/wsteth.js +5 -9
  94. package/dist/contracts/wsteth.js.map +1 -1
  95. package/dist/features/consolidation.d.ts +1 -1
  96. package/dist/features/defi-wrapper/create-vault.js +3 -3
  97. package/dist/features/defi-wrapper/create-vault.js.map +1 -1
  98. package/dist/features/defi-wrapper/defi-wrapper-factory.d.ts +14 -4
  99. package/dist/features/defi-wrapper/defi-wrapper-factory.js +21 -4
  100. package/dist/features/defi-wrapper/defi-wrapper-factory.js.map +1 -1
  101. package/dist/features/defi-wrapper/distributor.js +3 -3
  102. package/dist/features/defi-wrapper/pool-info.js +2 -2
  103. package/dist/features/defi-wrapper/timelock.d.ts +3 -3
  104. package/dist/features/defi-wrapper/timelock.js +3 -3
  105. package/dist/features/defi-wrapper/timelock.js.map +1 -1
  106. package/dist/features/deposits/make-pdg-proof.js +4 -4
  107. package/dist/features/deposits/make-pdg-proof.js.map +1 -1
  108. package/dist/features/deposits/validators.js +1 -1
  109. package/dist/features/deposits/validators.js.map +1 -1
  110. package/dist/features/metrics.d.ts +3 -0
  111. package/dist/features/metrics.js +25 -0
  112. package/dist/features/metrics.js.map +1 -1
  113. package/dist/features/mint-burn/mint-limit.js +1 -1
  114. package/dist/features/utils/minting-capacity.js +1 -1
  115. package/dist/features/vault-factory.js +1 -1
  116. package/dist/features/vault-operations/index.d.ts +1 -0
  117. package/dist/features/vault-operations/index.js +1 -0
  118. package/dist/features/vault-operations/index.js.map +1 -1
  119. package/dist/features/vault-operations/share-limit.d.ts +8 -0
  120. package/dist/features/vault-operations/share-limit.js +20 -0
  121. package/dist/features/vault-operations/share-limit.js.map +1 -0
  122. package/dist/features/with-report.d.ts +1 -1
  123. package/dist/index.js +30 -10
  124. package/dist/index.js.map +1 -1
  125. package/dist/programs/account/main.d.ts +1 -1
  126. package/dist/programs/account/write.js +29 -2
  127. package/dist/programs/account/write.js.map +1 -1
  128. package/dist/programs/contracts/dashboard/main.d.ts +1 -1
  129. package/dist/programs/contracts/dashboard/write.js +21 -14
  130. package/dist/programs/contracts/dashboard/write.js.map +1 -1
  131. package/dist/programs/contracts/hub/main.d.ts +1 -1
  132. package/dist/programs/contracts/hub/write.js +2 -1
  133. package/dist/programs/contracts/hub/write.js.map +1 -1
  134. package/dist/programs/contracts/lazy-oracle/main.d.ts +1 -1
  135. package/dist/programs/contracts/main.d.ts +1 -1
  136. package/dist/programs/contracts/operator-grid/main.d.ts +1 -1
  137. package/dist/programs/contracts/operator-grid/write.js +13 -9
  138. package/dist/programs/contracts/operator-grid/write.js.map +1 -1
  139. package/dist/programs/contracts/pdg/main.d.ts +1 -1
  140. package/dist/programs/contracts/pdg/write.js +1 -1
  141. package/dist/programs/contracts/vault/main.d.ts +1 -1
  142. package/dist/programs/contracts/vault-factory/main.d.ts +1 -1
  143. package/dist/programs/contracts/vault-viewer/main.d.ts +1 -1
  144. package/dist/programs/defi-wrapper/contracts/distributor/config.d.ts +1 -1
  145. package/dist/programs/defi-wrapper/contracts/distributor/main.d.ts +1 -1
  146. package/dist/programs/defi-wrapper/contracts/distributor/read.js +2 -2
  147. package/dist/programs/defi-wrapper/contracts/distributor/write.js +1 -1
  148. package/dist/programs/defi-wrapper/contracts/factory/config.d.ts +1 -1
  149. package/dist/programs/defi-wrapper/contracts/factory/main.d.ts +1 -1
  150. package/dist/programs/defi-wrapper/contracts/factory/read.js +2 -2
  151. package/dist/programs/defi-wrapper/contracts/factory/write.js +124 -36
  152. package/dist/programs/defi-wrapper/contracts/factory/write.js.map +1 -1
  153. package/dist/programs/defi-wrapper/contracts/main.d.ts +1 -1
  154. package/dist/programs/defi-wrapper/contracts/stv-pool/config.d.ts +1 -1
  155. package/dist/programs/defi-wrapper/contracts/stv-pool/main.d.ts +1 -1
  156. package/dist/programs/defi-wrapper/contracts/stv-pool/read.js +2 -2
  157. package/dist/programs/defi-wrapper/contracts/stv-pool/write.js +1 -1
  158. package/dist/programs/defi-wrapper/contracts/stv-steth-pool/config.d.ts +1 -1
  159. package/dist/programs/defi-wrapper/contracts/stv-steth-pool/main.d.ts +1 -1
  160. package/dist/programs/defi-wrapper/contracts/stv-steth-pool/read.js +2 -2
  161. package/dist/programs/defi-wrapper/contracts/stv-steth-pool/write.js +1 -1
  162. package/dist/programs/defi-wrapper/contracts/withdrawal-queue/config.d.ts +1 -1
  163. package/dist/programs/defi-wrapper/contracts/withdrawal-queue/main.d.ts +1 -1
  164. package/dist/programs/defi-wrapper/contracts/withdrawal-queue/read.js +2 -2
  165. package/dist/programs/defi-wrapper/contracts/withdrawal-queue/write.js +1 -1
  166. package/dist/programs/defi-wrapper/main.d.ts +1 -1
  167. package/dist/programs/defi-wrapper/use-cases/distributor/main.d.ts +1 -1
  168. package/dist/programs/defi-wrapper/use-cases/distributor/read.js +2 -2
  169. package/dist/programs/defi-wrapper/use-cases/distributor/write.js +3 -3
  170. package/dist/programs/defi-wrapper/use-cases/health/main.d.ts +1 -1
  171. package/dist/programs/defi-wrapper/use-cases/health/read.js +2 -2
  172. package/dist/programs/defi-wrapper/use-cases/health/utils.js +1 -1
  173. package/dist/programs/defi-wrapper/use-cases/health/write.js +3 -3
  174. package/dist/programs/defi-wrapper/use-cases/main.d.ts +1 -1
  175. package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/main.d.ts +1 -1
  176. package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/read.js +8 -8
  177. package/dist/programs/defi-wrapper/use-cases/timelock-governance/common/write.js +1 -1
  178. package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/main.d.ts +1 -1
  179. package/dist/programs/defi-wrapper/use-cases/timelock-governance/dashboard/write.js +3 -3
  180. package/dist/programs/defi-wrapper/use-cases/timelock-governance/main.d.ts +1 -1
  181. package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/main.d.ts +1 -1
  182. package/dist/programs/defi-wrapper/use-cases/timelock-governance/pool/write.js +3 -3
  183. package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/main.d.ts +1 -1
  184. package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/read.js +1 -1
  185. package/dist/programs/defi-wrapper/use-cases/timelock-governance/proxy/write.js +3 -3
  186. package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/main.d.ts +1 -1
  187. package/dist/programs/defi-wrapper/use-cases/timelock-governance/withdrawal-queue/write.js +3 -3
  188. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/main.d.ts +1 -1
  189. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/read.js +3 -3
  190. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js +35 -49
  191. package/dist/programs/defi-wrapper/use-cases/wrapper-operations/write.js.map +1 -1
  192. package/dist/programs/dev-tools/anvil/main.d.ts +1 -1
  193. package/dist/programs/dev-tools/defi-wrapper/main.d.ts +1 -1
  194. package/dist/programs/dev-tools/defi-wrapper/write.js +1 -1
  195. package/dist/programs/dev-tools/main.d.ts +1 -1
  196. package/dist/programs/pdg-helpers.js +4 -0
  197. package/dist/programs/pdg-helpers.js.map +1 -1
  198. package/dist/programs/use-cases/consolidation/main.d.ts +1 -1
  199. package/dist/programs/use-cases/consolidation/write.d.ts +1 -1
  200. package/dist/programs/use-cases/consolidation/write.js +1 -1
  201. package/dist/programs/use-cases/deposits/main.d.ts +1 -1
  202. package/dist/programs/use-cases/metrics/main.d.ts +1 -1
  203. package/dist/programs/use-cases/metrics/read.js +7 -7
  204. package/dist/programs/use-cases/metrics/read.js.map +1 -1
  205. package/dist/programs/use-cases/report/main.d.ts +1 -1
  206. package/dist/programs/use-cases/vault-operations/main.d.ts +1 -1
  207. package/dist/programs/use-cases/vault-operations/write.js +29 -15
  208. package/dist/programs/use-cases/vault-operations/write.js.map +1 -1
  209. package/dist/providers/wallet.d.ts +302 -300
  210. package/dist/providers/wallet.js +10 -2
  211. package/dist/providers/wallet.js.map +1 -1
  212. package/dist/tests/integration/deposits.test.js +1 -1
  213. package/dist/tests/integration/deposits.test.js.map +1 -1
  214. package/dist/tests/integration/helpers/test-client.d.ts +150 -150
  215. package/dist/tests/integration/metrics.test.js.map +1 -1
  216. package/dist/tests/integration/mint-burn.test.js.map +1 -1
  217. package/dist/tests/utils/calculate-overview-v2.test.js +1 -1
  218. package/dist/tests/utils/csv-file.test.js +1 -1
  219. package/dist/tests/utils/error-handler.test.js +5 -8
  220. package/dist/tests/utils/error-handler.test.js.map +1 -1
  221. package/dist/tests/utils/lido-apr.test.js +1 -1
  222. package/dist/tests/utils/logging.test.js +30 -14
  223. package/dist/tests/utils/logging.test.js.map +1 -1
  224. package/dist/tests/utils/rebase-rewards.test.js +44 -43
  225. package/dist/tests/utils/rebase-rewards.test.js.map +1 -1
  226. package/dist/tests/utils/report-statistic.test.d.ts +1 -0
  227. package/dist/tests/utils/report-statistic.test.js +501 -0
  228. package/dist/tests/utils/report-statistic.test.js.map +1 -0
  229. package/dist/tests/utils/snake-to-camel.test.js +1 -1
  230. package/dist/tests/utils/spinner.test.d.ts +1 -0
  231. package/dist/tests/utils/spinner.test.js +113 -0
  232. package/dist/tests/utils/spinner.test.js.map +1 -0
  233. package/dist/tests/utils/timestamp.test.js +1 -1
  234. package/dist/utils/arguments.d.ts +1 -1
  235. package/dist/utils/cache.d.ts +0 -1
  236. package/dist/utils/cache.js +1 -2
  237. package/dist/utils/cache.js.map +1 -1
  238. package/dist/utils/charts/blessed/charts-apr.js +5 -5
  239. package/dist/utils/charts/blessed/charts-apr.js.map +1 -1
  240. package/dist/utils/charts/blessed/charts-rewards.js +4 -4
  241. package/dist/utils/charts/blessed/charts-rewards.js.map +1 -1
  242. package/dist/utils/charts/blessed/datasets/prepare-metrics.d.ts +6 -6
  243. package/dist/utils/charts/blessed/datasets/prepare-metrics.js +12 -13
  244. package/dist/utils/charts/blessed/datasets/prepare-metrics.js.map +1 -1
  245. package/dist/utils/charts/blessed/utils.js +5 -2
  246. package/dist/utils/charts/blessed/utils.js.map +1 -1
  247. package/dist/utils/charts/simple/simple-charts.js +15 -7
  248. package/dist/utils/charts/simple/simple-charts.js.map +1 -1
  249. package/dist/utils/error-handler.js +3 -0
  250. package/dist/utils/error-handler.js.map +1 -1
  251. package/dist/utils/fetchCL.js +26 -35
  252. package/dist/utils/fetchCL.js.map +1 -1
  253. package/dist/utils/index.d.ts +1 -0
  254. package/dist/utils/index.js +1 -0
  255. package/dist/utils/index.js.map +1 -1
  256. package/dist/utils/interrupt-handler.js +14 -6
  257. package/dist/utils/interrupt-handler.js.map +1 -1
  258. package/dist/utils/logging/console.d.ts +5 -1
  259. package/dist/utils/logging/console.js +36 -25
  260. package/dist/utils/logging/console.js.map +1 -1
  261. package/dist/utils/prompts/confirmations.d.ts +1 -1
  262. package/dist/utils/prompts/operations.d.ts +1 -1
  263. package/dist/utils/prompts/predeposit-guarantee.d.ts +1 -1
  264. package/dist/utils/prompts/predeposit-guarantee.js +1 -1
  265. package/dist/utils/proof/create-proof.js +18 -3
  266. package/dist/utils/proof/create-proof.js.map +1 -1
  267. package/dist/utils/rebase-rewards.d.ts +0 -1
  268. package/dist/utils/rebase-rewards.js +12 -3
  269. package/dist/utils/rebase-rewards.js.map +1 -1
  270. package/dist/utils/report/statistic-data.js +31 -16
  271. package/dist/utils/report/statistic-data.js.map +1 -1
  272. package/dist/utils/spinner/spinners.js +5 -3
  273. package/dist/utils/spinner/spinners.js.map +1 -1
  274. package/dist/utils/statistic/report-statistic.d.ts +21 -6
  275. package/dist/utils/statistic/report-statistic.js +65 -25
  276. package/dist/utils/statistic/report-statistic.js.map +1 -1
  277. package/dist/utils/transactions/tx-private-key.d.ts +2 -2
  278. package/dist/utils/transactions/tx-private-key.js +43 -11
  279. package/dist/utils/transactions/tx-private-key.js.map +1 -1
  280. package/dist/utils/transactions/tx-wc.d.ts +12 -11
  281. package/dist/utils/transactions/tx-wc.js +108 -11
  282. package/dist/utils/transactions/tx-wc.js.map +1 -1
  283. package/dist/utils/transactions/utils.d.ts +1 -0
  284. package/dist/utils/transactions/utils.js +11 -0
  285. package/dist/utils/transactions/utils.js.map +1 -1
  286. package/dist/utils/wallet-connect.d.ts +4 -1
  287. package/dist/utils/wallet-connect.js +52 -4
  288. package/dist/utils/wallet-connect.js.map +1 -1
  289. package/dist/utils/with-error.d.ts +7 -0
  290. package/dist/utils/with-error.js +6 -0
  291. package/dist/utils/with-error.js.map +1 -0
  292. package/dist/version/index.js +1 -1
  293. package/package.json +3 -3
@@ -0,0 +1,501 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { calcAccruedFeeOffChain, calcNoEarnings, getNodeOperatorFeeForPeriod, getGrossStakingRewards, getDailyLidoFees, getNetStakingRewards, getGrossStakingAPR, getNetStakingAPR, getBottomLine, getCarrySpread, reportMetrics, } from 'utils/statistic/report-statistic.js';
3
+ // ─── Helpers ────────────────────────────────────────────────────────────────
4
+ const ETH = (n) => BigInt(n) * 1000000000000000000n; // n * 1e18
5
+ const ONE_YEAR_SECONDS = 31_536_000;
6
+ /** Minimal VaultReport fixture — override only the fields you care about. */
7
+ const makeReport = (opts = {}) => ({
8
+ data: {
9
+ vaultAddress: '0x0000000000000000000000000000000000000001',
10
+ totalValueWei: String(opts.totalValueWei ?? 0n),
11
+ fee: String(opts.fee ?? 0n),
12
+ liabilityShares: String(opts.liabilityShares ?? 0n),
13
+ maxLiabilityShares: '0',
14
+ slashingReserve: '0',
15
+ },
16
+ extraData: {
17
+ inOutDelta: String(opts.inOutDelta ?? 0n),
18
+ prevFee: '0',
19
+ infraFee: '0',
20
+ liquidityFee: '0',
21
+ reservationFee: '0',
22
+ },
23
+ leaf: '0x',
24
+ refSlot: 0,
25
+ blockNumber: opts.blockNumber ?? 1000,
26
+ timestamp: opts.timestamp ?? 0,
27
+ prevTreeCID: '',
28
+ cid: '',
29
+ });
30
+ const makeSnapshot = (opts = {}) => ({
31
+ accruedFee: 0n,
32
+ settledGrowth: 0n,
33
+ feeRate: 0n,
34
+ ...opts,
35
+ });
36
+ // ─── calcAccruedFeeOffChain ──────────────────────────────────────────────────
37
+ describe('calcAccruedFeeOffChain', () => {
38
+ it('calculates fee on positive unsettled growth', () => {
39
+ // growth = 100 - 80 = 20 ETH; unsettled = 20 - 15 = 5 ETH; fee = 5 * 10% = 0.5 ETH
40
+ const fee = calcAccruedFeeOffChain({
41
+ totalValueWei: ETH(100),
42
+ inOutDelta: ETH(80),
43
+ settledGrowth: ETH(15),
44
+ feeRate: 1000n, // 10%
45
+ });
46
+ expect(fee).toBe(ETH(1) / 2n); // 0.5 ETH
47
+ });
48
+ it('returns 0 when growth equals settledGrowth (fully settled)', () => {
49
+ const fee = calcAccruedFeeOffChain({
50
+ totalValueWei: ETH(120),
51
+ inOutDelta: ETH(100),
52
+ settledGrowth: ETH(20),
53
+ feeRate: 1000n,
54
+ });
55
+ expect(fee).toBe(0n);
56
+ });
57
+ it('returns 0 when unsettledGrowth is negative', () => {
58
+ // Vault lost value — no fee accrues
59
+ const fee = calcAccruedFeeOffChain({
60
+ totalValueWei: ETH(90),
61
+ inOutDelta: ETH(100),
62
+ settledGrowth: ETH(0),
63
+ feeRate: 1000n,
64
+ });
65
+ expect(fee).toBe(0n);
66
+ });
67
+ it('returns 0 when feeRate is 0', () => {
68
+ const fee = calcAccruedFeeOffChain({
69
+ totalValueWei: ETH(110),
70
+ inOutDelta: ETH(100),
71
+ settledGrowth: ETH(0),
72
+ feeRate: 0n,
73
+ });
74
+ expect(fee).toBe(0n);
75
+ });
76
+ it('is equivalent to on-chain formula: totalValueWei already includes quarantineValue', () => {
77
+ // On-chain: growth = (VaultHub.totalValue + quarantineValue) - inOutDelta
78
+ // IPFS: totalValueWei = VaultHub.totalValue + quarantineValue
79
+ // So the off-chain formula with totalValueWei produces the same result.
80
+ const quarantineValue = ETH(5);
81
+ const vaultHubTotalValue = ETH(95);
82
+ const totalValueWei = vaultHubTotalValue + quarantineValue; // = 100 ETH (IPFS value)
83
+ const feeOffChain = calcAccruedFeeOffChain({
84
+ totalValueWei,
85
+ inOutDelta: ETH(80),
86
+ settledGrowth: ETH(0),
87
+ feeRate: 1000n,
88
+ });
89
+ // growth = 100 - 80 = 20; fee = 20 * 10% = 2 ETH
90
+ expect(feeOffChain).toBe(ETH(2));
91
+ // Verify: same result using on-chain formula components explicitly
92
+ const onChainGrowth = vaultHubTotalValue + quarantineValue - ETH(80);
93
+ const onChainFee = (onChainGrowth * 1000n) / 10000n;
94
+ expect(feeOffChain).toBe(onChainFee);
95
+ });
96
+ });
97
+ // ─── calcNoEarnings ──────────────────────────────────────────────────────────
98
+ describe('calcNoEarnings', () => {
99
+ it('sums settled portion and accrued portion', () => {
100
+ // noEarnings = settledGrowth * feeRate / 10000 + accruedFee
101
+ // = 100 * 1000 / 10000 + 5 = 10 + 5 = 15 ETH
102
+ const result = calcNoEarnings({
103
+ settledGrowth: ETH(100),
104
+ feeRate: 1000n,
105
+ accruedFee: ETH(5),
106
+ });
107
+ expect(result).toBe(ETH(15));
108
+ });
109
+ it('returns only accruedFee when settledGrowth is 0', () => {
110
+ const result = calcNoEarnings({
111
+ settledGrowth: 0n,
112
+ feeRate: 1000n,
113
+ accruedFee: ETH(3),
114
+ });
115
+ expect(result).toBe(ETH(3));
116
+ });
117
+ it('handles negative settledGrowth (int128 can be negative)', () => {
118
+ // Negative settledGrowth can occur transiently; noEarnings may be < accruedFee
119
+ const result = calcNoEarnings({
120
+ settledGrowth: -ETH(50),
121
+ feeRate: 1000n, // 10%
122
+ accruedFee: ETH(10),
123
+ });
124
+ // = -50 * 10% + 10 = -5 + 10 = 5 ETH
125
+ expect(result).toBe(ETH(5));
126
+ });
127
+ it('returns 0 when all inputs are 0', () => {
128
+ expect(calcNoEarnings({ settledGrowth: 0n, feeRate: 0n, accruedFee: 0n })).toBe(0n);
129
+ });
130
+ });
131
+ // ─── getNodeOperatorFeeForPeriod ─────────────────────────────────────────────
132
+ describe('getNodeOperatorFeeForPeriod', () => {
133
+ it('returns positive delta when noEarnings increased', () => {
134
+ // prev noEarnings = 100*10% + 0 = 10 ETH
135
+ // curr noEarnings = 110*10% + 2 = 13 ETH → fee = 3 ETH
136
+ const prev = makeSnapshot({
137
+ settledGrowth: ETH(100),
138
+ feeRate: 1000n,
139
+ accruedFee: 0n,
140
+ });
141
+ const curr = makeSnapshot({
142
+ settledGrowth: ETH(110),
143
+ feeRate: 1000n,
144
+ accruedFee: ETH(2),
145
+ });
146
+ expect(getNodeOperatorFeeForPeriod(curr, prev)).toBe(ETH(3));
147
+ });
148
+ it('returns 0 when delta is negative (e.g. feeRate decreased)', () => {
149
+ // prev noEarnings = 100 * 10% + 0 = 10 ETH
150
+ // curr noEarnings = 100 * 5% + 0 = 5 ETH → delta = -5 → clamped to 0
151
+ const prev = makeSnapshot({ settledGrowth: ETH(100), feeRate: 1000n });
152
+ const curr = makeSnapshot({ settledGrowth: ETH(100), feeRate: 500n });
153
+ expect(getNodeOperatorFeeForPeriod(curr, prev)).toBe(0n);
154
+ });
155
+ it('returns 0 when noEarnings is unchanged', () => {
156
+ const snap = makeSnapshot({
157
+ settledGrowth: ETH(100),
158
+ feeRate: 1000n,
159
+ accruedFee: ETH(5),
160
+ });
161
+ expect(getNodeOperatorFeeForPeriod(snap, snap)).toBe(0n);
162
+ });
163
+ it('is claim-timing invariant: same result whether NO claimed once or multiple times', () => {
164
+ // After a claim: settledGrowth increases, accruedFee resets to 0.
165
+ // noEarnings is the same before and after a claim, so delta is unaffected.
166
+ const growth = ETH(200);
167
+ const feeRate = 1000n; // 10%
168
+ const expectedFee = (growth * feeRate) / 10000n; // 20 ETH earned total
169
+ // Scenario A: no claim during period
170
+ const prevA = makeSnapshot({
171
+ settledGrowth: ETH(100),
172
+ feeRate,
173
+ accruedFee: ETH(0),
174
+ });
175
+ // noEarnings = 100*10% + 0 = 10 ETH
176
+ const currA = makeSnapshot({
177
+ settledGrowth: ETH(100),
178
+ feeRate,
179
+ accruedFee: ETH(20),
180
+ });
181
+ // noEarnings = 100*10% + 20 = 30 ETH → delta = 20 ETH
182
+ // Scenario B: NO claimed mid-period (settledGrowth absorbed the accrual)
183
+ const prevB = makeSnapshot({
184
+ settledGrowth: ETH(100),
185
+ feeRate,
186
+ accruedFee: ETH(0),
187
+ });
188
+ const currB = makeSnapshot({
189
+ settledGrowth: ETH(300),
190
+ feeRate,
191
+ accruedFee: ETH(0),
192
+ });
193
+ // noEarnings = 300*10% + 0 = 30 ETH → delta = 20 ETH
194
+ expect(getNodeOperatorFeeForPeriod(currA, prevA)).toBe(expectedFee);
195
+ expect(getNodeOperatorFeeForPeriod(currB, prevB)).toBe(expectedFee);
196
+ });
197
+ });
198
+ // ─── getGrossStakingRewards ──────────────────────────────────────────────────
199
+ describe('getGrossStakingRewards', () => {
200
+ it('returns organic TVL growth when there are no capital flows', () => {
201
+ const prev = makeReport({
202
+ totalValueWei: ETH(1000),
203
+ inOutDelta: ETH(1000),
204
+ });
205
+ const curr = makeReport({
206
+ totalValueWei: ETH(1003),
207
+ inOutDelta: ETH(1000),
208
+ });
209
+ expect(getGrossStakingRewards(curr, prev)).toBe(ETH(3));
210
+ });
211
+ it('strips out a mid-period deposit from the reward', () => {
212
+ // 100 ETH deposited mid-period; vault earns 3.5 ETH from staking
213
+ const prev = makeReport({
214
+ totalValueWei: ETH(1000),
215
+ inOutDelta: ETH(1000),
216
+ });
217
+ const curr = makeReport({
218
+ totalValueWei: ETH(1103) + ETH(1) / 2n,
219
+ inOutDelta: ETH(1100),
220
+ });
221
+ // grossStakingRewards = (1103.5 - 1000) - (1100 - 1000) = 103.5 - 100 = 3.5 ETH
222
+ expect(getGrossStakingRewards(curr, prev)).toBe(ETH(7) / 2n); // 3.5 ETH
223
+ });
224
+ it('returns negative value on slashing / value loss', () => {
225
+ const prev = makeReport({
226
+ totalValueWei: ETH(1000),
227
+ inOutDelta: ETH(1000),
228
+ });
229
+ const curr = makeReport({ totalValueWei: ETH(997), inOutDelta: ETH(1000) });
230
+ expect(getGrossStakingRewards(curr, prev)).toBe(-ETH(3));
231
+ });
232
+ it('returns 0 when value change is entirely explained by withdrawal', () => {
233
+ // 8 ETH withdrawn; vault value drops by 8 ETH; no staking rewards
234
+ const prev = makeReport({ totalValueWei: ETH(100), inOutDelta: ETH(100) });
235
+ const curr = makeReport({ totalValueWei: ETH(92), inOutDelta: ETH(92) });
236
+ expect(getGrossStakingRewards(curr, prev)).toBe(0n);
237
+ });
238
+ });
239
+ // ─── getDailyLidoFees ────────────────────────────────────────────────────────
240
+ describe('getDailyLidoFees', () => {
241
+ it('returns the increase in cumulative Lido fee balance', () => {
242
+ const prev = makeReport({ fee: ETH(10) });
243
+ const curr = makeReport({ fee: ETH(12) });
244
+ expect(getDailyLidoFees(curr, prev)).toBe(ETH(2));
245
+ });
246
+ it('returns 0 when no fees were charged', () => {
247
+ const report = makeReport({ fee: ETH(5) });
248
+ expect(getDailyLidoFees(report, report)).toBe(0n);
249
+ });
250
+ });
251
+ // ─── getNetStakingRewards ────────────────────────────────────────────────────
252
+ describe('getNetStakingRewards', () => {
253
+ it('equals grossStakingRewards minus NO fee minus Lido fees', () => {
254
+ const prev = makeReport({
255
+ totalValueWei: ETH(1000),
256
+ inOutDelta: ETH(1000),
257
+ fee: ETH(10),
258
+ });
259
+ const curr = makeReport({
260
+ totalValueWei: ETH(1050),
261
+ inOutDelta: ETH(1000),
262
+ fee: ETH(12),
263
+ });
264
+ // gross = 50 ETH
265
+ const noFeePrev = makeSnapshot({
266
+ settledGrowth: ETH(100),
267
+ feeRate: 1000n,
268
+ accruedFee: 0n,
269
+ });
270
+ const noFeeCurr = makeSnapshot({
271
+ settledGrowth: ETH(100),
272
+ feeRate: 1000n,
273
+ accruedFee: ETH(5),
274
+ });
275
+ // noFee = 5 ETH; lidoFees = 2 ETH
276
+ // net = 50 - 5 - 2 = 43 ETH
277
+ const gross = getGrossStakingRewards(curr, prev);
278
+ const noFee = getNodeOperatorFeeForPeriod(noFeeCurr, noFeePrev);
279
+ const lido = getDailyLidoFees(curr, prev);
280
+ const net = getNetStakingRewards(curr, prev, noFeeCurr, noFeePrev);
281
+ expect(net).toBe(gross - noFee - lido);
282
+ expect(net).toBe(ETH(43));
283
+ });
284
+ it('can be negative when fees exceed staking income', () => {
285
+ const prev = makeReport({
286
+ totalValueWei: ETH(100),
287
+ inOutDelta: ETH(100),
288
+ fee: ETH(0),
289
+ });
290
+ const curr = makeReport({
291
+ totalValueWei: ETH(101),
292
+ inOutDelta: ETH(100),
293
+ fee: ETH(2),
294
+ });
295
+ // gross = 1 ETH, lidoFees = 2 ETH → net = -1 ETH
296
+ const snap = makeSnapshot();
297
+ const net = getNetStakingRewards(curr, prev, snap, snap);
298
+ expect(net).toBe(-ETH(1));
299
+ });
300
+ });
301
+ // ─── APR functions ───────────────────────────────────────────────────────────
302
+ //
303
+ // All three use the same annualization:
304
+ // APR% = numerator * 100 * 31536000 / (previousTVL * periodSeconds)
305
+ //
306
+ // Using a 1-year period simplifies validation: APR% = numerator * 100 / previousTVL
307
+ describe('getGrossStakingAPR', () => {
308
+ it('returns 5% APR for 50 ETH rewards on 1000 ETH TVL over one year', () => {
309
+ const prev = makeReport({
310
+ totalValueWei: ETH(1000),
311
+ inOutDelta: ETH(1000),
312
+ timestamp: 0,
313
+ });
314
+ const curr = makeReport({
315
+ totalValueWei: ETH(1050),
316
+ inOutDelta: ETH(1000),
317
+ timestamp: ONE_YEAR_SECONDS,
318
+ });
319
+ const { apr, apr_bps, apr_percent } = getGrossStakingAPR(curr, prev);
320
+ expect(apr).toBe(5n); // integer %
321
+ expect(apr_bps).toBeCloseTo(500, 5); // 5.00 %
322
+ expect(apr_percent).toBeCloseTo(5, 5);
323
+ });
324
+ it('returns negative APR when vault value dropped', () => {
325
+ const prev = makeReport({
326
+ totalValueWei: ETH(1000),
327
+ inOutDelta: ETH(1000),
328
+ timestamp: 0,
329
+ });
330
+ const curr = makeReport({
331
+ totalValueWei: ETH(980),
332
+ inOutDelta: ETH(1000),
333
+ timestamp: ONE_YEAR_SECONDS,
334
+ });
335
+ const { apr_percent } = getGrossStakingAPR(curr, prev);
336
+ expect(apr_percent).toBeCloseTo(-2, 5);
337
+ });
338
+ it('annualizes correctly for a 1-day period', () => {
339
+ const ONE_DAY = 86_400;
340
+ const dailyRewards = ETH(1000) / 365n; // ~2.74 ETH per day for 1000% annualized
341
+ const prev = makeReport({
342
+ totalValueWei: ETH(1000),
343
+ inOutDelta: ETH(1000),
344
+ timestamp: 0,
345
+ });
346
+ const curr = makeReport({
347
+ totalValueWei: ETH(1000) + dailyRewards,
348
+ inOutDelta: ETH(1000),
349
+ timestamp: ONE_DAY,
350
+ });
351
+ const { apr_percent } = getGrossStakingAPR(curr, prev);
352
+ // dailyRewards/TVL * 365 * 100 ≈ 100% APR (using integer division, slight truncation)
353
+ expect(apr_percent).toBeGreaterThan(99);
354
+ expect(apr_percent).toBeLessThanOrEqual(100);
355
+ });
356
+ });
357
+ describe('getNetStakingAPR', () => {
358
+ it('returns APR on net rewards (gross minus NO fee minus Lido fees)', () => {
359
+ // gross = 50 ETH, noFee = 5 ETH, lidoFees = 2 ETH → net = 43 ETH → 4.3%
360
+ const prev = makeReport({
361
+ totalValueWei: ETH(1000),
362
+ inOutDelta: ETH(1000),
363
+ fee: ETH(10),
364
+ timestamp: 0,
365
+ });
366
+ const curr = makeReport({
367
+ totalValueWei: ETH(1050),
368
+ inOutDelta: ETH(1000),
369
+ fee: ETH(12),
370
+ timestamp: ONE_YEAR_SECONDS,
371
+ });
372
+ const noFeePrev = makeSnapshot({
373
+ settledGrowth: ETH(100),
374
+ feeRate: 1000n,
375
+ accruedFee: 0n,
376
+ });
377
+ const noFeeCurr = makeSnapshot({
378
+ settledGrowth: ETH(100),
379
+ feeRate: 1000n,
380
+ accruedFee: ETH(5),
381
+ });
382
+ const { apr_percent } = getNetStakingAPR(curr, prev, noFeeCurr, noFeePrev);
383
+ expect(apr_percent).toBeCloseTo(4.3, 5);
384
+ });
385
+ });
386
+ describe('getCarrySpread', () => {
387
+ it('returns APR on bottom line (net minus stETH liability rebase adjustment)', () => {
388
+ // net = 43 ETH (from above), rebase adjustment = 10 ETH → bottomLine = 33 ETH → 3.3%
389
+ const prev = makeReport({
390
+ totalValueWei: ETH(1000),
391
+ inOutDelta: ETH(1000),
392
+ fee: ETH(10),
393
+ timestamp: 0,
394
+ });
395
+ const curr = makeReport({
396
+ totalValueWei: ETH(1050),
397
+ inOutDelta: ETH(1000),
398
+ fee: ETH(12),
399
+ timestamp: ONE_YEAR_SECONDS,
400
+ });
401
+ const noFeePrev = makeSnapshot({
402
+ settledGrowth: ETH(100),
403
+ feeRate: 1000n,
404
+ accruedFee: 0n,
405
+ });
406
+ const noFeeCurr = makeSnapshot({
407
+ settledGrowth: ETH(100),
408
+ feeRate: 1000n,
409
+ accruedFee: ETH(5),
410
+ });
411
+ const stEthLiabilityRebaseAdjustment = ETH(10);
412
+ const { apr_percent } = getCarrySpread(curr, prev, noFeeCurr, noFeePrev, stEthLiabilityRebaseAdjustment);
413
+ expect(apr_percent).toBeCloseTo(3.3, 5);
414
+ });
415
+ it('is negative when stETH liability growth exceeds net staking rewards', () => {
416
+ // net = 3 ETH, rebase adjustment = 5 ETH → bottomLine = -2 ETH
417
+ const prev = makeReport({
418
+ totalValueWei: ETH(1000),
419
+ inOutDelta: ETH(1000),
420
+ timestamp: 0,
421
+ });
422
+ const curr = makeReport({
423
+ totalValueWei: ETH(1003),
424
+ inOutDelta: ETH(1000),
425
+ timestamp: ONE_YEAR_SECONDS,
426
+ });
427
+ const snap = makeSnapshot();
428
+ const { apr_percent } = getCarrySpread(curr, prev, snap, snap, ETH(5));
429
+ expect(apr_percent).toBeCloseTo(-0.2, 5);
430
+ });
431
+ });
432
+ // ─── getBottomLine ───────────────────────────────────────────────────────────
433
+ describe('getBottomLine', () => {
434
+ it('equals netStakingRewards minus stETH liability rebase adjustment', () => {
435
+ const prev = makeReport({
436
+ totalValueWei: ETH(1000),
437
+ inOutDelta: ETH(1000),
438
+ fee: ETH(0),
439
+ });
440
+ const curr = makeReport({
441
+ totalValueWei: ETH(1050),
442
+ inOutDelta: ETH(1000),
443
+ fee: ETH(2),
444
+ });
445
+ const snap = makeSnapshot();
446
+ const rebaseAdjustment = ETH(10);
447
+ const net = getNetStakingRewards(curr, prev, snap, snap);
448
+ const bottomLine = getBottomLine(curr, prev, snap, snap, rebaseAdjustment);
449
+ expect(bottomLine).toBe(net - rebaseAdjustment);
450
+ });
451
+ });
452
+ // ─── reportMetrics ───────────────────────────────────────────────────────────
453
+ describe('reportMetrics', () => {
454
+ it('aggregates all metrics consistently', () => {
455
+ // 1-year period, 50 ETH gross, 5 ETH NO fee, 2 ETH Lido fees, 10 ETH rebase adjustment
456
+ const prev = makeReport({
457
+ totalValueWei: ETH(1000),
458
+ inOutDelta: ETH(1000),
459
+ fee: ETH(10),
460
+ timestamp: 0,
461
+ });
462
+ const curr = makeReport({
463
+ totalValueWei: ETH(1050),
464
+ inOutDelta: ETH(1000),
465
+ fee: ETH(12),
466
+ timestamp: ONE_YEAR_SECONDS,
467
+ });
468
+ const noFeePrev = makeSnapshot({
469
+ settledGrowth: ETH(100),
470
+ feeRate: 1000n,
471
+ accruedFee: 0n,
472
+ });
473
+ const noFeeCurr = makeSnapshot({
474
+ settledGrowth: ETH(100),
475
+ feeRate: 1000n,
476
+ accruedFee: ETH(5),
477
+ });
478
+ const stEthLiabilityRebaseAdjustment = ETH(10);
479
+ const metrics = reportMetrics({
480
+ reports: { current: curr, previous: prev },
481
+ noFeeCurr,
482
+ noFeePrev,
483
+ stEthLiabilityRebaseRewards: stEthLiabilityRebaseAdjustment,
484
+ });
485
+ expect(metrics.grossStakingRewards).toBe(ETH(50));
486
+ expect(metrics.nodeOperatorRewards).toBe(ETH(5));
487
+ expect(metrics.dailyLidoFees).toBe(ETH(2));
488
+ expect(metrics.netStakingRewards).toBe(ETH(43));
489
+ expect(metrics.bottomLine).toBe(ETH(33));
490
+ expect(metrics.grossStakingAPR.apr_percent).toBeCloseTo(5, 5);
491
+ expect(metrics.netStakingAPR.apr_percent).toBeCloseTo(4.3, 5);
492
+ expect(metrics.carrySpread.apr_percent).toBeCloseTo(3.3, 5);
493
+ // Internal consistency: netStakingRewards = grossStakingRewards - NO fee - Lido fees
494
+ expect(metrics.netStakingRewards).toBe(metrics.grossStakingRewards -
495
+ metrics.nodeOperatorRewards -
496
+ metrics.dailyLidoFees);
497
+ // Internal consistency: bottomLine = netStakingRewards - rebase adjustment
498
+ expect(metrics.bottomLine).toBe(metrics.netStakingRewards - stEthLiabilityRebaseAdjustment);
499
+ });
500
+ });
501
+ //# sourceMappingURL=report-statistic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-statistic.test.js","sourceRoot":"","sources":["../../../tests/utils/report-statistic.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,2BAA2B,EAC3B,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,aAAa,GAEd,MAAM,qCAAqC,CAAC;AAE7C,+EAA+E;AAE/E,MAAM,GAAG,GAAG,CAAC,CAAkB,EAAU,EAAE,CACzC,MAAM,CAAC,CAAC,CAAC,GAAG,oBAA0B,CAAC,CAAC,WAAW;AAErD,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,UAAU,GAAG,CACjB,OAOI,EAAE,EACO,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE;QACJ,YAAY,EAAE,4CAA4C;QAC1D,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;QAC/C,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;QACnD,kBAAkB,EAAE,GAAG;QACvB,eAAe,EAAE,GAAG;KACrB;IACD,SAAS,EAAE;QACT,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACzC,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;QACjB,cAAc,EAAE,GAAG;KACpB;IACD,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;IACrC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC;IAC9B,WAAW,EAAE,EAAE;IACf,GAAG,EAAE,EAAE;CACR,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,OAA+B,EAAE,EAAiB,EAAE,CAAC,CAAC;IAC1E,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,EAAE;IACjB,OAAO,EAAE,EAAE;IACX,GAAG,IAAI;CACR,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,mFAAmF;QACnF,MAAM,GAAG,GAAG,sBAAsB,CAAC;YACjC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACnB,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,KAAK,EAAE,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG,sBAAsB,CAAC;YACjC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;YACpB,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,oCAAoC;QACpC,MAAM,GAAG,GAAG,sBAAsB,CAAC;YACjC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC;YACtB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;YACpB,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,GAAG,GAAG,sBAAsB,CAAC;YACjC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;YACpB,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,0EAA0E;QAC1E,kEAAkE;QAClE,wEAAwE;QACxE,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,kBAAkB,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,kBAAkB,GAAG,eAAe,CAAC,CAAC,yBAAyB;QAErF,MAAM,WAAW,GAAG,sBAAsB,CAAC;YACzC,aAAa;YACb,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACnB,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,iDAAiD;QACjD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjC,mEAAmE;QACnE,MAAM,aAAa,GAAG,kBAAkB,GAAG,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC;QACpD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,4DAA4D;QAC5D,wDAAwD;QACxD,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,aAAa,EAAE,EAAE;YACjB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,+EAA+E;QAC/E,MAAM,MAAM,GAAG,cAAc,CAAC;YAC5B,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,MAAM;YACtB,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;SACpB,CAAC,CAAC;QACH,qCAAqC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CACJ,cAAc,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CACnE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,yCAAyC;QACzC,wDAAwD;QACxD,MAAM,IAAI,GAAG,YAAY,CAAC;YACxB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC;YACxB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,2CAA2C;QAC3C,sEAAsE;QACtE,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,YAAY,CAAC;YACxB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,kEAAkE;QAClE,2EAA2E;QAC3E,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM;QAC7B,MAAM,WAAW,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,sBAAsB;QAEvE,qCAAqC;QACrC,MAAM,KAAK,GAAG,YAAY,CAAC;YACzB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO;YACP,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,oCAAoC;QACpC,MAAM,KAAK,GAAG,YAAY,CAAC;YACzB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO;YACP,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;SACpB,CAAC,CAAC;QACH,sDAAsD;QAEtD,yEAAyE;QACzE,MAAM,KAAK,GAAG,YAAY,CAAC;YACzB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO;YACP,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC;YACzB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO;YACP,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,qDAAqD;QAErD,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,iEAAiE;QACjE,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;YACtC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;QACH,gFAAgF;QAChF,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,kEAAkE;QAClE,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;SACb,CAAC,CAAC;QACH,iBAAiB;QACjB,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,kCAAkC;QAClC,4BAA4B;QAE5B,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,2BAA2B,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAEnE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;YACpB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;YACpB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACZ,CAAC,CAAC;QACH,iDAAiD;QACjD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,EAAE;AACF,wCAAwC;AACxC,sEAAsE;AACtE,EAAE;AACF,oFAAoF;AAEpF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAErE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9C,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QAEH,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC;QACvB,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,yCAAyC;QAChF,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY;YACvC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;QAEH,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvD,sFAAsF;QACtF,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,wEAAwE;QACxE,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACZ,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QAEH,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,qFAAqF;QACrF,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACZ,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,8BAA8B,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAE/C,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CACpC,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,SAAS,EACT,8BAA8B,CAC/B,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,+DAA+D;QAC/D,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACZ,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAEjC,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAE3E,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,uFAAuF;QACvF,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC;YACtB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACZ,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,8BAA8B,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,aAAa,CAAC;YAC5B,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC1C,SAAS;YACT,SAAS;YACT,2BAA2B,EAAE,8BAA8B;SAC5D,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAE5D,qFAAqF;QACrF,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CACpC,OAAO,CAAC,mBAAmB;YACzB,OAAO,CAAC,mBAAmB;YAC3B,OAAO,CAAC,aAAa,CACxB,CAAC;QAEF,2EAA2E;QAC3E,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAC7B,OAAO,CAAC,iBAAiB,GAAG,8BAA8B,CAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { snakeToCamel } from '../../utils/snake-to-camel.js';
2
+ import { snakeToCamel } from 'utils/snake-to-camel.js';
3
3
  describe('snakeToCamel', () => {
4
4
  it('should convert snake_case to camelCase', () => {
5
5
  expect(snakeToCamel('hello_world')).toBe('helloWorld');
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
1
+ import { describe, test, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ // vi.hoisted ensures mocks are created before vi.mock hoisting
3
+ const mocks = vi.hoisted(() => {
4
+ const clear = vi.fn();
5
+ const logUpdateStderr = Object.assign(vi.fn(), { clear });
6
+ const logUpdateDefault = vi.fn();
7
+ return { logUpdateStderr, logUpdateDefault, clear };
8
+ });
9
+ vi.mock('log-update', () => ({
10
+ logUpdateStderr: mocks.logUpdateStderr,
11
+ default: mocks.logUpdateDefault,
12
+ }));
13
+ import { showSpinner } from '../../utils/spinner/spinners.js';
14
+ const originalArgv = process.argv;
15
+ beforeEach(() => {
16
+ vi.useFakeTimers();
17
+ vi.clearAllMocks();
18
+ process.argv = [...originalArgv].filter((a) => a !== '--json');
19
+ });
20
+ afterEach(() => {
21
+ vi.useRealTimers();
22
+ process.argv = originalArgv;
23
+ });
24
+ describe('showSpinner — --json mode', () => {
25
+ beforeEach(() => {
26
+ process.argv = [...process.argv, '--json'];
27
+ });
28
+ test('returns a no-op function without starting an interval', () => {
29
+ const hide = showSpinner();
30
+ vi.advanceTimersByTime(2000);
31
+ expect(mocks.logUpdateStderr).not.toHaveBeenCalled();
32
+ expect(typeof hide).toBe('function');
33
+ });
34
+ test('logUpdate (stdout) is also not called', () => {
35
+ showSpinner();
36
+ vi.advanceTimersByTime(2000);
37
+ expect(mocks.logUpdateDefault).not.toHaveBeenCalled();
38
+ });
39
+ test('the returned cleanup function does not throw', () => {
40
+ const hide = showSpinner();
41
+ expect(() => hide()).not.toThrow();
42
+ });
43
+ test('stdout.write is not called', () => {
44
+ const writeSpy = vi
45
+ .spyOn(process.stdout, 'write')
46
+ .mockImplementation(() => true);
47
+ showSpinner();
48
+ vi.advanceTimersByTime(2000);
49
+ expect(writeSpy).not.toHaveBeenCalled();
50
+ });
51
+ });
52
+ describe('showSpinner — normal mode (without --json)', () => {
53
+ test('writes spinner frames to stderr via logUpdateStderr', () => {
54
+ showSpinner({ type: 'point', message: 'Loading...' });
55
+ // point interval = 125ms; advance 200ms → at least 1 call
56
+ vi.advanceTimersByTime(200);
57
+ expect(mocks.logUpdateStderr).toHaveBeenCalled();
58
+ const frame = mocks.logUpdateStderr.mock.calls[0]?.[0];
59
+ expect(frame).toContain('Loading...');
60
+ });
61
+ test('does NOT use logUpdate (stdout)', () => {
62
+ showSpinner();
63
+ vi.advanceTimersByTime(500);
64
+ expect(mocks.logUpdateDefault).not.toHaveBeenCalled();
65
+ });
66
+ test('defaults to type point and message "Executing..."', () => {
67
+ showSpinner();
68
+ vi.advanceTimersByTime(200);
69
+ const frame = mocks.logUpdateStderr.mock.calls[0]?.[0];
70
+ expect(frame).toContain('Executing...');
71
+ });
72
+ test('frames change over time', () => {
73
+ showSpinner({ type: 'point' });
74
+ vi.advanceTimersByTime(125);
75
+ const first = mocks.logUpdateStderr.mock.calls[0]?.[0];
76
+ vi.advanceTimersByTime(125);
77
+ const second = mocks.logUpdateStderr.mock.calls[1]?.[0];
78
+ // frames should differ (animation)
79
+ expect(first).not.toBe(second);
80
+ });
81
+ test('cleanup stops the interval and calls logUpdateStderr.clear()', () => {
82
+ const hide = showSpinner();
83
+ vi.advanceTimersByTime(200);
84
+ const callsBefore = mocks.logUpdateStderr.mock.calls.length;
85
+ hide();
86
+ // no new calls should happen after hiding
87
+ vi.advanceTimersByTime(500);
88
+ expect(mocks.logUpdateStderr.mock.calls.length).toBe(callsBefore);
89
+ expect(mocks.clear).toHaveBeenCalledOnce();
90
+ });
91
+ test('supports a custom spinner type and message', () => {
92
+ showSpinner({ type: 'line', message: 'Processing...' });
93
+ vi.advanceTimersByTime(200);
94
+ const frame = mocks.logUpdateStderr.mock.calls[0]?.[0];
95
+ expect(frame).toContain('Processing...');
96
+ });
97
+ test('multiple independent spinners do not interfere with each other', () => {
98
+ const hide1 = showSpinner({ message: 'Task 1' });
99
+ const hide2 = showSpinner({ message: 'Task 2' });
100
+ vi.advanceTimersByTime(200);
101
+ expect(mocks.logUpdateStderr.mock.calls.length).toBeGreaterThanOrEqual(2);
102
+ const callsAfterBoth = mocks.logUpdateStderr.mock.calls.length;
103
+ hide1();
104
+ vi.advanceTimersByTime(200);
105
+ // second spinner keeps writing
106
+ expect(mocks.logUpdateStderr.mock.calls.length).toBeGreaterThan(callsAfterBoth);
107
+ hide2();
108
+ const callsAfterAll = mocks.logUpdateStderr.mock.calls.length;
109
+ vi.advanceTimersByTime(500);
110
+ expect(mocks.logUpdateStderr.mock.calls.length).toBe(callsAfterAll);
111
+ });
112
+ });
113
+ //# sourceMappingURL=spinner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.test.js","sourceRoot":"","sources":["../../../tests/utils/spinner.test.ts"],"names":[],"mappings":"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"}