@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.
- package/README.md +0 -0
- package/dist/abi/exports.cjs +1 -1
- package/dist/abi/exports.cjs.map +1 -1
- package/dist/abi/exports.d.cts +17 -1
- package/dist/abi/exports.d.ts +17 -1
- package/dist/abi/exports.mjs +1 -1
- package/dist/abi/exports.mjs.map +1 -1
- package/dist/actions/exports.cjs +1 -1
- package/dist/actions/exports.cjs.map +1 -1
- package/dist/actions/exports.d.cts +9 -38
- package/dist/actions/exports.d.ts +9 -38
- package/dist/actions/exports.mjs +1 -1
- package/dist/actions/exports.mjs.map +1 -1
- package/dist/chunk-2YBHAMDV.cjs +2 -0
- package/dist/chunk-2YBHAMDV.cjs.map +1 -0
- package/dist/chunk-57RINXU6.cjs +2 -0
- package/dist/chunk-57RINXU6.cjs.map +1 -0
- package/dist/{chunk-AX2YQQFQ.mjs → chunk-74QD4JAH.mjs} +2 -2
- package/dist/chunk-74QD4JAH.mjs.map +1 -0
- package/dist/chunk-74WA35RI.cjs +2 -0
- package/dist/chunk-74WA35RI.cjs.map +1 -0
- package/dist/{chunk-7WRTK7RJ.mjs → chunk-BEKH5EYT.mjs} +2 -2
- package/dist/chunk-BEKH5EYT.mjs.map +1 -0
- package/dist/{chunk-FCWDGE62.cjs → chunk-CF3LFNXG.cjs} +2 -2
- package/dist/chunk-CF3LFNXG.cjs.map +1 -0
- package/dist/chunk-COMMLZ3O.mjs +2 -0
- package/dist/chunk-COMMLZ3O.mjs.map +1 -0
- package/dist/chunk-DDEQFR3M.cjs +2 -0
- package/dist/chunk-DDEQFR3M.cjs.map +1 -0
- package/dist/{chunk-6LDOG5RL.cjs → chunk-DK42F2ZM.cjs} +2 -2
- package/dist/chunk-DK42F2ZM.cjs.map +1 -0
- package/dist/{chunk-7SMWQ6SN.mjs → chunk-FM3WDBFH.mjs} +2 -2
- package/dist/chunk-FM3WDBFH.mjs.map +1 -0
- package/dist/chunk-HWOGQSNL.cjs +4 -0
- package/dist/chunk-HWOGQSNL.cjs.map +1 -0
- package/dist/chunk-I7M43BB4.cjs +2 -0
- package/dist/chunk-I7M43BB4.cjs.map +1 -0
- package/dist/chunk-IBJOI5SN.mjs +4 -0
- package/dist/chunk-IBJOI5SN.mjs.map +1 -0
- package/dist/chunk-IDFMLLDY.mjs +2 -0
- package/dist/chunk-IDFMLLDY.mjs.map +1 -0
- package/dist/{chunk-YZV5LKIP.cjs → chunk-LNVR4BW6.cjs} +2 -2
- package/dist/chunk-LNVR4BW6.cjs.map +1 -0
- package/dist/chunk-MJZHJFZO.mjs +2 -0
- package/dist/{chunk-YNO7BCCM.mjs.map → chunk-MJZHJFZO.mjs.map} +1 -1
- package/dist/chunk-MK5NS5B5.mjs +2 -0
- package/dist/chunk-MK5NS5B5.mjs.map +1 -0
- package/dist/{chunk-C6ZGUO4H.cjs → chunk-NMH7LHPW.cjs} +2 -2
- package/dist/chunk-NMH7LHPW.cjs.map +1 -0
- package/dist/chunk-NVHV2LDK.cjs +2 -0
- package/dist/chunk-NVHV2LDK.cjs.map +1 -0
- package/dist/chunk-OGBD5YOG.mjs +2 -0
- package/dist/chunk-OGBD5YOG.mjs.map +1 -0
- package/dist/chunk-OIYXOKTT.cjs.map +1 -1
- package/dist/chunk-OUD27MU7.cjs.map +1 -1
- package/dist/chunk-PLIH6KQM.mjs +2 -0
- package/dist/chunk-PLIH6KQM.mjs.map +1 -0
- package/dist/chunk-QRAIGQF2.mjs +2 -0
- package/dist/chunk-QRAIGQF2.mjs.map +1 -0
- package/dist/chunk-RWOICHRW.cjs +2 -0
- package/dist/chunk-RWOICHRW.cjs.map +1 -0
- package/dist/chunk-T5FSQ3YE.mjs +2 -0
- package/dist/chunk-T5FSQ3YE.mjs.map +1 -0
- package/dist/chunk-WRFDB3QJ.cjs.map +1 -1
- package/dist/chunk-XNJLSA6P.cjs.map +1 -1
- package/dist/contexts/exports.cjs +1 -1
- package/dist/contexts/exports.cjs.map +1 -1
- package/dist/contexts/exports.d.cts +1 -1
- package/dist/contexts/exports.d.ts +1 -1
- package/dist/contexts/exports.mjs +1 -1
- package/dist/contexts/exports.mjs.map +1 -1
- package/dist/{defaultFlags-d0kPbT0i.d.cts → defaultFlags-D6KfkTZx.d.cts} +1 -1
- package/dist/{defaultFlags-d0kPbT0i.d.ts → defaultFlags-D6KfkTZx.d.ts} +1 -1
- package/dist/enum/exports.cjs +1 -1
- package/dist/enum/exports.cjs.map +1 -1
- package/dist/enum/exports.d.cts +1 -1
- package/dist/enum/exports.d.ts +1 -1
- package/dist/enum/exports.mjs +1 -1
- package/dist/errors/exports.cjs +1 -1
- package/dist/errors/exports.cjs.map +1 -1
- package/dist/errors/exports.d.cts +8 -3
- package/dist/errors/exports.d.ts +8 -3
- package/dist/errors/exports.mjs +1 -1
- package/dist/{getValidatorQueuedOperatorAddress-DZgrPmZ2.d.cts → getValidatorQueuedOperatorAddress-BdDYHycN.d.cts} +15 -4
- package/dist/{getValidatorQueuedOperatorAddress-CqR6cyqC.d.ts → getValidatorQueuedOperatorAddress-CmiPJmsr.d.ts} +15 -4
- package/dist/{global.d-BeYWDreg.d.ts → global.d-3GQMgC9k.d.ts} +1 -1
- package/dist/{global.d-DghRxpHd.d.cts → global.d-CwT1Phzf.d.cts} +1 -1
- package/dist/hooks/exports.cjs +3 -3
- package/dist/hooks/exports.cjs.map +1 -1
- package/dist/hooks/exports.d.cts +54 -75
- package/dist/hooks/exports.d.ts +54 -75
- package/dist/hooks/exports.mjs +3 -3
- package/dist/hooks/exports.mjs.map +1 -1
- package/dist/{txnEnum-DxPRHSJt.d.cts → txnEnum-CCuQUFlh.d.cts} +7 -0
- package/dist/{txnEnum-DxPRHSJt.d.ts → txnEnum-CCuQUFlh.d.ts} +7 -0
- package/dist/types/exports.cjs.map +1 -1
- package/dist/types/exports.d.cts +37 -4
- package/dist/types/exports.d.ts +37 -4
- package/dist/utils/exports.cjs +1 -1
- package/dist/utils/exports.cjs.map +1 -1
- package/dist/utils/exports.d.cts +2 -2
- package/dist/utils/exports.d.ts +2 -2
- package/dist/utils/exports.mjs +1 -1
- package/dist/utils/exports.mjs.map +1 -1
- package/package.json +25 -25
- package/src/abi/enso/ensoWalletV2Factory.ts +9 -0
- package/src/abi/exports.ts +1 -0
- package/src/abi/pyth/pyth.ts +0 -0
- package/src/actions/clients/BeraApolloClient.ts +3 -3
- package/src/actions/clients/getApolloClient.ts +5 -5
- package/src/actions/clients/getEnsoClient.ts +1 -1
- package/src/actions/dex/__tests__/aggregators.unit.test.ts +3 -3
- package/src/actions/dex/__tests__/getOnChainPool.unit.test.ts +1 -1
- package/src/actions/dex/aggregators/base.ts +12 -8
- package/src/actions/dex/aggregators/bex.ts +8 -8
- package/src/actions/dex/aggregators/bgt.ts +4 -4
- package/src/actions/dex/aggregators/enso/enso.ts +28 -20
- package/src/actions/dex/aggregators/enso/ensoErc4626.debug.test.ts +1 -1
- package/src/actions/dex/aggregators/enso/ensoErc4626.ts +7 -4
- package/src/actions/dex/aggregators/erc4626.ts +10 -6
- package/src/actions/dex/aggregators/fly.ts +9 -5
- package/src/actions/dex/aggregators/haiku.integration.test.ts +3 -3
- package/src/actions/dex/aggregators/haiku.ts +9 -5
- package/src/actions/dex/aggregators/honey.ts +15 -15
- package/src/actions/dex/aggregators/kyberswap.ts +8 -4
- package/src/actions/dex/aggregators/oogabooga.ts +8 -4
- package/src/actions/dex/aggregators/openOcean.ts +12 -8
- package/src/actions/dex/aggregators/wbera.ts +8 -4
- package/src/actions/dex/b-sdk.ts +2 -2
- package/src/actions/dex/getAllPools.ts +2 -2
- package/src/actions/dex/getApiPool.ts +2 -2
- package/src/actions/dex/getGlobalLiquidityAndSwapVolume.ts +2 -2
- package/src/actions/dex/getIsTokenExploited.ts +1 -1
- package/src/actions/dex/getOnChainPool.ts +3 -3
- package/src/actions/dex/getPoolEvents.ts +2 -2
- package/src/actions/dex/getPoolHistoricalData.ts +2 -2
- package/src/actions/dex/getVaultPausedState.ts +1 -1
- package/src/actions/enso/__tests__/getBendDemultiplyBundle.action.unit.test.ts +175 -0
- package/src/actions/enso/__tests__/getBendDemultiplyBundle.unit.test.ts +150 -0
- package/src/actions/enso/__tests__/getBendMultiplyBundle.action.unit.test.ts +138 -0
- package/src/actions/enso/__tests__/getBendMultiplyBundle.unit.test.ts +194 -0
- package/src/actions/enso/{getEnsoUserTokensWithBalances.debug.test.ts → __tests__/getEnsoUserTokensWithBalances.debug.test.ts} +3 -3
- package/src/actions/enso/__tests__/helpers.ts +42 -0
- package/src/actions/enso/__tests__/util.unit.test.ts +95 -0
- package/src/actions/enso/flashloan.ts +127 -0
- package/src/actions/enso/getBendDemultiplyBundle.ts +325 -0
- package/src/actions/enso/getBendMultiplyBundle.ts +348 -0
- package/src/actions/enso/getEnsoSwapBundle.ts +2 -2
- package/src/actions/enso/getEnsoUserTokensWithBalances.ts +5 -5
- package/src/actions/enso/util.ts +150 -5
- package/src/actions/exports.ts +0 -2
- package/src/actions/governance/__tests__/checkProposalField.unit.test.ts +2 -2
- package/src/actions/governance/__tests__/getDecodedFunctionData.integration.test.ts +2 -2
- package/src/actions/governance/__tests__/getQuorum.integration.test.ts +2 -2
- package/src/actions/governance/checkProposalField.ts +1 -1
- package/src/actions/governance/computeActualStatus.ts +1 -1
- package/src/actions/governance/getAllProposals.ts +1 -1
- package/src/actions/governance/getBodyErrors.ts +1 -1
- package/src/actions/governance/getProposalDetails.ts +1 -1
- package/src/actions/governance/getProposalFromTx.ts +1 -1
- package/src/actions/governance/getProposalParams.ts +3 -3
- package/src/actions/governance/getProposalVotes.ts +1 -1
- package/src/actions/governance/getQuorum.ts +2 -2
- package/src/actions/honey/getCollateralWeights.ts +2 -2
- package/src/actions/honey/getGlobalCapLimit.ts +4 -4
- package/src/actions/honey/getHoneyCollaterals.ts +5 -5
- package/src/actions/honey/getHoneyFees.ts +1 -1
- package/src/actions/honey/getHoneyPausedState.ts +1 -1
- package/src/actions/honey/getHoneyPreview.ts +3 -3
- package/src/actions/honey/getHoneyRootPriceOracle.ts +1 -1
- package/src/actions/honey/getHoneyVaultsBalance.ts +2 -2
- package/src/actions/honey/getRelativeCapLimit.ts +3 -3
- package/src/actions/honey/getSharesWithoutFees.ts +1 -1
- package/src/actions/honey/getSwapPayload.ts +6 -6
- package/src/actions/honey/isBadCollateralAsset.ts +2 -2
- package/src/actions/honey/isBasketModeEnabled.ts +2 -2
- package/src/actions/honey/tests/pyth.integration.test.ts +3 -3
- package/src/actions/misc/getBlockTimestamp.ts +2 -2
- package/src/actions/pol/__tests__/getAllValidators.integration.test.ts +2 -2
- package/src/actions/pol/__tests__/rewardVaults.integration.test.ts +1 -1
- package/src/actions/pol/getBGTGlobalInfo.ts +2 -2
- package/src/actions/pol/getBgtAprSimulation.ts +1 -1
- package/src/actions/pol/getBgtAprSimultaion.unit.test.ts +1 -1
- package/src/actions/pol/getBgtTokenTotalBoosts.ts +2 -2
- package/src/actions/pol/getBgtTokenTotalSupply.ts +2 -2
- package/src/actions/pol/getBlockTime.debug.test.ts +13 -0
- package/src/actions/pol/getBlockTime.ts +14 -23
- package/src/actions/pol/getEarnedStakedBeraVault.ts +3 -3
- package/src/actions/pol/getGlobalCuttingBoard.ts +0 -0
- package/src/actions/pol/getGlobalData.ts +2 -2
- package/src/actions/pol/getIncentiveFeeClaimStats.ts +4 -4
- package/src/actions/pol/getLSTStakeConfig.ts +5 -5
- package/src/actions/pol/getMarkets.ts +2 -2
- package/src/actions/pol/getRewardProofsByValidator.ts +4 -4
- package/src/actions/pol/getRewardTokenToBeraRate.ts +1 -1
- package/src/actions/pol/getRewardVault.ts +3 -3
- package/src/actions/pol/getRewardVaultBeaconImplementation.integration.test.ts +1 -1
- package/src/actions/pol/getRewardVaultBeaconImplementation.ts +3 -3
- package/src/actions/pol/getRewardVaultDurationConstants.integration.test.ts +1 -1
- package/src/actions/pol/getRewardVaultDurationConstants.ts +1 -1
- package/src/actions/pol/getRewardVaultFromToken.ts +1 -1
- package/src/actions/pol/getRewardVaultIncentives.ts +2 -2
- package/src/actions/pol/getRewardVaultRewards.ts +1 -1
- package/src/actions/pol/getRewardVaults.ts +1 -1
- package/src/actions/pol/getSWBeraVaultMetadata.ts +20 -22
- package/src/actions/pol/getSWBeraWithdrawal.ts +4 -4
- package/src/actions/pol/getStakedBeraAPR.ts +2 -2
- package/src/actions/pol/getStakedBeraSnapshots.ts +2 -2
- package/src/actions/pol/getStakingDailyAssets.ts +3 -3
- package/src/actions/pol/getStakingTokenInformation.ts +2 -2
- package/src/actions/pol/getTotalStakedAmount.ts +1 -1
- package/src/actions/pol/getUserClaimableIncentives.ts +4 -4
- package/src/actions/pol/getUserVaultInfo.ts +1 -1
- package/src/actions/pol/getUserVaults.ts +4 -4
- package/src/actions/pol/getUserVaultsBalance.ts +1 -1
- package/src/actions/pol/getUserVaultsReward.ts +0 -0
- package/src/actions/pol/getVaultHistory.ts +2 -2
- package/src/actions/pol/getVaultValidators.ts +1 -1
- package/src/actions/pol/getVaultsSupply.ts +0 -0
- package/src/actions/prices/__tests__/prices.integration.test.ts +2 -2
- package/src/actions/prices/getTokenCurrentPrices.ts +5 -5
- package/src/actions/pyth/getHoneyPythFeeds.ts +2 -2
- package/src/actions/pyth/getUpdateFee.ts +2 -2
- package/src/actions/tokens/getAllowances.ts +2 -2
- package/src/actions/tokens/getTokenInformation.ts +2 -2
- package/src/actions/tokens/getTokens.ts +3 -3
- package/src/actions/tokens/getUnderlyingToken.ts +4 -4
- package/src/actions/tokens/getWalletBalances.integration.test.ts +1 -1
- package/src/actions/tokens/getWalletBalances.ts +4 -4
- package/src/actions/transactions/beraWriteContract.integration.test.ts +6 -6
- package/src/actions/transactions/beraWriteContract.ts +12 -12
- package/src/actions/validators/getActiveBoostAndCommissionChangeDelay.integration.test.ts +1 -1
- package/src/actions/validators/getActiveBoostAndCommissionChangeDelay.ts +1 -1
- package/src/actions/validators/getAllValidators.ts +2 -2
- package/src/actions/validators/getApiValidator.ts +2 -2
- package/src/actions/validators/getBaselineRewardAllocation.ts +1 -1
- package/src/actions/validators/getDailyValidatorBlockStats.ts +1 -1
- package/src/actions/validators/getDefaultRewardAllocation.ts +1 -1
- package/src/actions/validators/getUserActiveValidators.ts +31 -33
- package/src/actions/validators/getUserBoosts.ts +12 -8
- package/src/actions/validators/getUserBoostsOnValidator.ts +15 -3
- package/src/actions/validators/getUserStakingPositions.ts +1 -1
- package/src/actions/validators/getValidatorAnalytics.ts +2 -2
- package/src/actions/validators/getValidatorCommission.ts +1 -1
- package/src/actions/validators/getValidatorEstimatedBgtPerYear.ts +1 -1
- package/src/actions/validators/getValidatorOperatorAddress.ts +1 -1
- package/src/actions/validators/getValidatorQueuedCommission.ts +1 -1
- package/src/actions/validators/getValidatorQueuedOperatorAddress.ts +1 -1
- package/src/actions/validators/getValidatorQueuedRewardAllocation.ts +1 -1
- package/src/actions/validators/getValidatorRewardAllocation.ts +1 -1
- package/src/actions/validators/getValidatorRewardAllocatorAddress.ts +1 -1
- package/src/actions/validators/utils/__tests__/validatorUtils.integration.test.ts +4 -4
- package/src/contexts/BeraFlags/defaultFlags.ts +4 -0
- package/src/contexts/BexStatusProvider.tsx +1 -1
- package/src/contexts/HoneyConfigProvider.tsx +3 -3
- package/src/contexts/SwrFallback.tsx +2 -2
- package/src/contexts/TokensProvider.tsx +3 -3
- package/src/contexts/block-time-provider.tsx +1 -1
- package/src/contexts/exports.ts +0 -0
- package/src/data/contracts.ts +10 -0
- package/src/enum/exports.ts +0 -0
- package/src/enum/polling.ts +0 -0
- package/src/enum/txnEnum.ts +9 -0
- package/src/errors/BeraMonitoring.ts +2 -2
- package/src/errors/BeraTracing.ts +2 -2
- package/src/errors/RequestError.ts +1 -1
- package/src/errors/assert.ts +18 -0
- package/src/errors/getErrorMessage.ts +0 -0
- package/src/errors/getRevertReason.integration.test.ts +7 -7
- package/src/errors/getRevertReason.ts +1 -1
- package/src/errors/parseViemError.ts +1 -1
- package/src/hooks/bend/useGetConvertToAssets.ts +4 -4
- package/src/hooks/dex/useAggregatorsQuotes.ts +19 -19
- package/src/hooks/dex/useAggregatorsRouterFeeBps.ts +2 -2
- package/src/hooks/dex/useAllUserPools.ts +3 -3
- package/src/hooks/dex/useApiPool.ts +3 -3
- package/src/hooks/dex/useBexStatus.ts +1 -1
- package/src/hooks/dex/useCreatePool.ts +9 -9
- package/src/hooks/dex/useExploitedTokens.ts +3 -3
- package/src/hooks/dex/useGlobalLiquidityAndSwapVolume.ts +1 -1
- package/src/hooks/dex/useLiquidityMismatch.ts +3 -3
- package/src/hooks/dex/useLpPosition.ts +7 -4
- package/src/hooks/dex/useMultipleTokenApprovalsWithSlippage.ts +4 -4
- package/src/hooks/dex/useOnChainPoolData.ts +3 -3
- package/src/hooks/dex/usePollPoolCreationRelayerApproval.ts +3 -3
- package/src/hooks/dex/usePool.ts +7 -40
- package/src/hooks/dex/usePoolEvents.ts +2 -2
- package/src/hooks/dex/usePoolHistoricalData.ts +6 -3
- package/src/hooks/dex/usePools.ts +3 -3
- package/src/hooks/dex/usePriceImpact.ts +2 -2
- package/src/hooks/dex/useSingleAggregatorQuote.ts +13 -13
- package/src/hooks/enso/useBendDemultiply.ts +158 -0
- package/src/hooks/enso/useBendMultiply.ts +163 -0
- package/src/hooks/enso/useBendZapSupply.ts +7 -7
- package/src/hooks/enso/useEnsoSwapBundle.ts +6 -6
- package/src/hooks/enso/useEnsoUserTokensWithBalances.ts +5 -5
- package/src/hooks/enso/useEnsoWalletV2Address.ts +38 -0
- package/src/hooks/enso/useIsBendAuthorized.ts +47 -0
- package/src/hooks/enso/useZapStakeBera.ts +4 -4
- package/src/hooks/exports.ts +4 -3
- package/src/hooks/governance/useCreateProposal.ts +3 -3
- package/src/hooks/governance/useGetPastVotes.ts +2 -2
- package/src/hooks/governance/useHasVoted.ts +2 -2
- package/src/hooks/governance/useIsCanceller.ts +4 -4
- package/src/hooks/governance/usePollAllProposals.ts +3 -3
- package/src/hooks/governance/usePollProposal.ts +7 -4
- package/src/hooks/governance/usePollProposalThreshold.ts +3 -3
- package/src/hooks/governance/usePollProposalVotes.ts +1 -1
- package/src/hooks/governance/usePollUserDelegates.ts +7 -4
- package/src/hooks/governance/useProposalFromTx.ts +1 -1
- package/src/hooks/governance/useProposalSnapshot.ts +2 -2
- package/src/hooks/governance/useProposalState.ts +2 -2
- package/src/hooks/governance/useProposalTimelockState.ts +2 -2
- package/src/hooks/governance/useQuorum.ts +1 -1
- package/src/hooks/honey/useCappedGlobally.ts +8 -5
- package/src/hooks/honey/useCappedRelatively.ts +7 -4
- package/src/hooks/honey/useCollateralWeights.ts +8 -5
- package/src/hooks/honey/useHoneyAlerts.ts +5 -5
- package/src/hooks/honey/useHoneyBalances.ts +7 -7
- package/src/hooks/honey/useHoneyChartData.ts +1 -1
- package/src/hooks/honey/useHoneySwapState.ts +4 -4
- package/src/hooks/honey/useHoneyVaultsBalance.ts +8 -5
- package/src/hooks/honey/useIsBadCollateralAsset.ts +9 -6
- package/src/hooks/honey/useIsBasketModeEnabled.ts +8 -5
- package/src/hooks/honey/usePythLatestPrices.ts +4 -4
- package/src/hooks/perps/usePythUpdateFee.ts +4 -4
- package/src/hooks/pol/useBgtAprSimulation.ts +1 -1
- package/src/hooks/pol/useBgtUnstakedBalance.ts +7 -4
- package/src/hooks/pol/useClaimableFees.ts +4 -4
- package/src/hooks/pol/useOnChainRewardVault.ts +7 -7
- package/src/hooks/pol/usePollGlobalData.ts +9 -3
- package/src/hooks/pol/usePollMarkets.ts +5 -2
- package/src/hooks/pol/useQueuedBeraUnlock.ts +4 -4
- package/src/hooks/pol/useRewardTokenToBeraRate.ts +4 -4
- package/src/hooks/pol/useRewardVault.ts +5 -2
- package/src/hooks/pol/useRewardVaultBalanceFromStakingToken.ts +2 -2
- package/src/hooks/pol/useRewardVaultFromToken.ts +2 -2
- package/src/hooks/pol/useRewardVaultIncentives.ts +2 -2
- package/src/hooks/pol/useRewardVaultRewards.ts +3 -3
- package/src/hooks/pol/useRewardVaults.ts +2 -2
- package/src/hooks/pol/useStakedAPR.ts +3 -3
- package/src/hooks/pol/useStakedData.ts +10 -10
- package/src/hooks/pol/useStakedSnapshots.ts +3 -3
- package/src/hooks/pol/useStakingVaultsMetadata.ts +40 -0
- package/src/hooks/pol/useTotalStakedAmount.ts +2 -2
- package/src/hooks/pol/useUserVaultInfo.ts +8 -5
- package/src/hooks/pol/useUserVaults.ts +7 -4
- package/src/hooks/pol/useVaultAddress.ts +2 -2
- package/src/hooks/pol/useVaultHistory.ts +2 -2
- package/src/hooks/pol/useVaultValidators.ts +5 -2
- package/src/hooks/tokens/useBeraCurrentPrice.ts +1 -1
- package/src/hooks/tokens/useMultipleTokenInformation.ts +7 -4
- package/src/hooks/tokens/usePollAllowances.ts +7 -4
- package/src/hooks/tokens/usePollBalance.ts +8 -5
- package/src/hooks/tokens/usePollWalletBalances.ts +8 -5
- package/src/hooks/tokens/useStakingTokenInformation.ts +7 -4
- package/src/hooks/tokens/useTokenCurrentPrice.ts +1 -1
- package/src/hooks/tokens/useTokenCurrentPrices.ts +6 -6
- package/src/hooks/tokens/useTokenInformation.ts +8 -5
- package/src/hooks/tokens/useTokenPrice.ts +1 -1
- package/src/hooks/tokens/useTokenPrices.ts +4 -4
- package/src/hooks/tokens/useTokens.ts +3 -3
- package/src/hooks/tokens/useTotalSupply.ts +1 -1
- package/src/hooks/tokens/useUnderlyingAsset.ts +3 -3
- package/src/hooks/useBlockToTimestamp.ts +5 -5
- package/src/hooks/useContractWrite/index.ts +0 -0
- package/src/hooks/useContractWrite/stateReducer.ts +0 -0
- package/src/hooks/useContractWrite/types.ts +2 -2
- package/src/hooks/useContractWrite/useBeraContractWrite.ts +5 -6
- package/src/hooks/useGetVerifiedAbi.ts +1 -1
- package/src/hooks/usePrevious.ts +0 -0
- package/src/hooks/validators/useAllValidators.ts +7 -4
- package/src/hooks/validators/useApiEnrichedAllocation.ts +2 -2
- package/src/hooks/validators/useApiValidator.ts +5 -2
- package/src/hooks/validators/useBaselineRewardAllocation.ts +2 -2
- package/src/hooks/validators/useDailyValidatorBlockStats.ts +3 -3
- package/src/hooks/validators/useDefaultRewardAllocation.ts +4 -4
- package/src/hooks/validators/useManagedValidatorRole.ts +8 -5
- package/src/hooks/validators/useOnChainValidator.ts +6 -3
- package/src/hooks/validators/useStakingPoolBatch.ts +7 -4
- package/src/hooks/validators/useUserActiveValidators.ts +6 -3
- package/src/hooks/validators/useUserBoostsOnValidator.ts +3 -3
- package/src/hooks/validators/useUserClaimableIncentives.ts +9 -9
- package/src/hooks/validators/useUserStakingPositions.ts +1 -1
- package/src/hooks/validators/useValidator.ts +1 -1
- package/src/hooks/validators/useValidatorAnalytics.ts +3 -3
- package/src/hooks/validators/useValidatorCommission.ts +5 -2
- package/src/hooks/validators/useValidatorEstimatedBgtPerYear.ts +3 -3
- package/src/hooks/validators/useValidatorQueuedCommission.ts +6 -3
- package/src/hooks/validators/useValidatorQueuedOperatorAddress.ts +5 -2
- package/src/hooks/validators/useValidatorQueuedRewardAllocation.ts +6 -3
- package/src/hooks/validators/useValidatorRewardAllocation.ts +2 -2
- package/src/types/dex.d.ts +1 -1
- package/src/types/enso.d.ts +34 -0
- package/src/types/exports.ts +0 -0
- package/src/types/global.d.ts +3 -3
- package/src/types/governance.d.ts +1 -1
- package/src/types/honeySwap.d.ts +3 -3
- package/src/types/staking.d.ts +0 -0
- package/src/utils/beraFetch.ts +1 -1
- package/src/utils/createEmitter.ts +1 -1
- package/src/utils/exports.ts +0 -0
- package/src/utils/filter.ts +0 -0
- package/src/utils/formatIncentivesTokenMap.ts +1 -1
- package/src/utils/formatInputTokenValue.ts +0 -0
- package/src/utils/formatNumber.ts +0 -0
- package/src/utils/getContractName.ts +1 -1
- package/src/utils/getHoneySwapMessage.test.ts +1 -1
- package/src/utils/getHoneySwapMessage.ts +1 -1
- package/src/utils/parseBaseArgs.ts +1 -1
- package/src/utils/parseBaseArgs.unit.test.ts +1 -1
- package/src/utils/parseWhiskToken.ts +1 -1
- package/src/utils/poolNamings.ts +1 -1
- package/src/utils/tokens.ts +2 -2
- package/src/utils/tokens.unit.test.ts +1 -1
- package/src/utils/truncateHash.ts +0 -0
- package/.claude/skills/berajs/SKILL.md +0 -222
- package/.claude/skills/berajs/references/dex.md +0 -235
- package/.claude/skills/berajs/references/pol.md +0 -194
- package/.claude/skills/berajs/references/staking.md +0 -198
- package/.claude/skills/berajs/references/tokens.md +0 -170
- package/LICENSE +0 -21
- package/dist/chunk-22J3YJDN.cjs +0 -2
- package/dist/chunk-22J3YJDN.cjs.map +0 -1
- package/dist/chunk-2LL3P5PN.mjs +0 -2
- package/dist/chunk-2LL3P5PN.mjs.map +0 -1
- package/dist/chunk-4GU2O2OW.cjs +0 -4
- package/dist/chunk-4GU2O2OW.cjs.map +0 -1
- package/dist/chunk-55L7STYD.mjs +0 -2
- package/dist/chunk-55L7STYD.mjs.map +0 -1
- package/dist/chunk-5XWELBWR.mjs +0 -2
- package/dist/chunk-5XWELBWR.mjs.map +0 -1
- package/dist/chunk-6LDOG5RL.cjs.map +0 -1
- package/dist/chunk-7LNBSOVV.cjs +0 -2
- package/dist/chunk-7LNBSOVV.cjs.map +0 -1
- package/dist/chunk-7SMWQ6SN.mjs.map +0 -1
- package/dist/chunk-7WRTK7RJ.mjs.map +0 -1
- package/dist/chunk-AX2YQQFQ.mjs.map +0 -1
- package/dist/chunk-BS6K7HGH.cjs +0 -2
- package/dist/chunk-BS6K7HGH.cjs.map +0 -1
- package/dist/chunk-C3FHGFLK.mjs +0 -2
- package/dist/chunk-C3FHGFLK.mjs.map +0 -1
- package/dist/chunk-C6ZGUO4H.cjs.map +0 -1
- package/dist/chunk-FCWDGE62.cjs.map +0 -1
- package/dist/chunk-RW3JFPED.mjs +0 -4
- package/dist/chunk-RW3JFPED.mjs.map +0 -1
- package/dist/chunk-S3EAKCVM.cjs +0 -2
- package/dist/chunk-S3EAKCVM.cjs.map +0 -1
- package/dist/chunk-SWMJQOH6.cjs +0 -2
- package/dist/chunk-SWMJQOH6.cjs.map +0 -1
- package/dist/chunk-THATXCJK.mjs +0 -2
- package/dist/chunk-THATXCJK.mjs.map +0 -1
- package/dist/chunk-VXL2ZZ4X.cjs +0 -2
- package/dist/chunk-VXL2ZZ4X.cjs.map +0 -1
- package/dist/chunk-YNO7BCCM.mjs +0 -2
- package/dist/chunk-YXLFOEZN.mjs +0 -2
- package/dist/chunk-YXLFOEZN.mjs.map +0 -1
- package/dist/chunk-YZV5LKIP.cjs.map +0 -1
- package/src/actions/dex/getSubgraphPool.ts +0 -30
- package/src/actions/validators/getManagedValidatorByAccount.ts +0 -32
- package/src/hooks/pol/useSWBeraVaultMetadata.ts +0 -35
- package/src/hooks/validators/useManagedValidatorByAccount.ts +0 -40
- 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 "
|
|
4
|
+
import { InvalidArgumentError } from "../../errors/InvalidArgumentError";
|
|
5
5
|
import type {
|
|
6
6
|
GetEnsoSwapBundleArgs,
|
|
7
7
|
GetZapTransactionResponse,
|
|
8
|
-
} from "
|
|
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 "
|
|
6
|
-
import { InvalidArgumentError } from "
|
|
7
|
-
import { initBeraError } from "
|
|
8
|
-
import type { BalanceToken } from "
|
|
9
|
-
import { beraToken, isToken } from "
|
|
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
|
/**
|