@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
@@ -0,0 +1,325 @@
1
+ import type { BundleAction, EnsoClient } from "@ensofinance/sdk";
2
+ import { type Address, formatUnits, type Hex, type PublicClient } from "viem";
3
+
4
+ import BigNumber from "@berachain/utils/pkg/bignumber.js";
5
+
6
+ import { assertAddress, assertPositive } from "../../errors/assert";
7
+ import { InvalidArgumentError } from "../../errors/InvalidArgumentError";
8
+ import type { Token } from "../../types/dex";
9
+ import type { BendDemultiplyBundleResponse } from "../../types/enso";
10
+ import { assembleBendFlashloanTransactions } from "./flashloan";
11
+ import { computeSwapOutputRatio, toEnsoAddress } from "./util";
12
+
13
+ // full-repay cleanup needs a non-trivial leftover debt balance after `repay`.
14
+ // without this proportional buffer, enso may fail to route near-zero dust.
15
+ const FULL_REPAY_CLEANUP_BUFFER_BPS = 25n; // 0.25%
16
+ const BPS_DIVISOR = 10_000n;
17
+
18
+ export interface GetBendDemultiplyBundleArgs {
19
+ fromAddress: Address;
20
+ repayAmount: string;
21
+ collateralToken: Token;
22
+ loanToken: Token;
23
+ marketId: Hex;
24
+ primaryAddress: Address;
25
+ chainId: number;
26
+ ensoClient: EnsoClient;
27
+ slippage: number;
28
+ publicClient: PublicClient;
29
+ collateralPriceInLoanAsset: string;
30
+ currentCollateral: string;
31
+ currentDebt: string;
32
+ ensoWalletV2Address: Address;
33
+ isAuthorized: boolean;
34
+ }
35
+
36
+ /**
37
+ * Calculate the collateral amount to flashloan and sell in order to repay
38
+ * the target debt amount.
39
+ *
40
+ * collateralNeeded = repayAmount / (collateralPrice * swapOutputRatio)
41
+ *
42
+ * This is the inverse of the multiply direction: we need enough collateral
43
+ * that, after swapping to the loan token with slippage, covers the repay
44
+ * amount. The result is clamped to `currentCollateral` (can't withdraw
45
+ * more than exists in the position).
46
+ */
47
+ export function calculateDemultiplyCollateralAmount({
48
+ repayAmount,
49
+ collateralPriceInLoanAsset,
50
+ collateralToken,
51
+ loanToken,
52
+ slippage,
53
+ currentCollateral,
54
+ }: {
55
+ repayAmount: string;
56
+ collateralPriceInLoanAsset: string;
57
+ collateralToken: Token;
58
+ loanToken: Token;
59
+ slippage: number;
60
+ currentCollateral: string;
61
+ }): string {
62
+ const swapOutputRatio = computeSwapOutputRatio(slippage);
63
+ const collateralPrice = new BigNumber(collateralPriceInLoanAsset);
64
+
65
+ if (collateralPrice.lte(0)) {
66
+ throw new InvalidArgumentError({
67
+ property: "collateralPriceInLoanAsset",
68
+ value: collateralPriceInLoanAsset,
69
+ expected: "a value greater than zero",
70
+ });
71
+ }
72
+
73
+ const loanDecimalsMul = new BigNumber(10).pow(loanToken.decimals);
74
+ const collateralDecimalsMul = new BigNumber(10).pow(collateralToken.decimals);
75
+
76
+ const repayAmountHuman = new BigNumber(repayAmount).dividedBy(
77
+ loanDecimalsMul,
78
+ );
79
+
80
+ const flashloanCollateralHuman = repayAmountHuman
81
+ .dividedBy(collateralPrice)
82
+ .dividedBy(swapOutputRatio);
83
+
84
+ const flashloanCollateralRaw = flashloanCollateralHuman
85
+ .multipliedBy(collateralDecimalsMul)
86
+ .integerValue(BigNumber.ROUND_UP);
87
+
88
+ if (flashloanCollateralRaw.lte(0)) return "0";
89
+
90
+ return BigNumber.minimum(
91
+ flashloanCollateralRaw,
92
+ new BigNumber(currentCollateral),
93
+ ).toFixed(0);
94
+ }
95
+
96
+ /**
97
+ * Estimate the position change after executing a demultiply.
98
+ *
99
+ * Unlike multiply, these values represent *reductions* from the current
100
+ * position — the caller subtracts them to get the new totals.
101
+ * Returns human-readable (formatted) values for display.
102
+ */
103
+ export function getPositionEstimate({
104
+ repayAmount,
105
+ collateralToWithdraw,
106
+ collateralToken,
107
+ loanToken,
108
+ }: {
109
+ repayAmount: string;
110
+ collateralToWithdraw: string;
111
+ collateralToken: Token;
112
+ loanToken: Token;
113
+ }): BendDemultiplyBundleResponse["positionEstimate"] {
114
+ return {
115
+ finalCollateral: formatUnits(
116
+ BigInt(collateralToWithdraw),
117
+ collateralToken.decimals,
118
+ ),
119
+ totalBorrow: formatUnits(BigInt(repayAmount), loanToken.decimals),
120
+ };
121
+ }
122
+
123
+ export async function getBendDemultiplyBundle({
124
+ fromAddress,
125
+ repayAmount,
126
+ collateralToken,
127
+ loanToken,
128
+ marketId,
129
+ primaryAddress,
130
+ chainId,
131
+ ensoClient,
132
+ slippage,
133
+ publicClient,
134
+ collateralPriceInLoanAsset,
135
+ currentCollateral,
136
+ currentDebt,
137
+ ensoWalletV2Address,
138
+ isAuthorized,
139
+ }: GetBendDemultiplyBundleArgs): Promise<BendDemultiplyBundleResponse> {
140
+ assertAddress(fromAddress, "fromAddress");
141
+ assertPositive(repayAmount, "repayAmount");
142
+ assertPositive(currentDebt, "currentDebt");
143
+
144
+ const rawRepayAmount = BigInt(repayAmount);
145
+ const rawCurrentDebt = BigInt(currentDebt);
146
+ const isFullRepayment = rawRepayAmount >= rawCurrentDebt;
147
+
148
+ const collateralAddress = toEnsoAddress(collateralToken.address);
149
+ const loanAddress = toEnsoAddress(loanToken.address);
150
+
151
+ // proportional extra debt amount (in raw units) reserved for full-repay cleanup.
152
+ const rawCleanupDebtAmountFromBps =
153
+ (rawRepayAmount * FULL_REPAY_CLEANUP_BUFFER_BPS + (BPS_DIVISOR - 1n)) /
154
+ BPS_DIVISOR;
155
+ const rawFullRepaymentCleanupDebtAmount = isFullRepayment
156
+ ? rawCleanupDebtAmountFromBps
157
+ : 0n;
158
+ // on full repay, quote flashloan collateral against repay + cleanup buffer.
159
+ // this intentionally creates remaining debt token in the callback so it can
160
+ // be swapped back to collateral and re-deposited.
161
+ const rawTargetRepayForFlashloanQuote = (
162
+ rawRepayAmount + rawFullRepaymentCleanupDebtAmount
163
+ ).toString();
164
+
165
+ const collateralToWithdraw = calculateDemultiplyCollateralAmount({
166
+ repayAmount: rawTargetRepayForFlashloanQuote,
167
+ collateralPriceInLoanAsset,
168
+ collateralToken,
169
+ loanToken,
170
+ slippage,
171
+ currentCollateral,
172
+ });
173
+ const isFlashloanCollateralClamped =
174
+ BigInt(collateralToWithdraw) >= BigInt(currentCollateral);
175
+ // if flashloan collateral is clamped by current collateral, skip cleanup to
176
+ // avoid adding extra callback steps when there is no safe collateral headroom.
177
+ const shouldRunFullRepaymentCleanup =
178
+ isFullRepayment &&
179
+ rawFullRepaymentCleanupDebtAmount > 0n &&
180
+ !isFlashloanCollateralClamped;
181
+
182
+ if (BigInt(collateralToWithdraw) <= 0n) {
183
+ throw new InvalidArgumentError({
184
+ property: "collateralToWithdraw",
185
+ value: collateralToWithdraw,
186
+ expected: "positive amount",
187
+ });
188
+ }
189
+
190
+ const baseCallbackActions = [
191
+ // [0] Swap flashloaned collateral into loan tokens
192
+ {
193
+ protocol: "enso",
194
+ action: "route",
195
+ args: {
196
+ tokenIn: collateralAddress,
197
+ tokenOut: loanAddress,
198
+ amountIn: collateralToWithdraw,
199
+ slippage: slippage * 100,
200
+ },
201
+ },
202
+ // [1] Repay debt using the swapped loan tokens
203
+ {
204
+ protocol: "bend",
205
+ action: "repay",
206
+ args: {
207
+ primaryAddress,
208
+ positionId: marketId,
209
+ tokenIn: loanAddress,
210
+ amountIn: { useOutputOfCallAt: 0 },
211
+ onBehalfOf: fromAddress,
212
+ },
213
+ },
214
+ ];
215
+
216
+ // On full repayment: swap leftover debt-token dust back to collateral and
217
+ // re-deposit it, so dust isn't left in the user's wallet.
218
+ // Cleanup indices are computed dynamically from baseCallbackActions length.
219
+ const cleanupStartIdx = baseCallbackActions.length;
220
+ const fullRepaymentCleanupActions = shouldRunFullRepaymentCleanup
221
+ ? [
222
+ // Read remaining debt token balance after repay
223
+ {
224
+ protocol: "enso",
225
+ action: "balance",
226
+ args: {
227
+ token: loanAddress,
228
+ },
229
+ },
230
+ // Swap remaining debt tokens back to collateral
231
+ {
232
+ protocol: "enso",
233
+ action: "route",
234
+ args: {
235
+ tokenIn: loanAddress,
236
+ tokenOut: collateralAddress,
237
+ amountIn: {
238
+ useOutputOfCallAt: cleanupStartIdx,
239
+ },
240
+ slippage: slippage * 100,
241
+ },
242
+ },
243
+ // Re-deposit recovered collateral into Bend
244
+ {
245
+ protocol: "bend",
246
+ action: "deposit",
247
+ args: {
248
+ primaryAddress,
249
+ positionId: marketId,
250
+ tokenIn: collateralAddress,
251
+ amountIn: {
252
+ useOutputOfCallAt: cleanupStartIdx + 1,
253
+ },
254
+ onBehalfOf: fromAddress,
255
+ },
256
+ },
257
+ ]
258
+ : [];
259
+
260
+ const callbackActions = [
261
+ ...baseCallbackActions,
262
+ ...fullRepaymentCleanupActions,
263
+ // Final action: withdraw collateral to repay the flashloan
264
+ {
265
+ protocol: "bend",
266
+ action: "withdraw",
267
+ args: {
268
+ primaryAddress,
269
+ positionId: marketId,
270
+ tokenOut: collateralAddress,
271
+ amountOut: collateralToWithdraw,
272
+ onBehalfOf: fromAddress,
273
+ },
274
+ },
275
+ ];
276
+
277
+ const flashloanActions = [
278
+ {
279
+ protocol: "bend",
280
+ action: "flashloan",
281
+ args: {
282
+ flashloanToken: collateralAddress,
283
+ flashloanAmount: collateralToWithdraw,
284
+ tokenOut: loanAddress,
285
+ callback: callbackActions,
286
+ },
287
+ },
288
+ ];
289
+
290
+ // @ts-expect-error Enso SDK BundleAction typing does not include Bend flashloan action shape yet.
291
+ const bundleActions: BundleAction[] = flashloanActions;
292
+
293
+ const bundle = await ensoClient.getBundleData(
294
+ {
295
+ fromAddress,
296
+ receiver: fromAddress,
297
+ spender: fromAddress,
298
+ chainId,
299
+ routingStrategy: "ensowallet-v2",
300
+ },
301
+ bundleActions,
302
+ );
303
+
304
+ const { transactions } = await assembleBendFlashloanTransactions({
305
+ fromAddress,
306
+ amountIn: "0",
307
+ tokenIn: collateralToken,
308
+ primaryAddress,
309
+ bundle,
310
+ publicClient,
311
+ ensoWalletV2Address,
312
+ isAuthorized,
313
+ });
314
+
315
+ return {
316
+ bundle,
317
+ transactions,
318
+ positionEstimate: getPositionEstimate({
319
+ repayAmount,
320
+ collateralToWithdraw,
321
+ collateralToken,
322
+ loanToken,
323
+ }),
324
+ };
325
+ }
@@ -0,0 +1,348 @@
1
+ import type { BundleAction, EnsoClient } from "@ensofinance/sdk";
2
+ import type { Address, Hex, PublicClient } from "viem";
3
+
4
+ import BigNumber from "@berachain/utils/pkg/bignumber.js";
5
+
6
+ import { assertAddress } from "../../errors/assert";
7
+ import { InvalidArgumentError } from "../../errors/InvalidArgumentError";
8
+ import type { Token } from "../../types/dex";
9
+ import type { BendMultiplyBundleResponse } from "../../types/enso";
10
+ import { assembleBendFlashloanTransactions } from "./flashloan";
11
+ import {
12
+ computeRawCollateralToLoanPrice,
13
+ computeSwapOutputRatio,
14
+ toEnsoAddress,
15
+ } from "./util";
16
+
17
+ export interface GetBendMultiplyBundleArgs {
18
+ fromAddress: Address;
19
+ rawSupplyCollateralAmount: string;
20
+ rawCurrentCollateralAmount: string;
21
+ rawCurrentBorrowAmount: string;
22
+ collateralToken: Token;
23
+ loanToken: Token;
24
+ marketId: Hex;
25
+ primaryAddress: Address;
26
+ chainId: number;
27
+ ensoClient: EnsoClient;
28
+ slippage: number;
29
+ leverageMultiplier: number;
30
+ publicClient: PublicClient;
31
+ formattedCollateralPriceInLoanAsset: string;
32
+ ensoWalletV2Address: Address;
33
+ isAuthorized: boolean;
34
+ }
35
+
36
+ /**
37
+ * Calculate the loan amount needed to reach a target leverage multiplier.
38
+ *
39
+ * The closed-form formula accounts for the recursive nature of leveraged
40
+ * looping: each borrowed amount is swapped to collateral (losing value to
41
+ * slippage), then deposited, which increases borrowing capacity.
42
+ *
43
+ * targetLtv = 1 - 1/leverage
44
+ * rawPrice = collateral-to-loan price in raw token units
45
+ * denominator = 1 - targetLtv * swapOutputRatio
46
+ *
47
+ * borrowAmount = (targetLtv * collateralBase * rawPrice - currentBorrow)
48
+ * / denominator
49
+ *
50
+ * The denominator corrects for the recursive loop: each unit of loan token
51
+ * that survives the swap (after slippage) becomes new collateral that
52
+ * enables further borrowing. When denominator <= 0, the leverage target is
53
+ * unreachable at the current slippage tolerance.
54
+ */
55
+ export function calculateMultiplyBorrowAmount({
56
+ rawSupplyCollateralAmount,
57
+ rawCurrentCollateralAmount,
58
+ rawCurrentBorrowAmount,
59
+ formattedCollateralPriceInLoanAsset,
60
+ collateralToken,
61
+ loanToken,
62
+ leverageMultiplier,
63
+ slippage,
64
+ }: {
65
+ rawSupplyCollateralAmount: string;
66
+ rawCurrentCollateralAmount: string;
67
+ rawCurrentBorrowAmount: string;
68
+ formattedCollateralPriceInLoanAsset: string;
69
+ collateralToken: Token;
70
+ loanToken: Token;
71
+ leverageMultiplier: number;
72
+ slippage: number;
73
+ }): string {
74
+ const normalizedLeverage = Math.max(leverageMultiplier, 1);
75
+ if (normalizedLeverage <= 1) return "0";
76
+
77
+ const swapOutputRatio = computeSwapOutputRatio(slippage);
78
+ const formattedCollateralPrice = new BigNumber(
79
+ formattedCollateralPriceInLoanAsset,
80
+ );
81
+
82
+ if (formattedCollateralPrice.lte(0)) {
83
+ throw new InvalidArgumentError({
84
+ property: "formattedCollateralPriceInLoanAsset",
85
+ value: formattedCollateralPriceInLoanAsset,
86
+ expected: "a value greater than zero",
87
+ });
88
+ }
89
+
90
+ const rawCollateralToLoanPrice = computeRawCollateralToLoanPrice(
91
+ formattedCollateralPrice,
92
+ collateralToken,
93
+ loanToken,
94
+ );
95
+
96
+ const targetLtv = new BigNumber(1).minus(
97
+ new BigNumber(1).dividedBy(normalizedLeverage),
98
+ );
99
+ const rawCollateralBase = new BigNumber(rawCurrentCollateralAmount).plus(
100
+ rawSupplyCollateralAmount,
101
+ );
102
+ const rawCurrentBorrow = new BigNumber(rawCurrentBorrowAmount);
103
+
104
+ // Denominator accounts for the recursive multiplier effect of re-deposited
105
+ // swap proceeds. A non-positive value means slippage eats all new collateral.
106
+ const denominator = new BigNumber(1).minus(
107
+ targetLtv.multipliedBy(swapOutputRatio),
108
+ );
109
+
110
+ if (denominator.lte(0)) {
111
+ throw new InvalidArgumentError({
112
+ property: "leverageMultiplier",
113
+ value: leverageMultiplier,
114
+ expected: "a lower leverage target for current slippage",
115
+ });
116
+ }
117
+
118
+ const requiredRawBorrow = targetLtv
119
+ .multipliedBy(rawCollateralBase)
120
+ .multipliedBy(rawCollateralToLoanPrice)
121
+ .minus(rawCurrentBorrow)
122
+ .dividedBy(denominator);
123
+
124
+ if (requiredRawBorrow.lte(0)) return "0";
125
+
126
+ const rawBorrowAmount = requiredRawBorrow.integerValue(BigNumber.ROUND_UP);
127
+ if (rawBorrowAmount.lte(0)) return "0";
128
+
129
+ return rawBorrowAmount.toFixed(0);
130
+ }
131
+
132
+ /**
133
+ * Estimate the position after executing a multiply loop.
134
+ *
135
+ * For a deposit-only (rawBorrowAmount = 0) scenario, final collateral is just
136
+ * the supplied amount. When borrowing, the loan is swapped to collateral
137
+ * (accounting for slippage) and added to the supplied amount.
138
+ *
139
+ * Returns human-readable (formatted) values for display.
140
+ */
141
+ export function getPositionEstimate({
142
+ rawSupplyCollateralAmount,
143
+ collateralToken,
144
+ loanToken,
145
+ rawBorrowAmount,
146
+ formattedCollateralPriceInLoanAsset,
147
+ slippage,
148
+ }: {
149
+ rawSupplyCollateralAmount: string;
150
+ collateralToken: Token;
151
+ loanToken: Token;
152
+ rawBorrowAmount: string;
153
+ formattedCollateralPriceInLoanAsset: string;
154
+ slippage: number;
155
+ }): BendMultiplyBundleResponse["positionEstimate"] {
156
+ const collateralDecimalsMul = new BigNumber(10).pow(collateralToken.decimals);
157
+ const loanDecimalsMul = new BigNumber(10).pow(loanToken.decimals);
158
+ const rawSupplyCollateral = new BigNumber(rawSupplyCollateralAmount);
159
+ const rawBorrow = new BigNumber(rawBorrowAmount);
160
+
161
+ if (rawBorrow.lte(0)) {
162
+ return {
163
+ finalCollateral: rawSupplyCollateral
164
+ .dividedBy(collateralDecimalsMul)
165
+ .toFixed(),
166
+ totalBorrow: "0",
167
+ };
168
+ }
169
+
170
+ const swapOutputRatio = computeSwapOutputRatio(slippage);
171
+ const rawCollateralToLoanPrice = computeRawCollateralToLoanPrice(
172
+ new BigNumber(formattedCollateralPriceInLoanAsset),
173
+ collateralToken,
174
+ loanToken,
175
+ );
176
+
177
+ // Collateral gained from swapping the borrowed loan tokens (after slippage)
178
+ const rawLoopCollateral = rawCollateralToLoanPrice.lte(0)
179
+ ? new BigNumber(0)
180
+ : rawBorrow
181
+ .multipliedBy(swapOutputRatio)
182
+ .dividedBy(rawCollateralToLoanPrice);
183
+
184
+ const finalFormattedCollateral = rawSupplyCollateral
185
+ .plus(rawLoopCollateral)
186
+ .dividedBy(collateralDecimalsMul);
187
+ const totalFormattedBorrow = rawBorrow.dividedBy(loanDecimalsMul);
188
+
189
+ return {
190
+ finalCollateral: finalFormattedCollateral.toFixed(),
191
+ totalBorrow: totalFormattedBorrow.toFixed(),
192
+ };
193
+ }
194
+
195
+ export async function getBendMultiplyBundle({
196
+ fromAddress,
197
+ rawSupplyCollateralAmount,
198
+ rawCurrentCollateralAmount,
199
+ rawCurrentBorrowAmount,
200
+ collateralToken,
201
+ loanToken,
202
+ marketId,
203
+ primaryAddress,
204
+ chainId,
205
+ ensoClient,
206
+ slippage,
207
+ leverageMultiplier,
208
+ publicClient,
209
+ formattedCollateralPriceInLoanAsset,
210
+ ensoWalletV2Address,
211
+ isAuthorized,
212
+ }: GetBendMultiplyBundleArgs): Promise<BendMultiplyBundleResponse> {
213
+ assertAddress(fromAddress, "fromAddress");
214
+
215
+ const collateralAddress = toEnsoAddress(collateralToken.address);
216
+ const loanAddress = toEnsoAddress(loanToken.address);
217
+
218
+ const rawBorrowAmount = calculateMultiplyBorrowAmount({
219
+ rawSupplyCollateralAmount,
220
+ rawCurrentCollateralAmount,
221
+ rawCurrentBorrowAmount,
222
+ formattedCollateralPriceInLoanAsset,
223
+ collateralToken,
224
+ loanToken,
225
+ leverageMultiplier,
226
+ slippage,
227
+ });
228
+
229
+ // -- Callback action indices for `useOutputOfCallAt` references.
230
+ // These MUST match the array position of each action in the callback below.
231
+ const CALLBACK_IDX_ROUTE_LOAN_TO_COLLATERAL = 0;
232
+ const CALLBACK_IDX_BALANCE_COLLATERAL = 1;
233
+
234
+ const depositOnlyActions = [
235
+ {
236
+ protocol: "bend",
237
+ action: "deposit",
238
+ args: {
239
+ primaryAddress,
240
+ positionId: marketId,
241
+ tokenIn: collateralAddress,
242
+ amountIn: rawSupplyCollateralAmount,
243
+ onBehalfOf: fromAddress,
244
+ },
245
+ },
246
+ ];
247
+
248
+ const flashloanActions = [
249
+ {
250
+ protocol: "bend",
251
+ action: "flashloan",
252
+ args: {
253
+ flashloanToken: loanAddress,
254
+ flashloanAmount: rawBorrowAmount,
255
+ tokenIn: collateralAddress,
256
+ amountIn: rawSupplyCollateralAmount,
257
+ tokenOut: loanAddress,
258
+ callback: [
259
+ // [0] Swap the flashloaned loan tokens into collateral
260
+ {
261
+ protocol: "enso",
262
+ action: "route",
263
+ args: {
264
+ tokenIn: loanAddress,
265
+ tokenOut: collateralAddress,
266
+ amountIn: rawBorrowAmount,
267
+ slippage: slippage * 100,
268
+ },
269
+ },
270
+ // [1] Check collateral balance after swap
271
+ {
272
+ protocol: "enso",
273
+ action: "balance",
274
+ args: {
275
+ token: collateralAddress,
276
+ },
277
+ },
278
+ // [2] Deposit all collateral (from balance check) into Bend
279
+ {
280
+ protocol: "bend",
281
+ action: "deposit",
282
+ args: {
283
+ primaryAddress,
284
+ positionId: marketId,
285
+ tokenIn: collateralAddress,
286
+ amountIn: {
287
+ useOutputOfCallAt: CALLBACK_IDX_BALANCE_COLLATERAL,
288
+ },
289
+ onBehalfOf: fromAddress,
290
+ },
291
+ },
292
+ // [3] Borrow loan tokens to repay the flashloan
293
+ {
294
+ protocol: "bend",
295
+ action: "borrow",
296
+ args: {
297
+ primaryAddress,
298
+ positionId: marketId,
299
+ collateral: collateralAddress,
300
+ tokenOut: loanAddress,
301
+ amountOut: rawBorrowAmount,
302
+ onBehalfOf: fromAddress,
303
+ },
304
+ },
305
+ ],
306
+ },
307
+ },
308
+ ];
309
+
310
+ // @ts-expect-error Enso SDK BundleAction typing does not include Bend flashloan action shape yet.
311
+ const bundleActions: BundleAction[] =
312
+ rawBorrowAmount === "0" ? depositOnlyActions : flashloanActions;
313
+
314
+ const bundle = await ensoClient.getBundleData(
315
+ {
316
+ fromAddress,
317
+ receiver: fromAddress,
318
+ spender: fromAddress,
319
+ chainId,
320
+ routingStrategy: "ensowallet-v2",
321
+ },
322
+ bundleActions,
323
+ );
324
+
325
+ const { transactions } = await assembleBendFlashloanTransactions({
326
+ fromAddress,
327
+ amountIn: rawSupplyCollateralAmount,
328
+ tokenIn: collateralToken,
329
+ primaryAddress,
330
+ bundle,
331
+ publicClient,
332
+ ensoWalletV2Address,
333
+ isAuthorized,
334
+ });
335
+
336
+ return {
337
+ bundle,
338
+ transactions,
339
+ positionEstimate: getPositionEstimate({
340
+ rawSupplyCollateralAmount,
341
+ collateralToken,
342
+ loanToken,
343
+ rawBorrowAmount,
344
+ formattedCollateralPriceInLoanAsset,
345
+ slippage,
346
+ }),
347
+ };
348
+ }
@@ -1,11 +1,11 @@
1
1
  import type { BundleAction } from "@ensofinance/sdk";
2
2
  import { ethAddress, zeroAddress } from "viem";
3
3
 
4
- import { InvalidArgumentError } from "~/errors/InvalidArgumentError";
4
+ import { InvalidArgumentError } from "../../errors/InvalidArgumentError";
5
5
  import type {
6
6
  GetEnsoSwapBundleArgs,
7
7
  GetZapTransactionResponse,
8
- } from "~/types/enso";
8
+ } from "../../types/enso";
9
9
  import { getTransactionsFromBundle } from "./util";
10
10
 
11
11
  export async function getEnsoSwapBundle({
@@ -2,11 +2,11 @@ import type { EnsoClient } from "@ensofinance/sdk";
2
2
  import { type Config, getChains, multicall } from "@wagmi/core";
3
3
  import { type Address, formatUnits } from "viem";
4
4
 
5
- import { BeraMonitoring } from "~/errors/BeraMonitoring";
6
- import { InvalidArgumentError } from "~/errors/InvalidArgumentError";
7
- import { initBeraError } from "~/errors/initBeraError";
8
- import type { BalanceToken } from "~/types/dex";
9
- import { beraToken, isToken } from "~/utils/tokens";
5
+ import { BeraMonitoring } from "../../errors/BeraMonitoring";
6
+ import { InvalidArgumentError } from "../../errors/InvalidArgumentError";
7
+ import { initBeraError } from "../../errors/initBeraError";
8
+ import type { BalanceToken } from "../../types/dex";
9
+ import { beraToken, isToken } from "../../utils/tokens";
10
10
  import { getBalanceCall } from "../tokens/getWalletBalances";
11
11
 
12
12
  /**