@berachain/berajs 0.2.4 → 0.2.6-patch.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/README.md +0 -0
  2. package/dist/abi/exports.cjs +1 -1
  3. package/dist/abi/exports.cjs.map +1 -1
  4. package/dist/abi/exports.d.cts +17 -1
  5. package/dist/abi/exports.d.ts +17 -1
  6. package/dist/abi/exports.mjs +1 -1
  7. package/dist/abi/exports.mjs.map +1 -1
  8. package/dist/actions/exports.cjs +1 -1
  9. package/dist/actions/exports.cjs.map +1 -1
  10. package/dist/actions/exports.d.cts +9 -38
  11. package/dist/actions/exports.d.ts +9 -38
  12. package/dist/actions/exports.mjs +1 -1
  13. package/dist/actions/exports.mjs.map +1 -1
  14. package/dist/chunk-2YBHAMDV.cjs +2 -0
  15. package/dist/chunk-2YBHAMDV.cjs.map +1 -0
  16. package/dist/chunk-57RINXU6.cjs +2 -0
  17. package/dist/chunk-57RINXU6.cjs.map +1 -0
  18. package/dist/{chunk-AX2YQQFQ.mjs → chunk-74QD4JAH.mjs} +2 -2
  19. package/dist/chunk-74QD4JAH.mjs.map +1 -0
  20. package/dist/chunk-74WA35RI.cjs +2 -0
  21. package/dist/chunk-74WA35RI.cjs.map +1 -0
  22. package/dist/{chunk-7WRTK7RJ.mjs → chunk-BEKH5EYT.mjs} +2 -2
  23. package/dist/chunk-BEKH5EYT.mjs.map +1 -0
  24. package/dist/{chunk-FCWDGE62.cjs → chunk-CF3LFNXG.cjs} +2 -2
  25. package/dist/chunk-CF3LFNXG.cjs.map +1 -0
  26. package/dist/chunk-COMMLZ3O.mjs +2 -0
  27. package/dist/chunk-COMMLZ3O.mjs.map +1 -0
  28. package/dist/chunk-DDEQFR3M.cjs +2 -0
  29. package/dist/chunk-DDEQFR3M.cjs.map +1 -0
  30. package/dist/{chunk-6LDOG5RL.cjs → chunk-DK42F2ZM.cjs} +2 -2
  31. package/dist/chunk-DK42F2ZM.cjs.map +1 -0
  32. package/dist/{chunk-7SMWQ6SN.mjs → chunk-FM3WDBFH.mjs} +2 -2
  33. package/dist/chunk-FM3WDBFH.mjs.map +1 -0
  34. package/dist/chunk-HWOGQSNL.cjs +4 -0
  35. package/dist/chunk-HWOGQSNL.cjs.map +1 -0
  36. package/dist/chunk-I7M43BB4.cjs +2 -0
  37. package/dist/chunk-I7M43BB4.cjs.map +1 -0
  38. package/dist/chunk-IBJOI5SN.mjs +4 -0
  39. package/dist/chunk-IBJOI5SN.mjs.map +1 -0
  40. package/dist/chunk-IDFMLLDY.mjs +2 -0
  41. package/dist/chunk-IDFMLLDY.mjs.map +1 -0
  42. package/dist/{chunk-YZV5LKIP.cjs → chunk-LNVR4BW6.cjs} +2 -2
  43. package/dist/chunk-LNVR4BW6.cjs.map +1 -0
  44. package/dist/chunk-MJZHJFZO.mjs +2 -0
  45. package/dist/{chunk-YNO7BCCM.mjs.map → chunk-MJZHJFZO.mjs.map} +1 -1
  46. package/dist/chunk-MK5NS5B5.mjs +2 -0
  47. package/dist/chunk-MK5NS5B5.mjs.map +1 -0
  48. package/dist/{chunk-C6ZGUO4H.cjs → chunk-NMH7LHPW.cjs} +2 -2
  49. package/dist/chunk-NMH7LHPW.cjs.map +1 -0
  50. package/dist/chunk-NVHV2LDK.cjs +2 -0
  51. package/dist/chunk-NVHV2LDK.cjs.map +1 -0
  52. package/dist/chunk-OGBD5YOG.mjs +2 -0
  53. package/dist/chunk-OGBD5YOG.mjs.map +1 -0
  54. package/dist/chunk-OIYXOKTT.cjs.map +1 -1
  55. package/dist/chunk-OUD27MU7.cjs.map +1 -1
  56. package/dist/chunk-PLIH6KQM.mjs +2 -0
  57. package/dist/chunk-PLIH6KQM.mjs.map +1 -0
  58. package/dist/chunk-QRAIGQF2.mjs +2 -0
  59. package/dist/chunk-QRAIGQF2.mjs.map +1 -0
  60. package/dist/chunk-RWOICHRW.cjs +2 -0
  61. package/dist/chunk-RWOICHRW.cjs.map +1 -0
  62. package/dist/chunk-T5FSQ3YE.mjs +2 -0
  63. package/dist/chunk-T5FSQ3YE.mjs.map +1 -0
  64. package/dist/chunk-WRFDB3QJ.cjs.map +1 -1
  65. package/dist/chunk-XNJLSA6P.cjs.map +1 -1
  66. package/dist/contexts/exports.cjs +1 -1
  67. package/dist/contexts/exports.cjs.map +1 -1
  68. package/dist/contexts/exports.d.cts +1 -1
  69. package/dist/contexts/exports.d.ts +1 -1
  70. package/dist/contexts/exports.mjs +1 -1
  71. package/dist/contexts/exports.mjs.map +1 -1
  72. package/dist/{defaultFlags-d0kPbT0i.d.cts → defaultFlags-D6KfkTZx.d.cts} +1 -1
  73. package/dist/{defaultFlags-d0kPbT0i.d.ts → defaultFlags-D6KfkTZx.d.ts} +1 -1
  74. package/dist/enum/exports.cjs +1 -1
  75. package/dist/enum/exports.cjs.map +1 -1
  76. package/dist/enum/exports.d.cts +1 -1
  77. package/dist/enum/exports.d.ts +1 -1
  78. package/dist/enum/exports.mjs +1 -1
  79. package/dist/errors/exports.cjs +1 -1
  80. package/dist/errors/exports.cjs.map +1 -1
  81. package/dist/errors/exports.d.cts +8 -3
  82. package/dist/errors/exports.d.ts +8 -3
  83. package/dist/errors/exports.mjs +1 -1
  84. package/dist/{getValidatorQueuedOperatorAddress-DZgrPmZ2.d.cts → getValidatorQueuedOperatorAddress-BdDYHycN.d.cts} +15 -4
  85. package/dist/{getValidatorQueuedOperatorAddress-CqR6cyqC.d.ts → getValidatorQueuedOperatorAddress-CmiPJmsr.d.ts} +15 -4
  86. package/dist/{global.d-BeYWDreg.d.ts → global.d-3GQMgC9k.d.ts} +1 -1
  87. package/dist/{global.d-DghRxpHd.d.cts → global.d-CwT1Phzf.d.cts} +1 -1
  88. package/dist/hooks/exports.cjs +3 -3
  89. package/dist/hooks/exports.cjs.map +1 -1
  90. package/dist/hooks/exports.d.cts +54 -75
  91. package/dist/hooks/exports.d.ts +54 -75
  92. package/dist/hooks/exports.mjs +3 -3
  93. package/dist/hooks/exports.mjs.map +1 -1
  94. package/dist/{txnEnum-DxPRHSJt.d.cts → txnEnum-CCuQUFlh.d.cts} +7 -0
  95. package/dist/{txnEnum-DxPRHSJt.d.ts → txnEnum-CCuQUFlh.d.ts} +7 -0
  96. package/dist/types/exports.cjs.map +1 -1
  97. package/dist/types/exports.d.cts +37 -4
  98. package/dist/types/exports.d.ts +37 -4
  99. package/dist/utils/exports.cjs +1 -1
  100. package/dist/utils/exports.cjs.map +1 -1
  101. package/dist/utils/exports.d.cts +2 -2
  102. package/dist/utils/exports.d.ts +2 -2
  103. package/dist/utils/exports.mjs +1 -1
  104. package/dist/utils/exports.mjs.map +1 -1
  105. package/package.json +25 -25
  106. package/src/abi/enso/ensoWalletV2Factory.ts +9 -0
  107. package/src/abi/exports.ts +1 -0
  108. package/src/abi/pyth/pyth.ts +0 -0
  109. package/src/actions/clients/BeraApolloClient.ts +3 -3
  110. package/src/actions/clients/getApolloClient.ts +5 -5
  111. package/src/actions/clients/getEnsoClient.ts +1 -1
  112. package/src/actions/dex/__tests__/aggregators.unit.test.ts +3 -3
  113. package/src/actions/dex/__tests__/getOnChainPool.unit.test.ts +1 -1
  114. package/src/actions/dex/aggregators/base.ts +12 -8
  115. package/src/actions/dex/aggregators/bex.ts +8 -8
  116. package/src/actions/dex/aggregators/bgt.ts +4 -4
  117. package/src/actions/dex/aggregators/enso/enso.ts +28 -20
  118. package/src/actions/dex/aggregators/enso/ensoErc4626.debug.test.ts +1 -1
  119. package/src/actions/dex/aggregators/enso/ensoErc4626.ts +7 -4
  120. package/src/actions/dex/aggregators/erc4626.ts +10 -6
  121. package/src/actions/dex/aggregators/fly.ts +9 -5
  122. package/src/actions/dex/aggregators/haiku.integration.test.ts +3 -3
  123. package/src/actions/dex/aggregators/haiku.ts +9 -5
  124. package/src/actions/dex/aggregators/honey.ts +15 -15
  125. package/src/actions/dex/aggregators/kyberswap.ts +8 -4
  126. package/src/actions/dex/aggregators/oogabooga.ts +8 -4
  127. package/src/actions/dex/aggregators/openOcean.ts +12 -8
  128. package/src/actions/dex/aggregators/wbera.ts +8 -4
  129. package/src/actions/dex/b-sdk.ts +2 -2
  130. package/src/actions/dex/getAllPools.ts +2 -2
  131. package/src/actions/dex/getApiPool.ts +2 -2
  132. package/src/actions/dex/getGlobalLiquidityAndSwapVolume.ts +2 -2
  133. package/src/actions/dex/getIsTokenExploited.ts +1 -1
  134. package/src/actions/dex/getOnChainPool.ts +3 -3
  135. package/src/actions/dex/getPoolEvents.ts +2 -2
  136. package/src/actions/dex/getPoolHistoricalData.ts +2 -2
  137. package/src/actions/dex/getVaultPausedState.ts +1 -1
  138. package/src/actions/enso/__tests__/getBendDemultiplyBundle.action.unit.test.ts +175 -0
  139. package/src/actions/enso/__tests__/getBendDemultiplyBundle.unit.test.ts +150 -0
  140. package/src/actions/enso/__tests__/getBendMultiplyBundle.action.unit.test.ts +138 -0
  141. package/src/actions/enso/__tests__/getBendMultiplyBundle.unit.test.ts +194 -0
  142. package/src/actions/enso/{getEnsoUserTokensWithBalances.debug.test.ts → __tests__/getEnsoUserTokensWithBalances.debug.test.ts} +3 -3
  143. package/src/actions/enso/__tests__/helpers.ts +42 -0
  144. package/src/actions/enso/__tests__/util.unit.test.ts +95 -0
  145. package/src/actions/enso/flashloan.ts +127 -0
  146. package/src/actions/enso/getBendDemultiplyBundle.ts +325 -0
  147. package/src/actions/enso/getBendMultiplyBundle.ts +348 -0
  148. package/src/actions/enso/getEnsoSwapBundle.ts +2 -2
  149. package/src/actions/enso/getEnsoUserTokensWithBalances.ts +5 -5
  150. package/src/actions/enso/util.ts +150 -5
  151. package/src/actions/exports.ts +0 -2
  152. package/src/actions/governance/__tests__/checkProposalField.unit.test.ts +2 -2
  153. package/src/actions/governance/__tests__/getDecodedFunctionData.integration.test.ts +2 -2
  154. package/src/actions/governance/__tests__/getQuorum.integration.test.ts +2 -2
  155. package/src/actions/governance/checkProposalField.ts +1 -1
  156. package/src/actions/governance/computeActualStatus.ts +1 -1
  157. package/src/actions/governance/getAllProposals.ts +1 -1
  158. package/src/actions/governance/getBodyErrors.ts +1 -1
  159. package/src/actions/governance/getProposalDetails.ts +1 -1
  160. package/src/actions/governance/getProposalFromTx.ts +1 -1
  161. package/src/actions/governance/getProposalParams.ts +3 -3
  162. package/src/actions/governance/getProposalVotes.ts +1 -1
  163. package/src/actions/governance/getQuorum.ts +2 -2
  164. package/src/actions/honey/getCollateralWeights.ts +2 -2
  165. package/src/actions/honey/getGlobalCapLimit.ts +4 -4
  166. package/src/actions/honey/getHoneyCollaterals.ts +5 -5
  167. package/src/actions/honey/getHoneyFees.ts +1 -1
  168. package/src/actions/honey/getHoneyPausedState.ts +1 -1
  169. package/src/actions/honey/getHoneyPreview.ts +3 -3
  170. package/src/actions/honey/getHoneyRootPriceOracle.ts +1 -1
  171. package/src/actions/honey/getHoneyVaultsBalance.ts +2 -2
  172. package/src/actions/honey/getRelativeCapLimit.ts +3 -3
  173. package/src/actions/honey/getSharesWithoutFees.ts +1 -1
  174. package/src/actions/honey/getSwapPayload.ts +6 -6
  175. package/src/actions/honey/isBadCollateralAsset.ts +2 -2
  176. package/src/actions/honey/isBasketModeEnabled.ts +2 -2
  177. package/src/actions/honey/tests/pyth.integration.test.ts +3 -3
  178. package/src/actions/misc/getBlockTimestamp.ts +2 -2
  179. package/src/actions/pol/__tests__/getAllValidators.integration.test.ts +2 -2
  180. package/src/actions/pol/__tests__/rewardVaults.integration.test.ts +1 -1
  181. package/src/actions/pol/getBGTGlobalInfo.ts +2 -2
  182. package/src/actions/pol/getBgtAprSimulation.ts +1 -1
  183. package/src/actions/pol/getBgtAprSimultaion.unit.test.ts +1 -1
  184. package/src/actions/pol/getBgtTokenTotalBoosts.ts +2 -2
  185. package/src/actions/pol/getBgtTokenTotalSupply.ts +2 -2
  186. package/src/actions/pol/getBlockTime.debug.test.ts +13 -0
  187. package/src/actions/pol/getBlockTime.ts +14 -23
  188. package/src/actions/pol/getEarnedStakedBeraVault.ts +3 -3
  189. package/src/actions/pol/getGlobalCuttingBoard.ts +0 -0
  190. package/src/actions/pol/getGlobalData.ts +2 -2
  191. package/src/actions/pol/getIncentiveFeeClaimStats.ts +4 -4
  192. package/src/actions/pol/getLSTStakeConfig.ts +5 -5
  193. package/src/actions/pol/getMarkets.ts +2 -2
  194. package/src/actions/pol/getRewardProofsByValidator.ts +4 -4
  195. package/src/actions/pol/getRewardTokenToBeraRate.ts +1 -1
  196. package/src/actions/pol/getRewardVault.ts +3 -3
  197. package/src/actions/pol/getRewardVaultBeaconImplementation.integration.test.ts +1 -1
  198. package/src/actions/pol/getRewardVaultBeaconImplementation.ts +3 -3
  199. package/src/actions/pol/getRewardVaultDurationConstants.integration.test.ts +1 -1
  200. package/src/actions/pol/getRewardVaultDurationConstants.ts +1 -1
  201. package/src/actions/pol/getRewardVaultFromToken.ts +1 -1
  202. package/src/actions/pol/getRewardVaultIncentives.ts +2 -2
  203. package/src/actions/pol/getRewardVaultRewards.ts +1 -1
  204. package/src/actions/pol/getRewardVaults.ts +1 -1
  205. package/src/actions/pol/getSWBeraVaultMetadata.ts +20 -22
  206. package/src/actions/pol/getSWBeraWithdrawal.ts +4 -4
  207. package/src/actions/pol/getStakedBeraAPR.ts +2 -2
  208. package/src/actions/pol/getStakedBeraSnapshots.ts +2 -2
  209. package/src/actions/pol/getStakingDailyAssets.ts +3 -3
  210. package/src/actions/pol/getStakingTokenInformation.ts +2 -2
  211. package/src/actions/pol/getTotalStakedAmount.ts +1 -1
  212. package/src/actions/pol/getUserClaimableIncentives.ts +4 -4
  213. package/src/actions/pol/getUserVaultInfo.ts +1 -1
  214. package/src/actions/pol/getUserVaults.ts +4 -4
  215. package/src/actions/pol/getUserVaultsBalance.ts +1 -1
  216. package/src/actions/pol/getUserVaultsReward.ts +0 -0
  217. package/src/actions/pol/getVaultHistory.ts +2 -2
  218. package/src/actions/pol/getVaultValidators.ts +1 -1
  219. package/src/actions/pol/getVaultsSupply.ts +0 -0
  220. package/src/actions/prices/__tests__/prices.integration.test.ts +2 -2
  221. package/src/actions/prices/getTokenCurrentPrices.ts +5 -5
  222. package/src/actions/pyth/getHoneyPythFeeds.ts +2 -2
  223. package/src/actions/pyth/getUpdateFee.ts +2 -2
  224. package/src/actions/tokens/getAllowances.ts +2 -2
  225. package/src/actions/tokens/getTokenInformation.ts +2 -2
  226. package/src/actions/tokens/getTokens.ts +3 -3
  227. package/src/actions/tokens/getUnderlyingToken.ts +4 -4
  228. package/src/actions/tokens/getWalletBalances.integration.test.ts +1 -1
  229. package/src/actions/tokens/getWalletBalances.ts +4 -4
  230. package/src/actions/transactions/beraWriteContract.integration.test.ts +6 -6
  231. package/src/actions/transactions/beraWriteContract.ts +12 -12
  232. package/src/actions/validators/getActiveBoostAndCommissionChangeDelay.integration.test.ts +1 -1
  233. package/src/actions/validators/getActiveBoostAndCommissionChangeDelay.ts +1 -1
  234. package/src/actions/validators/getAllValidators.ts +2 -2
  235. package/src/actions/validators/getApiValidator.ts +2 -2
  236. package/src/actions/validators/getBaselineRewardAllocation.ts +1 -1
  237. package/src/actions/validators/getDailyValidatorBlockStats.ts +1 -1
  238. package/src/actions/validators/getDefaultRewardAllocation.ts +1 -1
  239. package/src/actions/validators/getUserActiveValidators.ts +31 -33
  240. package/src/actions/validators/getUserBoosts.ts +12 -8
  241. package/src/actions/validators/getUserBoostsOnValidator.ts +15 -3
  242. package/src/actions/validators/getUserStakingPositions.ts +1 -1
  243. package/src/actions/validators/getValidatorAnalytics.ts +2 -2
  244. package/src/actions/validators/getValidatorCommission.ts +1 -1
  245. package/src/actions/validators/getValidatorEstimatedBgtPerYear.ts +1 -1
  246. package/src/actions/validators/getValidatorOperatorAddress.ts +1 -1
  247. package/src/actions/validators/getValidatorQueuedCommission.ts +1 -1
  248. package/src/actions/validators/getValidatorQueuedOperatorAddress.ts +1 -1
  249. package/src/actions/validators/getValidatorQueuedRewardAllocation.ts +1 -1
  250. package/src/actions/validators/getValidatorRewardAllocation.ts +1 -1
  251. package/src/actions/validators/getValidatorRewardAllocatorAddress.ts +1 -1
  252. package/src/actions/validators/utils/__tests__/validatorUtils.integration.test.ts +4 -4
  253. package/src/contexts/BeraFlags/defaultFlags.ts +4 -0
  254. package/src/contexts/BexStatusProvider.tsx +1 -1
  255. package/src/contexts/HoneyConfigProvider.tsx +3 -3
  256. package/src/contexts/SwrFallback.tsx +2 -2
  257. package/src/contexts/TokensProvider.tsx +3 -3
  258. package/src/contexts/block-time-provider.tsx +1 -1
  259. package/src/contexts/exports.ts +0 -0
  260. package/src/data/contracts.ts +10 -0
  261. package/src/enum/exports.ts +0 -0
  262. package/src/enum/polling.ts +0 -0
  263. package/src/enum/txnEnum.ts +9 -0
  264. package/src/errors/BeraMonitoring.ts +2 -2
  265. package/src/errors/BeraTracing.ts +2 -2
  266. package/src/errors/RequestError.ts +1 -1
  267. package/src/errors/assert.ts +18 -0
  268. package/src/errors/getErrorMessage.ts +0 -0
  269. package/src/errors/getRevertReason.integration.test.ts +7 -7
  270. package/src/errors/getRevertReason.ts +1 -1
  271. package/src/errors/parseViemError.ts +1 -1
  272. package/src/hooks/bend/useGetConvertToAssets.ts +4 -4
  273. package/src/hooks/dex/useAggregatorsQuotes.ts +19 -19
  274. package/src/hooks/dex/useAggregatorsRouterFeeBps.ts +2 -2
  275. package/src/hooks/dex/useAllUserPools.ts +3 -3
  276. package/src/hooks/dex/useApiPool.ts +3 -3
  277. package/src/hooks/dex/useBexStatus.ts +1 -1
  278. package/src/hooks/dex/useCreatePool.ts +9 -9
  279. package/src/hooks/dex/useExploitedTokens.ts +3 -3
  280. package/src/hooks/dex/useGlobalLiquidityAndSwapVolume.ts +1 -1
  281. package/src/hooks/dex/useLiquidityMismatch.ts +3 -3
  282. package/src/hooks/dex/useLpPosition.ts +7 -4
  283. package/src/hooks/dex/useMultipleTokenApprovalsWithSlippage.ts +4 -4
  284. package/src/hooks/dex/useOnChainPoolData.ts +3 -3
  285. package/src/hooks/dex/usePollPoolCreationRelayerApproval.ts +3 -3
  286. package/src/hooks/dex/usePool.ts +7 -40
  287. package/src/hooks/dex/usePoolEvents.ts +2 -2
  288. package/src/hooks/dex/usePoolHistoricalData.ts +6 -3
  289. package/src/hooks/dex/usePools.ts +3 -3
  290. package/src/hooks/dex/usePriceImpact.ts +2 -2
  291. package/src/hooks/dex/useSingleAggregatorQuote.ts +13 -13
  292. package/src/hooks/enso/useBendDemultiply.ts +158 -0
  293. package/src/hooks/enso/useBendMultiply.ts +163 -0
  294. package/src/hooks/enso/useBendZapSupply.ts +7 -7
  295. package/src/hooks/enso/useEnsoSwapBundle.ts +6 -6
  296. package/src/hooks/enso/useEnsoUserTokensWithBalances.ts +5 -5
  297. package/src/hooks/enso/useEnsoWalletV2Address.ts +38 -0
  298. package/src/hooks/enso/useIsBendAuthorized.ts +47 -0
  299. package/src/hooks/enso/useZapStakeBera.ts +4 -4
  300. package/src/hooks/exports.ts +4 -3
  301. package/src/hooks/governance/useCreateProposal.ts +3 -3
  302. package/src/hooks/governance/useGetPastVotes.ts +2 -2
  303. package/src/hooks/governance/useHasVoted.ts +2 -2
  304. package/src/hooks/governance/useIsCanceller.ts +4 -4
  305. package/src/hooks/governance/usePollAllProposals.ts +3 -3
  306. package/src/hooks/governance/usePollProposal.ts +7 -4
  307. package/src/hooks/governance/usePollProposalThreshold.ts +3 -3
  308. package/src/hooks/governance/usePollProposalVotes.ts +1 -1
  309. package/src/hooks/governance/usePollUserDelegates.ts +7 -4
  310. package/src/hooks/governance/useProposalFromTx.ts +1 -1
  311. package/src/hooks/governance/useProposalSnapshot.ts +2 -2
  312. package/src/hooks/governance/useProposalState.ts +2 -2
  313. package/src/hooks/governance/useProposalTimelockState.ts +2 -2
  314. package/src/hooks/governance/useQuorum.ts +1 -1
  315. package/src/hooks/honey/useCappedGlobally.ts +8 -5
  316. package/src/hooks/honey/useCappedRelatively.ts +7 -4
  317. package/src/hooks/honey/useCollateralWeights.ts +8 -5
  318. package/src/hooks/honey/useHoneyAlerts.ts +5 -5
  319. package/src/hooks/honey/useHoneyBalances.ts +7 -7
  320. package/src/hooks/honey/useHoneyChartData.ts +1 -1
  321. package/src/hooks/honey/useHoneySwapState.ts +4 -4
  322. package/src/hooks/honey/useHoneyVaultsBalance.ts +8 -5
  323. package/src/hooks/honey/useIsBadCollateralAsset.ts +9 -6
  324. package/src/hooks/honey/useIsBasketModeEnabled.ts +8 -5
  325. package/src/hooks/honey/usePythLatestPrices.ts +4 -4
  326. package/src/hooks/perps/usePythUpdateFee.ts +4 -4
  327. package/src/hooks/pol/useBgtAprSimulation.ts +1 -1
  328. package/src/hooks/pol/useBgtUnstakedBalance.ts +7 -4
  329. package/src/hooks/pol/useClaimableFees.ts +4 -4
  330. package/src/hooks/pol/useOnChainRewardVault.ts +7 -7
  331. package/src/hooks/pol/usePollGlobalData.ts +9 -3
  332. package/src/hooks/pol/usePollMarkets.ts +5 -2
  333. package/src/hooks/pol/useQueuedBeraUnlock.ts +4 -4
  334. package/src/hooks/pol/useRewardTokenToBeraRate.ts +4 -4
  335. package/src/hooks/pol/useRewardVault.ts +5 -2
  336. package/src/hooks/pol/useRewardVaultBalanceFromStakingToken.ts +2 -2
  337. package/src/hooks/pol/useRewardVaultFromToken.ts +2 -2
  338. package/src/hooks/pol/useRewardVaultIncentives.ts +2 -2
  339. package/src/hooks/pol/useRewardVaultRewards.ts +3 -3
  340. package/src/hooks/pol/useRewardVaults.ts +2 -2
  341. package/src/hooks/pol/useStakedAPR.ts +3 -3
  342. package/src/hooks/pol/useStakedData.ts +10 -10
  343. package/src/hooks/pol/useStakedSnapshots.ts +3 -3
  344. package/src/hooks/pol/useStakingVaultsMetadata.ts +40 -0
  345. package/src/hooks/pol/useTotalStakedAmount.ts +2 -2
  346. package/src/hooks/pol/useUserVaultInfo.ts +8 -5
  347. package/src/hooks/pol/useUserVaults.ts +7 -4
  348. package/src/hooks/pol/useVaultAddress.ts +2 -2
  349. package/src/hooks/pol/useVaultHistory.ts +2 -2
  350. package/src/hooks/pol/useVaultValidators.ts +5 -2
  351. package/src/hooks/tokens/useBeraCurrentPrice.ts +1 -1
  352. package/src/hooks/tokens/useMultipleTokenInformation.ts +7 -4
  353. package/src/hooks/tokens/usePollAllowances.ts +7 -4
  354. package/src/hooks/tokens/usePollBalance.ts +8 -5
  355. package/src/hooks/tokens/usePollWalletBalances.ts +8 -5
  356. package/src/hooks/tokens/useStakingTokenInformation.ts +7 -4
  357. package/src/hooks/tokens/useTokenCurrentPrice.ts +1 -1
  358. package/src/hooks/tokens/useTokenCurrentPrices.ts +6 -6
  359. package/src/hooks/tokens/useTokenInformation.ts +8 -5
  360. package/src/hooks/tokens/useTokenPrice.ts +1 -1
  361. package/src/hooks/tokens/useTokenPrices.ts +4 -4
  362. package/src/hooks/tokens/useTokens.ts +3 -3
  363. package/src/hooks/tokens/useTotalSupply.ts +1 -1
  364. package/src/hooks/tokens/useUnderlyingAsset.ts +3 -3
  365. package/src/hooks/useBlockToTimestamp.ts +5 -5
  366. package/src/hooks/useContractWrite/index.ts +0 -0
  367. package/src/hooks/useContractWrite/stateReducer.ts +0 -0
  368. package/src/hooks/useContractWrite/types.ts +2 -2
  369. package/src/hooks/useContractWrite/useBeraContractWrite.ts +5 -6
  370. package/src/hooks/useGetVerifiedAbi.ts +1 -1
  371. package/src/hooks/usePrevious.ts +0 -0
  372. package/src/hooks/validators/useAllValidators.ts +7 -4
  373. package/src/hooks/validators/useApiEnrichedAllocation.ts +2 -2
  374. package/src/hooks/validators/useApiValidator.ts +5 -2
  375. package/src/hooks/validators/useBaselineRewardAllocation.ts +2 -2
  376. package/src/hooks/validators/useDailyValidatorBlockStats.ts +3 -3
  377. package/src/hooks/validators/useDefaultRewardAllocation.ts +4 -4
  378. package/src/hooks/validators/useManagedValidatorRole.ts +8 -5
  379. package/src/hooks/validators/useOnChainValidator.ts +6 -3
  380. package/src/hooks/validators/useStakingPoolBatch.ts +7 -4
  381. package/src/hooks/validators/useUserActiveValidators.ts +6 -3
  382. package/src/hooks/validators/useUserBoostsOnValidator.ts +3 -3
  383. package/src/hooks/validators/useUserClaimableIncentives.ts +9 -9
  384. package/src/hooks/validators/useUserStakingPositions.ts +1 -1
  385. package/src/hooks/validators/useValidator.ts +1 -1
  386. package/src/hooks/validators/useValidatorAnalytics.ts +3 -3
  387. package/src/hooks/validators/useValidatorCommission.ts +5 -2
  388. package/src/hooks/validators/useValidatorEstimatedBgtPerYear.ts +3 -3
  389. package/src/hooks/validators/useValidatorQueuedCommission.ts +6 -3
  390. package/src/hooks/validators/useValidatorQueuedOperatorAddress.ts +5 -2
  391. package/src/hooks/validators/useValidatorQueuedRewardAllocation.ts +6 -3
  392. package/src/hooks/validators/useValidatorRewardAllocation.ts +2 -2
  393. package/src/types/dex.d.ts +1 -1
  394. package/src/types/enso.d.ts +34 -0
  395. package/src/types/exports.ts +0 -0
  396. package/src/types/global.d.ts +3 -3
  397. package/src/types/governance.d.ts +1 -1
  398. package/src/types/honeySwap.d.ts +3 -3
  399. package/src/types/staking.d.ts +0 -0
  400. package/src/utils/beraFetch.ts +1 -1
  401. package/src/utils/createEmitter.ts +1 -1
  402. package/src/utils/exports.ts +0 -0
  403. package/src/utils/filter.ts +0 -0
  404. package/src/utils/formatIncentivesTokenMap.ts +1 -1
  405. package/src/utils/formatInputTokenValue.ts +0 -0
  406. package/src/utils/formatNumber.ts +0 -0
  407. package/src/utils/getContractName.ts +1 -1
  408. package/src/utils/getHoneySwapMessage.test.ts +1 -1
  409. package/src/utils/getHoneySwapMessage.ts +1 -1
  410. package/src/utils/parseBaseArgs.ts +1 -1
  411. package/src/utils/parseBaseArgs.unit.test.ts +1 -1
  412. package/src/utils/parseWhiskToken.ts +1 -1
  413. package/src/utils/poolNamings.ts +1 -1
  414. package/src/utils/tokens.ts +2 -2
  415. package/src/utils/tokens.unit.test.ts +1 -1
  416. package/src/utils/truncateHash.ts +0 -0
  417. package/.claude/skills/berajs/SKILL.md +0 -222
  418. package/.claude/skills/berajs/references/dex.md +0 -235
  419. package/.claude/skills/berajs/references/pol.md +0 -194
  420. package/.claude/skills/berajs/references/staking.md +0 -198
  421. package/.claude/skills/berajs/references/tokens.md +0 -170
  422. package/LICENSE +0 -21
  423. package/dist/chunk-22J3YJDN.cjs +0 -2
  424. package/dist/chunk-22J3YJDN.cjs.map +0 -1
  425. package/dist/chunk-2LL3P5PN.mjs +0 -2
  426. package/dist/chunk-2LL3P5PN.mjs.map +0 -1
  427. package/dist/chunk-4GU2O2OW.cjs +0 -4
  428. package/dist/chunk-4GU2O2OW.cjs.map +0 -1
  429. package/dist/chunk-55L7STYD.mjs +0 -2
  430. package/dist/chunk-55L7STYD.mjs.map +0 -1
  431. package/dist/chunk-5XWELBWR.mjs +0 -2
  432. package/dist/chunk-5XWELBWR.mjs.map +0 -1
  433. package/dist/chunk-6LDOG5RL.cjs.map +0 -1
  434. package/dist/chunk-7LNBSOVV.cjs +0 -2
  435. package/dist/chunk-7LNBSOVV.cjs.map +0 -1
  436. package/dist/chunk-7SMWQ6SN.mjs.map +0 -1
  437. package/dist/chunk-7WRTK7RJ.mjs.map +0 -1
  438. package/dist/chunk-AX2YQQFQ.mjs.map +0 -1
  439. package/dist/chunk-BS6K7HGH.cjs +0 -2
  440. package/dist/chunk-BS6K7HGH.cjs.map +0 -1
  441. package/dist/chunk-C3FHGFLK.mjs +0 -2
  442. package/dist/chunk-C3FHGFLK.mjs.map +0 -1
  443. package/dist/chunk-C6ZGUO4H.cjs.map +0 -1
  444. package/dist/chunk-FCWDGE62.cjs.map +0 -1
  445. package/dist/chunk-RW3JFPED.mjs +0 -4
  446. package/dist/chunk-RW3JFPED.mjs.map +0 -1
  447. package/dist/chunk-S3EAKCVM.cjs +0 -2
  448. package/dist/chunk-S3EAKCVM.cjs.map +0 -1
  449. package/dist/chunk-SWMJQOH6.cjs +0 -2
  450. package/dist/chunk-SWMJQOH6.cjs.map +0 -1
  451. package/dist/chunk-THATXCJK.mjs +0 -2
  452. package/dist/chunk-THATXCJK.mjs.map +0 -1
  453. package/dist/chunk-VXL2ZZ4X.cjs +0 -2
  454. package/dist/chunk-VXL2ZZ4X.cjs.map +0 -1
  455. package/dist/chunk-YNO7BCCM.mjs +0 -2
  456. package/dist/chunk-YXLFOEZN.mjs +0 -2
  457. package/dist/chunk-YXLFOEZN.mjs.map +0 -1
  458. package/dist/chunk-YZV5LKIP.cjs.map +0 -1
  459. package/src/actions/dex/getSubgraphPool.ts +0 -30
  460. package/src/actions/validators/getManagedValidatorByAccount.ts +0 -32
  461. package/src/hooks/pol/useSWBeraVaultMetadata.ts +0 -35
  462. package/src/hooks/validators/useManagedValidatorByAccount.ts +0 -40
  463. package/src/hooks/validators/useSubgraphUserValidators.ts +0 -36
@@ -7,8 +7,8 @@ import {
7
7
  } from "@berachain/graphql/dex/api";
8
8
  import type { GqlChain } from "@berachain/graphql/pol/api";
9
9
 
10
- import { getApolloClient } from "~/actions/clients/getApolloClient";
11
- import { parseBaseArgs } from "~/utils/parseBaseArgs";
10
+ import { parseBaseArgs } from "../../utils/parseBaseArgs";
11
+ import { getApolloClient } from "../clients/getApolloClient";
12
12
 
13
13
  export async function getApiPool({
14
14
  poolId,
@@ -5,8 +5,8 @@ import {
5
5
  type GqlChain,
6
6
  } from "@berachain/graphql/dex/api";
7
7
 
8
- import { getApolloClient } from "~/actions/clients/getApolloClient";
9
- import { parseBaseArgs } from "~/utils/parseBaseArgs";
8
+ import { parseBaseArgs } from "../../utils/parseBaseArgs";
9
+ import { getApolloClient } from "../clients/getApolloClient";
10
10
 
11
11
  export async function getGlobalLiquidityAndSwapVolume(
12
12
  args: BeraJS.BaseFunctionArgs = {},
@@ -7,7 +7,7 @@ import {
7
7
  } from "@berachain/graphql/dex/subgraph";
8
8
  import BigNumber from "@berachain/utils/pkg/bignumber.js";
9
9
 
10
- import type { Token } from "~/types/dex";
10
+ import type { Token } from "../../types/dex";
11
11
  import { getApolloClient } from "../clients/getApolloClient";
12
12
 
13
13
  /**
@@ -17,9 +17,9 @@ import {
17
17
 
18
18
  import { GqlPoolType } from "@berachain/graphql/pol/api";
19
19
 
20
- import { InvalidArgumentError } from "~/errors/InvalidArgumentError";
21
- import { initBeraError } from "~/errors/initBeraError";
22
- import { parseBaseArgs } from "~/utils/parseBaseArgs";
20
+ import { InvalidArgumentError } from "../../errors/InvalidArgumentError";
21
+ import { initBeraError } from "../../errors/initBeraError";
22
+ import { parseBaseArgs } from "../../utils/parseBaseArgs";
23
23
  import { getPoolPausedState, type PoolStatus } from "./getPoolPausedState";
24
24
 
25
25
  export interface OnChainPool {
@@ -5,8 +5,8 @@ import {
5
5
  } from "@berachain/graphql/dex/api";
6
6
  import type { GqlChain, GqlPoolEventType } from "@berachain/graphql/pol/api";
7
7
 
8
- import { getApolloClient } from "~/actions/clients/getApolloClient";
9
- import { parseBaseArgs } from "~/utils/parseBaseArgs";
8
+ import { parseBaseArgs } from "../../utils/parseBaseArgs";
9
+ import { getApolloClient } from "../clients/getApolloClient";
10
10
 
11
11
  export async function getPoolEvents({
12
12
  poolId,
@@ -8,8 +8,8 @@ import {
8
8
  type PoolHistoricalDataFragment,
9
9
  } from "@berachain/graphql/dex/api";
10
10
 
11
- import { getApolloClient } from "~/actions/clients/getApolloClient";
12
- import { InvalidArgumentError } from "~/errors/InvalidArgumentError";
11
+ import { InvalidArgumentError } from "../../errors/InvalidArgumentError";
12
+ import { getApolloClient } from "../clients/getApolloClient";
13
13
 
14
14
  /** @deprecated */
15
15
  export type PoolDayData = {
@@ -2,7 +2,7 @@ import type { PublicClient } from "viem";
2
2
 
3
3
  import { vaultAbi as balancerVaultAbi } from "@berachain/abis/bex/vault";
4
4
 
5
- import { parseBaseArgs } from "~/utils/parseBaseArgs";
5
+ import { parseBaseArgs } from "../../utils/parseBaseArgs";
6
6
 
7
7
  export async function getVaultPausedState({
8
8
  publicClient,
@@ -0,0 +1,175 @@
1
+ import {
2
+ type Address,
3
+ ethAddress,
4
+ getAddress,
5
+ parseUnits,
6
+ zeroAddress,
7
+ } from "viem";
8
+ import { beforeEach, describe, expect, it, vi } from "vitest";
9
+
10
+ import { ChainId } from "@berachain/config/internal";
11
+
12
+ import { getBendDemultiplyBundle } from "../getBendDemultiplyBundle";
13
+ import {
14
+ collateral18,
15
+ loan6,
16
+ MOCK_BUNDLE_RESPONSE,
17
+ makeMockEnsoClient,
18
+ makeMockPublicClient,
19
+ TEST_ADDRESS,
20
+ TEST_MARKET_ID,
21
+ TEST_PRIMARY,
22
+ } from "./helpers";
23
+
24
+ vi.mock("../flashloan", () => ({
25
+ assembleBendFlashloanTransactions: vi.fn().mockResolvedValue({
26
+ transactions: [
27
+ { to: "0xbundle", data: "0x1234", value: 0n, gasLimit: 500000n },
28
+ ],
29
+ approvals: [],
30
+ ensoWalletFlashloanAdapter: "0x3333333333333333333333333333333333333333",
31
+ }),
32
+ }));
33
+
34
+ const mockEnsoClient = makeMockEnsoClient() as any;
35
+ const mockPublicClient = makeMockPublicClient() as any;
36
+
37
+ beforeEach(() => {
38
+ vi.clearAllMocks();
39
+ mockEnsoClient.getBundleData.mockResolvedValue(MOCK_BUNDLE_RESPONSE);
40
+ });
41
+
42
+ describe("getBendDemultiplyBundle", () => {
43
+ const baseArgs = {
44
+ fromAddress: TEST_ADDRESS,
45
+ repayAmount: parseUnits("5000", 6).toString(),
46
+ collateralToken: collateral18,
47
+ loanToken: loan6,
48
+ marketId: TEST_MARKET_ID,
49
+ primaryAddress: TEST_PRIMARY,
50
+ chainId: ChainId.MAINNET,
51
+ ensoClient: mockEnsoClient,
52
+ slippage: 0.5,
53
+ publicClient: mockPublicClient,
54
+ collateralPriceInLoanAsset: "2000",
55
+ currentCollateral: parseUnits("100", 18).toString(),
56
+ currentDebt: parseUnits("10000", 6).toString(),
57
+ ensoWalletV2Address: getAddress(
58
+ "0x2222222222222222222222222222222222222222",
59
+ ),
60
+ isAuthorized: true,
61
+ };
62
+
63
+ it("throws for missing fromAddress", async () => {
64
+ await expect(
65
+ getBendDemultiplyBundle({
66
+ ...baseArgs,
67
+ fromAddress: "" as Address,
68
+ }),
69
+ ).rejects.toThrow("fromAddress");
70
+ });
71
+
72
+ it("throws for zero repayAmount", async () => {
73
+ await expect(
74
+ getBendDemultiplyBundle({
75
+ ...baseArgs,
76
+ repayAmount: "0",
77
+ }),
78
+ ).rejects.toThrow("repayAmount");
79
+ });
80
+
81
+ it("throws for zero currentDebt", async () => {
82
+ await expect(
83
+ getBendDemultiplyBundle({
84
+ ...baseArgs,
85
+ currentDebt: "0",
86
+ }),
87
+ ).rejects.toThrow("currentDebt");
88
+ });
89
+
90
+ it("partial repay: no cleanup actions in callback", async () => {
91
+ await getBendDemultiplyBundle(baseArgs);
92
+
93
+ const bundleActions = mockEnsoClient.getBundleData.mock.calls[0][1];
94
+ expect(bundleActions).toHaveLength(1);
95
+ expect(bundleActions[0].action).toBe("flashloan");
96
+
97
+ // partial: route + repay + withdraw = 3 callback actions
98
+ const callback = bundleActions[0].args.callback;
99
+ expect(callback).toHaveLength(3);
100
+ expect(callback[0].action).toBe("route");
101
+ expect(callback[1].action).toBe("repay");
102
+ expect(callback[2].action).toBe("withdraw");
103
+ });
104
+
105
+ it("full repay: includes cleanup actions in callback", async () => {
106
+ await getBendDemultiplyBundle({
107
+ ...baseArgs,
108
+ repayAmount: parseUnits("10000", 6).toString(), // repay all debt
109
+ });
110
+
111
+ const callback =
112
+ mockEnsoClient.getBundleData.mock.calls[0][1][0].args.callback;
113
+ // full repay: route + repay + balance + route_back + deposit + withdraw = 6
114
+ expect(callback).toHaveLength(6);
115
+ expect(callback[0].action).toBe("route");
116
+ expect(callback[1].action).toBe("repay");
117
+ expect(callback[2].action).toBe("balance"); // cleanup
118
+ expect(callback[3].action).toBe("route"); // cleanup swap back
119
+ expect(callback[4].action).toBe("deposit"); // cleanup redeposit
120
+ expect(callback[5].action).toBe("withdraw");
121
+ });
122
+
123
+ it("full repay with clamped collateral: skips cleanup", async () => {
124
+ // Very little collateral — flashloan amount will be clamped
125
+ await getBendDemultiplyBundle({
126
+ ...baseArgs,
127
+ repayAmount: parseUnits("10000", 6).toString(),
128
+ currentCollateral: parseUnits("1", 18).toString(), // only 1 ETH
129
+ });
130
+
131
+ const callback =
132
+ mockEnsoClient.getBundleData.mock.calls[0][1][0].args.callback;
133
+ // clamped = no cleanup: route + repay + withdraw = 3
134
+ expect(callback).toHaveLength(3);
135
+ });
136
+
137
+ it("calls ensoClient with ensowallet-v2 strategy", async () => {
138
+ await getBendDemultiplyBundle(baseArgs);
139
+
140
+ const bundleConfig = mockEnsoClient.getBundleData.mock.calls[0][0];
141
+ expect(bundleConfig.routingStrategy).toBe("ensowallet-v2");
142
+ expect(bundleConfig.fromAddress).toBe(TEST_ADDRESS);
143
+ });
144
+
145
+ it("returns positionEstimate as reductions", async () => {
146
+ const result = await getBendDemultiplyBundle(baseArgs);
147
+
148
+ expect(result.positionEstimate).toBeDefined();
149
+ // These are reduction amounts, should be positive
150
+ expect(Number(result.positionEstimate.finalCollateral)).toBeGreaterThan(0);
151
+ expect(Number(result.positionEstimate.totalBorrow)).toBeGreaterThan(0);
152
+ });
153
+
154
+ it("normalizes zeroAddress to ethAddress", async () => {
155
+ const zeroCollateral = { ...collateral18, address: zeroAddress };
156
+
157
+ await getBendDemultiplyBundle({
158
+ ...baseArgs,
159
+ collateralToken: zeroCollateral,
160
+ });
161
+
162
+ const flashloanArgs = mockEnsoClient.getBundleData.mock.calls[0][1][0].args;
163
+ expect(flashloanArgs.flashloanToken).toBe(ethAddress);
164
+ });
165
+
166
+ it("passes amountIn as '0' to assembleBendFlashloanTransactions", async () => {
167
+ const { assembleBendFlashloanTransactions } = await import("../flashloan");
168
+
169
+ await getBendDemultiplyBundle(baseArgs);
170
+
171
+ expect(assembleBendFlashloanTransactions).toHaveBeenCalledWith(
172
+ expect.objectContaining({ amountIn: "0" }),
173
+ );
174
+ });
175
+ });
@@ -0,0 +1,150 @@
1
+ import { parseUnits } from "viem";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { InvalidArgumentError } from "../../../errors/InvalidArgumentError";
5
+ import {
6
+ calculateDemultiplyCollateralAmount,
7
+ getPositionEstimate,
8
+ } from "../getBendDemultiplyBundle";
9
+ import { collateral6, collateral18, loan6, loan18 } from "./helpers";
10
+
11
+ describe("calculateDemultiplyCollateralAmount", () => {
12
+ const baseArgs = {
13
+ repayAmount: parseUnits("10000", 6).toString(), // repay 10000 USDC
14
+ collateralPriceInLoanAsset: "2000", // 1 ETH = 2000 USDC
15
+ collateralToken: collateral18,
16
+ loanToken: loan6,
17
+ slippage: 0.5,
18
+ currentCollateral: parseUnits("100", 18).toString(), // 100 ETH available
19
+ };
20
+
21
+ it("calculates collateral needed to cover repayment", () => {
22
+ const result = calculateDemultiplyCollateralAmount(baseArgs);
23
+ const collateralEth = Number(result) / 1e18;
24
+
25
+ // Need to repay 10000 USDC, price is 2000 USDC/ETH, slippage 0.5%
26
+ // collateral = 10000 / (2000 * 0.995) ≈ 5.025 ETH
27
+ expect(collateralEth).toBeGreaterThan(5);
28
+ expect(collateralEth).toBeLessThan(5.1);
29
+ });
30
+
31
+ it("clamps to currentCollateral when needed amount exceeds position", () => {
32
+ const result = calculateDemultiplyCollateralAmount({
33
+ ...baseArgs,
34
+ currentCollateral: parseUnits("2", 18).toString(), // only 2 ETH
35
+ });
36
+
37
+ // Needs ~5 ETH but only has 2, should clamp
38
+ expect(result).toBe(parseUnits("2", 18).toString());
39
+ });
40
+
41
+ it("throws for zero price", () => {
42
+ expect(() =>
43
+ calculateDemultiplyCollateralAmount({
44
+ ...baseArgs,
45
+ collateralPriceInLoanAsset: "0",
46
+ }),
47
+ ).toThrow(InvalidArgumentError);
48
+ });
49
+
50
+ it("throws for negative price", () => {
51
+ expect(() =>
52
+ calculateDemultiplyCollateralAmount({
53
+ ...baseArgs,
54
+ collateralPriceInLoanAsset: "-100",
55
+ }),
56
+ ).toThrow(InvalidArgumentError);
57
+ });
58
+
59
+ it("returns '0' when repay amount is zero", () => {
60
+ const result = calculateDemultiplyCollateralAmount({
61
+ ...baseArgs,
62
+ repayAmount: "0",
63
+ });
64
+ expect(result).toBe("0");
65
+ });
66
+
67
+ it("returns integer string (no decimals)", () => {
68
+ const result = calculateDemultiplyCollateralAmount(baseArgs);
69
+ expect(result).toMatch(/^\d+$/);
70
+ });
71
+
72
+ it("higher slippage requires more collateral", () => {
73
+ const lowSlippage = calculateDemultiplyCollateralAmount({
74
+ ...baseArgs,
75
+ slippage: 0.5,
76
+ });
77
+ const highSlippage = calculateDemultiplyCollateralAmount({
78
+ ...baseArgs,
79
+ slippage: 5,
80
+ });
81
+
82
+ expect(Number(highSlippage)).toBeGreaterThan(Number(lowSlippage));
83
+ });
84
+
85
+ it("works with reversed decimal pairs (6 -> 18)", () => {
86
+ const result = calculateDemultiplyCollateralAmount({
87
+ repayAmount: parseUnits("5", 18).toString(), // repay 5 ETH
88
+ collateralPriceInLoanAsset: "0.0005", // 1 USDC = 0.0005 ETH
89
+ collateralToken: collateral6,
90
+ loanToken: loan18,
91
+ slippage: 0.5,
92
+ currentCollateral: parseUnits("1000000", 6).toString(), // 1M USDC
93
+ });
94
+
95
+ const collateralUsdc = Number(result) / 1e6;
96
+ // Need 5 ETH, price is 0.0005 ETH/USDC → need 10000 USDC + slippage
97
+ expect(collateralUsdc).toBeGreaterThan(10000);
98
+ expect(collateralUsdc).toBeLessThan(10100);
99
+ });
100
+ });
101
+
102
+ describe("getPositionEstimate (demultiply)", () => {
103
+ it("returns collateral and debt reductions in human-readable format", () => {
104
+ const result = getPositionEstimate({
105
+ repayAmount: parseUnits("5000", 6).toString(),
106
+ collateralToWithdraw: parseUnits("3", 18).toString(),
107
+ collateralToken: collateral18,
108
+ loanToken: loan6,
109
+ });
110
+
111
+ expect(Number(result.finalCollateral)).toBe(3);
112
+ expect(Number(result.totalBorrow)).toBe(5000);
113
+ });
114
+
115
+ it("handles small amounts without precision loss", () => {
116
+ const result = getPositionEstimate({
117
+ repayAmount: "1", // 1 raw unit = 0.000001 USDC
118
+ collateralToWithdraw: "1", // 1 raw unit = 1e-18 ETH
119
+ collateralToken: collateral18,
120
+ loanToken: loan6,
121
+ });
122
+
123
+ expect(Number(result.totalBorrow)).toBeCloseTo(0.000001, 10);
124
+ expect(Number(result.finalCollateral)).toBeCloseTo(1e-18, 25);
125
+ });
126
+
127
+ it("handles zero values", () => {
128
+ const result = getPositionEstimate({
129
+ repayAmount: "0",
130
+ collateralToWithdraw: "0",
131
+ collateralToken: collateral18,
132
+ loanToken: loan6,
133
+ });
134
+
135
+ expect(Number(result.finalCollateral)).toBe(0);
136
+ expect(Number(result.totalBorrow)).toBe(0);
137
+ });
138
+
139
+ it("works with 6-decimal collateral", () => {
140
+ const result = getPositionEstimate({
141
+ repayAmount: parseUnits("1", 18).toString(),
142
+ collateralToWithdraw: parseUnits("2000", 6).toString(),
143
+ collateralToken: collateral6,
144
+ loanToken: loan18,
145
+ });
146
+
147
+ expect(Number(result.finalCollateral)).toBe(2000);
148
+ expect(Number(result.totalBorrow)).toBe(1);
149
+ });
150
+ });
@@ -0,0 +1,138 @@
1
+ import {
2
+ type Address,
3
+ ethAddress,
4
+ getAddress,
5
+ parseUnits,
6
+ zeroAddress,
7
+ } from "viem";
8
+ import { beforeEach, describe, expect, it, vi } from "vitest";
9
+
10
+ import { ChainId } from "@berachain/config/internal";
11
+
12
+ import { getBendMultiplyBundle } from "../getBendMultiplyBundle";
13
+ import {
14
+ collateral18,
15
+ loan6,
16
+ MOCK_BUNDLE_RESPONSE,
17
+ makeMockEnsoClient,
18
+ makeMockPublicClient,
19
+ TEST_ADDRESS,
20
+ TEST_MARKET_ID,
21
+ TEST_PRIMARY,
22
+ } from "./helpers";
23
+
24
+ vi.mock("../flashloan", () => ({
25
+ assembleBendFlashloanTransactions: vi.fn().mockResolvedValue({
26
+ transactions: [
27
+ { to: "0xbundle", data: "0x1234", value: 0n, gasLimit: 500000n },
28
+ ],
29
+ approvals: [],
30
+ ensoWalletFlashloanAdapter: "0x3333333333333333333333333333333333333333",
31
+ }),
32
+ }));
33
+
34
+ const mockEnsoClient = makeMockEnsoClient() as any;
35
+ const mockPublicClient = makeMockPublicClient() as any;
36
+
37
+ beforeEach(() => {
38
+ vi.clearAllMocks();
39
+ mockEnsoClient.getBundleData.mockResolvedValue(MOCK_BUNDLE_RESPONSE);
40
+ });
41
+
42
+ describe("getBendMultiplyBundle", () => {
43
+ const baseArgs = {
44
+ fromAddress: TEST_ADDRESS,
45
+ rawSupplyCollateralAmount: parseUnits("10", 18).toString(),
46
+ rawCurrentCollateralAmount: "0",
47
+ rawCurrentBorrowAmount: "0",
48
+ collateralToken: collateral18,
49
+ loanToken: loan6,
50
+ marketId: TEST_MARKET_ID,
51
+ primaryAddress: TEST_PRIMARY,
52
+ chainId: ChainId.MAINNET,
53
+ ensoClient: mockEnsoClient,
54
+ slippage: 0.5,
55
+ leverageMultiplier: 2,
56
+ publicClient: mockPublicClient,
57
+ formattedCollateralPriceInLoanAsset: "2000",
58
+ ensoWalletV2Address: getAddress(
59
+ "0x2222222222222222222222222222222222222222",
60
+ ),
61
+ isAuthorized: true,
62
+ };
63
+
64
+ it("throws for missing fromAddress", async () => {
65
+ await expect(
66
+ getBendMultiplyBundle({
67
+ ...baseArgs,
68
+ fromAddress: "" as Address,
69
+ }),
70
+ ).rejects.toThrow("fromAddress");
71
+ });
72
+
73
+ it("uses deposit-only actions when leverage = 1", async () => {
74
+ await getBendMultiplyBundle({
75
+ ...baseArgs,
76
+ leverageMultiplier: 1,
77
+ });
78
+
79
+ const bundleActions = mockEnsoClient.getBundleData.mock.calls[0][1];
80
+ expect(bundleActions).toHaveLength(1);
81
+ expect(bundleActions[0].action).toBe("deposit");
82
+ });
83
+
84
+ it("uses flashloan actions when leverage > 1", async () => {
85
+ await getBendMultiplyBundle(baseArgs);
86
+
87
+ const bundleActions = mockEnsoClient.getBundleData.mock.calls[0][1];
88
+ expect(bundleActions).toHaveLength(1);
89
+ expect(bundleActions[0].action).toBe("flashloan");
90
+ expect(bundleActions[0].args.callback).toHaveLength(4);
91
+ });
92
+
93
+ it("flashloan callback has correct action order", async () => {
94
+ await getBendMultiplyBundle(baseArgs);
95
+
96
+ const callback =
97
+ mockEnsoClient.getBundleData.mock.calls[0][1][0].args.callback;
98
+ expect(callback[0].action).toBe("route"); // swap loan -> collateral
99
+ expect(callback[1].action).toBe("balance"); // check collateral balance
100
+ expect(callback[2].action).toBe("deposit"); // deposit collateral
101
+ expect(callback[3].action).toBe("borrow"); // borrow to repay flashloan
102
+ });
103
+
104
+ it("calls ensoClient.getBundleData with ensowallet-v2 strategy", async () => {
105
+ await getBendMultiplyBundle(baseArgs);
106
+
107
+ const bundleConfig = mockEnsoClient.getBundleData.mock.calls[0][0];
108
+ expect(bundleConfig.routingStrategy).toBe("ensowallet-v2");
109
+ expect(bundleConfig.fromAddress).toBe(TEST_ADDRESS);
110
+ expect(bundleConfig.chainId).toBe(ChainId.MAINNET);
111
+ });
112
+
113
+ it("returns positionEstimate with transactions", async () => {
114
+ const result = await getBendMultiplyBundle(baseArgs);
115
+
116
+ expect(result.bundle).toBeDefined();
117
+ expect(result.transactions).toBeDefined();
118
+ expect(result.positionEstimate).toBeDefined();
119
+ expect(Number(result.positionEstimate.finalCollateral)).toBeGreaterThan(0);
120
+ expect(Number(result.positionEstimate.totalBorrow)).toBeGreaterThan(0);
121
+ });
122
+
123
+ it("normalizes zeroAddress to ethAddress for tokens", async () => {
124
+ const zeroCollateral = {
125
+ ...collateral18,
126
+ address: zeroAddress,
127
+ };
128
+
129
+ await getBendMultiplyBundle({
130
+ ...baseArgs,
131
+ collateralToken: zeroCollateral,
132
+ });
133
+
134
+ const bundleActions = mockEnsoClient.getBundleData.mock.calls[0][1];
135
+ const flashloanArgs = bundleActions[0].args;
136
+ expect(flashloanArgs.tokenIn).toBe(ethAddress);
137
+ });
138
+ });