@berachain/berajs 0.2.0 → 0.2.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/dist/{transactionStore-BvStaXf3.d.ts → BexStatusProvider-nS3NcdxI.d.cts} +1 -41
- package/dist/{transactionStore-CQrGYSY2.d.cts → BexStatusProvider-nS3NcdxI.d.ts} +1 -41
- package/dist/abi/exports.cjs.map +1 -1
- package/dist/actions/exports.cjs +1 -1
- package/dist/actions/exports.cjs.map +1 -1
- package/dist/actions/exports.d.cts +4 -5
- package/dist/actions/exports.d.ts +4 -5
- package/dist/actions/exports.mjs +1 -1
- package/dist/{chunk-OS5AJMYJ.cjs → chunk-22J3YJDN.cjs} +2 -2
- package/dist/chunk-22J3YJDN.cjs.map +1 -0
- package/dist/{chunk-MTS5SZLA.mjs → chunk-2LL3P5PN.mjs} +2 -2
- package/dist/chunk-3YXSUBA5.mjs +2 -0
- package/dist/{chunk-H2QSRMVS.mjs.map → chunk-3YXSUBA5.mjs.map} +1 -1
- package/dist/chunk-55L7STYD.mjs +2 -0
- package/dist/chunk-55L7STYD.mjs.map +1 -0
- package/dist/{chunk-BOYZVULX.cjs → chunk-6LDOG5RL.cjs} +2 -2
- package/dist/chunk-6LDOG5RL.cjs.map +1 -0
- package/dist/{chunk-UQUWMHVF.cjs → chunk-7LNBSOVV.cjs} +2 -2
- package/dist/chunk-7LNBSOVV.cjs.map +1 -0
- package/dist/{chunk-ZQRACIGR.mjs → chunk-7SMWQ6SN.mjs} +2 -2
- package/dist/{chunk-7GWTHOLO.mjs → chunk-7WRTK7RJ.mjs} +2 -2
- package/dist/chunk-A4UDYSB6.mjs +4 -0
- package/dist/chunk-A4UDYSB6.mjs.map +1 -0
- package/dist/chunk-AX2YQQFQ.mjs +2 -0
- package/dist/chunk-AX2YQQFQ.mjs.map +1 -0
- package/dist/chunk-C6ZGUO4H.cjs +2 -0
- package/dist/chunk-C6ZGUO4H.cjs.map +1 -0
- package/dist/chunk-CYKCYPFR.cjs.map +1 -1
- package/dist/chunk-ECRMUMTA.mjs +2 -0
- package/dist/chunk-ECRMUMTA.mjs.map +1 -0
- package/dist/{chunk-ZAKA4TGK.cjs → chunk-FCWDGE62.cjs} +2 -2
- package/dist/chunk-FCWDGE62.cjs.map +1 -0
- package/dist/chunk-FL2N3XHK.cjs.map +1 -1
- package/dist/chunk-MUCEYO3E.cjs +4 -0
- package/dist/chunk-MUCEYO3E.cjs.map +1 -0
- package/dist/chunk-OIYXOKTT.cjs.map +1 -1
- package/dist/chunk-P2Q7CMUD.cjs +2 -0
- package/dist/chunk-P2Q7CMUD.cjs.map +1 -0
- package/dist/chunk-PKXAW6MO.cjs +2 -0
- package/dist/chunk-PKXAW6MO.cjs.map +1 -0
- package/dist/chunk-SWMJQOH6.cjs.map +1 -1
- package/dist/{chunk-YQGZMWDT.mjs → chunk-THATXCJK.mjs} +2 -2
- package/dist/chunk-VP7XUOSI.cjs.map +1 -1
- package/dist/chunk-VXL2ZZ4X.cjs.map +1 -1
- package/dist/chunk-WRFDB3QJ.cjs.map +1 -1
- package/dist/chunk-XNJLSA6P.cjs.map +1 -1
- package/dist/chunk-YZV5LKIP.cjs +2 -0
- package/dist/chunk-YZV5LKIP.cjs.map +1 -0
- package/dist/contexts/exports.cjs +1 -1
- package/dist/contexts/exports.cjs.map +1 -1
- package/dist/contexts/exports.d.cts +2 -10
- package/dist/contexts/exports.d.ts +2 -10
- package/dist/contexts/exports.mjs +1 -1
- package/dist/contexts/exports.mjs.map +1 -1
- package/dist/enum/exports.cjs.map +1 -1
- package/dist/enum/exports.d.cts +1 -2
- package/dist/enum/exports.d.ts +1 -2
- package/dist/errors/exports.cjs +1 -1
- package/dist/errors/exports.cjs.map +1 -1
- package/dist/errors/exports.d.cts +25 -2
- package/dist/errors/exports.d.ts +25 -2
- package/dist/errors/exports.mjs +1 -1
- package/dist/{getValidatorQueuedOperatorAddress-It0GsdvQ.d.cts → getValidatorQueuedOperatorAddress-Dstyaomr.d.cts} +1 -1
- package/dist/{getValidatorQueuedOperatorAddress-BX35p2Lv.d.ts → getValidatorQueuedOperatorAddress-RW4OMcD1.d.ts} +1 -1
- package/dist/{global.d-Ba-NIojH.d.cts → global.d-CN6l2b9E.d.cts} +1 -2
- package/dist/{global.d-By70bEv2.d.ts → global.d-wYu8G8IQ.d.ts} +1 -2
- package/dist/hooks/exports.cjs +2 -2
- package/dist/hooks/exports.cjs.map +1 -1
- package/dist/hooks/exports.d.cts +7 -15
- package/dist/hooks/exports.d.ts +7 -15
- package/dist/hooks/exports.mjs +3 -3
- package/dist/hooks/exports.mjs.map +1 -1
- package/dist/{txnEnum-BYNbCxla.d.ts → txnEnum-BlBYhNRl.d.cts} +74 -1
- package/dist/{txnEnum-BYNbCxla.d.cts → txnEnum-BlBYhNRl.d.ts} +74 -1
- package/dist/types/exports.cjs.map +1 -1
- package/dist/types/exports.d.cts +2 -3
- package/dist/types/exports.d.ts +2 -3
- package/dist/utils/exports.cjs +1 -1
- package/dist/utils/exports.cjs.map +1 -1
- package/dist/utils/exports.mjs +1 -1
- package/dist/utils/exports.mjs.map +1 -1
- package/package.json +6 -6
- package/src/actions/dex/aggregators/haiku.ts +1 -1
- package/src/actions/dex/aggregators/oogabooga.ts +1 -1
- package/src/actions/pol/getEarnedStakedBeraVault.ts +1 -1
- package/src/actions/pol/getStakingDailyAssets.ts +4 -1
- package/src/actions/tokens/getWalletBalances.integration.test.ts +1 -1
- package/src/contexts/exports.ts +0 -1
- package/src/data/contracts.ts +1 -1
- package/src/errors/BeraError.ts +11 -2
- package/src/errors/RequestError.ts +27 -1
- package/src/errors/errorMap.ts +7 -6
- package/src/errors/getErrorMessage.ts +59 -20
- package/src/errors/getRevertReason.integration.test.ts +1 -1
- package/src/hooks/exports.ts +0 -4
- package/src/hooks/pol/useStakedData.ts +1 -1
- package/dist/chunk-7SC4VD3U.cjs +0 -2
- package/dist/chunk-7SC4VD3U.cjs.map +0 -1
- package/dist/chunk-BHNQX4XC.mjs +0 -2
- package/dist/chunk-BHNQX4XC.mjs.map +0 -1
- package/dist/chunk-BOYZVULX.cjs.map +0 -1
- package/dist/chunk-C3G5KXCH.mjs +0 -2
- package/dist/chunk-C3G5KXCH.mjs.map +0 -1
- package/dist/chunk-G6NA6NSM.mjs +0 -4
- package/dist/chunk-G6NA6NSM.mjs.map +0 -1
- package/dist/chunk-H2QSRMVS.mjs +0 -2
- package/dist/chunk-IJM76AWK.cjs +0 -4
- package/dist/chunk-IJM76AWK.cjs.map +0 -1
- package/dist/chunk-MUNAP5TM.cjs +0 -2
- package/dist/chunk-MUNAP5TM.cjs.map +0 -1
- package/dist/chunk-OS5AJMYJ.cjs.map +0 -1
- package/dist/chunk-TJWKS54T.mjs +0 -2
- package/dist/chunk-TJWKS54T.mjs.map +0 -1
- package/dist/chunk-UQUWMHVF.cjs.map +0 -1
- package/dist/chunk-UXUWSRVV.cjs +0 -2
- package/dist/chunk-UXUWSRVV.cjs.map +0 -1
- package/dist/chunk-WTCBORPB.cjs +0 -2
- package/dist/chunk-WTCBORPB.cjs.map +0 -1
- package/dist/chunk-ZAKA4TGK.cjs.map +0 -1
- package/dist/contracts-CQIPk0Jc.d.cts +0 -74
- package/dist/contracts-CQIPk0Jc.d.ts +0 -74
- package/src/contexts/TransactionStoreContext.tsx +0 -87
- package/src/hooks/transactions/transactionStore.ts +0 -296
- package/src/hooks/transactions/transactionStore.unit.test.ts +0 -561
- package/src/hooks/transactions/useAddRecentTransaction.ts +0 -29
- package/src/hooks/transactions/useRecentTransactions.ts +0 -27
- package/src/hooks/transactions/useSetTransactionStatus.ts +0 -31
- /package/dist/{chunk-MTS5SZLA.mjs.map → chunk-2LL3P5PN.mjs.map} +0 -0
- /package/dist/{chunk-ZQRACIGR.mjs.map → chunk-7SMWQ6SN.mjs.map} +0 -0
- /package/dist/{chunk-7GWTHOLO.mjs.map → chunk-7WRTK7RJ.mjs.map} +0 -0
- /package/dist/{chunk-YQGZMWDT.mjs.map → chunk-THATXCJK.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/actions/bend/getConvertToAssets.ts","../src/actions/clients/BeraApolloClient.ts","../src/actions/clients/getApolloClient.ts","../src/actions/dex/aggregators/base.ts","../src/actions/dex/b-sdk.ts","../src/actions/dex/getAllPools.ts","../src/actions/dex/getApiPool.ts","../src/actions/dex/getGlobalLiquidityAndSwapVolume.ts","../src/actions/dex/getPoolPausedState.ts","../src/actions/dex/getOnChainPool.ts","../src/actions/dex/getPoolEvents.ts","../src/actions/dex/getPoolHistoricalData.ts","../src/actions/dex/getSubgraphPool.ts","../src/actions/governance/checkProposalField.ts","../src/actions/governance/computeActualStatus.ts","../src/actions/governance/getAllProposals.ts","../src/actions/governance/getBodyErrors.ts","../src/actions/governance/getProposalDetails.ts","../src/actions/governance/parseProposalBody.ts","../src/actions/governance/getProposalFromTx.ts","../src/actions/governance/getProposalVotes.ts","../src/actions/honey/getChartData.ts","../src/actions/honey/getCollateralWeights.ts","../src/actions/tokens/getTokenInformation.ts","../src/actions/honey/getHoneyCollaterals.ts","../src/actions/honey/isBadCollateralAsset.ts","../src/actions/honey/getGlobalCapLimit.ts","../src/actions/honey/getSharesWithoutFees.ts","../src/actions/honey/getHoneyGlobalData.ts","../src/actions/honey/getHoneyPreview.ts","../src/actions/honey/getHoneyVaultsBalance.ts","../src/actions/honey/getPythLatestPrices.ts","../src/actions/honey/getRelativeCapLimit.ts","../src/actions/pyth/getUpdateFee.ts","../src/actions/honey/getSwapPayload.ts","../src/actions/honey/isBasketModeEnabled.ts","../src/actions/misc/getBlockTimestamp.ts","../src/actions/pol/getRewardVaultRewards.ts","../src/actions/pol/getBgtAprSimulation.ts","../src/actions/pol/getEarnedStakedBeraVault.ts","../src/actions/pol/getRewardVaults.ts","../src/actions/pol/getBGTGlobalInfo.ts","../src/actions/pol/getBgtTokenTotalBoosts.ts","../src/actions/pol/getBgtTokenTotalSupply.ts","../src/actions/pol/getGlobalCuttingBoard.ts","../src/actions/pol/getGlobalData.ts","../src/actions/pol/getIncentiveFeeClaimStats.ts","../src/actions/pol/getMarkets.ts","../src/actions/pol/getRewardProofsByValidator.ts","../src/actions/pol/getRewardTokenToBeraRate.ts","../src/actions/pol/getRewardVault.ts","../src/actions/pol/getRewardVaultIncentives.ts","../src/actions/pol/getRewardVaultStakingToken.ts","../src/actions/pol/getStakedBeraAPR.ts","../src/actions/pol/getStakedBeraSnapshots.ts","../src/actions/pol/getStakeWithdrawalCooldown.ts","../src/actions/pol/getSWBeraVaultMetadata.ts","../src/actions/pol/getSWBeraWithdrawal.ts","../src/actions/pol/getTotalStakedAmount.ts","../src/actions/pol/getUserClaimableIncentives.ts","../src/actions/pol/getUserVaultsReward.ts","../src/actions/pol/getUserVaultInfo.ts","../src/actions/pol/getUserVaultsBalance.ts","../src/actions/pol/getVaultsSupply.ts","../src/actions/pol/getUserVaults.ts","../src/actions/pol/getVaultHistory.ts","../src/actions/pol/getVaultValidators.ts","../src/actions/prices/getTokenCurrentPrices.ts","../src/actions/tokens/getAllowances.ts","../src/actions/transactions/beraWriteContract.ts","../src/errors/getRevertReason.ts","../src/actions/validators/getAllValidators.ts","../src/actions/validators/getApiEnrichedAllocation.ts","../src/actions/validators/getApiValidator.ts","../src/actions/validators/getDailyValidatorBlockStats.ts","../src/actions/validators/getValidatorRewardAllocation.ts","../src/actions/validators/getDefaultRewardAllocation.ts","../src/actions/validators/getManagedValidatorByAccount.ts","../src/actions/validators/getStakingPoolBatch.ts","../src/actions/validators/getUserBoostsOnValidator.ts","../src/actions/validators/getUserBoosts.ts","../src/actions/validators/getUserActiveValidators.ts","../src/actions/validators/getUserStakingPositions.ts","../src/actions/validators/getValidatorAnalytics.ts","../src/actions/validators/getValidatorCommission.ts","../src/actions/validators/getValidatorEstimatedBgtPerYear.ts","../src/actions/validators/getValidatorOperatorAddress.ts","../src/actions/validators/getValidatorQueuedCommission.ts","../src/actions/validators/getValidatorQueuedOperatorAddress.ts","../src/actions/validators/getValidatorQueuedRewardAllocation.ts"],"sourcesContent":["import { type Address, formatEther, type PublicClient } from \"viem\";\n\nimport { metaMorphoAbi } from \"~/abi/bend/metaMorpho\";\n\nexport interface GetConvertToAssetsProps {\n sharesAmount: bigint;\n vaultAddress: Address;\n publicClient: PublicClient;\n}\n\nexport async function getConvertToAssets({\n sharesAmount,\n vaultAddress,\n publicClient,\n}: GetConvertToAssetsProps): Promise<{ raw: bigint; formatted: string }> {\n const convertToAssets = await publicClient.readContract({\n address: vaultAddress,\n abi: metaMorphoAbi,\n functionName: \"convertToAssets\",\n args: [sharesAmount],\n });\n return { raw: convertToAssets, formatted: formatEther(convertToAssets) };\n}\n","import {\n ApolloClient,\n type DocumentNode,\n type ErrorLike,\n type OperationVariables,\n ServerError,\n} from \"@apollo/client\";\n\nimport { appConfig } from \"@berachain/config/internal\";\n\nimport { BeraError } from \"~/errors/BeraError\";\nimport { BeraTracing } from \"~/errors/BeraTracing\";\nimport { RequestError } from \"~/errors/RequestError\";\n\n/**\n * This is a wrapper around the ApolloClient that throws a BeraError if the query returns an error or no data.\n *\n * It's mostly a typescript helper that keeps data always defined since we use errorPolicy: \"none\" by default.\n * Such setting will throw an error if the query returns an error, rather than returning an object with undefined data and an error property.\n */\nexport class BeraApolloClient extends ApolloClient {\n /**\n * The URL of the endpoint. Used for error reporting only.\n */\n protected url: string;\n\n constructor(\n options: ApolloClient.Options & {\n /**\n * The URL of the endpoint. Used for error reporting only.\n */\n url: string;\n },\n ) {\n super(options);\n this.url = options.url;\n }\n\n async query<\n TData = unknown,\n TVariables extends OperationVariables = OperationVariables,\n >(\n // We handle errors in our custom logic so we don't need to pass errorPolicy here\n options: Omit<ApolloClient.QueryOptions<TData, TVariables>, \"errorPolicy\">,\n ): Promise<{\n // Only data is returned and we're sure it's not undefined due to errorPolicy\n data: TData;\n }> {\n const queryName = getQueryName(options.query);\n const endpoint = {\n url: this.url,\n type: \"graphql\",\n } as const;\n\n const tags = {\n \"operation.type\": \"query\",\n \"operation.source.url\": endpoint.url,\n \"operation.source.type\": endpoint.type,\n \"operation.source.queryName\": queryName,\n };\n\n try {\n const executeQuery = () =>\n super.query<TData, TVariables>(\n options as ApolloClient.QueryOptions<TData, TVariables>,\n );\n\n const res = await BeraTracing.startSpan(\n {\n name: `GraphQL ${queryName}`,\n op: \"BeraApolloClient.query\",\n attributes: tags,\n },\n executeQuery,\n );\n\n if (res.error || res.data === undefined) {\n throw new BeraError({\n level: \"fatal\",\n tags,\n message:\n \"Bera Apollo Client: No data returned from query, but error should be thrown since errorPolicy is none\",\n });\n }\n\n return { data: res.data } as const;\n } catch (error) {\n !appConfig.env.isProduction &&\n console.error(\"BeraApolloClient error\", error);\n\n if (ServerError.is(error)) {\n throw new RequestError({\n // reason: error,\n response: error.response,\n cause: error,\n statusCode: error.statusCode,\n endpoint,\n tags,\n });\n }\n if (error instanceof TypeError) {\n throw new RequestError({\n level: \"fatal\",\n reason: \"TypeError\",\n response: error,\n cause: error,\n endpoint,\n tags,\n });\n }\n throw new RequestError({\n response: error as ErrorLike,\n tags,\n cause: error,\n endpoint,\n });\n }\n }\n}\n\nfunction getQueryName(queryDefinition: DocumentNode) {\n const likelyNode = queryDefinition.definitions.find(\n (def) => def.kind === (\"OperationDefinition\" as const),\n );\n\n return likelyNode?.name?.value;\n}\n","import { InMemoryCache, type InMemoryCacheConfig } from \"@apollo/client\";\nimport { HttpLink } from \"@apollo/client/link/http\";\n\nimport type { HttpLink as BeraConfigHttpLink } from \"@berachain/config\";\nimport { getUriFromLink } from \"@berachain/config\";\nimport { currentDapp } from \"@berachain/config/internal\";\n\nimport apiResults from \"@berachain/graphql/dex/api\";\n\nimport { BeraError } from \"~/errors/BeraError\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { BeraApolloClient } from \"./BeraApolloClient\";\n\n/**\n * If currentDapp is set, it will add the stellate client name and version to the headers.\n * @see {@link https://stellate.co/docs/graphql-metrics/tracking/clients}\n */\nfunction applyStellateClientName(url: BeraConfigHttpLink): BeraConfigHttpLink {\n if (!currentDapp) {\n return url;\n }\n const headers = typeof url === \"string\" ? undefined : url.headers;\n return {\n uri: getUriFromLink(url),\n headers: {\n ...headers,\n \"x-graphql-client-name\": `berachain.${currentDapp}.${process.env.NEXT_RUNTIME || \"browser\"}`,\n \"x-graphql-client-version\": `${process.env.VERCEL_TARGET_ENV}.${process.env.VERCEL_GIT_COMMIT_SHA}`,\n },\n };\n}\n\nexport { gql } from \"@apollo/client\";\n\nfunction getClient(\n endpoint: BeraConfigHttpLink,\n {\n ssrMode,\n inMemoryCacheOptions,\n }: {\n ssrMode?: boolean;\n inMemoryCacheOptions?: InMemoryCacheConfig;\n } = {},\n) {\n const url = getUriFromLink(endpoint);\n const headers = typeof endpoint === \"string\" ? undefined : endpoint.headers;\n\n return new BeraApolloClient({\n url,\n link: new HttpLink({\n uri: url,\n headers,\n }),\n defaultOptions: {\n query: {\n // With the default none error policy, an error causes the promise to reject.\n errorPolicy: \"none\",\n fetchPolicy: \"no-cache\",\n },\n },\n cache: new InMemoryCache(inMemoryCacheOptions),\n ssrMode,\n });\n}\n\ntype GraphqlClient =\n | \"honey.subgraph\"\n | \"pol.subgraph\"\n | \"governance.subgraph\"\n | \"blocks.subgraph\"\n | \"bex.subgraph\"\n | \"api\"\n | \"bend.whisk\";\n\nexport function getApolloClient(\n clientName: GraphqlClient,\n { ...args }: BeraJS.BaseFunctionArgs,\n): BeraApolloClient {\n const { config } = parseBaseArgs(args);\n\n switch (clientName) {\n case \"api\":\n return getClient(applyStellateClientName(config.api), {\n inMemoryCacheOptions: {\n possibleTypes: apiResults.possibleTypes,\n },\n });\n\n case \"bend.whisk\":\n if (!config.bend.whiskApi) {\n throw new BeraError({\n message: \"Bend whisk API is not configured on this chain\",\n level: \"error\",\n });\n }\n return getClient(config.bend.whiskApi);\n\n case \"honey.subgraph\":\n return getClient(config.honey.subgraph);\n case \"pol.subgraph\":\n return getClient(config.pol.subgraph);\n case \"governance.subgraph\":\n return getClient(config.governance.subgraph);\n case \"blocks.subgraph\":\n return getClient(config.blocksSubgraph);\n case \"bex.subgraph\":\n return getClient(config.bex.subgraph);\n }\n}\n","import { type Address, formatUnits, isAddress, zeroAddress } from \"viem\";\n\nimport type { BeraConfig, ChainId } from \"@berachain/config/internal\";\n\nimport BigNumber from \"@berachain/utils/pkg/bignumber.js\";\n\nimport type { HoneyConfigContextReturn } from \"~/contexts/HoneyConfigProvider\";\nimport type { Aggregators } from \"~/enum/dex\";\nimport { BeraError } from \"~/errors/BeraError\";\nimport { initBeraError } from \"~/errors/initBeraError\";\nimport type { IAggregatorArgs, IRawAggregatorQuote, Token } from \"~/types/dex\";\nimport { beraFetch } from \"~/utils/beraFetch\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { isToken } from \"~/utils/tokens\";\n\nexport abstract class BaseAggregator {\n abstract name: Aggregators;\n /**\n * Supported chains for the aggregator.\n * If null, the aggregator is supported on all chains.\n */\n abstract supportedChains: number[] | null;\n static PATH_NOT_FOUND_REASON = \"NO_SWAP_PATHS\";\n\n needsAccountForQuote: boolean = false;\n notFoundMessages: string[] = [];\n\n config: BeraConfig;\n\n chainId: ChainId;\n constructor(args: BeraJS.BaseFunctionArgs = {}) {\n const { config, chainId } = parseBaseArgs(args);\n this.config = config;\n this.chainId = chainId;\n }\n\n /**\n * Identifies the url of the last sent request. Might not have all query params.\n * Mainly used for error reporting.\n */\n url: string = \"\";\n abstract readonly type: \"rest\" | \"graphql\" | \"rpc\";\n\n abstract getQuote(\n args: IAggregatorArgs,\n ):\n | Promise<IRawAggregatorQuote | undefined>\n | Promise<IRawAggregatorQuote | undefined>;\n\n /**\n * return wbera for native tokens to accomodate the aggregator's router logic\n */\n protected parseAddresses(\n tokenIn: string,\n tokenOut: string,\n ): {\n tokenInAddress: Address;\n tokenOutAddress: Address;\n isTokenInNative: boolean;\n isTokenOutNative: boolean;\n } {\n if (!isAddress(tokenIn) || !isAddress(tokenOut)) {\n throw new BeraError({\n message: `Invalid address: ${tokenIn} or ${tokenOut}`,\n level: \"error\",\n });\n }\n\n return {\n tokenInAddress: isToken(tokenIn, \"BERA\")\n ? this.config.tokens.wbera\n : tokenIn,\n tokenOutAddress: isToken(tokenOut, \"BERA\")\n ? this.config.tokens.wbera\n : tokenOut,\n isTokenInNative: isToken(tokenIn, \"BERA\"),\n isTokenOutNative: isToken(tokenOut, \"BERA\"),\n };\n }\n\n /**\n * Calculate input amount after fees.\n *\n * @returns Amount in wad format\n */\n protected getAmountAfterFees(\n amount: string,\n aggregatorsFeeBps?: number,\n ): string {\n if (aggregatorsFeeBps === undefined) {\n throw new BeraError({\n message: \"aggregatorsFeeBps is required\",\n level: \"error\",\n });\n }\n\n const fees = new BigNumber(amount)\n .times(aggregatorsFeeBps)\n .dividedBy(10_000)\n .toFixed(0, BigNumber.ROUND_DOWN);\n return new BigNumber(amount).minus(fees).toFixed(0, BigNumber.ROUND_DOWN);\n }\n /**\n * Formats input data for aggregator swaps\n */\n protected getInputData({\n tokenIn,\n amountIn,\n isNative,\n isPermit2Approval = false,\n permit2SpenderAddress,\n }: {\n tokenIn: Address;\n amountIn: string;\n isNative: boolean;\n isPermit2Approval?: boolean;\n permit2SpenderAddress?: Address | null;\n }) {\n return {\n tokenIn,\n amountIn: BigInt(amountIn),\n isNative,\n isPermit2Approval,\n permit2SpenderAddress: permit2SpenderAddress ?? zeroAddress,\n };\n }\n\n /**\n * Calculate min amount out\n */\n protected getMinAmountOut(amountOut: string, slippage: number): bigint {\n if (slippage === undefined) {\n throw new BeraError({\n message: \"slippage is required\",\n level: \"error\",\n });\n }\n const minAmountOut = new BigNumber(amountOut).times(1 - slippage / 100);\n\n if (minAmountOut.isNaN() || minAmountOut.isZero()) {\n return 0n;\n }\n return BigInt(minAmountOut.toFixed(0));\n }\n\n protected parseAllowanceRequirements({\n tokenIn,\n rawAmount,\n spender,\n }: {\n tokenIn: Token;\n rawAmount: string;\n spender: Address;\n }) {\n return isToken(tokenIn, \"BERA\")\n ? []\n : [\n {\n token: tokenIn,\n amount: {\n raw: rawAmount,\n formatted: formatUnits(BigInt(rawAmount), tokenIn.decimals),\n },\n spender,\n },\n ];\n }\n\n /**\n * Check if chain is supported\n */\n checkChainSupport({\n tokenIn,\n tokenOut,\n }: {\n tokenIn: Token;\n tokenOut: Token;\n // needed in honey native aggregator\n honeyNativeState?: Pick<HoneyConfigContextReturn, \"collateralList\">;\n // needed in ERC4626 aggregator\n underlyingToken?: Token | null;\n }): boolean {\n if (this.supportedChains === null) {\n return true;\n }\n\n return (\n this.supportedChains.includes(tokenIn.chainId) &&\n this.supportedChains.includes(tokenOut.chainId)\n );\n }\n\n assertChainSupport({\n tokenIn,\n tokenOut,\n underlyingToken,\n }: {\n tokenIn: Token;\n tokenOut: Token;\n underlyingToken?: Token | null;\n }): void {\n if (!this.checkChainSupport({ tokenIn, tokenOut, underlyingToken })) {\n throw new BeraError({\n message: `${this.name} does not support tokens chain ID: ${tokenIn.chainId} and ${tokenOut.chainId}`,\n level: \"error\",\n });\n }\n }\n\n protected async fetch(url: string | URL, options?: RequestInit) {\n try {\n return await beraFetch(\n { url, name: this.name, type: this.type },\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n ...options,\n },\n );\n } catch (err) {\n const error = initBeraError({ cause: err });\n if (\n this.notFoundMessages.some((message) => error.message.includes(message))\n ) {\n error.reason = BaseAggregator.PATH_NOT_FOUND_REASON;\n }\n throw error;\n }\n }\n}\n","import {\n API_CHAIN_NAMES,\n BALANCER_QUERIES,\n BALANCER_RELAYER,\n BalancerApi,\n CHAINS,\n COMPOSABLE_STABLE_POOL_FACTORY,\n NATIVE_ASSETS,\n Token,\n VAULT,\n WEIGHTED_POOL_FACTORY_BALANCER_V2,\n} from \"@berachain-foundation/berancer-sdk\";\nimport { zeroAddress } from \"viem\";\nimport { berachain, berachainBepolia } from \"viem/chains\";\n\nimport { type ChainId, chainConfigs } from \"@berachain/config/internal\";\n\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { beraToken } from \"~/utils/tokens\";\n\nfor (const chain of Object.keys(chainConfigs)) {\n const { config, chainId } = parseBaseArgs({\n chainId: Number(chain) as ChainId,\n });\n\n API_CHAIN_NAMES[chainId] = config.bex.chainName;\n\n // this needs to be typed this way, because leaving @ts-expect-error\n // is incredibly expensive (TypeScript takes 4 seconds to compile)\n (CHAINS as Record<number, any>)[chainId] =\n chainId === berachain.id ? berachain : berachainBepolia;\n BALANCER_RELAYER[chainId] = config.bex.relayer;\n VAULT[chainId] = config.bex.vault;\n BALANCER_QUERIES[chainId] = config.bex.queries;\n\n WEIGHTED_POOL_FACTORY_BALANCER_V2[chainId] = zeroAddress;\n COMPOSABLE_STABLE_POOL_FACTORY[chainId] = zeroAddress;\n\n const nativeToken = new Token(\n chainId,\n zeroAddress,\n beraToken.decimals,\n beraToken.name,\n beraToken.symbol,\n config.tokens.wbera,\n );\n // @ts-expect-error not in network list\n NATIVE_ASSETS[chainId] = nativeToken;\n}\n\nexport { BalancerApi };\n","import type { FetchPolicy } from \"@apollo/client\";\n\nimport {\n GetPools,\n type GetPoolsQuery,\n type GetPoolsQueryVariables,\n} from \"@berachain/graphql/dex/api\";\nimport {\n type GqlChain,\n GqlPoolOrderBy,\n GqlPoolOrderDirection,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getAllPools({\n textSearch,\n chain,\n first,\n orderBy,\n orderDirection,\n skip,\n fetchPolicy,\n userAddress,\n blacklistedPoolIds,\n ...args\n}: Partial<\n GetPoolsQueryVariables & {\n fetchPolicy: FetchPolicy;\n }\n> &\n BeraJS.BaseFunctionArgs = {}) {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const pools = await bexApiGraphqlClient.query<\n GetPoolsQuery,\n GetPoolsQueryVariables\n >({\n query: GetPools,\n variables: {\n textSearch,\n chain: chain ?? (config.bex.chainName as GqlChain),\n first,\n orderBy: orderBy ?? GqlPoolOrderBy.TotalLiquidity,\n orderDirection: orderDirection ?? GqlPoolOrderDirection.Desc,\n skip,\n userAddress,\n blacklistedPoolIds,\n },\n fetchPolicy: fetchPolicy,\n });\n\n return {\n pools: pools.data.poolGetPools ?? [],\n count: pools.data.count ?? 0,\n };\n}\n","import type { Address } from \"viem\";\n\nimport {\n GetPool,\n type GetPoolQuery,\n type GetPoolQueryVariables,\n} from \"@berachain/graphql/dex/api\";\nimport type { GqlChain } from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getApiPool({\n poolId,\n account,\n ...args\n}: {\n poolId: string;\n account?: Address | undefined;\n} & BeraJS.BaseFunctionArgs) {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n const pool = await bexApiGraphqlClient.query<\n GetPoolQuery,\n GetPoolQueryVariables\n >({\n query: GetPool,\n variables: {\n id: poolId,\n userAddress: account,\n chain: config.bex.chainName as GqlChain,\n },\n fetchPolicy: \"no-cache\", // If we cache it seems to return an empty response\n });\n\n // Transform the result to match the BalancerApiPoolResult type\n const data = pool.data.poolGetPool;\n if (!data) {\n throw new Error(`Pool not found for id: ${poolId} and user ${account}`);\n }\n\n // NOTE: we need to be able to use the output here with b-sdk's PoolState to add / withdraw liquidity, so we do some casting.\n // If we want to avoid this, we could instead update b-sdk ourselves to pull rewardVault to pull like we do here.\n // (see PoolStateWithBalancesAndDynamicData, packages/b-sdk/src/data/providers/balancer-api/modules/pool-state/index.ts)\n return data;\n}\n","import {\n GetGlobalLiquidityAndSwapVolume,\n type GetGlobalLiquidityAndSwapVolumeQuery,\n type GetGlobalLiquidityAndSwapVolumeQueryVariables,\n type GqlChain,\n} from \"@berachain/graphql/dex/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getGlobalLiquidityAndSwapVolume(\n args: BeraJS.BaseFunctionArgs = {},\n) {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const response = await bexApiGraphqlClient.query<\n GetGlobalLiquidityAndSwapVolumeQuery,\n GetGlobalLiquidityAndSwapVolumeQueryVariables\n >({\n query: GetGlobalLiquidityAndSwapVolume,\n variables: {\n chain: config.bex.chainName as GqlChain,\n },\n });\n\n return response.data;\n}\n","import { weightedPoolV4Abi_V2 } from \"@berachain-foundation/berancer-sdk\";\nimport type { Address, PublicClient } from \"viem\";\n\nexport interface PoolStatus {\n isPoolInRecoveryMode: boolean;\n isPoolPaused: boolean;\n}\n\nexport async function getPoolPausedState({\n publicClient,\n poolAddress,\n}: {\n publicClient: PublicClient;\n poolAddress: Address;\n}) {\n const abi = weightedPoolV4Abi_V2;\n // NOTE: we are only intersted in functions that span both ABIs, so I'll use weighted here. For SOME REASON. Balancer did\n // not include inRecoveryMode etc in the stable ABI (despite it EXISTING in both weighted/stable) see for yourself:\n // <scanner>/address/0xF7F214A9543c1153eF5DF2edCd839074615F248c/contract/80000/readContract#F28\n // ... so we will just use the weighted ABI here no matter the pool type, just be mindful not to call any type-specific functions\n const results = await publicClient.multicall({\n contracts: [\n {\n address: poolAddress,\n abi,\n functionName: \"inRecoveryMode\",\n },\n {\n address: poolAddress,\n abi,\n functionName: \"getPausedState\",\n },\n ],\n allowFailure: false, // NOTE: this disallows partial failures of the multicall\n });\n return {\n isPoolInRecoveryMode: results[0],\n isPoolPaused: results[1][0],\n } as PoolStatus;\n}\n","import {\n stablePoolAbi_V3,\n vaultV2Abi,\n weightedPoolFactoryAbi_V3,\n weightedPoolV4Abi_V2,\n} from \"@berachain-foundation/berancer-sdk\";\nimport {\n type Address,\n erc20Abi,\n formatEther,\n formatUnits,\n type Hex,\n isAddress,\n isHex,\n type PublicClient,\n} from \"viem\";\n\nimport { GqlPoolType } from \"@berachain/graphql/pol/api\";\n\nimport { InvalidArgumentError } from \"~/errors/InvalidArgumentError\";\nimport { initBeraError } from \"~/errors/initBeraError\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { getPoolPausedState, type PoolStatus } from \"./getPoolPausedState\";\n\nexport interface OnChainPool {\n pausedState: PoolStatus;\n address: Address;\n id: Hex;\n name: string;\n\n poolTokens: [\n /**\n * The addresses of the tokens in the pool\n */\n readonly Address[],\n /**\n * The balances of the tokens in the pool\n */\n string[],\n /**\n * The last change block of the pool\n */\n number,\n ];\n totalSupply: string;\n swapFee: string;\n decimals: number;\n weights: readonly string[] | undefined;\n version: any;\n factory: Address;\n type: GqlPoolType;\n /**\n * For example, if value is 300000n and precision is 1000n, the user-set amplification parameter would be 300000n / 1000n = 300n.\n *\n * The first number is the raw value, the second number is a boolean indicating if the amplification parameter is being updated, and the third number is the precision factor.\n * @see https://github.com/balancer/docs-developers/blob/main/references/valuing-balancer-lp-tokens/pools/stablepools.md#getamplificationparameter\n */\n amplificationParameter: readonly [number, boolean, number] | undefined;\n}\n\nexport async function getOnChainPool({\n poolId,\n publicClient,\n ...args\n}: {\n poolId: string;\n publicClient: PublicClient;\n} & BeraJS.BaseFunctionArgs): Promise<OnChainPool> {\n const { config } = parseBaseArgs(args);\n const address = poolId.slice(0, 42) as Address;\n if (!isAddress(address) || !isHex(poolId)) {\n throw new InvalidArgumentError({\n property: \"poolId\",\n value: poolId,\n expected: \"Hex\",\n });\n }\n try {\n const [\n name,\n poolTokens,\n totalSupply,\n swapFee,\n _version,\n _decimals,\n isComposableStable,\n isWeighted,\n poolPausedState,\n ] = await Promise.all([\n publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"name\",\n }),\n publicClient.readContract({\n address: config.bex.vault,\n abi: vaultV2Abi,\n functionName: \"getPoolTokens\",\n args: [poolId],\n }),\n publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"totalSupply\",\n }),\n publicClient.readContract({\n address,\n abi: weightedPoolV4Abi_V2,\n functionName: \"getSwapFeePercentage\",\n }),\n publicClient.readContract({\n address,\n abi: weightedPoolV4Abi_V2,\n functionName: \"version\",\n }),\n publicClient.readContract({\n address,\n abi: weightedPoolV4Abi_V2,\n functionName: \"decimals\",\n }),\n publicClient.readContract({\n address: config.bex.factories.composableStable,\n abi: weightedPoolFactoryAbi_V3,\n functionName: \"isPoolFromFactory\",\n args: [address],\n }),\n publicClient.readContract({\n address: config.bex.factories.weighted,\n abi: weightedPoolFactoryAbi_V3,\n functionName: \"isPoolFromFactory\",\n args: [address],\n }),\n getPoolPausedState({ publicClient, poolAddress: address }),\n ]);\n\n const decimals = Number(_decimals);\n const version = JSON.parse(_version);\n\n let virtualSupply: bigint | undefined;\n let weights: readonly bigint[] | undefined;\n let amplificationParameter: readonly [bigint, boolean, bigint] | undefined;\n\n if (isComposableStable) {\n // This returns the actual supply excluding preminted BPTs\n [virtualSupply, amplificationParameter] = await Promise.all([\n publicClient.readContract({\n address,\n abi: [\n {\n type: \"function\",\n name: \"getActualSupply\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n type: \"uint256\",\n },\n ],\n },\n ],\n functionName: \"getActualSupply\",\n }),\n // NOTE: it is possible to pull this from the subgraph, but not using GqlPoolBase, we'd have to query a specific pool type.\n publicClient.readContract({\n address,\n abi: stablePoolAbi_V3,\n functionName: \"getAmplificationParameter\",\n }),\n ]);\n } else if (version.name === \"WeightedPool\") {\n weights = await publicClient.readContract({\n address,\n abi: weightedPoolV4Abi_V2,\n functionName: \"getNormalizedWeights\",\n });\n }\n\n if (!isComposableStable && !isWeighted) {\n throw new Error(`Pool ${address} is not a valid BEX pool`);\n }\n\n return {\n name,\n address,\n id: poolId,\n poolTokens: [\n poolTokens[0],\n poolTokens[1].map(String),\n Number(poolTokens[2]),\n ],\n totalSupply: formatUnits(virtualSupply ?? totalSupply, decimals),\n swapFee: formatEther(swapFee),\n decimals,\n weights: weights?.map((weight) => formatEther(weight)),\n version,\n factory: isComposableStable\n ? config.bex.factories.composableStable\n : config.bex.factories.weighted,\n type: isComposableStable ? GqlPoolType.Stable : GqlPoolType.Weighted,\n\n amplificationParameter: amplificationParameter\n ? [\n // raw value\n Number(amplificationParameter[0]),\n // is updating\n amplificationParameter[1],\n // precision factor\n Number(amplificationParameter[2]),\n ]\n : undefined,\n pausedState: poolPausedState,\n };\n } catch (e) {\n throw initBeraError({ cause: e });\n }\n}\n","import {\n GetPoolEvents,\n type GetPoolEventsQuery,\n type GetPoolEventsQueryVariables,\n} from \"@berachain/graphql/dex/api\";\nimport type { GqlChain, GqlPoolEventType } from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getPoolEvents({\n poolId,\n typeInArray,\n ...args\n}: {\n poolId: string;\n typeInArray: GqlPoolEventType[];\n} & BeraJS.BaseFunctionArgs) {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n const response = await bexApiGraphqlClient.query<\n GetPoolEventsQuery,\n GetPoolEventsQueryVariables\n >({\n query: GetPoolEvents,\n variables: {\n poolId,\n typeIn: typeInArray,\n chain: config.bex.chainName as GqlChain,\n },\n });\n\n return response.data;\n}\n","import { isHex } from \"viem\";\n\nimport {\n GetPoolHistoricalData,\n type GetPoolHistoricalDataQuery,\n type GetPoolHistoricalDataQueryVariables,\n type GqlChain,\n type PoolHistoricalDataFragment,\n} from \"@berachain/graphql/dex/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { InvalidArgumentError } from \"~/errors/InvalidArgumentError\";\n\n/** @deprecated */\nexport type PoolDayData = {\n date: number;\n tvlUsd: string;\n volumeUsd: string;\n feesUsd: string;\n};\n\ninterface GetPoolHistoricalDataProps {\n poolId: string;\n chain: GqlChain;\n}\n\nexport async function getPoolHistoricalData({\n poolId,\n chain,\n ...args\n}: GetPoolHistoricalDataProps & BeraJS.BaseFunctionArgs): Promise<\n PoolHistoricalDataFragment[] | undefined\n> {\n if (!poolId || !isHex(poolId))\n throw new InvalidArgumentError({\n property: \"poolId\",\n value: poolId,\n expected: \"hex string\",\n });\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const { data } = await bexApiGraphqlClient.query<\n GetPoolHistoricalDataQuery,\n GetPoolHistoricalDataQueryVariables\n >({\n query: GetPoolHistoricalData,\n variables: { poolId, chain },\n });\n return data.poolGetSnapshots;\n}\n","import { isHex } from \"viem\";\n\nimport {\n GetSubgraphPool,\n type GetSubgraphPoolQuery,\n type GetSubgraphPoolQueryVariables,\n} from \"@berachain/graphql/dex/subgraph\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\n\nexport async function getSubgraphPool({\n poolId,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n poolId: string;\n}) {\n if (!isHex(poolId)) {\n throw new Error(\"poolId is not a valid hex string\");\n }\n const bexSubgraphClient = getApolloClient(\"bex.subgraph\", args);\n const res = await bexSubgraphClient.query<\n GetSubgraphPoolQuery,\n GetSubgraphPoolQueryVariables\n >({\n query: GetSubgraphPool,\n variables: { id: poolId },\n });\n\n return res.data.pool;\n}\n","import { type AbiParameter, isAddress, isHex } from \"viem\";\n\nimport { ProposalErrorCodes } from \"~/enum/governance\";\n\ntype CheckProposalFieldResultMinimal = ProposalErrorCodes | null;\n\ntype CheckProposalFieldResult =\n | ProposalErrorCodes\n | null\n | CheckProposalFieldResultMinimal[]\n | Record<string, CheckProposalFieldResultMinimal>;\n\ninterface CheckProposalField {\n (arg: {\n fieldOrType:\n | \"address\"\n | \"hex\"\n | \"abi\"\n | \"string\"\n | \"bool\"\n | `uint${string}`\n | `int${string}`\n | \"action\"\n | \"title\"\n | \"forumLink\"\n | \"description\"\n | \"logoURI\"\n | \"url\";\n value: any;\n required?: boolean;\n baseUrl?: string;\n components?: readonly (AbiParameter | readonly AbiParameter[])[];\n }): CheckProposalFieldResultMinimal;\n (arg: {\n fieldOrType: \"tuple[]\" | \"tuple\";\n value: any;\n required?: boolean;\n baseUrl?: string;\n components?: readonly (AbiParameter | readonly AbiParameter[])[];\n }): CheckProposalFieldResult;\n}\n// @ts-expect-error TODO: this is not typed, will throw if not valid\nexport const checkProposalField: CheckProposalField = ({\n fieldOrType,\n value,\n required = true,\n baseUrl,\n components,\n}) => {\n const notRequiredAbiTypes = [\"bool\", \"string\"];\n\n if (\n !notRequiredAbiTypes.includes(fieldOrType) &&\n required &&\n (value === undefined || value === null || value === \"\")\n ) {\n return ProposalErrorCodes.REQUIRED;\n }\n\n if (fieldOrType.startsWith(\"uint\") || fieldOrType.startsWith(\"int\")) {\n if (typeof value !== \"string\") {\n return ProposalErrorCodes.INVALID_AMOUNT;\n }\n\n try {\n const valueBN = BigInt(value);\n if (fieldOrType.startsWith(\"uint\")) {\n if (valueBN < 0n) {\n return ProposalErrorCodes.NEGATIVE_AMOUNT;\n }\n }\n } catch {\n return ProposalErrorCodes.INVALID_AMOUNT;\n }\n return null;\n }\n\n switch (fieldOrType) {\n case \"string\":\n if (value !== undefined && typeof value !== \"string\") {\n return ProposalErrorCodes.INVALID_AMOUNT;\n }\n return null;\n\n case \"bool\":\n if (typeof value !== \"boolean\") {\n return ProposalErrorCodes.INVALID_AMOUNT;\n }\n return null;\n\n case \"title\":\n if (value.length === 0) {\n return ProposalErrorCodes.REQUIRED;\n }\n return null;\n\n case \"description\":\n if (value.length === 0) {\n return ProposalErrorCodes.REQUIRED;\n }\n return null;\n\n case \"forumLink\":\n if (value.length === 0) {\n return ProposalErrorCodes.REQUIRED;\n }\n\n if (!URL.canParse(value)) {\n return ProposalErrorCodes.INVALID_ADDRESS;\n }\n\n // biome-ignore lint/correctness/noSwitchDeclarations: <explanation>\n const base = new URL(baseUrl as string);\n\n // base.pathname = \"/c/\";\n\n if (!value.startsWith(base.toString())) {\n return ProposalErrorCodes.INVALID_BASEPATH;\n }\n\n return null;\n\n case \"address\":\n if (!isAddress(value, { strict: true })) {\n return ProposalErrorCodes.INVALID_ADDRESS;\n }\n\n return null;\n\n case \"hex\":\n if (!isHex(value, { strict: true })) {\n return ProposalErrorCodes.INVALID_ADDRESS;\n }\n return null;\n\n case \"abi\":\n try {\n JSON.parse(value);\n } catch {\n return ProposalErrorCodes.INVALID_ABI;\n }\n return null;\n\n case \"action\":\n if (!isAddress(value, { strict: true })) {\n return ProposalErrorCodes.INVALID_ADDRESS;\n }\n return null;\n\n case \"tuple\":\n if (typeof value === \"object\" && Array.isArray(components)) {\n const errors: Record<string, ProposalErrorCodes | null> = {};\n\n for (const component of components) {\n errors[component.name!] = checkProposalField({\n fieldOrType: component.type,\n value: value[component.name!],\n components: component.components,\n });\n }\n\n if (Object.values(errors).every((v) => v === null)) {\n return null;\n }\n\n return errors;\n }\n\n return null;\n\n case \"tuple[]\":\n if (Array.isArray(value)) {\n const errors = value.map((v) =>\n checkProposalField({\n fieldOrType: \"tuple\",\n value: v,\n components,\n }),\n );\n\n if (errors.every((v) => v === null)) {\n return null;\n }\n\n return errors;\n }\n\n return null;\n case \"logoURI\": {\n if (value === undefined || value === \"\") {\n return null;\n }\n if (URL.canParse(value) && new URL(value).protocol === \"https:\") {\n return null;\n }\n return ProposalErrorCodes.MUST_BE_HTTPS_OR_IPFS;\n }\n case \"url\": {\n if (value === undefined || value === \"\") {\n return null;\n }\n if (URL.canParse(value) && new URL(value).protocol === \"https:\") {\n return null;\n }\n return ProposalErrorCodes.MUST_BE_HTTPS;\n }\n default:\n console.error(`Invalid field or type: ${fieldOrType}`);\n return null;\n }\n};\n","import {\n type ProposalSelectionFragment,\n ProposalStatus,\n} from \"@berachain/graphql/governance\";\n\nimport { ProposalState } from \"~/enum/governance\";\n\nconst GOVERNANCE_ACCELERATE_PROPOSAL = false;\n\nexport const MOCKED_PROPOSAL_STATUSES: readonly ProposalStatus[] = [\n ProposalStatus.Active,\n ProposalStatus.PendingQueue,\n ProposalStatus.PendingExecution,\n ProposalStatus.Defeated,\n ProposalStatus.QuorumNotReached,\n];\n\nexport function computeActualStatus(\n proposal: ProposalSelectionFragment,\n /**\n * Value returned by the `state` function of the governance contract.\n */\n proposalOnChainState?: ProposalState,\n): ProposalStatus {\n /**\n * If the proposal state is provided, we can use it for early return.\n */\n\n const timestampInSeconds = Date.now() / 1000;\n if (proposalOnChainState !== undefined) {\n if (proposal.status === ProposalStatus.CanceledByGuardian) {\n return ProposalStatus.CanceledByGuardian;\n }\n\n if (proposalOnChainState === ProposalState.Canceled) {\n if (Number(proposal.voteStartAt) < timestampInSeconds)\n return ProposalStatus.CanceledByUser;\n return ProposalStatus.CanceledByGuardian;\n }\n\n if (proposalOnChainState === ProposalState.Defeated) {\n if (!proposal.pollResult) {\n // Poll result is created after first vote.\n return ProposalStatus.QuorumNotReached;\n }\n\n if (\n // Quorum might be null if no votes were cast.\n !proposal.quorum ||\n BigInt(proposal.quorum) > BigInt(proposal.pollResult.totalTowardsQuorum)\n ) {\n return ProposalStatus.QuorumNotReached;\n }\n return ProposalStatus.Defeated;\n }\n\n if (proposalOnChainState === ProposalState.Succeeded) {\n return ProposalStatus.PendingQueue;\n }\n\n if (proposalOnChainState === ProposalState.Queued) {\n if (Number(proposal.queueEnd) < Date.now() / 1000) {\n return ProposalStatus.PendingExecution;\n }\n return ProposalStatus.InQueue;\n }\n\n if (proposalOnChainState === ProposalState.Expired) {\n console.warn(\"Unexpected expired state on proposal id: \", proposal.id);\n return ProposalStatus.Defeated;\n }\n }\n\n /*\n * If the proposal state is not provided, we need to compute it from subgraph data.\n */\n if (proposal.status === ProposalStatus.InQueue) {\n if (Number(proposal.queueEnd) < Date.now() / 1000) {\n return ProposalStatus.PendingExecution;\n }\n }\n\n if (\n GOVERNANCE_ACCELERATE_PROPOSAL &&\n proposalOnChainState === ProposalState.Active &&\n proposal.quorum &&\n BigInt(proposal.quorum) < BigInt(proposal.pollResult.totalTowardsQuorum) &&\n Number(proposal.pollResult.forPercentage) >\n Number(proposal.pollResult.againstPercentage)\n ) {\n return ProposalStatus.PendingQueue;\n }\n\n if (proposal.status === ProposalStatus.Pending) {\n if (\n Number(proposal.voteStartAt) < timestampInSeconds &&\n Number(proposal.voteEndAt) > timestampInSeconds\n ) {\n return ProposalStatus.Active;\n }\n\n if (Number(proposal.voteEndAt) < timestampInSeconds) {\n if (!proposal.pollResult) {\n // Poll result is created after first vote.\n return ProposalStatus.QuorumNotReached;\n }\n\n if (\n !proposal.quorum ||\n BigInt(proposal.quorum) > BigInt(proposal.pollResult.totalTowardsQuorum)\n ) {\n return ProposalStatus.QuorumNotReached;\n }\n\n if (proposal.pollResult?.against > proposal.pollResult?.for) {\n return ProposalStatus.Defeated;\n }\n return ProposalStatus.PendingQueue;\n }\n return ProposalStatus.Pending;\n }\n\n if (\n proposal.status === ProposalStatus.Active &&\n Number(proposal.voteEndAt) < timestampInSeconds\n ) {\n // Proposal can't be active if vote is over\n // So we need to check if it is pending queue or was defeated\n\n if (\n !proposal.quorum ||\n BigInt(proposal.quorum) > BigInt(proposal.pollResult.totalTowardsQuorum)\n ) {\n return ProposalStatus.QuorumNotReached;\n }\n\n if (\n BigInt(proposal.pollResult?.against ?? 0n) >\n BigInt(proposal.pollResult?.for ?? 0n)\n ) {\n return ProposalStatus.Defeated;\n }\n\n return ProposalStatus.PendingQueue;\n }\n\n if (proposal.status === ProposalStatus.InQueue) {\n if (Number(proposal.queueEnd) < Date.now() / 1000) {\n return ProposalStatus.PendingExecution;\n }\n }\n\n return proposal.status;\n}\n","import {\n GetProposals,\n type GetProposalsQuery,\n type GetProposalsQueryVariables,\n type OrderDirection,\n type Proposal_Filter,\n type Proposal_OrderBy,\n type ProposalSelectionFragment,\n SearchProposals,\n type SearchProposalsQuery,\n type SearchProposalsQueryVariables,\n} from \"@berachain/graphql/governance\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { computeActualStatus } from \"./computeActualStatus\";\n\nexport async function getAllProposals({\n where,\n orderBy,\n orderDirection,\n offset = 0,\n perPage = 20,\n text,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n offset?: number;\n where: Proposal_Filter;\n perPage?: number;\n orderBy?: Proposal_OrderBy;\n orderDirection?: OrderDirection;\n text?: string;\n}): Promise<ProposalSelectionFragment[] | undefined> {\n try {\n if (perPage > 1000) {\n throw new Error(\"perPage must be less than 1000\");\n }\n\n const governanceClient = getApolloClient(\"governance.subgraph\", args);\n const [response] = await Promise.all([\n text\n ? governanceClient.query<\n SearchProposalsQuery,\n SearchProposalsQueryVariables\n >({\n query: SearchProposals,\n variables: {\n offset,\n limit: perPage,\n where,\n text,\n },\n })\n : governanceClient.query<GetProposalsQuery, GetProposalsQueryVariables>(\n {\n query: GetProposals,\n variables: {\n offset,\n limit: perPage,\n where,\n orderBy,\n orderDirection,\n },\n },\n ),\n ]);\n\n return response.data.proposals.map((p) => ({\n ...p,\n status: computeActualStatus(p),\n }));\n } catch (e) {\n console.error(\"getAllProposals:\", e);\n throw e;\n }\n}\n","import type {\n CustomProposal,\n CustomProposalErrors,\n GovernanceTopic,\n} from \"~/types/governance\";\nimport { checkProposalField } from \"./checkProposalField\";\n\nexport const getBodyErrors = (\n proposal: CustomProposal,\n currentTopic: GovernanceTopic,\n) => {\n const e: CustomProposalErrors = {};\n e.title = checkProposalField({\n fieldOrType: \"title\",\n value: proposal.title,\n });\n e.description = checkProposalField({\n fieldOrType: \"description\",\n value: proposal.description,\n });\n e.forumLink = checkProposalField({\n fieldOrType: \"forumLink\",\n value: proposal.forumLink,\n baseUrl: currentTopic.forumLink,\n });\n\n return e;\n};\n","import type { PublicClient } from \"viem\";\n\nimport {\n GetProposal,\n type GetProposalQuery,\n type GetProposalQueryVariables,\n type ProposalWithVotesFragment,\n} from \"@berachain/graphql/governance\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { computeActualStatus } from \"./computeActualStatus\";\n\nexport async function getProposalDetails({\n proposalId,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n proposalId: string;\n client?: PublicClient;\n}): Promise<ProposalWithVotesFragment | undefined> {\n const governanceClient = getApolloClient(\"governance.subgraph\", args);\n\n const res = await governanceClient.query<\n GetProposalQuery,\n GetProposalQueryVariables\n >({\n query: GetProposal,\n variables: {\n id: proposalId,\n },\n });\n\n if (!res.data.proposal) {\n return undefined;\n }\n\n return {\n ...res.data.proposal,\n status: computeActualStatus(res.data.proposal),\n } as ProposalWithVotesFragment;\n}\n","import graymatter from \"gray-matter\";\n\nimport type { ProposalSelectionFragment } from \"@berachain/graphql/governance\";\n\nconst parseLegacyBody = (\n s: string,\n): { type: string | null; title: string; content: string } => {\n const pattern = /#(?:([\\w-]+)# )?(.+)\\n([\\s\\S]*)/;\n const match = s.match(pattern);\n\n if (match) {\n const type = match[1] || null;\n const title = match[2];\n const content = match[3].replace(\"\\n\", \"<br />\");\n return {\n type,\n title,\n content,\n };\n }\n\n throw new Error(\"Invalid proposal body\");\n};\n\nexport const parseProposalBody = (\n proposal?: Pick<ProposalSelectionFragment, \"description\">,\n): graymatter.GrayMatterFile<string> & {\n isFrontMatter: boolean;\n} => {\n if (!proposal) {\n return {\n isFrontMatter: false,\n data: { title: \"Loading...\" },\n content: \"\",\n matter: \"\",\n language: \"\",\n orig: \"\",\n stringify: () => \"\",\n };\n }\n\n const body = proposal?.description ?? \"\";\n\n if (graymatter.test(body)) {\n return { ...graymatter(body), isFrontMatter: true };\n }\n\n try {\n const legacyBody = parseLegacyBody(body);\n\n return {\n isFrontMatter: false,\n data: { title: legacyBody.title },\n content: legacyBody.content,\n matter: \"\",\n language: \"\",\n orig: body,\n stringify: () => body,\n };\n } catch {\n return {\n isFrontMatter: false,\n data: {\n title: proposal?.description?.split(\"\\n\")[0].slice(0, 100),\n },\n content: body,\n matter: \"\",\n language: \"\",\n orig: body,\n stringify: () => body,\n };\n }\n};\n","import {\n type Address,\n type PublicClient,\n parseEventLogs,\n type TransactionReceipt,\n} from \"viem\";\n\nimport {\n type ExecutableCallSubsetFragment,\n ProposalStatus,\n type ProposalWithVotesFragment,\n} from \"@berachain/graphql/governance\";\n\nimport { governanceAbi } from \"~/abi/governance/governance\";\nimport { assertPublicClient } from \"~/errors/assert\";\nimport { parseProposalBody } from \"./parseProposalBody\";\n\nexport async function getProposalFromTx(\n args: {\n publicClient: PublicClient | undefined;\n } & (\n | {\n tx: TransactionReceipt;\n }\n | {\n txHash: Address;\n }\n ),\n): Promise<ProposalWithVotesFragment | null> {\n assertPublicClient(args.publicClient);\n\n let tx: TransactionReceipt;\n\n if (\"tx\" in args) {\n tx = args.tx;\n } else {\n tx = await args.publicClient.getTransactionReceipt({ hash: args.txHash });\n }\n\n const creationEvent = tx?.logs\n ? parseEventLogs({\n abi: governanceAbi,\n logs: tx.logs,\n eventName: \"ProposalCreated\",\n })?.at(0)\n : undefined;\n\n if (!tx || !creationEvent) {\n return null;\n }\n\n const block = await args.publicClient.getBlock({\n blockNumber: tx.blockNumber,\n });\n const fm = parseProposalBody({\n description: creationEvent?.args.description as string,\n });\n\n return {\n id: String(creationEvent.args.proposalId),\n proposalId: String(creationEvent?.args.proposalId),\n createdAt: block.timestamp.toString(),\n title: fm.data.title,\n createdAtBlock: block.timestamp.toString(),\n voteStartAt: String(creationEvent?.args.voteStart),\n voteEndAt: String(creationEvent?.args.voteEnd),\n proposer: creationEvent?.args.proposer,\n description: fm.content,\n unverifiedForumLink: fm.data.forumLink,\n pollResult: {\n for: \"0\",\n forVotersCount: 0,\n forPercentage: \"0\",\n against: \"0\",\n againstVotersCount: 0,\n againstPercentage: \"0\",\n abstain: \"0\",\n abstainVotersCount: 0,\n abstainPercentage: \"0\",\n total: \"0\",\n totalVotersCount: 0,\n totalTowardsQuorum: \"0\",\n },\n status: ProposalStatus.Pending,\n quorum: null,\n topics: fm.data.topics,\n votes: [],\n executableCalls: creationEvent?.args.targets.map(\n (target, index) =>\n ({\n __typename: \"ExecutableCall\",\n id: `${tx.transactionHash}-${index}`,\n target: target as Address,\n value: String(creationEvent?.args.values[index]),\n calldata: creationEvent?.args.calldatas[index],\n }) satisfies ExecutableCallSubsetFragment,\n ),\n timelock: undefined,\n } satisfies ProposalWithVotesFragment;\n}\n","import {\n GetProposalVotes,\n type GetProposalVotesQuery,\n type GetProposalVotesQueryVariables,\n} from \"@berachain/graphql/governance\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\n\nexport async function getProposalVotes({\n variables,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n variables: GetProposalVotesQueryVariables;\n}) {\n const governanceClient = getApolloClient(\"governance.subgraph\", args);\n return governanceClient.query<GetProposalVotesQuery>({\n query: GetProposalVotes,\n variables,\n });\n}\n","import {\n Aggregation_Interval,\n GetChartData,\n type GetChartDataQuery,\n type GetChartDataQueryVariables,\n} from \"@berachain/graphql/honey\";\n\nimport { getApolloClient } from \"../clients/getApolloClient\";\nexport async function getChartData({\n days,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n days: number;\n}) {\n const client = getApolloClient(\"honey.subgraph\", args);\n\n const res = await client.query<GetChartDataQuery, GetChartDataQueryVariables>(\n {\n query: GetChartData,\n variables: {\n interval: Aggregation_Interval.Day,\n first: days,\n },\n },\n );\n return res.data;\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport type { Token } from \"~/types/dex\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\n/**\n * Arguments for the getCollateralWeights function.\n */\ninterface GetCollateralWeightsArgs extends BeraJS.BaseFunctionArgs {\n client: PublicClient;\n collateralList: Token[];\n}\n\n/**\n * Fetches the weights of collaterals from the honey factory contract.\n * and returns a record of collateral addresses and their weights.\n *\n * @param {getCollateralWeightsArgs} args - The arguments for the function.\n * @returns {Promise<Record<Address, bigint> | undefined>} A promise that resolves to a record of collateral addresses and their weights, or undefined if an error occurs.\n */\nexport async function getCollateralWeights({\n client,\n collateralList,\n ...args\n}: GetCollateralWeightsArgs): Promise<Record<Address, bigint> | undefined> {\n const { config } = parseBaseArgs(args);\n\n try {\n // Fetch the weights for all collateral assets\n const collateralWeights = await client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"getWeights\",\n });\n\n // Combine the addresses and weights into a single object\n // where each address maps to its corresponding weight\n const weightsWithAddress: Record<Address, bigint> = collateralList.reduce(\n (agg, key, idx) =>\n Object.assign(agg, { [key.address]: collateralWeights[idx] }),\n {},\n );\n\n return weightsWithAddress;\n } catch (e) {\n console.log(e);\n throw e;\n }\n}\n","import { type Address, erc20Abi, type PublicClient } from \"viem\";\n\nimport { initBeraError } from \"~/errors/initBeraError\";\nimport type { MinimalERC20 } from \"~/types/dex\";\n\nexport interface GetTokenInformation {\n address: Address;\n publicClient: PublicClient;\n chainId: number;\n}\n\nexport type GetTokenInformationResponse = MinimalERC20 | undefined;\n\nexport async function getTokenInformation({\n address,\n publicClient,\n chainId,\n}: GetTokenInformation): Promise<GetTokenInformationResponse> {\n try {\n if (!publicClient) {\n throw new Error(\"Public client not found\");\n }\n\n const [decimals, name, symbol] = await Promise.all([\n publicClient.readContract({\n address: address,\n abi: erc20Abi,\n functionName: \"decimals\",\n }),\n publicClient.readContract({\n address: address,\n abi: erc20Abi,\n functionName: \"name\",\n }),\n publicClient.readContract({\n address: address,\n abi: erc20Abi,\n functionName: \"symbol\",\n }),\n ]);\n\n const token = {\n address,\n decimals,\n name,\n symbol,\n chainId,\n };\n if (\n typeof token.decimals !== \"number\" ||\n typeof token.name !== \"string\" ||\n typeof token.symbol !== \"string\"\n )\n throw new Error(`Invalid ERC20 token. Address: ${address}`);\n return token satisfies MinimalERC20;\n } catch (e) {\n console.error(e);\n throw initBeraError({ cause: e });\n }\n}\n","import type { PublicClient } from \"viem\";\n\nimport type { Address } from \"@berachain/config\";\nimport type { EdgeConfigSchema } from \"@berachain/config/internal/edge-config\";\n\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport { getTokenInformation } from \"~/actions/tokens/getTokenInformation\";\nimport type { TokenWithOrder } from \"~/contexts/HoneyConfigProvider\";\nimport type { TokenWithMetadata } from \"~/types/dex\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { isToken } from \"~/utils/tokens\";\n\ninterface GetHoneyCollateralsArgs extends BeraJS.BaseFunctionArgs {\n /**\n * The public client for blockchain interactions\n */\n client: PublicClient;\n /**\n * Optional pre-fetched token data to avoid redundant contract calls\n */\n tokenData?: TokenWithMetadata[];\n /**\n * preferred collateral order coming from edge config\n */\n preferredCollateralOrder?: NonNullable<\n NonNullable<EdgeConfigSchema[\"honey\"]>[\"preferredCollateralOrder\"]\n >[\"mainnet\"];\n}\n\n/**\n * Retrieves and processes collateral tokens for the Honey factory contract.\n * Fetches registered collateral assets from the contract, enriches them with token metadata,\n * and applies configurable ordering overrides.\n *\n * @returns\n * - `collaterals`: Array of collateral tokens with metadata, sorted by contract order and any overrides\n * - `referenceCollateral`: The reference collateral token used for relative & global cap limit\n */\nexport async function getHoneyCollaterals({\n client,\n tokenData,\n preferredCollateralOrder,\n ...args\n}: GetHoneyCollateralsArgs): Promise<{\n collaterals: TokenWithOrder[];\n referenceCollateral: TokenWithOrder;\n}> {\n const { config } = parseBaseArgs(args);\n\n // Get the total number of registered collateral assets\n const [amountOfCollaterals, referenceCollateralAddress] = await Promise.all([\n client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"numRegisteredAssets\",\n }),\n client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"referenceCollateral\",\n }),\n ]);\n\n // Create an array of promises to fetch each registered asset's address\n const promiseList: Promise<Address>[] = [];\n for (let i = 0; i < amountOfCollaterals; i++) {\n promiseList.push(\n client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"registeredAssets\",\n args: [BigInt(i)],\n }),\n );\n }\n\n const collaterals = await Promise.all(promiseList);\n\n // COLLATERALS ==============================================================\n const collateralsTokens = await Promise.all(\n collaterals.map((coll) => {\n // if tokenData of that token exists, use it\n const token = tokenData?.find((token) => isToken(token, coll));\n if (token) {\n return token;\n }\n // in case that specific collateral is missing, fetch the token information from the contract\n return getTokenInformation({\n address: coll,\n chainId: config.chainId,\n publicClient: client,\n });\n }),\n );\n\n // sort the tokens based on contract order and remove eventual undefined values\n const collateralTokens: TokenWithOrder[] = collateralsTokens\n .filter((coll) => !!coll)\n .sort((a, b) => {\n return collaterals.indexOf(a.address) - collaterals.indexOf(b.address);\n })\n .map((coll, idx) => ({\n ...coll,\n order: idx,\n }));\n\n // Now sort them based on the preferredCollateralOrder flag\n if (preferredCollateralOrder?.length) {\n const newCollateralOrder: TokenWithOrder[] = [];\n for (const override of preferredCollateralOrder) {\n const newFirstCollateral = collateralTokens.find((coll) =>\n isToken(coll.address, override.address as Address),\n );\n if (newFirstCollateral) {\n newCollateralOrder.push(newFirstCollateral);\n collateralTokens.splice(\n collateralTokens.indexOf(newFirstCollateral),\n 1,\n );\n }\n }\n collateralTokens.unshift(...newCollateralOrder);\n }\n\n const referenceCollateral = collateralTokens.find((coll) =>\n isToken(coll, referenceCollateralAddress),\n );\n\n if (!collateralTokens) {\n throw new Error(\"Collateral tokens not found\");\n }\n\n if (!referenceCollateral) {\n throw new Error(\"Reference collateral address not found\");\n }\n return {\n collaterals: collateralTokens,\n referenceCollateral,\n };\n}\n","import { type PublicClient, parseUnits } from \"viem\";\n\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport { honeyFactoryReaderAbi } from \"~/abi/honey/honeyFactoryReader\";\nimport type { Token } from \"~/types/dex\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport type { PythLatestUpdates } from \"./getPythLatestPrices\";\n\nexport interface IsBadCollateralArgs extends BeraJS.BaseFunctionArgs {\n client: PublicClient;\n collateral: Token;\n latestPrices: PythLatestUpdates | undefined;\n isPythWrapperEnabled: boolean;\n}\n\nexport interface IsBadCollateralResponse {\n isBlacklisted: boolean;\n isDepegged: boolean;\n}\n\n/**\n * Checks if a given collateral asset is considered bad, either by being blacklisted or depegged.\n *\n * @param {Object} args - The arguments object.\n * @param {PublicClient} args.client - The client used to interact with the blockchain.\n * @param {Token} args.collateral - The collateral asset to check.\n *\n * @returns {Promise<IsBadCollateralResponse | undefined>} An object indicating if the collateral is blacklisted or depegged.\n */\nexport async function isBadCollateralAsset({\n client,\n collateral,\n latestPrices,\n isPythWrapperEnabled,\n ...args\n}: IsBadCollateralArgs): Promise<IsBadCollateralResponse | undefined> {\n const { config } = parseBaseArgs(args);\n\n try {\n const isBadCollateralCall = client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"isBadCollateralAsset\",\n args: [collateral.address],\n });\n\n let isPeggedCall = client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"isPegged\",\n args: [collateral.address],\n });\n\n if (isPythWrapperEnabled && latestPrices) {\n const prices = latestPrices.prices.map((price) => parseUnits(price, 18));\n isPeggedCall = client.readContract({\n address: config.honey.reader,\n abi: honeyFactoryReaderAbi,\n functionName: \"isPeggedWithPrice\",\n args: [collateral.address, prices[0]],\n });\n }\n // Check if the collateral is bad = blacklisted OR depegged\n const [badCollateralResult, isPeggedResult] = await Promise.all([\n isBadCollateralCall,\n isPeggedCall,\n ]);\n\n return {\n isBlacklisted: badCollateralResult,\n isDepegged: !isPeggedResult, // invert the result to get the correct value\n };\n } catch (e) {\n console.log(e);\n throw e;\n }\n}\n","import { type PublicClient, parseEther } from \"viem\";\n\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport type { Token } from \"~/types/dex\";\nimport { CAP_LIMIT_BUFFER } from \"~/utils/constants\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { isToken } from \"~/utils/tokens\";\nimport { getHoneyCollaterals } from \"./getHoneyCollaterals\";\nimport type { PythLatestUpdates } from \"./getPythLatestPrices\";\nimport { getSharesWithoutFees } from \"./getSharesWithoutFees\";\nimport { isBadCollateralAsset } from \"./isBadCollateralAsset\";\n\ninterface GetGlobalCapLimitArgs extends BeraJS.BaseFunctionArgs {\n client: PublicClient;\n asset: Token;\n amount: string;\n isMint: boolean;\n latestPrices: PythLatestUpdates | undefined;\n isPythWrapperEnabled: boolean;\n}\n\nconst ONE_HUNDRED_PERCENT = parseEther(\"1\");\n\n/**\n * Get the global cap limit for the Honey protocol.\n *\n * @param {Object} args - The arguments object.\n * @param {PublicClient} args.client - The client used to interact with the blockchain.\n * @param {Token} args.asset - The asset that is being provided for the exchange.\n * @param {string} args.amount - The amount of the asset.\n *\n * @returns {Promise<boolean | undefined>} If the exchange will trigger the global cap limit or get close to it.\n */\nexport async function getGlobalCapLimit({\n client,\n asset,\n amount,\n isMint,\n isPythWrapperEnabled,\n latestPrices,\n ...args\n}: GetGlobalCapLimitArgs): Promise<boolean | undefined> {\n const { config } = parseBaseArgs(args);\n\n try {\n // Fetch the global cap limit as a bigint\n const globalCap = await client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"globalCap\",\n });\n\n // If the global cap is 100%, then the global cap is not active\n if (globalCap >= ONE_HUNDRED_PERCENT) {\n return false;\n }\n\n const [{ collaterals: registeredAssets }, weights] = await Promise.all([\n getHoneyCollaterals({\n client,\n }),\n getWeights({ client, asset, amount, latestPrices, isPythWrapperEnabled }),\n ]);\n\n if (!weights) {\n return undefined;\n }\n\n for (const idx in weights) {\n if (\n (isMint && isToken(registeredAssets[idx], asset)) ||\n (!isMint && isToken(registeredAssets[idx], asset))\n ) {\n const weight = weights[idx];\n if (weight > globalCap - CAP_LIMIT_BUFFER) {\n return true;\n }\n }\n }\n\n return false;\n } catch (e) {\n console.log(e);\n throw e;\n }\n}\n\n/**\n * Get the weights of the assets in the Honey protocol.\n * taking into account the paused assets but not the blacklisted ones.\n *\n * @param {Object} args - The arguments object.\n * @param {PublicClient} args.client - The client used to interact with the blockchain.\n * @param {Token} args.asset - The asset that is being provided for the exchange.\n * @param {string} args.amount - The amount of the asset.\n *\n * @returns {Promise<Array<bigint> | undefined>} The weights of the assets.\n */\nasync function getWeights({\n client,\n asset,\n amount,\n latestPrices,\n isPythWrapperEnabled,\n}: Required<\n Omit<GetGlobalCapLimitArgs, \"isMint\" | \"chainId\" | \"config\">\n>): Promise<Array<bigint> | undefined> {\n const { collaterals: registeredAssets } = await getHoneyCollaterals({\n client,\n });\n\n let sum = 0n;\n const weights: Array<bigint> = [];\n\n for (const singleAsset of registeredAssets) {\n // TODO: refactor this to use Promise.all\n const isBad = await isBadCollateralAsset({\n client,\n collateral: asset,\n latestPrices,\n isPythWrapperEnabled,\n });\n if (isBad?.isBlacklisted || isBad?.isDepegged) {\n continue;\n }\n\n const share = await getSharesWithoutFees({\n client,\n asset: singleAsset.address,\n amount: isToken(singleAsset, asset) ? amount : \"0\",\n });\n if (!share) {\n continue;\n }\n sum += share;\n weights.push(share);\n }\n\n if (sum === 0n) {\n return weights;\n }\n\n for (const idx in registeredAssets) {\n weights[idx] = parseEther(weights[idx].toString()) / sum;\n }\n\n return weights;\n}\n","import { type Address, type PublicClient, parseEther } from \"viem\";\n\nimport { collateralVaultAbi } from \"~/abi/honey/collateralVault\";\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\n/**\n * Arguments for the getSharesWithoutFees function.\n * The amount is optional because it's used to simulate a mint transaction to change\n * the weights of the assets.\n * This is needed for the global cap limit calculation.\n */\ninterface GetSharesWithoutFeesArgs extends BeraJS.BaseFunctionArgs {\n client: PublicClient;\n asset: Address;\n amount?: string;\n}\n\n/**\n * Get the balance that has been deposited in the asset vault without fees.\n *\n * @param {Object} args - The arguments object.\n * @param {PublicClient} args.client - The client used to interact with the blockchain.\n * @param {Address} args.asset - The address of the asset to get the shares without fees for.\n * @param {string} args.amount - The amount that is being deposited in the asset vault. Used to simulate a mint transaction.\n *\n * @returns {Promise<bigint | undefined>} The shares without fees for the given asset.\n */\nexport async function getSharesWithoutFees({\n client,\n asset,\n amount,\n ...args\n}: GetSharesWithoutFeesArgs): Promise<bigint | undefined> {\n const { config } = parseBaseArgs(args);\n\n try {\n const [vault, fees] = await Promise.all([\n client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"vaults\",\n args: [asset],\n }),\n client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"collectedFees\",\n args: [config.honey.factory, asset],\n }),\n ]);\n\n const balance = await client.readContract({\n address: vault,\n abi: collateralVaultAbi,\n functionName: \"balanceOf\",\n args: [config.honey.factory],\n });\n\n return balance + parseEther(amount ?? \"0\") - fees;\n } catch (e) {\n console.log(e);\n throw e;\n }\n}\n","import {\n GetGlobalData,\n type GetGlobalDataQuery,\n type GetGlobalDataQueryVariables,\n} from \"@berachain/graphql/honey\";\n\nimport { getApolloClient } from \"../clients/getApolloClient\";\n\nexport async function getHoneyGlobalData({\n ...args\n}: BeraJS.BaseFunctionArgs = {}) {\n const client = getApolloClient(\"honey.subgraph\", args);\n const result = await client.query<\n GetGlobalDataQuery,\n GetGlobalDataQueryVariables\n >({\n query: GetGlobalData,\n });\n\n return result.data;\n}\n","import { type Address, type PublicClient, parseUnits } from \"viem\";\n\nimport { honeyFactoryReaderAbi } from \"~/abi/honey/honeyFactoryReader\";\nimport type { TokenWithOrder } from \"~/contexts/HoneyConfigProvider\";\nimport type { Token } from \"~/types/dex\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport type { PythLatestUpdates } from \"./getPythLatestPrices\";\n\nexport enum HoneyPreviewMethod {\n Mint = \"previewMintHoney\",\n MintWithPrice = \"previewMintHoneyWithPrices\",\n RequiredCollateral = \"previewMintCollaterals\",\n RequiredCollateralWithPrice = \"previewMintCollateralsWithPrices\",\n Redeem = \"previewRedeemCollaterals\",\n RedeemWithPrice = \"previewRedeemCollateralsWithPrices\",\n HoneyToRedeem = \"previewRedeemHoney\",\n HoneyToRedeemWithPrice = \"previewRedeemHoneyWithPrices\",\n}\n\nexport interface HoneyPreviewArgs extends BeraJS.BaseFunctionArgs {\n client: PublicClient;\n collateral: Token;\n collateralList: TokenWithOrder[];\n amount: string;\n method: HoneyPreviewMethod;\n latestPrices?: PythLatestUpdates;\n isPythWrapperEnabled: boolean;\n}\n\nexport interface HoneyPreviewResult {\n collaterals: Record<Address, bigint>;\n honey: bigint;\n}\n\nexport interface HoneyPreviewReadResult {\n collaterals: bigint[];\n honey: bigint;\n}\n\n/**\n * Calculates preview amounts for Honey protocol operations including minting and redeeming.\n * This function handles different preview methods to calculate either the amount of Honey tokens\n * that can be minted with given collateral or the amount of collateral needed to mint/redeem Honey tokens.\n *\n * @param {Object} params - The parameters for the preview calculation\n * @param {PublicClient} params.client - The Viem public client for blockchain interaction\n * @param {Token} params.collateral - The primary collateral token being used\n * @param {Address[]} params.collateralList - List of all supported collateral tokens\n * @param {string} params.amount - The amount to calculate preview for (in token units)\n * @param {HoneyPreviewMethod} params.method - The type of preview calculation to perform\n * @param {PythLatestUpdates | undefined} params.latestPrices - Optional latest price updates from Pyth oracle\n *\n * @returns {Promise<HoneyPreviewResult | undefined>} An object containing:\n * - collaterals: Record mapping collateral token addresses to their respective amounts\n * - honey: The amount of Honey tokens involved in the operation\n *\n * @throws {Error} If there's an error during the contract interaction or calculation\n */\nexport async function getHoneyPreview({\n client,\n collateral,\n collateralList,\n amount,\n method,\n latestPrices,\n isPythWrapperEnabled,\n ...baseArgs\n}: HoneyPreviewArgs): Promise<HoneyPreviewResult | undefined> {\n const { config } = parseBaseArgs(baseArgs);\n\n try {\n // Utils to know if the amount is in Honey or in another collateral token\n const isAmountHoney =\n method === HoneyPreviewMethod.Mint ||\n method === HoneyPreviewMethod.HoneyToRedeem ||\n method === HoneyPreviewMethod.MintWithPrice ||\n method === HoneyPreviewMethod.HoneyToRedeemWithPrice;\n const formattedAmount = parseUnits(\n amount,\n isAmountHoney ? collateral.decimals : 18,\n );\n\n let formattedResult: HoneyPreviewReadResult;\n let args:\n | readonly [Address, bigint, bigint[]]\n | readonly [Address, bigint] = [collateral.address, formattedAmount];\n\n // If pyth is active we need to read the preview with the prices in order to have a correct READ on the\n // basket mode (this READ is made by the contract internally)\n if (isPythWrapperEnabled && latestPrices) {\n const prices = latestPrices.prices.map((price) => parseUnits(price, 18));\n args = [collateral.address, formattedAmount, prices];\n }\n\n // This If-ELSE is needed cause the returned object is different depending on the method\n if (isAmountHoney) {\n const result = (await client.readContract({\n address: config.honey.reader,\n abi: honeyFactoryReaderAbi,\n functionName: method,\n args: args,\n })) as [bigint[], bigint];\n\n formattedResult = {\n collaterals: result[0],\n honey: result[1],\n };\n } else {\n const result = (await client.readContract({\n address: config.honey.reader,\n abi: honeyFactoryReaderAbi,\n functionName: method,\n args: args,\n })) as bigint[];\n\n formattedResult = {\n collaterals: result,\n honey: formattedAmount,\n };\n }\n\n const amountsWithAddress: Record<Address, bigint> = collateralList.reduce(\n (agg, key) => {\n const idx = key.order;\n if (\n key.address === collateral.address &&\n formattedResult.collaterals[idx] === BigInt(0)\n ) {\n return Object.assign(agg, {\n [key.address]: formattedResult.collaterals[0],\n });\n }\n return Object.assign(agg, {\n [key.address]: formattedResult.collaterals[idx],\n });\n },\n {},\n );\n\n if (amountsWithAddress[collateral.address] === BigInt(0)) {\n amountsWithAddress[collateral.address] = formattedResult.collaterals[0];\n }\n\n return {\n collaterals: amountsWithAddress,\n honey: formattedResult.honey,\n };\n } catch (e) {\n console.log(\"error\", e);\n throw e;\n }\n}\n","import { type Address, formatUnits, type PublicClient } from \"viem\";\n\nimport { collateralVaultAbi } from \"~/abi/honey/collateralVault\";\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport type { BalanceToken, Token } from \"~/types/dex\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\ninterface GetVaultsBalancesArgs extends BeraJS.BaseFunctionArgs {\n client: PublicClient;\n collateralList: Token[];\n honeyFactoryAddress?: Address;\n}\n\nexport interface GetHoneyVaultsBalanceResponse extends BalanceToken {\n vault: Address;\n}\n\nexport async function getHoneyVaultsBalance({\n client,\n collateralList,\n honeyFactoryAddress,\n ...args\n}: GetVaultsBalancesArgs): Promise<GetHoneyVaultsBalanceResponse[]> {\n const { config } = parseBaseArgs(args);\n const factory = honeyFactoryAddress ?? config.honey.factory;\n\n const vaults = await Promise.all(\n collateralList.map(async (coll) => {\n const vault = await client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"vaults\",\n args: [coll.address],\n });\n\n const [\n shares,\n // this is most likely 0 since we're sending fees to PolFeeCollector\n // here for future proofing\n feeShares,\n // if balance is held in a custodian, we need to return the custodian address\n [isCustodian, custodianAddress],\n ] = await Promise.all([\n client.readContract({\n address: vault,\n abi: collateralVaultAbi,\n functionName: \"balanceOf\",\n args: [factory],\n }),\n client.readContract({\n address: factory,\n abi: honeyFactoryAbi,\n functionName: \"collectedAssetFees\",\n args: [coll.address],\n }),\n client.readContract({\n address: vault,\n abi: collateralVaultAbi,\n functionName: \"custodyInfo\",\n }),\n ]);\n\n const balance = await client.readContract({\n address: vault,\n abi: collateralVaultAbi,\n functionName: \"convertToAssets\",\n args: [shares - feeShares],\n });\n\n return {\n ...coll,\n balance: {\n raw: balance.toString(),\n formatted: formatUnits(balance, coll.decimals),\n },\n vault: isCustodian ? custodianAddress : vault,\n };\n }),\n );\n\n return vaults;\n}\n","import { HermesClient } from \"@pythnetwork/hermes-client\";\nimport { formatUnits } from \"viem\";\n\nconst pythEndpoint = \"https://hermes.pyth.network\";\n\n/**\n * Interface representing the latest Pyth price updates\n * @interface PythLatestUpdates\n * @property {`0x${string}`[]} calldata - Array of hex-encoded calldata for price updates\n * @property {string[]} prices - Array of formatted price strings\n */\nexport interface PythLatestUpdates {\n calldata: `0x${string}`[];\n prices: string[];\n}\n\n/**\n * Fetches the latest price updates from Pyth Network's Hermes service\n * @param {Object} params - The parameters object\n * @param {string[]} params.priceFeedId - Array of Pyth price feed IDs to fetch updates for\n * @returns {Promise<PythLatestUpdates>} Promise resolving to the latest price updates\n * @example\n * ```ts\n * const updates = await getPythLatestPrices({\n * priceFeedId: [\"0x123...\", \"0x456...\"]\n * });\n * ```\n */\nexport async function getPythLatestPrices({\n priceFeedId,\n}: {\n priceFeedId: string[];\n}): Promise<PythLatestUpdates> {\n const hermesClient = new HermesClient(pythEndpoint, {});\n const updates = await hermesClient.getLatestPriceUpdates(priceFeedId, {\n encoding: \"hex\",\n parsed: true,\n });\n\n /**\n * the Prices need to be formatted first with the exponent value passed with the\n * pyth price feed.\n * The expo reppresent the confidence interval of the price.\n * To use this price we need to format it again with the decimals of the token.\n */\n\n return {\n calldata: updates.binary.data.map((d) => `0x${d}` as `0x${string}`),\n prices:\n updates.parsed?.flatMap((p) =>\n formatUnits(BigInt(p.price.price), p.price.expo * -1),\n ) ?? [],\n };\n}\n","import { type Address, type PublicClient, parseEther } from \"viem\";\n\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport type { TokenWithOrder } from \"~/contexts/HoneyConfigProvider\";\nimport { CAP_LIMIT_BUFFER } from \"~/utils/constants\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { getSharesWithoutFees } from \"./getSharesWithoutFees\";\n\ninterface GetRelativeCapLimitArgs extends BeraJS.BaseFunctionArgs {\n client: PublicClient;\n asset: Address;\n amount: string;\n isMint: boolean;\n referenceCollateral: TokenWithOrder;\n}\n\n/**\n * Get the relative cap limit for a given asset.\n *\n * @param {Object} args - The arguments object.\n * @param {PublicClient} args.client - The client used to interact with the blockchain.\n * @param {Address} args.asset - The address of the asset to get the relative cap limit for.\n * @param {string} args.amount - The amount of the asset to get the relative cap limit for.\n * @param {boolean} args.isMint - Whether the transaction is a mint or a redeem.\n *\n * @returns {Promise<boolean | undefined>} If the asset is relatively capped.\n */\nexport async function getRelativeCapLimit({\n client,\n asset,\n amount,\n isMint,\n referenceCollateral,\n ...args\n}: GetRelativeCapLimitArgs): Promise<boolean | undefined> {\n const { config } = parseBaseArgs(args);\n\n if (asset === referenceCollateral.address) {\n // reference collateral is never capped, as it would be relative to itself\n return false;\n }\n\n try {\n const [assetRelativeCap] = await Promise.all([\n client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"relativeCap\",\n args: [asset],\n }),\n ]);\n\n const [assetBalance, referenceCollateralBalance] = await Promise.all([\n getSharesWithoutFees({\n client,\n asset,\n amount: isMint ? amount : undefined,\n }),\n getSharesWithoutFees({\n client,\n asset: referenceCollateral.address,\n amount: isMint ? undefined : amount,\n }),\n ]);\n\n if (referenceCollateralBalance === 0n) {\n // If the balance of the asset is 0, it means that is capped`\n // because the refence asset has also 0 balance.\n return assetBalance !== 0n;\n }\n\n const weight =\n parseEther((assetBalance ?? 0n).toString()) /\n (referenceCollateralBalance ?? 0n);\n if (weight >= assetRelativeCap - CAP_LIMIT_BUFFER) {\n return true;\n }\n return false;\n } catch (e) {\n console.log(e);\n throw e;\n }\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { pythAbi } from \"~/abi/pyth/pyth\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getPythUpdateFee({\n client,\n priceFeedId,\n ...args\n}: {\n client: PublicClient;\n priceFeedId: Address[];\n} & BeraJS.BaseFunctionArgs) {\n const { config } = parseBaseArgs(args);\n try {\n const result = await client.readContract({\n address: config.external.pyth,\n abi: pythAbi,\n functionName: \"getUpdateFee\",\n args: [priceFeedId],\n });\n return result;\n } catch (e) {\n console.error(\"getPythUpdateFee\", e);\n throw e;\n }\n}\n","import {\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type PublicClient,\n parseUnits,\n} from \"viem\";\n\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport { pythWrapperAbi } from \"~/abi/honey/pythWrapper\";\nimport type { IHoneySwapState } from \"~/hooks/honey/useHoneySwapState\";\nimport type { TokenWithMetadata } from \"~/types/dex\";\nimport type { PythPriceFeedMap } from \"~/types/honeySwap\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { getPythDefaultUpdateFee } from \"~/utils/pythHoneyUtils\";\nimport { getHoneyToken } from \"~/utils/tokens\";\nimport { getPythUpdateFee } from \"../pyth/getUpdateFee\";\nimport { getPythLatestPrices } from \"./getPythLatestPrices\";\n\ninterface GetSwapPayloadReturn {\n address: Address;\n abi: Abi;\n functionName: \"mint\" | \"redeem\";\n params:\n | ContractFunctionArgs<typeof pythWrapperAbi, \"payable\", \"mint\" | \"redeem\">\n | ContractFunctionArgs<\n typeof honeyFactoryAbi,\n \"nonpayable\",\n \"mint\" | \"redeem\"\n >;\n value: bigint;\n}\n\nexport const getSwapPayload = async ({\n state,\n publicClient,\n priceFeedMap,\n collateralList,\n isPythWrapperEnabled,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n state: Pick<\n IHoneySwapState,\n \"actionType\" | \"fromAmount\" | \"collaterals\" | \"isBasketModeEnabled\"\n >;\n collateralList: TokenWithMetadata[];\n publicClient: PublicClient | undefined;\n priceFeedMap?: PythPriceFeedMap;\n isPythWrapperEnabled: boolean;\n}): Promise<({ account }: { account: Address }) => GetSwapPayloadReturn> => {\n const { config } = parseBaseArgs(args);\n const honeyToken = getHoneyToken(args);\n const { actionType, fromAmount, collaterals, isBasketModeEnabled } = state;\n const destinationContractAddress = isPythWrapperEnabled\n ? config.honey.pythWrapper\n : config.honey.factory;\n const pairMainAddress = collateralList.map((coll) => coll.address);\n if (fromAmount[0] && !!pairMainAddress.length) {\n const isMint = actionType === \"mint\";\n if (isPythWrapperEnabled && publicClient && priceFeedMap) {\n // to mint or redeem we need to update the prices for all the collaterals\n // get the price feed ids from pyth to update the calldata\n const latestPrices = await getPythLatestPrices({\n priceFeedId: Object.values(priceFeedMap),\n });\n const calldata = latestPrices.calldata;\n let pythUpdateFee: bigint = 0n;\n try {\n // get the update fee from pyth that will be used inside the contract to update the prices\n pythUpdateFee = await getPythUpdateFee({\n client: publicClient,\n priceFeedId: calldata,\n });\n } catch {\n // if the update fee fails, we will use the default update fee\n pythUpdateFee = getPythDefaultUpdateFee(collaterals.length);\n }\n\n return ({ account }) => {\n const pythPayload: ContractFunctionArgs<\n typeof pythWrapperAbi,\n \"payable\",\n \"mint\" | \"redeem\"\n > = [\n calldata,\n collaterals[0]?.address,\n parseUnits(\n fromAmount[0],\n (isMint ? collaterals[0]?.decimals : honeyToken?.decimals) ?? 18,\n ),\n account,\n !!isBasketModeEnabled,\n ];\n\n return {\n address: destinationContractAddress,\n abi: pythWrapperAbi,\n functionName: isMint ? \"mint\" : \"redeem\",\n params: pythPayload,\n value: pythUpdateFee,\n };\n };\n }\n\n return ({ account }) => {\n const defaultPayload: ContractFunctionArgs<\n typeof honeyFactoryAbi,\n \"nonpayable\",\n \"mint\" | \"redeem\"\n > = [\n collaterals[0]?.address,\n parseUnits(\n fromAmount[0],\n (isMint ? collaterals[0]?.decimals : honeyToken?.decimals) ?? 18,\n ),\n account,\n !!isBasketModeEnabled,\n ];\n return {\n value: 0n,\n address: destinationContractAddress,\n abi: honeyFactoryAbi,\n functionName: isMint ? \"mint\" : \"redeem\",\n params: defaultPayload,\n };\n };\n }\n\n throw new Error(\"Something went wrong while creating the Honey swap payload\");\n};\n","import { type PublicClient, parseUnits } from \"viem\";\n\nimport { honeyFactoryAbi } from \"~/abi/honey/honeyFactory\";\nimport { honeyFactoryReaderAbi } from \"~/abi/honey/honeyFactoryReader\";\nimport type { Token } from \"~/types/dex\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport type { PythLatestUpdates } from \"./getPythLatestPrices\";\n\nexport async function isBasketModeEnabled({\n client,\n isMint,\n collateralList,\n latestPrices,\n isPythWrapperEnabled,\n ...args\n}: {\n client: PublicClient;\n isMint: boolean;\n collateralList: Token[];\n latestPrices: PythLatestUpdates | undefined;\n isPythWrapperEnabled: boolean;\n} & BeraJS.BaseFunctionArgs): Promise<boolean | undefined> {\n const { config } = parseBaseArgs(args);\n\n if (isPythWrapperEnabled && latestPrices) {\n if (collateralList.length === 0) return undefined;\n\n const prices = latestPrices.prices.map((price) => parseUnits(price, 18));\n\n const isActive = await client.readContract({\n address: config.honey.reader,\n abi: honeyFactoryReaderAbi,\n functionName: \"isBasketModeEnabledWithPrices\",\n args: [isMint, prices],\n });\n\n return isActive;\n }\n\n const isActive = await client.readContract({\n address: config.honey.factory,\n abi: honeyFactoryAbi,\n functionName: \"isBasketModeEnabled\",\n args: [isMint],\n });\n return isActive;\n}\n","import type { PublicClient } from \"viem\";\n\nimport { assertDefined, assertPublicClient } from \"~/errors/assert\";\nimport { msToSeconds } from \"~/utils/time\";\n\n/**\n * Gets the timestamp of a block or an estimated timestamp if the block is in the future.\n * @returns\n */\nexport async function getBlockTimestamp({\n block,\n currentBlock,\n blockTime,\n publicClient,\n}: {\n block: number | bigint | string;\n currentBlock: number | bigint | string;\n blockTime: number;\n publicClient: PublicClient;\n}): Promise<{ timestamp: number }> {\n assertDefined(block, \"block\");\n assertPublicClient(publicClient);\n\n if (currentBlock > block) {\n const blockData = await publicClient.getBlock({\n blockNumber: BigInt(block),\n includeTransactions: false,\n });\n\n return {\n timestamp: Number(blockData.timestamp),\n };\n }\n const ts =\n msToSeconds(Date.now()) +\n blockTime * (Number(block) - Number(currentBlock));\n\n return {\n timestamp: ts,\n };\n}\n","import { type Address, formatUnits, type PublicClient } from \"viem\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\nimport { msToSeconds } from \"~/utils/time\";\n\nexport enum RewardVaultDistributionMode {\n Duration = \"duration\",\n TargetRate = \"targetRate\",\n TargetApr = \"targetApr\",\n}\nexport interface GetRewardVaultRewardsReturn {\n rewardsDuration: number;\n manager: Address;\n /**\n * The amount of BGT that will be distributed per second\n */\n rewardRate: string;\n /**\n * The timestamp when rewards will be depleted\n */\n periodFinish: number;\n /**\n * The amount of BGT that will be distributed from now until the periodFinish timestamp\n */\n availableRewards: string;\n /**\n * The amount of BGT that will be distributed per second.\n *\n * If this is 0, the duration mode is active.\n */\n targetRewardsPerSecond: string;\n /**\n * The minimum reward duration for the target rate\n */\n minRewardDurationForTargetRate: number;\n /**\n * The current mode of the vault\n */\n mode:\n | RewardVaultDistributionMode.Duration\n | RewardVaultDistributionMode.TargetRate;\n}\n\nexport async function getRewardVaultRewards(\n address: Address,\n publicClient: PublicClient,\n): Promise<GetRewardVaultRewardsReturn> {\n const [\n rewardsDuration,\n manager,\n rewardRate,\n periodFinish,\n targetRewardsPerSecond,\n minRewardDurationForTargetRate,\n ] = await Promise.all([\n publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"rewardsDuration\",\n }),\n publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"rewardVaultManager\",\n }),\n\n publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"rewardRate\",\n }),\n publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"periodFinish\",\n }),\n publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"targetRewardsPerSecond\",\n }),\n publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"minRewardDurationForTargetRate\",\n }),\n ]);\n\n const availableRewards =\n (rewardRate * (periodFinish - BigInt(msToSeconds(Date.now())))) /\n 10n ** 18n;\n\n return {\n rewardsDuration: Number(rewardsDuration),\n mode:\n targetRewardsPerSecond === 0n\n ? RewardVaultDistributionMode.Duration\n : RewardVaultDistributionMode.TargetRate,\n manager,\n\n // 36 decimals for the reward rate\n rewardRate: formatUnits(rewardRate, 36),\n periodFinish: Number(periodFinish),\n // 36 decimals for the reward rate\n availableRewards: formatUnits(availableRewards, 18),\n minRewardDurationForTargetRate: Number(minRewardDurationForTargetRate),\n targetRewardsPerSecond: formatUnits(targetRewardsPerSecond, 36),\n };\n}\n","import { msToSeconds, yearsInSeconds } from \"~/utils/time\";\nimport { RewardVaultDistributionMode } from \"./getRewardVaultRewards\";\n\nexport type GetBgtAprSimulationArgs = {\n /**\n * Staked TVL of the vault in USD.\n *\n * Null if not available\n */\n tvl: number | null;\n\n /**\n * Price of BGT in USD\n */\n bgtPrice: number;\n\n /**\n * Undistributed BGT rewards\n */\n availableRewards: number;\n\n /**\n * Finish period of the reward distribution in seconds\n */\n periodFinish: number;\n\n /**\n * Current duration of the reward distribution in seconds. This will be used if the reward rate is 0.\n *\n */\n currentDuration: number;\n\n /**\n * Maximum reward duration in seconds\n */\n MAX_REWARD_DURATION: number;\n\n /**\n * Minimum reward duration in seconds\n */\n MIN_REWARD_DURATION: number;\n} & (\n | {\n /**\n *\n */\n mode: RewardVaultDistributionMode.TargetApr;\n apr: number;\n /**\n * Minimum reward duration for the target rate\n */\n minRewardDurationForTargetRate: number;\n }\n | {\n /**\n *\n */\n mode: RewardVaultDistributionMode.TargetRate;\n rewardRate: number;\n /**\n * Minimum reward duration for the target rate\n */\n minRewardDurationForTargetRate: number;\n }\n | {\n /**\n *\n */\n mode: RewardVaultDistributionMode.Duration;\n /**\n * Duration of the reward distribution in seconds\n */\n duration: number;\n rewardRate?: never;\n /**\n * Must be between MIN_REWARD_DURATION and MAX_REWARD_DURATION\n */\n minRewardDurationForTargetRate?: never;\n }\n);\n\nexport type GetBgtAprSimulationResult = {\n apr: number | null;\n duration: number;\n rewardRate: number;\n periodFinish: number;\n /**\n * It's the input target rate for the target rate mode.\n *\n * If input was target apr, it will be the calculated reward rate.\n *\n * If input was duration, it will be null.\n */\n targetRate: string | null;\n /**\n * If the mode is changed, this will be the new mode. Null otherwise.\n */\n mode: RewardVaultDistributionMode | null;\n};\n\nfunction _getApr(tvl: number | null, bgtPrice: number, rewardRate: number) {\n // If TVL is null, there is no price for staking, so we return null\n // Also if it's falsy, we return null as well\n return tvl ? (rewardRate * bgtPrice * yearsInSeconds(1)) / tvl : null;\n}\n\nfunction _getRewardRate(apr: number, bgtPrice: number, tvl: number | null) {\n return tvl ? (apr * tvl) / (bgtPrice * yearsInSeconds(1)) : 0;\n}\n\nexport function getBgtAprSimulation({\n availableRewards,\n periodFinish,\n tvl,\n bgtPrice,\n MIN_REWARD_DURATION,\n MAX_REWARD_DURATION,\n ...args\n}: GetBgtAprSimulationArgs): GetBgtAprSimulationResult {\n const currentTime = msToSeconds(Date.now());\n\n if (currentTime > periodFinish) {\n return {\n apr: 0,\n duration: 0,\n rewardRate: 0,\n targetRate: null,\n periodFinish: 0,\n mode: null,\n };\n }\n\n if (args.mode === \"targetRate\" || args.mode === \"targetApr\") {\n let rewardRate: number;\n const {\n minRewardDurationForTargetRate: _providedMinRewardDurationForTargetRate,\n currentDuration,\n } = args;\n\n if (args.mode === \"targetRate\") {\n rewardRate = args.rewardRate;\n } else {\n rewardRate = _getRewardRate(args.apr, bgtPrice, tvl);\n }\n\n if (rewardRate === 0) {\n const newDuration = Math.min(currentDuration, MAX_REWARD_DURATION);\n const rewardRate = availableRewards ? availableRewards / newDuration : 0;\n\n return {\n apr: _getApr(tvl, bgtPrice, rewardRate),\n // When switching to duration mode, the current duration will be used if it's in the allowed range.\n // Current duration on chain can never be lower than MIN_REWARD_DURATION, so we just check the max.\n duration: newDuration,\n rewardRate,\n targetRate: null,\n periodFinish: newDuration + currentTime,\n mode: RewardVaultDistributionMode.Duration,\n };\n }\n\n const minRewardDurationForTargetRate =\n // minRewardDurationForTargetRate might be zero the first time the target rate is set.\n // If it's not set, we use the max reward duration.\n _providedMinRewardDurationForTargetRate || MIN_REWARD_DURATION;\n\n const duration = availableRewards ? availableRewards / rewardRate : 0;\n\n if (duration < minRewardDurationForTargetRate) {\n const rewardRate = availableRewards\n ? availableRewards / minRewardDurationForTargetRate\n : 0;\n return {\n apr: _getApr(tvl, bgtPrice, rewardRate),\n duration: minRewardDurationForTargetRate,\n rewardRate,\n targetRate: rewardRate.toString(),\n periodFinish: minRewardDurationForTargetRate + currentTime,\n mode: null,\n };\n }\n\n return {\n apr: _getApr(tvl, bgtPrice, rewardRate),\n duration: duration,\n rewardRate,\n targetRate: rewardRate.toString(),\n periodFinish: duration + currentTime,\n mode: null,\n };\n }\n\n const { duration } = args;\n\n const newRewardRate = availableRewards / duration;\n\n const apr = _getApr(tvl, bgtPrice, newRewardRate);\n\n return {\n apr,\n mode: null,\n targetRate: null,\n duration,\n rewardRate: newRewardRate,\n periodFinish: duration + currentTime,\n };\n}\n","import type { Address } from \"viem\";\n\nimport { beraFetchJson } from \"~/utils/beraFetch\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\ntype StakingHistoryData = {\n currentDepositRate: string;\n earningsRealized: string;\n earningsTotal: string;\n};\n\ntype GetEarnedStakedBeraVaultArgs = {\n /**\n * The token that the user has staked\n */\n address: Address;\n /**\n * The account that the user has staked\n */\n account: Address;\n};\nexport async function getEarnedStakedBeraVault({\n address,\n account,\n ...args\n}: BeraJS.BaseFunctionArgs &\n GetEarnedStakedBeraVaultArgs): Promise<StakingHistoryData> {\n const { config } = parseBaseArgs(args);\n const url = `${config.bonder}/vaults/${address}/earnings/${account}`;\n return beraFetchJson<StakingHistoryData>(url);\n}\n","import { type Address, formatUnits, type PublicClient } from \"viem\";\n\nimport {\n type ApiVaultFragment,\n GetVaults,\n type GetVaultsQuery,\n type GetVaultsQueryVariables,\n} from \"@berachain/graphql/pol/api\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\n\nexport interface GetGaugeData {\n gaugeList: ApiVaultFragment[];\n pagination: {\n currentPage: number;\n totalCount: number;\n };\n}\n\nexport async function getRewardVaults({\n filter,\n publicClient,\n ...args\n}: {\n filter?: GetVaultsQueryVariables;\n publicClient?: PublicClient | undefined;\n} & BeraJS.BaseFunctionArgs = {}): Promise<GetGaugeData> {\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const res = await bexApiGraphqlClient.query<\n GetVaultsQuery,\n GetVaultsQueryVariables\n >({\n query: GetVaults,\n variables: filter,\n });\n\n const incentives = await Promise.allSettled(\n res.data.polGetRewardVaults.vaults.map(async (vault) => {\n if (!publicClient) return undefined;\n\n return Promise.allSettled(\n vault.activeIncentives.map((incentive) =>\n publicClient.readContract({\n abi: rewardVaultAbi,\n address: vault.address as Address,\n functionName: \"incentives\",\n args: [incentive.tokenAddress as Address],\n }),\n ),\n );\n }),\n );\n\n const vaults = res.data.polGetRewardVaults.vaults.map((vault, index) => {\n let totalIncentiveInUsdc = 0;\n\n const incentivesArray: typeof vault.activeIncentives =\n vault.activeIncentives.map((apiIncentive, incIdx) => {\n const tokenPrice =\n Number(apiIncentive.remainingAmountUsd) &&\n Number(apiIncentive.remainingAmount)\n ? Number(apiIncentive.remainingAmountUsd) /\n Number(apiIncentive.remainingAmount)\n : 0;\n\n const remainingAmount =\n incentives[index]?.status === \"fulfilled\" &&\n incentives[index]?.value?.[incIdx]?.status === \"fulfilled\"\n ? formatUnits(\n BigInt(incentives[index].value[incIdx].value[2]),\n apiIncentive.token.decimals,\n )\n : apiIncentive.remainingAmount;\n\n totalIncentiveInUsdc += Number(remainingAmount) * Number(tokenPrice);\n\n return {\n ...apiIncentive,\n remainingAmount,\n };\n });\n\n return {\n ...vault,\n dynamicData: {\n ...vault.dynamicData,\n allTimeReceivedBGTAmount:\n vault.dynamicData?.allTimeReceivedBGTAmount ?? \"0\",\n bgtCapturePercentage: vault.dynamicData?.bgtCapturePercentage ?? \"0\",\n activeIncentivesValueUsd: totalIncentiveInUsdc.toString(),\n activeIncentivesRateUsd:\n vault.dynamicData?.activeIncentivesRateUsd ?? \"0\",\n bgtCapturePerBlock: vault.dynamicData?.bgtCapturePerBlock ?? \"0\",\n },\n activeIncentives: incentivesArray,\n } satisfies typeof vault;\n });\n\n return {\n pagination: res.data.polGetRewardVaults.pagination,\n gaugeList: vaults!,\n };\n}\n","import type { GqlChain } from \"@berachain/graphql/dex/api\";\nimport {\n GlobalData,\n type GlobalDataQuery,\n type GlobalDataQueryVariables,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\ntype ReturnedFromQuery = GlobalDataQuery[\"polGetGlobalInfo\"] & {\n top3EmittingValidators: GlobalDataQuery[\"top3EmittingValidators\"][\"validators\"];\n allValidatorsCount: number;\n};\n\nexport interface GlobalInfo extends Partial<ReturnedFromQuery> {}\n\nexport async function getBGTGlobalInfo(\n args: BeraJS.BaseFunctionArgs = {},\n): Promise<GlobalInfo> {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const apiRes = await bexApiGraphqlClient.query<\n GlobalDataQuery,\n GlobalDataQueryVariables\n >({\n query: GlobalData,\n variables: {\n chain: config.bex.chainName as GqlChain,\n },\n });\n\n const data = apiRes.data;\n\n // allValidatorCount include inactive validators for the purpose of ranking\n return {\n ...data.polGetGlobalInfo,\n top3EmittingValidators: apiRes.data.top3EmittingValidators.validators,\n allValidatorsCount: apiRes.data.allValidatorsCount.pagination.totalCount,\n } satisfies GlobalInfo;\n}\n","import { formatEther, type PublicClient } from \"viem\";\n\nimport { bgtAbi } from \"~/abi/pol/bgt\";\nimport { assertPublicClient } from \"~/errors/assert\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport interface GetBgtTokenTotalBoosts extends BeraJS.BaseFunctionArgs {\n publicClient: PublicClient | undefined;\n}\n\nexport async function getBgtTokenTotalBoosts({\n publicClient,\n ...args\n}: GetBgtTokenTotalBoosts): Promise<string> {\n const { config } = parseBaseArgs(args);\n assertPublicClient(publicClient);\n\n try {\n const result = await publicClient.readContract({\n address: config.tokens.bgt,\n abi: bgtAbi,\n functionName: \"totalBoosts\",\n args: [],\n });\n return formatEther(result);\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n","import { erc20Abi, formatEther, type PublicClient } from \"viem\";\n\nimport { assertPublicClient } from \"~/errors/assert\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport interface GetBgtTokenTotalSupply extends BeraJS.BaseFunctionArgs {\n publicClient: PublicClient | undefined;\n}\n\nexport async function getBgtTokenTotalSupply({\n publicClient,\n ...args\n}: GetBgtTokenTotalSupply): Promise<string> {\n const { config } = parseBaseArgs(args);\n assertPublicClient(publicClient);\n\n try {\n const result = await publicClient.readContract({\n address: config.tokens.bgt,\n abi: erc20Abi,\n functionName: \"totalSupply\",\n args: [],\n });\n return formatEther(result ?? 0n);\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n","import {\n type ApiVaultFragment,\n GqlRewardVaultOrderBy,\n GqlRewardVaultOrderDirection,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getRewardVaults } from \"./getRewardVaults\";\n\nexport async function getGlobalCuttingBoard(\n threshold: number,\n): Promise<ApiVaultFragment[]> {\n const { gaugeList } = await getRewardVaults({\n filter: {\n // TODO sort by bgt capture percentage\n orderBy: GqlRewardVaultOrderBy.Apr,\n orderDirection: GqlRewardVaultOrderDirection.Desc,\n pageSize: threshold,\n where: {\n includeNonWhitelisted: false,\n },\n },\n });\n\n return gaugeList;\n}\n","import type { PublicClient } from \"viem\";\n\nimport type { ApiVaultFragment } from \"@berachain/graphql/pol/api\";\n\nimport { BeraMonitoring } from \"~/errors/BeraMonitoring\";\nimport { initBeraError } from \"~/errors/initBeraError\";\nimport { type GlobalInfo, getBGTGlobalInfo } from \"./getBGTGlobalInfo\";\nimport { getBgtTokenTotalBoosts } from \"./getBgtTokenTotalBoosts\";\nimport { getBgtTokenTotalSupply } from \"./getBgtTokenTotalSupply\";\nimport { getGlobalCuttingBoard } from \"./getGlobalCuttingBoard\";\n\nexport interface GlobalData extends GlobalInfo {\n globalCuttingBoard: ApiVaultFragment[] | undefined;\n bgtTotalSupply: string | undefined;\n bgtTotalBoosts: string | undefined;\n}\nexport async function getGlobalData(\n publicClient: PublicClient,\n): Promise<GlobalData> {\n const [\n globalDataRes,\n globalCuttingBoardRes,\n bgtTotalSupplyRes,\n bgtTotalBoostsRes,\n ] = await Promise.allSettled([\n getBGTGlobalInfo(),\n getGlobalCuttingBoard(300),\n getBgtTokenTotalSupply({\n publicClient,\n }),\n getBgtTokenTotalBoosts({\n publicClient,\n }),\n ]);\n\n if (globalDataRes.status === \"rejected\") {\n BeraMonitoring.captureException(\n initBeraError({ cause: globalDataRes.reason, level: \"warning\" }),\n );\n }\n\n if (globalCuttingBoardRes.status === \"rejected\") {\n BeraMonitoring.captureException(\n initBeraError({ cause: globalCuttingBoardRes.reason, level: \"warning\" }),\n );\n }\n\n if (bgtTotalSupplyRes.status === \"rejected\") {\n BeraMonitoring.captureException(\n initBeraError({ cause: bgtTotalSupplyRes.reason, level: \"warning\" }),\n );\n }\n\n if (bgtTotalBoostsRes.status === \"rejected\") {\n BeraMonitoring.captureException(\n initBeraError({ cause: bgtTotalBoostsRes.reason, level: \"warning\" }),\n );\n }\n\n return {\n bgtTotalSupply:\n bgtTotalSupplyRes.status === \"fulfilled\"\n ? bgtTotalSupplyRes.value\n : undefined,\n globalCuttingBoard:\n globalCuttingBoardRes.status === \"fulfilled\"\n ? globalCuttingBoardRes.value\n : [],\n bgtTotalBoosts:\n bgtTotalBoostsRes.status === \"fulfilled\"\n ? bgtTotalBoostsRes.value\n : undefined,\n ...(globalDataRes.status === \"fulfilled\" ? globalDataRes.value : {}),\n } satisfies GlobalData;\n}\n","import {\n GetIncentiveFeeClaimStats,\n type GetIncentiveFeeClaimStatsQuery,\n type GetIncentiveFeeClaimStatsQueryVariables,\n} from \"@berachain/graphql/pol/subgraph\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { days } from \"~/utils/time\";\n\nexport async function getIncentiveFeeClaimStats({\n ...args\n}: BeraJS.BaseFunctionArgs) {\n const bgtClient = getApolloClient(\"pol.subgraph\", args);\n const { data } = await bgtClient.query<\n GetIncentiveFeeClaimStatsQuery,\n GetIncentiveFeeClaimStatsQueryVariables\n >({\n query: GetIncentiveFeeClaimStats,\n });\n\n if (data.incentiveFeeClaims.length > 0) {\n const sumAllClaims = data?.incentiveFeeClaims.reduce(\n (acc, curr) => acc + Number(curr.payoutAmount),\n 30_000, // this is due to a bug in the subgraph, where the first claim of 50_000 was counted as 20_000, once hunter pushed the fix we can upgrade it.\n );\n const claimsInLast24Hours = data?.incentiveFeeClaims.filter(\n (claim) => Number(claim.timestamp) / 1000 > Date.now() - days(1),\n );\n const sumClaimsInLast24Hours = claimsInLast24Hours.reduce(\n (acc, curr) => acc + Number(curr.payoutAmount),\n 0,\n );\n return {\n sumAllClaims,\n sumClaimsInLast24Hours,\n };\n }\n\n return {\n sumAllClaims: 0,\n sumClaimsInLast24Hours: 0,\n };\n}\n","import type { ProtocolMetadata } from \"~/types/staking\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport interface GetMarkets {\n marketList: ProtocolMetadata[];\n marketDictionary: { [key: string]: ProtocolMetadata };\n}\n\nexport async function getMarkets(\n args: BeraJS.BaseFunctionArgs = {},\n): Promise<GetMarkets> {\n const { config } = parseBaseArgs(args);\n\n try {\n const markets = await fetch(config.lists.rewardVaultList);\n const temp = await markets.json();\n\n if (!temp.protocols) {\n throw new Error(\"Missing protocols in market list\");\n }\n\n return {\n marketList: temp.protocols,\n marketDictionary: temp.protocols.reduce(\n (acc: { [key: string]: ProtocolMetadata }, item: ProtocolMetadata) => {\n acc[item.name] = item;\n return acc;\n },\n {},\n ),\n };\n } catch (error) {\n console.error(\"Error fetching validator information\", error);\n throw error;\n }\n}\n","import type { Address } from \"viem\";\n\nimport { BeraError } from \"~/errors/BeraError\";\nimport type { BribeBoostRewardProof } from \"~/types/bribe-boost\";\nimport { getErrorResponse } from \"~/utils/getErrorResponse\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getRewardProofsByValidator({\n account,\n validator,\n page = 1,\n perPage = 1000,\n ...args\n}: {\n account: Address;\n validator: Address;\n page?: number;\n perPage?: number;\n} & BeraJS.BaseFunctionArgs): Promise<BribeBoostRewardProof> {\n const { config } = parseBaseArgs(args);\n\n // We'll try to revalidate on the client side by using the cache: \"no-store\" and swrImmutable\n // In the future, we can look at using cache and tags to invalidate the cache on the server side to prevent stale data\n const result = await fetch(\n `${\n config.pol.bribeBoostApi\n }/api/v1/wallets/${account.toLowerCase()}/proofs/validator/${validator.toLowerCase()}?page=${page}&per_page=${perPage}`,\n {\n cache: \"no-store\",\n },\n );\n\n if (!result.ok) {\n const error = await getErrorResponse(result);\n throw new BeraError({\n message: \"Failed to fetch proofs on server\",\n cause: {\n error,\n result: result,\n account,\n validator,\n },\n reason: error?.reason,\n });\n }\n\n const data = await result.json();\n return data;\n}\n","import { type Address, formatUnits, type PublicClient, parseUnits } from \"viem\";\n\nimport { stakeBeraVaultAbi } from \"~/abi/pol/stakeBeraVault\";\nimport { assertPublicClient } from \"~/errors/assert\";\n\n/**\n *\n * @param address - The address of the vault\n * @throws {Error} If the vault is not found\n * @returns\n */\nexport async function getRewardTokenToBeraRate({\n address,\n publicClient,\n}: {\n address: Address;\n publicClient?: PublicClient;\n}): Promise<number> {\n assertPublicClient(publicClient);\n\n return publicClient\n .readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"previewRedeem\" as const,\n args: [parseUnits(\"1\", 18)],\n })\n .then((rate) => Number(formatUnits(rate, 18)))\n .catch(() => 0);\n}\n","import type { Address } from \"viem\";\n\nimport {\n type ApiVaultFragment,\n GetRewardVault,\n type GetRewardVaultQuery,\n type GetRewardVaultQueryVariables,\n type GqlChain,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { NotFoundError } from \"~/errors/NotFoundError\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\n/**\n *\n * @param address - The address of the vault\n * @throws {Error} If the vault is not found\n * @returns\n */\nexport async function getRewardVault({\n address,\n chainName,\n ...args\n}: {\n address: Address;\n chainName?: GqlChain;\n} & BeraJS.BaseFunctionArgs): Promise<ApiVaultFragment> {\n const { config } = parseBaseArgs(args);\n const resolvedChainName = chainName ?? (config.bex.chainName as GqlChain);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const { data } = await bexApiGraphqlClient.query<\n GetRewardVaultQuery,\n GetRewardVaultQueryVariables\n >({\n query: GetRewardVault,\n variables: {\n vaultId: address,\n chain: resolvedChainName,\n },\n });\n\n if (!data?.rewardVault) {\n throw new NotFoundError({\n resource: \"Reward vault\",\n id: address,\n chainId: config.chainId,\n });\n }\n\n return data.rewardVault;\n}\n","import { isSameAddress } from \"@berachain-foundation/berancer-sdk\";\nimport { type Address, erc20Abi, formatUnits, type PublicClient } from \"viem\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\nimport { BeraError } from \"~/errors/BeraError\";\nimport { BeraMonitoring } from \"~/errors/BeraMonitoring\";\n\nexport interface RewardVaultIncentive {\n token: Address;\n manager: Address;\n minIncentiveRate: string;\n incentiveRate: string;\n remainingAmount: string;\n symbol?: string;\n /**\n * Amount of tokens that needs approval before they can be added to the incentive.\n *\n * Anyone can just `transfer` ERC20 to the vault, but incentive manager need to send accountIncentives to turn on distribution.\n */\n pendingAmount: string;\n decimals: number;\n}\n\nexport async function getRewardVaultIncentives({\n address,\n stakingToken,\n publicClient,\n}: {\n address: Address;\n stakingToken: Address;\n publicClient: PublicClient;\n}): Promise<RewardVaultIncentive[]> {\n const whitelistedTokens = await publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"getWhitelistedTokens\",\n });\n\n // Only fetch totalSupply if stakingToken is in whitelistedTokens\n const stakingTokenIndex = whitelistedTokens.findIndex((token) =>\n isSameAddress(stakingToken, token),\n );\n\n const totalSupply =\n stakingTokenIndex !== -1\n ? await publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"totalSupply\",\n })\n : 0n;\n\n const incentives = await Promise.allSettled(\n whitelistedTokens.map(async (token) => {\n const [incentiveInfo, decimals, symbol, totalBalance] = await Promise.all(\n [\n publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"incentives\",\n args: [token],\n }),\n publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: \"decimals\",\n }),\n publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: \"symbol\",\n }),\n publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [address],\n }),\n ],\n );\n\n const [minIncentiveRate, incentiveRate, remainingAmount, manager] =\n incentiveInfo;\n\n return {\n token,\n manager,\n minIncentiveRate: formatUnits(minIncentiveRate, decimals),\n incentiveRate: formatUnits(incentiveRate, decimals),\n remainingAmount: formatUnits(remainingAmount, decimals),\n symbol,\n decimals,\n pendingAmount: isSameAddress(stakingToken, token)\n ? formatUnits(totalBalance - totalSupply - remainingAmount, decimals)\n : formatUnits(totalBalance - remainingAmount, decimals),\n };\n }),\n );\n\n incentives.forEach((result, index) => {\n if (result.status === \"rejected\") {\n BeraMonitoring.captureException(\n new BeraError({\n reason: result.reason,\n message: \"Incorrect incentives token received.\",\n level: \"error\",\n extra: {\n token: whitelistedTokens[index],\n address: address,\n error: result.reason,\n },\n }),\n );\n }\n });\n\n return incentives\n .map((result) => (result.status === \"fulfilled\" ? result.value : null))\n .filter((incentive) => incentive !== null);\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\n\nexport async function getRewardVaultStakingToken({\n address,\n publicClient,\n}: {\n address: Address;\n publicClient: NonNullable<PublicClient>;\n}) {\n const vaultAddress = await publicClient.readContract({\n address: address,\n abi: rewardVaultAbi,\n functionName: \"stakeToken\",\n });\n\n return vaultAddress;\n}\n","import {\n GetSWberaVaultMetadata,\n type GetSWberaVaultMetadataQuery,\n type GetSWberaVaultMetadataQueryVariables,\n type GqlChain,\n GqlSWberaVaultMetadataResolution,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nfunction getResolution(window: \"DAY\" | \"WEEK\") {\n if (window === \"DAY\") {\n return GqlSWberaVaultMetadataResolution.OneDay;\n }\n return GqlSWberaVaultMetadataResolution.SevenDays;\n}\n\n/**\n *\n * @throws {Error} If the vault is not found\n * @returns\n */\nexport async function getStakedBeraAPR({\n window,\n ...args\n}: {\n /**\n * APR might vary depending on the annualized time window (day or week)\n */\n window: \"DAY\" | \"WEEK\";\n} & BeraJS.BaseFunctionArgs): Promise<number> {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n try {\n const data = await bexApiGraphqlClient.query<\n GetSWberaVaultMetadataQuery,\n GetSWberaVaultMetadataQueryVariables\n >({\n query: GetSWberaVaultMetadata,\n variables: {\n chain: config.bex.chainName as GqlChain,\n resolution: getResolution(window ?? \"DAY\"),\n },\n });\n\n const { apr } = data.data.polGetSWberaVaultMetadata;\n\n return Number(apr);\n } catch (error) {\n console.error(\"Failed to get SW Bera APR\", error);\n throw error;\n }\n}\n","import {\n GetSWberaVaultSnapshots,\n type GetSWberaVaultSnapshotsQuery,\n type GetSWberaVaultSnapshotsQueryVariables,\n type GqlChain,\n GqlVaultSnapshotDataRange,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport type GetStakedBeraSnapshotsArgs = {\n chain?: GqlChain;\n range?: GqlVaultSnapshotDataRange;\n} & BeraJS.BaseFunctionArgs;\n\n/**\n *\n * @throws {Error} If the vault is not found\n * @returns\n */\nexport async function getStakedBeraSnapshots({\n chain,\n range = GqlVaultSnapshotDataRange.ThirtyDays,\n ...args\n}: GetStakedBeraSnapshotsArgs = {}): Promise<\n GetSWberaVaultSnapshotsQuery[\"polGetSWberaVaultSnapshots\"]\n> {\n const { config } = parseBaseArgs(args);\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n try {\n const data = await bexApiGraphqlClient.query<\n GetSWberaVaultSnapshotsQuery,\n GetSWberaVaultSnapshotsQueryVariables\n >({\n query: GetSWberaVaultSnapshots,\n variables: {\n chain: chain ?? (config.bex.chainName as GqlChain),\n range,\n },\n });\n\n return data.data.polGetSWberaVaultSnapshots;\n } catch (error) {\n console.error(\"Failed to get SW Bera Snapshots\", error);\n throw error;\n }\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { stakeBeraVaultAbi } from \"~/abi/pol/stakeBeraVault\";\n\nexport async function getStakeWithdrawalCooldown({\n publicClient,\n address,\n}: {\n publicClient: PublicClient;\n address: Address;\n}): Promise<number> {\n const lockPeriod = await publicClient.readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"WITHDRAWAL_COOLDOWN\" as const,\n });\n\n return Number(lockPeriod);\n}\n","import { type Address, erc20Abi, type PublicClient } from \"viem\";\n\nimport BigNumber from \"@berachain/utils/pkg/bignumber.js\";\n\nimport { stakeBeraVaultAbi } from \"~/abi/pol/stakeBeraVault\";\nimport { assertPublicClient } from \"~/errors/assert\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { getIncentiveFeeClaimStats } from \"./getIncentiveFeeClaimStats\";\nimport { getStakeWithdrawalCooldown } from \"./getStakeWithdrawalCooldown\";\n\nexport interface VaultMetadata {\n current: {\n exchangeRate: string;\n totalSupply: string;\n totalAssets: string;\n tvl: string;\n };\n previous: {\n exchangeRate: string;\n totalSupply: string;\n totalAssets: string;\n tvl: string;\n };\n totalWBeraIssued: string;\n lockPeriod?: number;\n totalBuyBacks: number;\n totalBuyBacksInLast24Hours: number;\n}\n/**\n *\n * @param address - The address of the vault\n * @throws {Error} If the vault is not found\n * @returns\n */\nexport async function getSWBeraVaultMetadata({\n address,\n publicClient,\n blockTime,\n ...args\n}: {\n address: Address;\n publicClient?: PublicClient;\n blockTime: number;\n} & BeraJS.BaseFunctionArgs): Promise<VaultMetadata> {\n const { config } = parseBaseArgs(args);\n assertPublicClient(publicClient);\n\n const hoursWindow = 26; // 26 hours is the window for the vault to ensure at least 1 claim per APR window.\n try {\n // Get current block number\n const [currentBlock] = await Promise.all([\n publicClient.getBlock({ blockTag: \"latest\" }),\n ]);\n const blocksPerWindow = Math.floor((hoursWindow * 60 * 60) / blockTime); // hoursWindow * 60 minutes * 60 seconds / actual block time\n const blockWindowAgo = currentBlock.number - BigInt(blocksPerWindow);\n\n const [\n curretTotalAssets,\n currentTotalSupply,\n currentOneShareWorth,\n currentTVL,\n totalAssets24HoursAgo,\n totalSupply24HoursAgo,\n oneShareWorthWindowAgo,\n tvl24HoursAgo,\n totalWBeraIssued,\n lockPeriod,\n incentiveFeeClaimStats,\n ] = await Promise.all([\n publicClient.readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"totalAssets\",\n }),\n publicClient.readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"totalSupply\",\n }),\n publicClient.readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"previewRedeem\",\n args: [10n ** 18n],\n blockNumber: currentBlock.number,\n }),\n publicClient.readContract({\n address: config.tokens.wbera,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [address],\n }),\n publicClient.readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"totalAssets\",\n blockNumber: blockWindowAgo,\n }),\n publicClient.readContract({\n address,\n abi: erc20Abi,\n functionName: \"totalSupply\",\n blockNumber: blockWindowAgo,\n }),\n publicClient.readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"previewRedeem\",\n args: [10n ** 18n],\n blockNumber: blockWindowAgo,\n }),\n publicClient.readContract({\n address: config.tokens.wbera,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [address],\n blockNumber: blockWindowAgo,\n }),\n publicClient.readContract({\n address: config.tokens.wbera,\n abi: erc20Abi,\n functionName: \"totalSupply\",\n }),\n getStakeWithdrawalCooldown({\n publicClient,\n address,\n }),\n getIncentiveFeeClaimStats({}),\n ]);\n const exchangeRateWindowAgo = new BigNumber(\n oneShareWorthWindowAgo.toString(),\n );\n\n const currentExchangeRate = new BigNumber(currentOneShareWorth.toString());\n\n return {\n current: {\n exchangeRate: currentExchangeRate.toString(),\n totalSupply: new BigNumber(currentTotalSupply.toString())\n .dividedBy(1e18)\n .toString(),\n totalAssets: new BigNumber(curretTotalAssets.toString())\n .dividedBy(1e18)\n .toString(),\n tvl: new BigNumber(currentTVL.toString()).dividedBy(1e18).toString(),\n },\n previous: {\n exchangeRate: exchangeRateWindowAgo.toString(),\n totalSupply: new BigNumber(totalSupply24HoursAgo.toString())\n .dividedBy(1e18)\n .toString(),\n totalAssets: new BigNumber(totalAssets24HoursAgo.toString())\n .dividedBy(1e18)\n .toString(),\n tvl: new BigNumber(tvl24HoursAgo.toString()).dividedBy(1e18).toString(),\n },\n totalWBeraIssued: new BigNumber(totalWBeraIssued.toString())\n .dividedBy(1e18)\n .toString(),\n lockPeriod,\n totalBuyBacks: incentiveFeeClaimStats.sumAllClaims,\n totalBuyBacksInLast24Hours: incentiveFeeClaimStats.sumClaimsInLast24Hours,\n };\n } catch (error) {\n console.error(\"Failed to get SW Bera Vault Metadata\", error);\n throw error;\n }\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { stakeBeraVaultAbi } from \"~/abi/pol/stakeBeraVault\";\nimport { getStakeWithdrawalCooldown } from \"~/actions/pol/getStakeWithdrawalCooldown\";\nimport { formatTimeLeft } from \"~/utils/formatTimestamps\";\nimport { msToSeconds } from \"~/utils/time\";\nimport { isToken } from \"~/utils/tokens\";\n\n/**\n * Calculates and returns formatted time remaining until a target date\n * @param targetTime - Unix timestamp in seconds representing the target time\n * @returns Formatted time string (e.g., \"2h 30m\") or undefined if time has passed\n */\nfunction getTimeUntil(targetTime: number): string | undefined {\n const currentTime = Date.now();\n const timeDiff = targetTime * 1000 - currentTime;\n\n // If time has already passed, return undefined\n if (timeDiff <= 0) {\n return;\n }\n\n // Convert milliseconds to seconds for formatTimeLeft function\n const totalSeconds = msToSeconds(timeDiff);\n return formatTimeLeft(totalSeconds, true, true);\n}\n\n/**\n * Interface representing a staked BERA withdrawal request\n */\nexport interface StakedBeraWithdrawal {\n receiptTokenAddress: Address;\n withdrawalAmount?: bigint;\n timeRemaining?: string;\n withdrawalRequestId?: bigint;\n}\n\n/**\n * Interface representing a withdrawal request for V1\n */\ntype WithdrawalRequestV1 = readonly [\n bigint,\n bigint,\n bigint,\n `0x${string}`,\n `0x${string}`,\n];\n\n/**\n * Retrieves staked BERA withdrawal information for a given account\n *\n * This function handles both V1 and V2 versions of the stake vault contract:\n * - V1: Uses a single withdrawal request per account\n * - V2: Uses ERC721 tokens to represent multiple withdrawal requests per account\n *\n * @param contractAddress - The address of the stake vault contract\n * @param accountAddress - The address of the account to check withdrawals for\n * @param publicClient - Viem public client for blockchain interactions\n * @param version - The version of the stake vault contract (\"V1\" or \"V2\")\n * @returns Promise resolving to an array of withdrawal request information\n */\nexport async function getSWBeraWithdrawal({\n contractAddress,\n accountAddress,\n publicClient,\n version,\n}: {\n contractAddress: Address;\n accountAddress: Address;\n publicClient: PublicClient;\n version: \"V1\" | \"V2\";\n}): Promise<StakedBeraWithdrawal[]> {\n const withdrawalRequests: StakedBeraWithdrawal[] = [];\n\n function withdrawalRequestV1Helper(\n withdrawalRequest: WithdrawalRequestV1,\n lockPeriod: number,\n ): void {\n const [assets, _shares, timestamp] = withdrawalRequest;\n const withdrawalAmount = assets;\n const readyTime = Number(timestamp) + Number(lockPeriod);\n const currentTime = msToSeconds(Date.now());\n const timeLeft = readyTime - currentTime;\n if (withdrawalAmount > 0) {\n const timeRemaining = getTimeUntil(timeLeft <= 0 ? 0 : readyTime);\n withdrawalRequests.push({\n receiptTokenAddress: contractAddress,\n withdrawalAmount,\n timeRemaining,\n });\n }\n }\n\n switch (version) {\n case \"V1\": {\n const [withdrawalRequest, lockPeriod] = await Promise.all([\n publicClient.readContract({\n address: contractAddress,\n abi: stakeBeraVaultAbi,\n functionName: \"withdrawalRequests\" as const,\n args: [accountAddress],\n }),\n getStakeWithdrawalCooldown({\n publicClient,\n address: contractAddress,\n }),\n ]);\n withdrawalRequestV1Helper(withdrawalRequest, lockPeriod);\n return withdrawalRequests;\n }\n case \"V2\": {\n const [withdrawalRequestIds, lockPeriod] = await Promise.all([\n publicClient.readContract({\n address: contractAddress,\n abi: stakeBeraVaultAbi,\n functionName: \"getERC721WithdrawalRequestIds\" as const,\n args: [accountAddress],\n }),\n getStakeWithdrawalCooldown({\n publicClient,\n address: contractAddress,\n }),\n ]);\n\n if (isToken(contractAddress, \"SWBERA\")) {\n const withdrawalRequestV1 = await publicClient.readContract({\n address: contractAddress,\n abi: stakeBeraVaultAbi,\n functionName: \"withdrawalRequests\" as const,\n args: [accountAddress],\n });\n withdrawalRequestV1Helper(withdrawalRequestV1, lockPeriod);\n }\n\n // Process each withdrawal request ID to get detailed information\n const withdrawalResults = await Promise.all(\n withdrawalRequestIds.map(\n async (withdrawalRequestId): Promise<StakedBeraWithdrawal | null> => {\n const withdrawalRequest = await publicClient.readContract({\n address: contractAddress,\n abi: stakeBeraVaultAbi,\n functionName: \"getERC721WithdrawalRequest\",\n args: [withdrawalRequestId as bigint],\n });\n\n const { assets, requestTime: timestamp } = withdrawalRequest;\n if (!assets || !timestamp)\n throw new Error(\"Invalid withdrawal request\");\n const withdrawalAmount = assets;\n\n // Calculate when this specific withdrawal will be ready\n const readyTime = Number(timestamp) + Number(lockPeriod);\n const currentTime = msToSeconds(Date.now());\n const timeLeft = readyTime - currentTime;\n\n // Only include withdrawal if there's an amount to withdraw\n if (withdrawalAmount > 0) {\n const timeRemaining = getTimeUntil(timeLeft <= 0 ? 0 : readyTime);\n return {\n withdrawalAmount,\n timeRemaining,\n withdrawalRequestId,\n receiptTokenAddress: contractAddress,\n };\n }\n return null;\n },\n ),\n );\n\n // Filter out null results (withdrawals with no amount)\n const filteredRequests = withdrawalResults.filter(\n (request): request is StakedBeraWithdrawal => request !== null,\n );\n withdrawalRequests.push(...filteredRequests);\n return withdrawalRequests;\n }\n }\n}\n","import type { PublicClient } from \"viem\";\n\nimport type { Address } from \"@berachain/config\";\n\nimport { stakeBeraVaultAbi } from \"~/abi/pol/stakeBeraVault\";\nimport { assertPublicClient } from \"~/errors/assert\";\n\n/**\n * Get the total staked amount for a given vault address\n * @param vaultAddresses - The addresses of the vaults to get the total staked amount for\n * @param publicClient - The public client to use to get the total staked amount\n * @returns The total staked amount for the given vault addresses\n */\nexport async function getTotalStakedAmount({\n vaultAddresses,\n publicClient,\n}: {\n vaultAddresses: Address[];\n publicClient?: PublicClient;\n} & BeraJS.BaseFunctionArgs): Promise<Record<Address, bigint>> {\n assertPublicClient(publicClient);\n\n try {\n const totalAssets = await Promise.all(\n vaultAddresses.map(async (address) => {\n return await publicClient.readContract({\n address,\n abi: stakeBeraVaultAbi,\n functionName: \"totalAssets\",\n });\n }),\n );\n\n const stakedAmount = vaultAddresses.reduce(\n (acc, address, index) => {\n acc[address] = totalAssets[index];\n return acc;\n },\n {} as Record<Address, bigint>,\n );\n\n return stakedAmount;\n } catch (error) {\n console.error(\"Failed to get total staked amount\", error);\n throw error;\n }\n}\n","import type { Address } from \"viem\";\n\nimport { BeraError } from \"~/errors/BeraError\";\nimport type { BribeBoostRewardItem } from \"~/types/bribe-boost\";\nimport { getErrorResponse } from \"~/utils/getErrorResponse\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\n/**\n * Server-side function to get user claimable incentives grouped by validator\n */\nexport async function getUserClaimableIncentives({\n account,\n ...args\n}: {\n account: Address;\n} & BeraJS.BaseFunctionArgs): Promise<BribeBoostRewardItem[] | null> {\n const { config } = parseBaseArgs(args);\n\n // We'll try to revalidate on the client side by using the cache: \"no-store\" and swrImmutable\n // In the future, we can look at using cache and tags to invalidate the cache on the server side to prevent stale data\n const result = await fetch(\n `${\n config.pol.bribeBoostApi\n }/api/v1/wallets/${account.toLowerCase()}/rewards/aggregation`,\n {\n cache: \"no-store\",\n },\n );\n\n if (!result.ok) {\n const error = await getErrorResponse(result);\n throw new BeraError({\n message: \"Failed to fetch incentives on server\",\n cause: { error, result, account },\n reason: error?.error,\n });\n }\n\n return await result.json();\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\n\nexport interface GetUserVaultsInfo {\n account: string | undefined;\n vaultAddress: Address;\n publicClient: PublicClient | undefined;\n}\n\n/**\n * Gets claimable rewards for a user's vault.\n *\n * It can also be used to get the claimable fees from the BGT staker\n * @returns\n */\nexport async function getUserVaultsReward({\n account,\n vaultAddress,\n publicClient,\n}: GetUserVaultsInfo): Promise<bigint> {\n if (!publicClient) throw new Error(\"Missing public client\");\n if (!account) throw new Error(\"Missing user account\");\n if (!vaultAddress) throw new Error(\"Missing vault address\");\n\n return await publicClient.readContract({\n address: vaultAddress,\n abi: rewardVaultAbi,\n functionName: \"earned\",\n args: [account as `0x${string}`],\n });\n}\n","import { type Address, formatEther, type PublicClient } from \"viem\";\n\nimport type { UserVaultInfo } from \"~/types/pol\";\nimport { getUserVaultsBalance } from \"./getUserVaultsBalance\";\nimport { getUserVaultsReward } from \"./getUserVaultsReward\";\nimport { getVaultsSupply } from \"./getVaultsSupply\";\n\nexport interface GetUserVaultInfoParams {\n account: Address;\n vaultAddress: Address;\n publicClient: PublicClient | undefined;\n}\n\nexport async function getUserVaultInfo({\n account,\n vaultAddress,\n publicClient,\n}: GetUserVaultInfoParams): Promise<UserVaultInfo> {\n const [userBalance, userReward, totalSupply] = await Promise.all([\n getUserVaultsBalance({\n account,\n vaultAddress,\n publicClient,\n }),\n getUserVaultsReward({\n account,\n vaultAddress,\n publicClient,\n }),\n getVaultsSupply({\n vaultAddress,\n publicClient,\n }),\n ]);\n\n const withdrawableBalance = userBalance.balance - userBalance.delegated;\n const percentage =\n totalSupply > 0n\n ? Number(\n Number.parseFloat(formatEther(userBalance.balance)) /\n Number.parseFloat(formatEther(totalSupply)),\n ).toString()\n : \"0\";\n\n return {\n balance: userBalance.balance,\n delegatedBalance: userBalance.delegated,\n withdrawableBalance,\n rewards: formatEther(userReward),\n percentage,\n };\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\nimport { assertAddress, assertPublicClient } from \"~/errors/assert\";\n\nexport interface GetUserVaultsInfo {\n account: string | undefined;\n vaultAddress: Address;\n publicClient: PublicClient | undefined;\n}\n\nexport async function getUserVaultsBalance({\n account,\n vaultAddress,\n publicClient,\n}: GetUserVaultsInfo): Promise<{ balance: bigint; delegated: bigint }> {\n assertPublicClient(publicClient);\n assertAddress(account, \"account\");\n assertAddress(vaultAddress, \"vaultAddress\");\n\n try {\n const [balance, delegated] = await Promise.all([\n publicClient.readContract({\n address: vaultAddress,\n abi: rewardVaultAbi,\n functionName: \"balanceOf\",\n args: [account],\n }),\n publicClient.readContract({\n address: vaultAddress,\n abi: rewardVaultAbi,\n functionName: \"getTotalDelegateStaked\",\n args: [account],\n }),\n ]);\n\n return { balance, delegated };\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\n\nexport interface GetVaultsSupply {\n vaultAddress: Address;\n publicClient: PublicClient | undefined;\n}\n\nexport async function getVaultsSupply({\n vaultAddress,\n publicClient,\n}: GetVaultsSupply): Promise<bigint> {\n if (!publicClient) throw new Error(\"Missing public client\");\n if (!vaultAddress) throw new Error(\"Missing vault address\");\n try {\n const result = await publicClient.readContract({\n address: vaultAddress,\n abi: rewardVaultAbi,\n functionName: \"totalSupply\",\n args: [],\n });\n return result as bigint;\n } catch (error) {\n console.log(error);\n throw error;\n }\n}\n","import { type Address, formatUnits, type PublicClient } from \"viem\";\n\nimport {\n type ApiVaultFragment,\n GetUserVaults,\n type GetUserVaultsQuery,\n type GetUserVaultsQueryVariables,\n type GqlChain,\n} from \"@berachain/graphql/pol/api\";\n\nimport { rewardVaultAbi } from \"~/abi/pol/rewardVault\";\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { BeraError } from \"~/errors/BeraError\";\nimport { BeraMonitoring } from \"~/errors/BeraMonitoring\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport interface UserVault {\n unclaimedBgt: string;\n formattedBalance: string;\n stakingTokenPrice: number | null;\n vault: ApiVaultFragment;\n}\n\nexport type GetUserVaultsResponse = {\n totalStakedValue: number;\n totalBgtRewards: string;\n vaults: UserVault[];\n};\n\nexport async function getUserVaults({\n account,\n publicClient,\n ...args\n}: {\n account: Address;\n publicClient: PublicClient;\n} & BeraJS.BaseFunctionArgs): Promise<GetUserVaultsResponse> {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n const res = await bexApiGraphqlClient.query<\n GetUserVaultsQuery,\n GetUserVaultsQueryVariables\n >({\n query: GetUserVaults,\n variables: {\n userId: account,\n chain: config.bex.chainName as GqlChain,\n },\n });\n\n const deposits = res.data?.userVaultDeposits?.deposits;\n\n if (!deposits) {\n return {\n totalBgtRewards: \"0\",\n vaults: [],\n totalStakedValue: 0,\n };\n }\n\n const [earnedResult, balanceResult] = await Promise.all([\n // Fetch pending BGT rewards for each vault\n publicClient.multicall({\n allowFailure: false,\n contracts: deposits.map(\n (deposit) =>\n ({\n address: deposit.vaultAddress,\n abi: rewardVaultAbi,\n functionName: \"earned\",\n args: [account],\n }) as const,\n ),\n }),\n // Fetch user balance of each vault\n publicClient.multicall({\n allowFailure: false,\n contracts: deposits.map(\n (deposit) =>\n ({\n address: deposit.vaultAddress,\n abi: rewardVaultAbi,\n functionName: \"balanceOf\",\n args: [account],\n }) as const,\n ),\n }),\n ]);\n\n const { userVaults, total } = deposits.reduce<{\n userVaults: UserVault[];\n total: bigint;\n }>(\n (acc, deposit, index) => {\n const item = earnedResult[index];\n const balanceItem = balanceResult[index];\n\n acc.total += item;\n\n if (!deposit.vault) {\n // This is in case the API is missing the vault data\n\n BeraMonitoring.captureException(\n new BeraError({\n message: \"Deposit data from API is missing vault\",\n level: \"error\",\n extra: {\n deposit,\n },\n }),\n );\n\n console.error(\"Deposit data from API is missing vault\", deposit);\n\n return acc;\n }\n\n // Either user has pending rewards or has a balance.\n // Otherwise the vault has just been withdrawn and claimed or BE has not yet updated the balance.\n if (item > 0n || balanceItem > 0n) {\n /**\n * Calculate the staking token price based on the TVL and the staked amount.\n */\n const stakingTokenPrice =\n deposit.vault.dynamicData?.tvl &&\n // If staked amount is 0, we don't want to divide by 0\n Number(deposit.vault.stakingTokenAmount) !== 0\n ? Number(deposit.vault.dynamicData?.tvl ?? 0) /\n Number(deposit.vault.stakingTokenAmount)\n : null;\n\n acc.userVaults.push({\n ...deposit,\n vault: deposit.vault,\n unclaimedBgt: formatUnits(item, 18),\n formattedBalance: formatUnits(\n balanceItem,\n deposit.vault.stakingToken.decimals,\n ),\n stakingTokenPrice: stakingTokenPrice,\n });\n }\n\n return acc;\n },\n {\n userVaults: [],\n total: 0n,\n },\n );\n\n // Sort userVaults so that whitelisted vaults come first, then by unclaimedBgt descending\n const sortedUserVaults = [...userVaults].sort((a, b) => {\n // Whitelisted vaults should be first\n if (a.vault.isVaultWhitelisted && !b.vault.isVaultWhitelisted) {\n return -1;\n }\n if (!a.vault.isVaultWhitelisted && b.vault.isVaultWhitelisted) {\n return 1;\n }\n // Then sort by unclaimedBgt descending\n const aUnclaimed = Number.parseFloat(a.unclaimedBgt);\n const bUnclaimed = Number.parseFloat(b.unclaimedBgt);\n return bUnclaimed - aUnclaimed;\n });\n\n const totalStakedValue = sortedUserVaults.reduce((acc, vault) => {\n const tvl = Number(vault.vault.dynamicData?.tvl ?? 0);\n if (tvl === 0) {\n return acc;\n }\n const stakingTokenAmount = Number.parseFloat(\n vault.vault.stakingTokenAmount,\n );\n\n const stakingTokenPrice = tvl / stakingTokenAmount;\n\n return acc + stakingTokenPrice * Number(vault.formattedBalance);\n }, 0);\n\n return {\n totalStakedValue,\n totalBgtRewards: formatUnits(total, 18),\n vaults: sortedUserVaults satisfies UserVault[],\n };\n}\n","import type { Address } from \"viem\";\n\nimport {\n GetVaultHistory,\n type GetVaultHistoryQuery,\n type GetVaultHistoryQueryVariables,\n type GqlChain,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport type GetVaultHistoryArgs = {\n vault: Address;\n chain?: GqlChain;\n} & Omit<GetVaultHistoryQueryVariables, \"vaultId\" | \"chain\"> &\n BeraJS.BaseFunctionArgs;\n\nexport async function getVaultHistory({\n vault,\n chain,\n ...args\n}: GetVaultHistoryArgs): Promise<\n GetVaultHistoryQuery[\"polGetRewardVaultSnapshots\"] | undefined\n> {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const result = await bexApiGraphqlClient.query<\n GetVaultHistoryQuery,\n GetVaultHistoryQueryVariables\n >({\n query: GetVaultHistory,\n variables: {\n ...args,\n vaultId: vault,\n chain: chain ?? (config.bex.chainName as GqlChain),\n },\n });\n\n return result.data.polGetRewardVaultSnapshots;\n}\n","import type { Address } from \"viem\";\n\nimport {\n type ApiValidatorFragment,\n GetVaultValidators,\n type GetVaultValidatorsQuery,\n type GetVaultValidatorsQueryVariables,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\n\nexport async function getVaultValidators({\n address,\n onlyActiveValidators,\n ...args\n}: {\n address: Address;\n onlyActiveValidators?: boolean;\n} & BeraJS.BaseFunctionArgs): Promise<ApiValidatorFragment[]> {\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const result = await bexApiGraphqlClient.query<\n GetVaultValidatorsQuery,\n GetVaultValidatorsQueryVariables\n >({\n query: GetVaultValidators,\n variables: { vaultId: address, isActive: onlyActiveValidators },\n });\n\n return result.data.validators.validators ?? [];\n}\n","import { getAddress, zeroAddress } from \"viem\";\n\nimport {\n GetTokenCurrentPrices,\n type GetTokenCurrentPricesQuery,\n type GetTokenCurrentPricesQueryVariables,\n type GqlChain,\n} from \"@berachain/graphql/dex/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport type { TokenCurrentPriceMap } from \"~/types/dex\";\nimport { getSafeNumber } from \"~/utils/formatNumber\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { isToken } from \"~/utils/tokens\";\n\nexport async function getTokenCurrentPrices({\n addressIn: _addressIn,\n ...args\n}: {\n addressIn: string[];\n} & BeraJS.BaseFunctionArgs): Promise<TokenCurrentPriceMap> {\n const { config, chainId } = parseBaseArgs(args);\n\n const addressIn = _addressIn\n .map((a) => a.toLowerCase())\n .filter((addr, idx, arr) => addr && arr.indexOf(addr) === idx);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const { data } = await bexApiGraphqlClient.query<\n GetTokenCurrentPricesQuery,\n GetTokenCurrentPricesQueryVariables\n >({\n query: GetTokenCurrentPrices,\n variables: {\n chains: [config.bex.chainName as GqlChain],\n addressIn,\n },\n });\n\n return data.tokenGetCurrentPrices.reduce<TokenCurrentPriceMap>(\n (map, tokenInformation) => {\n if (!tokenInformation.price || !tokenInformation.address) {\n return map;\n }\n\n const formattedAddress = tokenInformation.address;\n\n map[getAddress(formattedAddress)] = {\n price: getSafeNumber(tokenInformation.price.toString()),\n updatedAt: tokenInformation.updatedAt,\n chainId,\n };\n\n map[formattedAddress.toLowerCase()] = {\n price: getSafeNumber(tokenInformation.price.toString()),\n updatedAt: tokenInformation.updatedAt,\n chainId,\n };\n\n if (isToken(formattedAddress, \"WBERA\")) {\n map[zeroAddress] = {\n price: getSafeNumber(tokenInformation.price.toString()),\n updatedAt: tokenInformation.updatedAt,\n chainId,\n };\n map[config.tokens.bgt.toLowerCase()] = {\n price: getSafeNumber(tokenInformation.price.toString()),\n updatedAt: tokenInformation.updatedAt,\n chainId,\n };\n\n map[config.tokens.bgt] = {\n price: getSafeNumber(tokenInformation.price.toString()),\n updatedAt: tokenInformation.updatedAt,\n chainId,\n };\n }\n\n return map;\n },\n {},\n );\n}\n","import { type Config, getPublicClient } from \"@wagmi/core\";\nimport {\n type Address,\n type ContractFunctionParameters,\n erc20Abi,\n formatUnits,\n} from \"viem\";\n\nimport { assertDefined, assertPublicClient } from \"~/errors/assert\";\nimport type { AllowanceQueryItem, AllowanceToken } from \"~/types/dex\";\n\nexport interface GetAllowances {\n items: AllowanceQueryItem[] | undefined;\n account: `0x${string}` | undefined;\n config: Config | undefined;\n}\n\nexport type GetAllowancesResponse = AllowanceToken[] | undefined;\n\nexport async function getAllowances({\n items: itemsList,\n account,\n config,\n}: GetAllowances): Promise<GetAllowancesResponse> {\n assertDefined(itemsList, \"items\");\n assertDefined(config, \"config\");\n assertDefined(account, \"account\");\n\n const tokensByChainId = Object.groupBy(\n itemsList,\n (item) => item.token.chainId,\n );\n\n const res = await Promise.allSettled(\n Object.entries(tokensByChainId).map(async ([chainId, items]) => {\n if (!items) return [];\n\n const publicClient = getPublicClient(config, {\n chainId: Number(chainId),\n });\n assertPublicClient(publicClient, `publicClient ${chainId}`);\n\n const result = await publicClient.multicall({\n contracts: items.map(\n (item) =>\n ({\n address: item.token.address,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [account, item.spender as Address],\n }) as const as ContractFunctionParameters<\n typeof erc20Abi,\n \"view\",\n \"allowance\"\n >,\n ),\n });\n\n const allowances = result.map((item, index: number) => {\n const token = items[index];\n if (item.error) {\n return undefined;\n }\n\n const resultAllowanceToken: AllowanceToken = {\n token: token.token,\n spender: token.spender,\n amount: token.amount,\n allowance: {\n raw: item.result.toString(),\n formatted: formatUnits(item.result, token.token.decimals),\n },\n needsApproval: item.result < BigInt(token.amount.raw),\n } satisfies AllowanceToken;\n return resultAllowanceToken;\n });\n return allowances.filter((i): i is AllowanceToken => Boolean(i));\n }),\n );\n\n return res\n .flatMap((result) =>\n result.status === \"fulfilled\" ? result.value : undefined,\n )\n .filter((i): i is AllowanceToken => Boolean(i));\n}\n","import {\n getPublicClient,\n getWalletClient,\n type SwitchChainErrorType,\n switchChain,\n type WriteContractParameters,\n} from \"@wagmi/core\";\nimport {\n type Abi,\n BaseError,\n type ContractFunctionArgs,\n type ContractFunctionName,\n createWalletClient,\n decodeErrorResult,\n type GetTransactionCountReturnType,\n type Hex,\n HttpRequestError,\n http,\n type TransactionReceipt,\n type WalletCallReceipt,\n} from \"viem\";\n\nimport { ChainId, defaultChainId } from \"@berachain/config/internal\";\n\nimport { commonAbiErrors } from \"~/abi/utils/commonAbiErrors\";\nimport { assertPublicClient } from \"~/errors/assert\";\nimport { BeraError } from \"~/errors/BeraError\";\nimport { getRevertReason } from \"~/errors/getRevertReason\";\nimport { InvalidArgumentError } from \"~/errors/InvalidArgumentError\";\nimport { parseDecodedError, parseViemError } from \"~/errors/parseViemError\";\nimport { RequestError } from \"~/errors/RequestError\";\nimport { TransactionFailedError } from \"~/errors/TransactionFailedError\";\nimport type { IContractWrite } from \"~/types/global\";\nimport { DEFAULT_METAMASK_GAS_LIMIT } from \"~/utils/constants\";\nimport { getTestClient } from \"~/utils/getTestClient\";\nimport { seconds } from \"~/utils/time\";\n\n/**\n * Setting 1 seconds as refresh interval since block time is 2 seconds.\n *\n * Keeping this longer will increase the time to wait for the transaction to be confirmed.\n * If tx is confirmed after 0.5 seconds, the user would have to wait for 1.5 seconds more before UI is updated.\n * 1 seconds seems a good compromise. A shorter interval\n */\nconst defaultPollingInterval = seconds(1);\n\nconst increaseByPercentage = (value: bigint, percentage: number) => {\n return (value * (100n + BigInt(percentage))) / 100n;\n};\n\n/**\n * This helps prevent IntegerOutOfRangeError by not providing a nonce if it's too large.\n *\n * Despite this should not be possible, some users have experienced this error. We're collecting\n * the error and the nonce value to help debug the issue.\n */\nfunction parseNonce({\n nonceResult,\n onWarning,\n}: {\n nonceResult: PromiseSettledResult<GetTransactionCountReturnType | undefined>;\n onWarning?: (e: BeraError) => void;\n}): number | undefined {\n if (nonceResult.status === \"fulfilled\") {\n if (nonceResult.value && nonceResult.value > Number.MAX_SAFE_INTEGER) {\n // This happened only to one user that manually set a very high nonce.\n // This is very unlikely to happen if we get the nonce from the latest block instead of pending.\n onWarning?.(\n new BeraError({\n message:\n \"Nonce is too large. No nonce will be provided to avoid IntegerOutOfRangeError.\",\n cause: nonceResult.value,\n level: \"debug\",\n }),\n );\n return undefined;\n }\n\n return nonceResult.value;\n }\n return undefined;\n}\n\nexport function isImpersonateAccount(chainId: number = defaultChainId) {\n return chainId === ChainId.BEPOLIA\n ? process.env.NEXT_PUBLIC_80069_ANVIL_IMPERSONATE_ACCOUNT === \"true\"\n : process.env.NEXT_PUBLIC_80094_ANVIL_IMPERSONATE_ACCOUNT === \"true\";\n}\n\nexport async function beraWriteContract<\n abi extends Abi | undefined = undefined,\n functionName extends abi extends Abi\n ? ContractFunctionName<abi>\n : never = abi extends Abi ? ContractFunctionName<abi> : never,\n params extends abi extends Abi\n ? ContractFunctionArgs<abi, \"payable\" | \"nonpayable\", functionName>\n : never = abi extends Abi\n ? ContractFunctionArgs<abi, \"payable\" | \"nonpayable\", functionName>\n : never,\n>(\n args: IContractWrite<abi, functionName, params> & {\n enableSimulateCalls?: boolean;\n chainId?: number;\n impersonateAccount?: boolean;\n /**\n * The polling interval in milliseconds to fetch the on-chain transaction status\n * @default 1000 (1 second)\n */\n pollingInterval?: number;\n /**\n * The timeout in milliseconds to wait for the transaction to be confirmed.\n * @default 120_000 (2 minutes)\n */\n txConfirmationTimeout?: number;\n },\n): Promise<\n | TransactionReceipt\n | WalletCallReceipt<bigint, \"success\" | \"reverted\">\n | undefined\n> {\n if (\n process.env.NODE_ENV === \"development\" &&\n !args.contractName &&\n // let's avoid this for eip5972 calls\n args.address &&\n !(\"calls\" in args || args.calls)\n ) {\n console.warn(\n \"beraWriteContract: Contract name is required. Either update the contract mapping in devrel or provide a contract name in ContractName enum\",\n \"This is a development error and will be thrown in development mode only.\",\n );\n\n throw new InvalidArgumentError({\n property: \"contractName\",\n value: args.contractName,\n expected: \"ContractName\",\n displayMessage: `[DEV] Contract name is required as it's not mapped in the devrel's contract mapping ${args.address}`,\n level: \"error\",\n });\n }\n\n const {\n address,\n calls,\n value,\n gasLimit,\n onLoading,\n onSuccess,\n onWarning,\n onError,\n onSubmission,\n wagmiConfig,\n walletClient: _walletClient,\n account: argsAccount,\n txConfirmationTimeout = 120_000,\n chainId = defaultChainId,\n impersonateAccount = isImpersonateAccount(chainId),\n errorsAbi: _errorsAbi = [],\n pollingInterval = defaultPollingInterval,\n ...rest\n } = args;\n\n onLoading?.(args);\n\n const data = \"data\" in rest ? (rest.data as Hex) : undefined;\n\n const globalAbi = [\n ...commonAbiErrors,\n ..._errorsAbi,\n ...(\"abi\" in rest && rest.abi && Array.isArray(rest.abi)\n ? (rest.abi as unknown as Abi)\n : []),\n ] as unknown as abi extends undefined ? Abi : abi;\n\n let walletClient = _walletClient;\n\n if (!wagmiConfig) {\n onError?.(\n new InvalidArgumentError({\n property: \"wagmiConfig\",\n value: wagmiConfig,\n expected: \"Config\",\n }),\n args,\n );\n return;\n }\n\n const isLocalAccount = walletClient?.account?.type === \"local\";\n\n if (!isLocalAccount) {\n try {\n /**\n * This is needed because if we don't wrap the button into an ActionButton, or the connector doesn't warn us that the chain\n * is not synced with the dapp, we'll get a ChainMismatchError.\n */\n await switchChain(wagmiConfig, { chainId });\n } catch (e) {\n const error = e as SwitchChainErrorType;\n onError?.(\n new BeraError({\n cause: error,\n displayMessage: \"There was an error switching to the chain.\",\n }),\n args,\n );\n return;\n }\n }\n\n if (!walletClient) {\n try {\n walletClient = await getWalletClient(wagmiConfig, { chainId });\n } catch (e) {\n onError?.(\n new BeraError({\n cause: e,\n displayMessage: \"There was an error connecting to the wallet.\",\n }),\n args,\n );\n return;\n }\n }\n\n if (!walletClient) {\n onError?.(\n new InvalidArgumentError({\n displayMessage: \"There was an error connecting to the wallet.\",\n property: \"walletClient\",\n value: walletClient,\n expected: \"WalletClient\",\n }),\n args,\n );\n return;\n }\n\n const account = argsAccount || walletClient.account;\n\n if (!account) {\n onError?.(\n new InvalidArgumentError({\n property: \"account\",\n value: account,\n expected: \"Account\",\n }),\n args,\n );\n return;\n }\n\n const accountAddress =\n typeof account === \"string\" ? account : account.address;\n\n const publicClient = getPublicClient(wagmiConfig, {\n chainId,\n });\n\n try {\n assertPublicClient(publicClient);\n } catch (error) {\n onError?.(error as InvalidArgumentError, args);\n return;\n }\n\n if (impersonateAccount) {\n const testClient = getTestClient(chainId);\n await testClient.impersonateAccount({\n address: accountAddress,\n });\n\n walletClient = createWalletClient({\n transport: http(testClient.transport.url),\n account,\n chain: walletClient.chain,\n });\n }\n /**\n * If tx is submitted, this will be assigned the tx hash\n */\n let txHash: Hex | undefined;\n /**\n * This is just needed for the error object\n */\n const input = {\n calls: \"calls\" in rest ? rest.calls : undefined,\n params: \"params\" in rest ? rest.params : undefined,\n value,\n data: \"data\" in rest ? (rest.data as Hex) : undefined,\n } as const;\n\n try {\n /**\n * Nonces are security-critical for preventing replay attacks.\n */\n const noncePromise = publicClient\n .getTransactionCount({\n address: accountAddress,\n /**\n * We won't use pending any more because if someone previously send a txn with a higher nonce, this won't be executed\n * unless all the previous nonces are executed.\n *\n * This will lead to a UX issue where the user thinks the txn was not sent because it's pending forever.\n *\n * The only case where pending is needed is if chain is halted or the user is sending multiple transactions at the same time.\n * However, it's less likely to happen.\n *\n * A lot of waitForTransactionReceipt were timing out, and maybe it was related to that.\n */\n blockTag: \"latest\",\n })\n // This must be caught to prevent the promise from rejecting before being awaited\n .catch(() => undefined);\n\n /**\n * These are properties that are shared between the simulation and gas estimation whether we have\n */\n const sharedTxProperties = {\n account: accountAddress,\n to: address,\n address,\n chainId,\n value,\n } as const;\n\n if (calls) {\n const parsedCalls = calls.map((call) => {\n if (\"abi\" in call && Array.isArray(globalAbi)) {\n globalAbi.push(...(call.abi as Abi));\n }\n\n if (\"data\" in call) {\n return {\n to: call.address,\n data: call.data as Hex,\n value: call.value ?? 0n,\n };\n }\n if (\"abi\" in call && \"functionName\" in call) {\n const params = \"params\" in call ? call.params : undefined;\n\n return {\n to: call.address,\n abi: call.abi as Abi,\n functionName: call.functionName as ContractFunctionName<Abi>,\n args: params as readonly unknown[],\n value: call.value ?? 0n,\n };\n }\n return {\n to: call.address,\n value: call.value ?? 0n,\n };\n });\n\n if (args.enableSimulateCalls) {\n const res = await publicClient.simulateCalls({\n calls: parsedCalls,\n account,\n });\n\n const failedCallIndex = res.results.findIndex(\n (result) => result.status === \"failure\",\n );\n if (failedCallIndex !== -1) {\n if (res.block.number === null) {\n throw new InvalidArgumentError({\n property: \"blockNumber\",\n value: res.block.number,\n expected: \"bigint\",\n message: \"Block number is null\",\n });\n }\n\n const failedCall = res.results[failedCallIndex];\n\n const { reason: decodedReason } =\n failedCall.data && failedCall.data !== \"0x\"\n ? {\n reason: parseDecodedError(\n decodeErrorResult({\n data: failedCall.data,\n abi: globalAbi,\n }),\n ),\n }\n : parseViemError({\n error: failedCall.error as Error,\n revertIfUnknown: false,\n abi: globalAbi,\n });\n\n onError?.(\n new TransactionFailedError({\n cause: failedCall.error,\n txHash,\n chainId,\n reason: decodedReason,\n abi: globalAbi,\n input,\n blockNumber: res.block.number,\n }),\n args,\n );\n return;\n }\n }\n\n if (process.env.NODE_ENV === \"test\") {\n // sendCalls uses EIP-5972 so that the wallet provider can send batch calls with EIP-7702\n // @todo We can simulate it using the EIP-7702StatelessDelegator ABI, assuming the wallet has sent authorized metamask's contract\n throw new InvalidArgumentError({\n displayMessage: \"Batch calls are not supported in test environment\",\n expected: \"not test\",\n property: \"NODE_ENV\",\n value: process.env.NODE_ENV,\n level: \"fatal\",\n });\n }\n\n const request = await walletClient.sendCalls({\n calls: parsedCalls,\n account,\n // This is needed to ensure that the transaction is atomic\n // If this was not set, we might have a list of receipts instead of a single one\n forceAtomic: true,\n });\n\n /**\n * This is different from the other onSubmission callbacks\n * however `request` does not have the txHash, but just the request id to the wallet provider\n * Wallet provider should support the showCallStatus method. MM does not atm.\n */\n onSubmission?.({ id: request.id }, args);\n\n // If we get the call status right after the call is submitted, it will be pending\n // Receipts will be empty\n // Here's an example of the response:\n // {\n // \"id\": \"0x939c0c8b9fd546878b042c8232802450\",\n // \"status\": \"pending\",\n // \"atomic\": true,\n // \"chainId\": 80069,\n // \"receipts\": [],\n // \"statusCode\": 100,\n // \"version\": \"2.0.0\"\n // }\n // const callStatusPending = await walletClient.getCallsStatus({\n // id: request.id,\n // });\n\n // This will wait for the transaction to be submitted to the chain\n const callStatus = await walletClient.waitForCallsStatus({\n id: request.id,\n pollingInterval,\n timeout: txConfirmationTimeout,\n });\n\n if (callStatus.status === \"success\") {\n const receipt = callStatus.receipts?.[0];\n\n if (!receipt) {\n // This should never happen\n throw new BeraError({\n message: \"Call status is success but no receipt was found\",\n cause: callStatus,\n level: \"error\",\n reason: \"CALL_STATUS_SUCCESS_BUT_NO_RECEIPT\",\n });\n }\n\n onSuccess?.(receipt, args);\n return receipt;\n }\n\n console.error(\"wallet_sendCalls: Call failed\", callStatus);\n\n throw new TransactionFailedError({\n cause: callStatus,\n level: \"error\",\n input,\n txHash,\n abi: globalAbi,\n chainId,\n });\n }\n\n if (data) {\n // In this scenario data was already encoded by external library\n // and we can use it directly. If ABI was provided, errors will be decoded by parseViemError\n // This might also be just a value transaction\n\n // Add gas estimation for direct transactions\n const [simulationResult, estimatedGas, nonceResult] =\n await Promise.allSettled([\n publicClient.call({\n ...sharedTxProperties,\n data,\n }),\n gasLimit ??\n publicClient.estimateGas({\n ...sharedTxProperties,\n data,\n }),\n noncePromise,\n ]);\n\n if (simulationResult.status === \"rejected\") {\n throw simulationResult.reason;\n }\n\n const gas =\n estimatedGas.status === \"fulfilled\"\n ? increaseByPercentage(estimatedGas.value, 10)\n : DEFAULT_METAMASK_GAS_LIMIT;\n\n txHash = await walletClient.sendTransaction({\n data,\n to: address,\n account,\n gas,\n chainId,\n nonce: parseNonce({\n nonceResult,\n onWarning(e) {\n onWarning?.(e, args);\n },\n }),\n value,\n });\n onSubmission?.({ txHash }, args);\n } else if (\"abi\" in rest && \"functionName\" in rest) {\n const { abi, functionName } = rest as {\n abi: NonNullable<abi>;\n functionName: NonNullable<functionName>;\n };\n\n const params = \"params\" in rest ? rest.params : undefined;\n // Run simulation and gas estimation in parallel\n // TODO: figure out clean way to early detect errors and effectively show them on the UI\n const [simulationResult, gasEstimateResult, nonceResult] =\n await Promise.allSettled([\n // @ts-expect-error nested type issues. Be careful when changing this.\n publicClient.simulateContract({\n ...sharedTxProperties,\n abi: globalAbi as typeof abi,\n functionName,\n args: params,\n account,\n }),\n // Only estimate gas if no gasLimit is provided\n gasLimit ??\n // @ts-expect-error nested type issues. Be careful when changing this.\n publicClient.estimateContractGas({\n ...sharedTxProperties,\n abi: globalAbi,\n functionName,\n args: params,\n }),\n noncePromise,\n ]);\n\n if (simulationResult.status === \"rejected\") {\n throw simulationResult.reason;\n }\n\n const estimatedGas =\n gasLimit ??\n (gasEstimateResult.status === \"fulfilled\"\n ? increaseByPercentage(gasEstimateResult.value, 10)\n : DEFAULT_METAMASK_GAS_LIMIT);\n\n txHash = await walletClient.writeContract({\n ...simulationResult.value.request,\n chainId,\n gas: estimatedGas,\n nonce: parseNonce({\n nonceResult,\n onWarning(e) {\n onWarning?.(e, args);\n },\n }),\n } as WriteContractParameters);\n onSubmission?.({ txHash }, args);\n } else {\n const [nonceResult] = await Promise.allSettled([noncePromise]);\n txHash = await walletClient.sendTransaction({\n chainId,\n to: address,\n value,\n account,\n nonce: parseNonce({\n nonceResult,\n onWarning(e) {\n onWarning?.(e, args);\n },\n }),\n });\n onSubmission?.({ txHash }, args);\n }\n\n if (process.env.NODE_ENV === \"test\") {\n const testClient = getTestClient(chainId);\n await testClient.mine({ blocks: 1 });\n }\n\n const confirmationReceipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n pollingInterval,\n timeout: txConfirmationTimeout,\n confirmations: 1,\n });\n\n if (confirmationReceipt.status === \"success\") {\n onSuccess?.(confirmationReceipt, args);\n } else {\n const revertReason = await getRevertReason({\n publicClient,\n blockNumber: confirmationReceipt.blockNumber,\n to: address,\n account: accountAddress,\n abi: globalAbi,\n args:\n \"params\" in rest ? (rest.params as readonly unknown[]) : undefined,\n functionName:\n \"functionName\" in rest\n ? (rest.functionName as functionName)\n : undefined,\n value,\n data,\n });\n\n if (process.env.NODE_ENV === \"test\") {\n console.error(\"beraWriteContract: Revert reason\", revertReason);\n }\n\n onError?.(\n new TransactionFailedError({\n reason: revertReason.reason,\n txHash,\n receipt: confirmationReceipt,\n to: address,\n functionName:\n \"functionName\" in rest\n ? (rest.functionName as functionName)\n : undefined,\n input,\n chainId,\n abi: globalAbi,\n blockNumber: confirmationReceipt.blockNumber,\n }),\n args,\n );\n }\n return confirmationReceipt;\n } catch (e) {\n if (e instanceof BeraError) {\n onError?.(e, args);\n } else if (e instanceof Error) {\n const viemError = parseViemError({\n error: e,\n revertIfUnknown: false,\n abi: globalAbi,\n });\n\n if (\n viemError &&\n viemError.rootCause instanceof BaseError &&\n \"url\" in viemError.rootCause\n ) {\n onError?.(\n new RequestError({\n cause: viemError.rootCause,\n response: undefined,\n endpoint: {\n url: viemError.rootCause.url as string,\n type: \"rpc\",\n },\n statusCode:\n viemError.rootCause instanceof HttpRequestError\n ? viemError.rootCause.status\n : undefined,\n }),\n args,\n );\n return;\n }\n onError?.(\n new TransactionFailedError({\n cause: e,\n to: address,\n txHash,\n chainId,\n abi: globalAbi,\n functionName:\n \"functionName\" in rest\n ? (rest.functionName as functionName)\n : undefined,\n input,\n }),\n args,\n );\n } else {\n onError?.(\n new TransactionFailedError({\n cause: e,\n txHash,\n to: address,\n chainId,\n functionName:\n \"functionName\" in rest\n ? (rest.functionName as functionName)\n : undefined,\n input,\n abi: globalAbi,\n }),\n args,\n );\n }\n }\n}\n","import {\n type Abi,\n AbiFunctionSignatureNotFoundError,\n type Address,\n decodeFunctionData,\n type Hex,\n type PublicClient,\n} from \"viem\";\n\nimport { commonAbiErrors } from \"~/abi/utils/commonAbiErrors\";\nimport { InvalidArgumentError } from \"./InvalidArgumentError\";\nimport { parseViemError } from \"./parseViemError\";\nimport { TransactionFailedError } from \"./TransactionFailedError\";\n\nexport type GetRevertReasonArgs = {\n publicClient: PublicClient;\n abi?: Abi;\n} & (\n | {\n txHash: Hex;\n }\n | ({\n blockNumber: bigint;\n to: Address;\n account: Address;\n value?: bigint | undefined;\n } & (\n | { data: Hex }\n | { value: bigint }\n | {\n args: readonly unknown[] | undefined;\n functionName: string | undefined;\n value?: bigint;\n }\n ))\n);\n/**\n * Recovers the revert reason for a transaction that failed **on-chain**.\n *\n * When a transaction is mined but reverts, the revert reason is no longer available in the\n * original viem error (we only get `status: \"reverted\"` in the receipt). This function\n * recovers the reason by **replaying the transaction** at the same block number.\n *\n * ## How it works\n *\n * 1. **Reconstruct the call:** Either from a `txHash` (fetches tx data from chain) or from\n * explicit `blockNumber + to + account + data/functionName+args`.\n * 2. **Replay via simulateContract:** Calls `publicClient.simulateContract` at the original\n * `blockNumber`, which reproduces the exact revert that happened on-chain.\n * 3. **Parse the revert:** The simulated revert throws a viem error, which is caught and\n * parsed by `parseViemError` to extract the reason.\n *\n * ## Usage context\n *\n * This function is called internally by `beraWriteContract` when a transaction receipt has\n * `status: \"reverted\"`. The recovered reason is passed into `TransactionFailedError`, which\n * then feeds into the standard pipeline (errorMap → displayMessage → Sentry).\n *\n * ## ABI importance\n *\n * Passing the correct ABI is critical here. Without it, custom error names cannot be decoded\n * and the reason falls back to a hex selector. The ABI is merged with `commonAbiErrors`\n * (which includes `Error(string)` and `Panic(uint256)`) to handle standard reverts.\n *\n * @returns Same shape as parseViemError: `{ reason, rootCause }`\n */\nexport async function getRevertReason({\n publicClient,\n abi: providedAbi,\n ...params\n}: GetRevertReasonArgs): Promise<ReturnType<typeof parseViemError>> {\n const abi = [...commonAbiErrors, ...(providedAbi ?? [])];\n let blockNumber: bigint;\n let to: Address;\n let account: Address;\n let value: bigint | undefined;\n\n let data: Hex | undefined;\n let functionName: string | undefined;\n let args: readonly unknown[] | undefined;\n\n // ── Step 1: Reconstruct the original call parameters ──────────────────\n if (\"txHash\" in params) {\n // Fetch the original transaction from the chain to get its input data, recipient, etc.\n const tx = await publicClient.getTransaction({\n hash: params.txHash,\n });\n if (!tx.to)\n throw new InvalidArgumentError({\n property: \"tx\",\n value: tx,\n expected: \"Transaction\",\n message: \"Trying to get revert reason for a contract creation\",\n });\n\n data = tx.input;\n to = tx.to;\n account = tx.from;\n value = tx.value;\n blockNumber = tx.blockNumber;\n } else {\n blockNumber = params.blockNumber;\n to = params.to;\n account = params.account;\n value = params.value;\n\n if (\"data\" in params) {\n data = params.data;\n } else if (\"functionName\" in params && \"args\" in params) {\n functionName = params.functionName;\n args = params.args;\n } else if (!value) {\n throw new InvalidArgumentError({\n property: \"dataOrFunctionNameAndArgs\",\n value: params,\n expected: \"Hex or FunctionName and Args\",\n });\n }\n }\n\n // ── Step 2: Replay the transaction to reproduce the revert ────────────\n // We intentionally call simulateContract/call expecting it to revert.\n // The revert error is then caught and parsed by parseViemError.\n try {\n if (!abi) {\n // No ABI available — use raw call which will revert with raw data\n if (data) {\n await publicClient.call({\n data,\n to,\n account,\n blockNumber,\n value,\n });\n } else {\n throw new Error(\"Data is required if abi is not provided\");\n }\n }\n\n // Resolve functionName and args from the raw data if not provided\n if (\"functionName\" in params && \"args\" in params && params.functionName) {\n functionName = params.functionName;\n args = params.args;\n } else if (data) {\n if (!abi) {\n const res = await publicClient.call({\n data,\n to,\n account,\n blockNumber,\n value,\n });\n\n throw new Error(\n `Getting revert reason for successful simulation. Data: ${data}`,\n { cause: res },\n );\n }\n try {\n // Decode the raw calldata into function name + args using the ABI\n const decoded = decodeFunctionData({\n abi,\n data,\n });\n\n functionName = decoded.functionName;\n args = decoded.args;\n } catch (e) {\n if (e instanceof AbiFunctionSignatureNotFoundError) {\n // Function signature not in ABI — fall back to raw call\n await publicClient.call({\n data,\n to,\n account,\n blockNumber,\n value,\n });\n }\n\n throw new Error(\"Data is required if abi is not provided\");\n }\n } else {\n throw new Error(\"No data or function name and args provided\");\n }\n\n if (abi && functionName) {\n // Replay with simulateContract — this should revert and throw a viem error\n // containing the decoded revert reason.\n await publicClient.simulateContract({\n functionName,\n args,\n abi,\n address: to,\n account,\n blockNumber,\n });\n\n // If we get here, the simulation succeeded (shouldn't happen for a reverted tx)\n throw new TransactionFailedError({\n message: `Getting revert reason for successful simulation`,\n functionName,\n to,\n txHash: \"txHash\" in params ? params.txHash : undefined,\n input: params,\n });\n }\n\n throw new Error(\"No data or function name and args provided\");\n } catch (error) {\n // ── Step 3: Parse the revert error to extract the reason ──────────\n // The simulated revert throws a viem error chain which parseViemError unwraps.\n if (error instanceof Error) {\n return parseViemError({ error, abi, revertIfUnknown: true });\n }\n\n throw error;\n }\n}\n","import {\n GetValidators,\n type GetValidatorsQuery,\n type GetValidatorsQueryVariables,\n type GqlChain,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getAllValidators({\n variables = {},\n ...args\n}: {\n variables?: GetValidatorsQueryVariables;\n} & BeraJS.BaseFunctionArgs = {}): Promise<GetValidatorsQuery | undefined> {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const result = await bexApiGraphqlClient.query<\n GetValidatorsQuery,\n GetValidatorsQueryVariables\n >({\n query: GetValidators,\n variables: {\n chain: config.bex.chainName as GqlChain,\n ...variables,\n },\n });\n\n return result.data;\n}\n","import { isAddressEqual } from \"viem\";\n\nimport type { ApiRewardAllocationWeightFragment } from \"@berachain/graphql/pol/api\";\n\nimport { getRewardVaults } from \"../pol/getRewardVaults\";\nimport type { ValidatorRewardAllocation } from \"./getValidatorRewardAllocation\";\n\nexport async function getApiEnrichedAllocation({\n allocation,\n}: {\n allocation: ValidatorRewardAllocation;\n}) {\n const vaults = await getRewardVaults({\n filter: {\n where: {\n vaultAddressIn: allocation.weights.map((weight) => weight.receiver),\n },\n },\n });\n const startBlock = allocation?.start.blockNumber ?? 0;\n return allocation?.weights.map<ApiRewardAllocationWeightFragment>(\n (allocation) => {\n return {\n percentage: allocation.percentage,\n receiver: allocation.receiver,\n startBlock,\n receivingVault: vaults?.gaugeList.find((vault) =>\n isAddressEqual(vault.address, allocation.receiver),\n ),\n };\n },\n );\n}\n","import type { Address } from \"viem\";\n\nimport {\n GetValidator,\n type GetValidatorQuery,\n type GetValidatorQueryVariables,\n type GqlChain,\n} from \"@berachain/graphql/pol/api\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getApiValidator({\n id,\n ...args\n}: {\n /**\n * The validator keccak256 pubkey\n */\n id: Address;\n} & BeraJS.BaseFunctionArgs): Promise<GetValidatorQuery> {\n const { config } = parseBaseArgs(args);\n\n const bexApiGraphqlClient = getApolloClient(\"api\", args);\n\n const results = await bexApiGraphqlClient.query<\n GetValidatorQuery,\n GetValidatorQueryVariables\n >({\n query: GetValidator,\n variables: {\n id,\n chain: config.bex.chainName as GqlChain,\n },\n });\n\n return results.data;\n}\n","import type { Address } from \"viem\";\n\nimport {\n GetValidatorBlockStats,\n type GetValidatorBlockStatsQuery,\n type GetValidatorBlockStatsQueryVariables,\n} from \"@berachain/graphql/pol/subgraph\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\n\nexport async function getDailyValidatorBlockStats({\n pubKey,\n first = 1,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n pubKey: Address;\n first?: number;\n}): Promise<GetValidatorBlockStatsQuery | undefined> {\n const bgtClient = getApolloClient(\"pol.subgraph\", args);\n try {\n const result = await bgtClient.query<\n GetValidatorBlockStatsQuery,\n GetValidatorBlockStatsQueryVariables\n >({\n query: GetValidatorBlockStats,\n variables: {\n pubKey,\n first,\n },\n });\n\n return result.data;\n } catch (e) {\n console.error(\"GetValidatorBlockStats:\", e);\n throw e;\n }\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { beraChefAbi } from \"~/abi/pol/beraChef\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport interface ValidatorRewardAllocationRaw {\n startBlock: bigint;\n weights: readonly {\n receiver: `0x${string}`;\n percentageNumerator: bigint;\n }[];\n}\nexport interface ValidatorRewardAllocation {\n start: {\n blockNumber: number;\n timestamp: number;\n };\n weights: readonly {\n receiver: `0x${string}`;\n /**\n * Weight percentage as a number between 0 and 1.\n */\n percentage: number;\n }[];\n}\n\nexport interface ValidatorRewardAllocationUpdate {\n active: ValidatorRewardAllocation[\"start\"];\n set: ValidatorRewardAllocation[\"start\"];\n}\n\nexport interface ValidatorRewardAllocationUpdateWithExpiration\n extends ValidatorRewardAllocationUpdate {\n expiresAtTs: number;\n}\n\nexport function formatValidatorRewardAllocation(\n raw: ValidatorRewardAllocationRaw,\n startTs: number,\n): ValidatorRewardAllocation {\n return {\n start: {\n blockNumber: Number(raw.startBlock),\n timestamp: raw.startBlock !== 0n ? startTs : 0,\n },\n weights: raw.weights.map((weight) => ({\n receiver: weight.receiver,\n percentage: Number(weight.percentageNumerator) / 1e4,\n })),\n };\n}\nexport function isSameRewardAllocation(\n a: ValidatorRewardAllocation,\n b: ValidatorRewardAllocation,\n): boolean {\n return (\n a.start.blockNumber === b.start.blockNumber &&\n a.weights.every(\n (weight, index) => weight.percentage === b.weights[index].percentage,\n )\n );\n}\n\nexport async function getValidatorRewardAllocation({\n client,\n pubKey,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n client: PublicClient;\n pubKey: Address;\n}): Promise<{\n /**\n * The active reward allocation for the validator.\n */\n activeRewardAllocation: ValidatorRewardAllocation;\n /**\n * The set reward allocation for the validator.\n *\n * It might differ from the active reward allocation if the validator hasn't updated\n * the reward allocation for more than the reward allocation inactivity block span.\n */\n setRewardAllocation: ValidatorRewardAllocation;\n /**\n * Whether the reward allocation is inactive so it falls back to the baseline reward allocation.\n */\n isBaseline: boolean;\n\n isNeverSet: boolean;\n}> {\n const { config } = parseBaseArgs(args);\n\n try {\n const [rawActiveRewardAllocation, rawSetRewardAllocation] =\n await Promise.all([\n client.readContract({\n address: config.pol.beraChef,\n abi: beraChefAbi,\n functionName: \"getActiveRewardAllocation\",\n args: [pubKey],\n }),\n client.readContract({\n address: config.pol.beraChef,\n abi: beraChefAbi,\n functionName: \"getSetActiveRewardAllocation\",\n args: [pubKey],\n }),\n ]);\n\n // blocknumber !== 0 is also checked in `formatValidatorRewardAllocation`\n // but we're saving a request by checking it here.\n const [lastRaUpdateActive, lastRaUpdateSet] = await Promise.all([\n rawActiveRewardAllocation.startBlock !== 0n\n ? client.getBlock({\n blockNumber: BigInt(rawActiveRewardAllocation.startBlock),\n })\n : { timestamp: 0 },\n rawSetRewardAllocation.startBlock !== 0n\n ? client.getBlock({\n blockNumber: BigInt(rawSetRewardAllocation.startBlock),\n })\n : { timestamp: 0 },\n ]);\n\n const activeRewardAllocation = formatValidatorRewardAllocation(\n rawActiveRewardAllocation,\n Number(lastRaUpdateActive.timestamp),\n );\n\n const setRewardAllocation = formatValidatorRewardAllocation(\n rawSetRewardAllocation,\n Number(lastRaUpdateSet.timestamp),\n );\n\n let isBaseline = false;\n\n if (setRewardAllocation.start.blockNumber === 0) {\n // the validator has never set the reward allocation\n isBaseline = true;\n } else {\n // the validator has set the reward allocation,\n // but BeraChef might be using the baseline reward allocation if it's inactive.\n isBaseline = !isSameRewardAllocation(\n setRewardAllocation,\n activeRewardAllocation,\n );\n }\n\n return {\n activeRewardAllocation: activeRewardAllocation,\n setRewardAllocation,\n isBaseline,\n isNeverSet: setRewardAllocation?.start.blockNumber === 0,\n };\n } catch (e) {\n console.log(\"getValidatorRewardAllocation:\", e);\n throw e;\n }\n}\n","import type { PublicClient } from \"viem\";\n\nimport { beraChefAbi } from \"~/abi/pol/beraChef\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport {\n formatValidatorRewardAllocation,\n type ValidatorRewardAllocation,\n} from \"./getValidatorRewardAllocation\";\n\nexport function isDefaultRewardAllocation(\n rewardAllocation: ValidatorRewardAllocation,\n): boolean {\n return rewardAllocation.start.blockNumber === 0;\n}\n\nexport async function getDefaultRewardAllocation({\n client,\n ...args\n}: {\n client: PublicClient;\n}): Promise<ValidatorRewardAllocation> {\n const { config } = parseBaseArgs(args);\n\n const rawDefaultRewardAllocation = await client.readContract({\n address: config.pol.beraChef,\n abi: beraChefAbi,\n functionName: \"getDefaultRewardAllocation\",\n args: [],\n });\n\n // Default reward allocation is active as soon as it's set by governance.\n // Since startBlock is not validated and might be anything set in the payload\n // (but it has no effect), we force it to 0 to avoid any confusion.\n // this might change if smart contract is updated to validate startBlock.\n return formatValidatorRewardAllocation(\n { ...rawDefaultRewardAllocation, startBlock: 0n },\n 0,\n );\n}\n","import type { Address } from \"viem\";\n\nimport {\n GetValidatorByAccount,\n type GetValidatorByAccountQuery,\n type GetValidatorByAccountQueryVariables,\n} from \"@berachain/graphql/pol/subgraph\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\n\nexport async function getManagedValidatorByAccount({\n account,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n account: Address;\n}): Promise<GetValidatorByAccountQuery | undefined> {\n try {\n const bgtClient = getApolloClient(\"pol.subgraph\", args);\n const result = await bgtClient.query<\n GetValidatorByAccountQuery,\n GetValidatorByAccountQueryVariables\n >({\n query: GetValidatorByAccount,\n variables: { account },\n });\n\n return result.data;\n } catch (e) {\n console.error(\"getManagedValidatorByAccount:\", e);\n throw e;\n }\n}\n","import type { PublicClient } from \"viem\";\n\n/**\n * Get the current number of BERA in the batch for a validator's staking pool\n * The batch can contain at most 10K BERA, then the batch will be sent to the contract\n * @param client - The public client\n * @param valPubKey - The public key of the validator\n * @returns The current batch number\n */\nexport async function getStakingPoolBatch({\n client,\n valPubKey,\n}: {\n client: PublicClient;\n valPubKey: `0x${string}`;\n}) {\n // [TODO] Implement this\n // probably going to be a contract call or better a query to read the subgraph\n return 5614;\n}\n","import { type Address, formatEther, type PublicClient } from \"viem\";\n\nimport { bgtAbi } from \"~/abi/pol/bgt\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport type UserBoostsOnValidator = {\n pubkey: Address;\n activeBoostAmount: string;\n queuedBoostAmount: string;\n queuedBoostStartBlock: number;\n queuedDropBoostAmount: string;\n queuedDropBoostStartBlock: number;\n hasPendingBoosts: boolean;\n hasActiveBoosts: boolean;\n};\n\nexport async function getUserBoostsOnValidator({\n account,\n pubkey,\n publicClient,\n ...args\n}: {\n account: Address;\n pubkey: Address;\n publicClient: PublicClient | undefined;\n} & BeraJS.BaseFunctionArgs): Promise<UserBoostsOnValidator> {\n const { config } = parseBaseArgs(args);\n\n if (!account) {\n throw new Error(\"account is required\");\n }\n if (!publicClient) {\n throw new Error(\"publicClient is required\");\n }\n\n const [activeBoostAmount, queuedBoostAmount, queuedDropBoostAmount] =\n await Promise.all([\n publicClient.readContract({\n address: config.tokens.bgt,\n abi: bgtAbi,\n functionName: \"boosted\",\n args: [account!, pubkey!],\n }),\n publicClient.readContract({\n address: config.tokens.bgt,\n abi: bgtAbi,\n functionName: \"boostedQueue\",\n args: [account!, pubkey!],\n }),\n publicClient.readContract({\n address: config.tokens.bgt,\n abi: bgtAbi,\n functionName: \"dropBoostQueue\",\n args: [account!, pubkey!],\n }),\n ]);\n\n return {\n pubkey,\n activeBoostAmount: formatEther(activeBoostAmount),\n queuedBoostAmount: formatEther(queuedBoostAmount[1]),\n queuedDropBoostAmount: formatEther(queuedDropBoostAmount[1]),\n queuedBoostStartBlock: queuedBoostAmount[0],\n queuedDropBoostStartBlock: queuedDropBoostAmount[0],\n hasPendingBoosts:\n Number(queuedBoostAmount[1]) > 0 || Number(queuedDropBoostAmount[1]) > 0,\n hasActiveBoosts: Number(activeBoostAmount) > 0,\n };\n}\n","import type { Address } from \"viem\";\n\nimport {\n GetUserValidatorInformation,\n type GetUserValidatorInformationQuery,\n type GetUserValidatorInformationQueryVariables,\n} from \"@berachain/graphql/pol/subgraph\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\n\nexport async function getUserBoosts({\n account,\n block,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n account: string;\n block?: GetUserValidatorInformationQueryVariables[\"block\"];\n}) {\n const bgtClient = getApolloClient(\"pol.subgraph\", args);\n // TODO: handle more than 1000 validators\n return await bgtClient.query<\n GetUserValidatorInformationQuery,\n GetUserValidatorInformationQueryVariables\n >({\n query: GetUserValidatorInformation,\n variables: { address: account.toLowerCase() as Address, block },\n });\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport type {\n ApiValidatorFragment,\n GqlChain,\n} from \"@berachain/graphql/pol/api\";\n\nimport { isSubgraphStale } from \"~/utils/isSubgraphStale\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport { getAllValidators } from \"./getAllValidators\";\nimport { getUserBoosts } from \"./getUserBoosts\";\nimport {\n getUserBoostsOnValidator,\n type UserBoostsOnValidator,\n} from \"./getUserBoostsOnValidator\";\n\nexport type ValidatorWithUserBoost = ApiValidatorFragment & {\n userBoosts: UserBoostsOnValidator;\n};\n\nexport async function getUserActiveValidators({\n account,\n publicClient,\n chain,\n ...args\n}: {\n account: string;\n publicClient?: PublicClient | undefined;\n chain?: GqlChain;\n} & BeraJS.BaseFunctionArgs): Promise<ValidatorWithUserBoost[] | undefined> {\n const { config } = parseBaseArgs(args);\n const resolvedChain = chain ?? (config.bex.chainName as GqlChain);\n\n const userBoosts = await getUserBoosts({ account });\n\n const [validatorInfoList, onChainBoosts] = await Promise.all([\n getAllValidators({\n variables: {\n chain: resolvedChain,\n where: {\n idIn: userBoosts.data.userValidatorInformations.map(\n (t) => t.validator.id,\n ),\n },\n },\n }),\n publicClient &&\n isSubgraphStale({\n lastBlockTimestamp: userBoosts.data._meta?.block.timestamp,\n blockTime: config.averageBlockTime,\n })\n ? Promise.all(\n userBoosts.data.userValidatorInformations.map((t) =>\n getUserBoostsOnValidator({\n account: account as Address,\n pubkey: t.validator.publicKey,\n publicClient: publicClient,\n }),\n ),\n )\n : undefined,\n ]);\n\n return validatorInfoList?.validators.validators.map((validator) => {\n const userDeposited = onChainBoosts\n ? onChainBoosts.find(\n (data) =>\n data.pubkey.toLowerCase() === validator.pubkey.toLowerCase(),\n )\n : userBoosts.data.userValidatorInformations.find(\n (data) =>\n data.validator.id.toLowerCase() === validator.id.toLowerCase(),\n );\n\n if (!userDeposited) {\n throw new Error(\"User deposited not found\");\n }\n\n return {\n ...validator,\n userBoosts: {\n pubkey:\n \"pubkey\" in userDeposited\n ? userDeposited.pubkey\n : userDeposited.validator.publicKey,\n activeBoostAmount: userDeposited?.activeBoostAmount,\n queuedBoostAmount: userDeposited?.queuedBoostAmount,\n queuedBoostStartBlock: Number(userDeposited?.queuedBoostStartBlock),\n queuedDropBoostAmount: userDeposited?.queuedDropBoostAmount,\n queuedDropBoostStartBlock: Number(\n userDeposited?.queuedDropBoostStartBlock,\n ),\n hasPendingBoosts:\n Number(userDeposited?.queuedBoostAmount) > 0 ||\n Number(userDeposited?.queuedDropBoostAmount) > 0,\n hasActiveBoosts: Number(userDeposited?.activeBoostAmount) > 0,\n } satisfies UserBoostsOnValidator,\n } satisfies ValidatorWithUserBoost;\n });\n}\n","import type { Address } from \"viem\";\n\nimport { msToSeconds } from \"~/utils/time\";\n\ninterface StakingPoolAmount {\n amount: bigint;\n formattedAmount: string;\n}\n\nexport interface UserStakingPoolPosition {\n validatorAddress: Address;\n earning: number;\n staked?: StakingPoolAmount;\n rewards?: StakingPoolAmount;\n queueData?: {\n stake?: StakingPoolAmount[];\n unstake?: (StakingPoolAmount & { timestamp: number })[];\n };\n}\n\nconst snowTestWalletPositions: UserStakingPoolPosition[] = [\n {\n validatorAddress:\n \"0x8f51e63d9921a461be29e73dca1c2385e1adc5943fbb36ded4ba96025ee8a783184d1118da08171f6ea831153c878a6d\",\n earning: 0.045,\n staked: {\n amount: 16114000000000000000n,\n formattedAmount: \"161.14\",\n },\n rewards: {\n amount: 15214000000000000000n,\n formattedAmount: \"152.14\",\n },\n },\n {\n staked: {\n amount: 141514000000000000000n,\n formattedAmount: \"1415.14\",\n },\n validatorAddress:\n \"0x97b21253b17f4e814fe7505c15c18e68c85ab2477274ad370a762df50e3eb4cb1a48451e089bc22e158d7448549a8ab9\",\n earning: 0.045,\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n stake: [\n {\n amount: 16159000000000000000n,\n formattedAmount: \"161.59\",\n },\n ],\n unstake: [\n {\n amount: 16159000000000000000n,\n formattedAmount: \"161.59\",\n timestamp: msToSeconds(Date.now() - 72000000),\n },\n ],\n },\n },\n {\n staked: {\n amount: 141514000000000000000n,\n formattedAmount: \"1415.14\",\n },\n validatorAddress:\n \"0xa2705d6b27891f3f5651f26547d1bb79e256f95f249d1ad717cef087d77d38b037e5d6dbaa2538930fd0731ec9b02f3a\",\n earning: 0.145,\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n unstake: [\n {\n amount: 16159000000000000000n,\n formattedAmount: \"161.59\",\n timestamp: msToSeconds(Date.now() - 72000000),\n },\n ],\n },\n },\n {\n staked: {\n amount: 141514000000000000000n,\n formattedAmount: \"1415.14\",\n },\n validatorAddress:\n \"0xa2705d6b27891f3f5651f26547d1bb79e256f95f249d1ad717cef087d77d38b037e5d6dbaa2538930fd0731ec9b02f3a\",\n earning: 0.145,\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n unstake: [\n {\n amount: 16159000000000000000n,\n formattedAmount: \"161.59\",\n timestamp: msToSeconds(Date.now() - 72000000),\n },\n ],\n },\n },\n {\n staked: {\n amount: 141514000000000000000n,\n formattedAmount: \"1415.14\",\n },\n validatorAddress:\n \"0xa2705d6b27891f3f5651f26547d1bb79e256f95f249d1ad717cef087d77d38b037e5d6dbaa2538930fd0731ec9b02f3a\",\n earning: 0.145,\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n unstake: [\n {\n amount: 16159000000000000000n,\n formattedAmount: \"161.59\",\n timestamp: msToSeconds(Date.now() - 72000000),\n },\n ],\n },\n },\n {\n staked: {\n amount: 141514000000000000000n,\n formattedAmount: \"1415.14\",\n },\n validatorAddress:\n \"0xa2705d6b27891f3f5651f26547d1bb79e256f95f249d1ad717cef087d77d38b037e5d6dbaa2538930fd0731ec9b02f3a\",\n earning: 0.145,\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n unstake: [\n {\n amount: 16159000000000000000n,\n formattedAmount: \"161.59\",\n timestamp: msToSeconds(Date.now() - 72000000),\n },\n ],\n },\n },\n {\n staked: {\n amount: 141514000000000000000n,\n formattedAmount: \"1415.14\",\n },\n validatorAddress:\n \"0xa2705d6b27891f3f5651f26547d1bb79e256f95f249d1ad717cef087d77d38b037e5d6dbaa2538930fd0731ec9b02f3a\",\n earning: 0.145,\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n unstake: [\n {\n amount: 16159000000000000000n,\n formattedAmount: \"161.59\",\n timestamp: msToSeconds(Date.now() - 72000000),\n },\n ],\n },\n },\n {\n staked: {\n amount: 241514000000000000000n,\n formattedAmount: \"2415.14\",\n },\n validatorAddress:\n \"0xa4e4b63514f54d61da5197359f11ff1fc2930788ba2ffdd30c2fc059cbe0221020197bf9446b16ac347f36c7517a8686\",\n earning: 0.145,\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n unstake: [\n {\n amount: 1159000000000000000n,\n formattedAmount: \"11.59\",\n timestamp: msToSeconds(Date.now() - 36000000),\n },\n ],\n },\n },\n {\n validatorAddress:\n \"0xb0511ec039591e98bd4e183ba70b85572214a7ad8ca1a43e96ad3495d3821054927bc542e5482ec9733e35b7ef0b1f03\",\n earning: 0.045,\n staked: {\n amount: 141514000000000000000n,\n formattedAmount: \"1415.14\",\n },\n rewards: {\n amount: 15414000000000000000n,\n formattedAmount: \"154.14\",\n },\n queueData: {\n stake: [\n {\n amount: 1159000000000000000n,\n formattedAmount: \"11.59\",\n },\n ],\n },\n },\n];\n\nexport async function getUserStakingPositions(account: Address) {\n await new Promise((resolve) => setTimeout(resolve, 2000)); // Simulate network delay\n if (account === \"0x4C368fFE3650379d6318C8d4630bc51f8Ad12bB6\") {\n // Snow test wallet\n return snowTestWalletPositions;\n }\n return [];\n}\n","import type { Address } from \"viem\";\n\nimport {\n GetValidatorAnalytics,\n type GetValidatorAnalyticsQuery,\n type GetValidatorAnalyticsQueryVariables,\n} from \"@berachain/graphql/pol/subgraph\";\n\nimport { getApolloClient } from \"~/actions/clients/getApolloClient\";\nimport { calculateTimestampFromDays } from \"~/utils/formatTimestamps\";\n\nexport async function getValidatorAnalytics({\n pubkey,\n dayRange,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n pubkey: Address;\n dayRange: number;\n}): Promise<GetValidatorAnalyticsQuery | undefined> {\n const bgtClient = getApolloClient(\"pol.subgraph\", args);\n\n const result = await bgtClient.query<\n GetValidatorAnalyticsQuery,\n GetValidatorAnalyticsQueryVariables\n >({\n query: GetValidatorAnalytics,\n variables: {\n pubKey: pubkey,\n timestamp: calculateTimestampFromDays(dayRange).toString(),\n },\n });\n\n return result.data;\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { beraChefAbi } from \"~/abi/pol/beraChef\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getValidatorCommission({\n client,\n pubKey,\n ...args\n}: {\n client: PublicClient;\n pubKey: Address;\n} & BeraJS.BaseFunctionArgs): Promise<number | undefined | null> {\n const { config } = parseBaseArgs(args);\n\n const result = await client.readContract({\n address: config.pol.beraChef,\n abi: beraChefAbi,\n functionName: \"getValCommissionOnIncentiveTokens\",\n args: [pubKey],\n });\n\n return Number(result ?? 0n) / 10000;\n}\n","import type { ApiValidatorMinimalFragment } from \"@berachain/graphql/pol/api\";\n\nimport { yearsInSeconds } from \"~/utils/time\";\n\nexport const getValidatorEstimatedBgtPerYear = (\n validator: ApiValidatorMinimalFragment,\n totalStakedBeraAmount: number,\n blockTime: number,\n): number => {\n if (!totalStakedBeraAmount || !validator) return 0;\n\n const estimatedBlocksPerYear = yearsInSeconds(1) / blockTime;\n const estimatedValidatorBlocksPerYear = totalStakedBeraAmount\n ? estimatedBlocksPerYear *\n (Number(validator.dynamicData?.stakedBeraAmount) / totalStakedBeraAmount)\n : 0;\n\n // if you divide by validatorCounts, you assume that each validator has the same amount of blocks\n // this is not the case, so we need to multiply by the validator's probability of being selected\n\n return (\n estimatedValidatorBlocksPerYear *\n Number.parseFloat(validator.dynamicData?.rewardRate ?? \"0\")\n );\n};\n","import type { Address, PublicClient } from \"viem\";\n\nimport { beaconDepositAbi } from \"~/abi/pol/beaconDeposit\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport async function getValidatorOperatorAddress({\n client,\n pubKey,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n client: PublicClient;\n pubKey: Address;\n}): Promise<Address | undefined> {\n const { config } = parseBaseArgs(args);\n try {\n const result = await client.readContract({\n address: config.depositContract,\n abi: beaconDepositAbi,\n functionName: \"getOperator\",\n args: [pubKey],\n });\n return result as Address;\n } catch (e) {\n console.log(\"getValidatorOperatorAddress:\", e);\n throw e;\n }\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { beraChefAbi } from \"~/abi/pol/beraChef\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport interface ValidatorQueuedCommission {\n blockNumberLast: number;\n commissionRate: number;\n}\n\nexport async function getValidatorQueuedCommission({\n client,\n pubKey,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n client: PublicClient;\n pubKey: Address;\n}): Promise<ValidatorQueuedCommission | undefined | null> {\n const { config } = parseBaseArgs(args);\n const result = await client.readContract({\n address: config.pol.beraChef,\n abi: beraChefAbi,\n functionName: \"getValQueuedCommissionOnIncentiveTokens\",\n args: [pubKey],\n });\n return {\n blockNumberLast: result.blockNumberLast,\n commissionRate: Number(result.commissionRate) / 10000,\n };\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { beaconDepositAbi } from \"~/abi/pol/beaconDeposit\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\n\nexport type ValidatorQueuedOperatorAddress = [bigint, string];\n\nexport async function getValidatorQueuedOperatorAddress({\n client,\n pubKey,\n ...args\n}: {\n client: PublicClient;\n pubKey: Address;\n} & BeraJS.BaseFunctionArgs): Promise<\n ValidatorQueuedOperatorAddress | undefined\n> {\n const { config } = parseBaseArgs(args);\n\n try {\n const result = await client.readContract({\n address: config.depositContract,\n abi: beaconDepositAbi,\n functionName: \"queuedOperator\",\n args: [pubKey],\n });\n return result as ValidatorQueuedOperatorAddress;\n } catch (e) {\n console.log(\"getValidatorQueuedOperatorAddress:\", e);\n throw e;\n }\n}\n","import type { Address, PublicClient } from \"viem\";\n\nimport { beraChefAbi } from \"~/abi/pol/beraChef\";\nimport { parseBaseArgs } from \"~/utils/parseBaseArgs\";\nimport {\n formatValidatorRewardAllocation,\n type ValidatorRewardAllocation,\n} from \"./getValidatorRewardAllocation\";\n\nexport async function getValidatorQueuedRewardAllocation({\n client,\n pubKey,\n ...args\n}: BeraJS.BaseFunctionArgs & {\n client: PublicClient;\n pubKey: Address;\n}): Promise<ValidatorRewardAllocation | undefined> {\n const { config } = parseBaseArgs(args);\n try {\n const result = await client.readContract({\n address: config.pol.beraChef,\n abi: beraChefAbi,\n functionName: \"getQueuedRewardAllocation\",\n args: [pubKey],\n });\n return formatValidatorRewardAllocation(result, 0);\n } catch (e) {\n console.log(\"getValidatorQueuedRewardAllocation:\", e);\n throw e;\n }\n}\n"],"mappings":"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","names":["formatEther","getConvertToAssets","sharesAmount","vaultAddress","publicClient","convertToAssets","metaMorphoAbi","formatEther","ApolloClient","ServerError","appConfig","BeraApolloClient","ApolloClient","options","queryName","getQueryName","endpoint","tags","executeQuery","res","BeraTracing","BeraError","error","appConfig","ServerError","RequestError","queryDefinition","def","InMemoryCache","HttpLink","getUriFromLink","currentDapp","apiResults","gql","applyStellateClientName","url","currentDapp","headers","getUriFromLink","getClient","endpoint","ssrMode","inMemoryCacheOptions","BeraApolloClient","HttpLink","InMemoryCache","getApolloClient","clientName","args","config","parseBaseArgs","apiResults","BeraError","formatUnits","isAddress","zeroAddress","BigNumber","BaseAggregator","_BaseAggregator","args","config","chainId","parseBaseArgs","tokenIn","tokenOut","isAddress","BeraError","isToken","amount","aggregatorsFeeBps","fees","BigNumber","amountIn","isNative","isPermit2Approval","permit2SpenderAddress","zeroAddress","amountOut","slippage","minAmountOut","rawAmount","spender","formatUnits","underlyingToken","url","options","beraFetch","err","error","initBeraError","message","API_CHAIN_NAMES","BALANCER_QUERIES","BALANCER_RELAYER","BalancerApi","CHAINS","COMPOSABLE_STABLE_POOL_FACTORY","NATIVE_ASSETS","Token","VAULT","WEIGHTED_POOL_FACTORY_BALANCER_V2","zeroAddress","berachain","berachainBepolia","chainConfigs","chain","chainConfigs","config","chainId","parseBaseArgs","API_CHAIN_NAMES","CHAINS","berachain","berachainBepolia","BALANCER_RELAYER","VAULT","BALANCER_QUERIES","WEIGHTED_POOL_FACTORY_BALANCER_V2","zeroAddress","COMPOSABLE_STABLE_POOL_FACTORY","nativeToken","Token","beraToken","NATIVE_ASSETS","GetPools","GqlPoolOrderBy","GqlPoolOrderDirection","getAllPools","textSearch","chain","first","orderBy","orderDirection","skip","fetchPolicy","userAddress","blacklistedPoolIds","args","config","parseBaseArgs","pools","getApolloClient","GetPools","GqlPoolOrderBy","GqlPoolOrderDirection","GetPool","getApiPool","poolId","account","args","config","parseBaseArgs","data","getApolloClient","GetPool","GetGlobalLiquidityAndSwapVolume","getGlobalLiquidityAndSwapVolume","args","config","parseBaseArgs","getApolloClient","GetGlobalLiquidityAndSwapVolume","weightedPoolV4Abi_V2","getPoolPausedState","publicClient","poolAddress","abi","results","stablePoolAbi_V3","vaultV2Abi","weightedPoolFactoryAbi_V3","weightedPoolV4Abi_V2","erc20Abi","formatEther","formatUnits","isAddress","isHex","GqlPoolType","getOnChainPool","poolId","publicClient","args","config","parseBaseArgs","address","isAddress","isHex","InvalidArgumentError","name","poolTokens","totalSupply","swapFee","_version","_decimals","isComposableStable","isWeighted","poolPausedState","erc20Abi","vaultV2Abi","weightedPoolV4Abi_V2","weightedPoolFactoryAbi_V3","getPoolPausedState","decimals","version","virtualSupply","weights","amplificationParameter","stablePoolAbi_V3","formatUnits","formatEther","weight","GqlPoolType","e","initBeraError","GetPoolEvents","getPoolEvents","poolId","typeInArray","args","config","parseBaseArgs","getApolloClient","GetPoolEvents","isHex","GetPoolHistoricalData","getPoolHistoricalData","poolId","chain","args","isHex","InvalidArgumentError","bexApiGraphqlClient","getApolloClient","data","GetPoolHistoricalData","isHex","GetSubgraphPool","getSubgraphPool","poolId","args","isHex","getApolloClient","GetSubgraphPool","isAddress","isHex","checkProposalField","fieldOrType","value","required","baseUrl","components","valueBN","base","isAddress","isHex","errors","component","v","ProposalStatus","GOVERNANCE_ACCELERATE_PROPOSAL","MOCKED_PROPOSAL_STATUSES","ProposalStatus","computeActualStatus","proposal","proposalOnChainState","timestampInSeconds","GetProposals","SearchProposals","getAllProposals","where","orderBy","orderDirection","offset","perPage","text","args","governanceClient","getApolloClient","response","SearchProposals","GetProposals","p","computeActualStatus","e","getBodyErrors","proposal","currentTopic","e","checkProposalField","GetProposal","getProposalDetails","proposalId","args","res","getApolloClient","GetProposal","computeActualStatus","graymatter","parseLegacyBody","s","pattern","match","type","title","content","parseProposalBody","proposal","body","legacyBody","parseEventLogs","ProposalStatus","getProposalFromTx","args","assertPublicClient","tx","creationEvent","parseEventLogs","governanceAbi","block","fm","parseProposalBody","ProposalStatus","target","index","GetProposalVotes","getProposalVotes","variables","args","getApolloClient","GetProposalVotes","Aggregation_Interval","GetChartData","getChartData","days","args","getApolloClient","GetChartData","Aggregation_Interval","getCollateralWeights","client","collateralList","args","config","parseBaseArgs","collateralWeights","honeyFactoryAbi","agg","key","idx","e","erc20Abi","getTokenInformation","address","publicClient","chainId","decimals","name","symbol","erc20Abi","token","e","initBeraError","getHoneyCollaterals","client","tokenData","preferredCollateralOrder","args","config","parseBaseArgs","amountOfCollaterals","referenceCollateralAddress","honeyFactoryAbi","promiseList","i","collaterals","collateralTokens","coll","token","isToken","getTokenInformation","a","idx","newCollateralOrder","override","newFirstCollateral","referenceCollateral","parseUnits","isBadCollateralAsset","client","collateral","latestPrices","isPythWrapperEnabled","args","config","parseBaseArgs","isBadCollateralCall","honeyFactoryAbi","isPeggedCall","prices","price","parseUnits","honeyFactoryReaderAbi","badCollateralResult","isPeggedResult","e","parseEther","parseEther","getSharesWithoutFees","client","asset","amount","args","config","parseBaseArgs","vault","fees","honeyFactoryAbi","collateralVaultAbi","parseEther","e","ONE_HUNDRED_PERCENT","parseEther","getGlobalCapLimit","client","asset","amount","isMint","isPythWrapperEnabled","latestPrices","args","config","parseBaseArgs","globalCap","honeyFactoryAbi","registeredAssets","weights","getHoneyCollaterals","getWeights","idx","isToken","CAP_LIMIT_BUFFER","e","sum","singleAsset","isBad","isBadCollateralAsset","share","getSharesWithoutFees","GetGlobalData","getHoneyGlobalData","args","getApolloClient","GetGlobalData","parseUnits","HoneyPreviewMethod","getHoneyPreview","client","collateral","collateralList","amount","method","latestPrices","isPythWrapperEnabled","baseArgs","config","parseBaseArgs","isAmountHoney","formattedAmount","parseUnits","formattedResult","args","prices","price","result","honeyFactoryReaderAbi","amountsWithAddress","agg","key","idx","e","formatUnits","getHoneyVaultsBalance","client","collateralList","honeyFactoryAddress","args","config","parseBaseArgs","factory","coll","vault","honeyFactoryAbi","shares","feeShares","isCustodian","custodianAddress","collateralVaultAbi","balance","formatUnits","HermesClient","formatUnits","pythEndpoint","getPythLatestPrices","priceFeedId","updates","d","p","parseEther","getRelativeCapLimit","client","asset","amount","isMint","referenceCollateral","args","config","parseBaseArgs","assetRelativeCap","honeyFactoryAbi","assetBalance","referenceCollateralBalance","getSharesWithoutFees","parseEther","CAP_LIMIT_BUFFER","e","getPythUpdateFee","client","priceFeedId","args","config","parseBaseArgs","pythAbi","e","parseUnits","getSwapPayload","state","publicClient","priceFeedMap","collateralList","isPythWrapperEnabled","args","config","parseBaseArgs","honeyToken","getHoneyToken","actionType","fromAmount","collaterals","isBasketModeEnabled","destinationContractAddress","pairMainAddress","coll","isMint","calldata","getPythLatestPrices","pythUpdateFee","getPythUpdateFee","getPythDefaultUpdateFee","account","pythPayload","parseUnits","pythWrapperAbi","defaultPayload","honeyFactoryAbi","parseUnits","isBasketModeEnabled","client","isMint","collateralList","latestPrices","isPythWrapperEnabled","args","config","parseBaseArgs","prices","price","parseUnits","honeyFactoryReaderAbi","honeyFactoryAbi","getBlockTimestamp","block","currentBlock","blockTime","publicClient","assertDefined","assertPublicClient","blockData","msToSeconds","formatUnits","RewardVaultDistributionMode","getRewardVaultRewards","address","publicClient","rewardsDuration","manager","rewardRate","periodFinish","targetRewardsPerSecond","minRewardDurationForTargetRate","rewardVaultAbi","availableRewards","msToSeconds","formatUnits","_getApr","tvl","bgtPrice","rewardRate","yearsInSeconds","_getRewardRate","apr","getBgtAprSimulation","availableRewards","periodFinish","MIN_REWARD_DURATION","MAX_REWARD_DURATION","args","currentTime","msToSeconds","_providedMinRewardDurationForTargetRate","currentDuration","newDuration","minRewardDurationForTargetRate","duration","newRewardRate","getEarnedStakedBeraVault","address","account","args","config","parseBaseArgs","url","beraFetchJson","formatUnits","GetVaults","getRewardVaults","filter","publicClient","args","res","getApolloClient","GetVaults","incentives","vault","incentive","rewardVaultAbi","vaults","index","totalIncentiveInUsdc","incentivesArray","apiIncentive","incIdx","tokenPrice","remainingAmount","formatUnits","GlobalData","getBGTGlobalInfo","args","config","parseBaseArgs","apiRes","getApolloClient","GlobalData","formatEther","getBgtTokenTotalBoosts","publicClient","args","config","parseBaseArgs","assertPublicClient","result","bgtAbi","formatEther","error","erc20Abi","formatEther","getBgtTokenTotalSupply","publicClient","args","config","parseBaseArgs","assertPublicClient","result","erc20Abi","formatEther","error","GqlRewardVaultOrderBy","GqlRewardVaultOrderDirection","getGlobalCuttingBoard","threshold","gaugeList","getRewardVaults","GqlRewardVaultOrderBy","GqlRewardVaultOrderDirection","getGlobalData","publicClient","globalDataRes","globalCuttingBoardRes","bgtTotalSupplyRes","bgtTotalBoostsRes","getBGTGlobalInfo","getGlobalCuttingBoard","getBgtTokenTotalSupply","getBgtTokenTotalBoosts","BeraMonitoring","initBeraError","GetIncentiveFeeClaimStats","getIncentiveFeeClaimStats","args","bgtClient","getApolloClient","data","GetIncentiveFeeClaimStats","sumAllClaims","acc","curr","sumClaimsInLast24Hours","claim","days","getMarkets","args","config","parseBaseArgs","temp","acc","item","error","getRewardProofsByValidator","account","validator","page","perPage","args","config","parseBaseArgs","result","error","getErrorResponse","BeraError","formatUnits","parseUnits","getRewardTokenToBeraRate","address","publicClient","assertPublicClient","stakeBeraVaultAbi","parseUnits","rate","formatUnits","GetRewardVault","getRewardVault","address","chainName","args","config","parseBaseArgs","resolvedChainName","bexApiGraphqlClient","getApolloClient","data","GetRewardVault","NotFoundError","isSameAddress","erc20Abi","formatUnits","getRewardVaultIncentives","address","stakingToken","publicClient","whitelistedTokens","rewardVaultAbi","totalSupply","token","isSameAddress","incentives","incentiveInfo","decimals","symbol","totalBalance","erc20Abi","minIncentiveRate","incentiveRate","remainingAmount","manager","formatUnits","result","index","BeraMonitoring","BeraError","incentive","getRewardVaultStakingToken","address","publicClient","rewardVaultAbi","GetSWberaVaultMetadata","GqlSWberaVaultMetadataResolution","getResolution","window","GqlSWberaVaultMetadataResolution","getStakedBeraAPR","args","config","parseBaseArgs","bexApiGraphqlClient","getApolloClient","data","GetSWberaVaultMetadata","apr","error","GetSWberaVaultSnapshots","GqlVaultSnapshotDataRange","getStakedBeraSnapshots","chain","range","GqlVaultSnapshotDataRange","args","config","parseBaseArgs","bexApiGraphqlClient","getApolloClient","GetSWberaVaultSnapshots","error","getStakeWithdrawalCooldown","publicClient","address","lockPeriod","stakeBeraVaultAbi","erc20Abi","BigNumber","getSWBeraVaultMetadata","address","publicClient","blockTime","args","config","parseBaseArgs","assertPublicClient","hoursWindow","currentBlock","blocksPerWindow","blockWindowAgo","curretTotalAssets","currentTotalSupply","currentOneShareWorth","currentTVL","totalAssets24HoursAgo","totalSupply24HoursAgo","oneShareWorthWindowAgo","tvl24HoursAgo","totalWBeraIssued","lockPeriod","incentiveFeeClaimStats","stakeBeraVaultAbi","erc20Abi","getStakeWithdrawalCooldown","getIncentiveFeeClaimStats","exchangeRateWindowAgo","BigNumber","error","getTimeUntil","targetTime","currentTime","timeDiff","totalSeconds","msToSeconds","formatTimeLeft","getSWBeraWithdrawal","contractAddress","accountAddress","publicClient","version","withdrawalRequests","withdrawalRequestV1Helper","withdrawalRequest","lockPeriod","assets","_shares","timestamp","withdrawalAmount","readyTime","timeLeft","timeRemaining","stakeBeraVaultAbi","getStakeWithdrawalCooldown","withdrawalRequestIds","isToken","withdrawalRequestV1","filteredRequests","withdrawalRequestId","request","getTotalStakedAmount","vaultAddresses","publicClient","assertPublicClient","totalAssets","address","stakeBeraVaultAbi","acc","index","error","getUserClaimableIncentives","account","args","config","parseBaseArgs","result","error","getErrorResponse","BeraError","getUserVaultsReward","account","vaultAddress","publicClient","rewardVaultAbi","formatEther","getUserVaultsBalance","account","vaultAddress","publicClient","assertPublicClient","assertAddress","balance","delegated","rewardVaultAbi","error","getVaultsSupply","vaultAddress","publicClient","rewardVaultAbi","error","getUserVaultInfo","account","vaultAddress","publicClient","userBalance","userReward","totalSupply","getUserVaultsBalance","getUserVaultsReward","getVaultsSupply","withdrawableBalance","percentage","formatEther","formatUnits","GetUserVaults","getUserVaults","account","publicClient","args","config","parseBaseArgs","deposits","getApolloClient","GetUserVaults","earnedResult","balanceResult","deposit","rewardVaultAbi","userVaults","total","acc","index","item","balanceItem","BeraMonitoring","BeraError","stakingTokenPrice","formatUnits","sortedUserVaults","a","b","aUnclaimed","vault","tvl","stakingTokenAmount","GetVaultHistory","getVaultHistory","vault","chain","args","config","parseBaseArgs","getApolloClient","GetVaultHistory","GetVaultValidators","getVaultValidators","address","onlyActiveValidators","args","getApolloClient","GetVaultValidators","getAddress","zeroAddress","GetTokenCurrentPrices","getTokenCurrentPrices","_addressIn","args","config","chainId","parseBaseArgs","addressIn","a","addr","idx","arr","bexApiGraphqlClient","getApolloClient","data","GetTokenCurrentPrices","map","tokenInformation","formattedAddress","getAddress","getSafeNumber","isToken","zeroAddress","getPublicClient","erc20Abi","formatUnits","getAllowances","itemsList","account","config","assertDefined","tokensByChainId","item","chainId","items","publicClient","getPublicClient","assertPublicClient","erc20Abi","index","token","formatUnits","i","result","getPublicClient","getWalletClient","switchChain","BaseError","createWalletClient","decodeErrorResult","HttpRequestError","http","ChainId","defaultChainId","AbiFunctionSignatureNotFoundError","decodeFunctionData","getRevertReason","publicClient","providedAbi","params","abi","commonAbiErrors","blockNumber","to","account","value","data","functionName","args","tx","InvalidArgumentError","res","decoded","decodeFunctionData","e","AbiFunctionSignatureNotFoundError","TransactionFailedError","error","parseViemError","defaultPollingInterval","seconds","increaseByPercentage","value","percentage","parseNonce","nonceResult","onWarning","BeraError","isImpersonateAccount","chainId","defaultChainId","ChainId","beraWriteContract","args","InvalidArgumentError","address","calls","gasLimit","onLoading","onSuccess","onError","onSubmission","wagmiConfig","_walletClient","argsAccount","txConfirmationTimeout","impersonateAccount","_errorsAbi","pollingInterval","rest","data","globalAbi","commonAbiErrors","walletClient","switchChain","e","error","getWalletClient","account","accountAddress","publicClient","getPublicClient","assertPublicClient","testClient","getTestClient","createWalletClient","http","txHash","input","noncePromise","sharedTxProperties","parsedCalls","call","params","res","failedCallIndex","result","failedCall","decodedReason","parseDecodedError","decodeErrorResult","parseViemError","TransactionFailedError","request","callStatus","receipt","simulationResult","estimatedGas","gas","DEFAULT_METAMASK_GAS_LIMIT","abi","functionName","gasEstimateResult","confirmationReceipt","revertReason","getRevertReason","viemError","BaseError","RequestError","HttpRequestError","GetValidators","getAllValidators","variables","args","config","parseBaseArgs","getApolloClient","GetValidators","isAddressEqual","getApiEnrichedAllocation","allocation","vaults","getRewardVaults","weight","startBlock","vault","isAddressEqual","GetValidator","getApiValidator","id","args","config","parseBaseArgs","getApolloClient","GetValidator","GetValidatorBlockStats","getDailyValidatorBlockStats","pubKey","first","args","bgtClient","getApolloClient","GetValidatorBlockStats","e","formatValidatorRewardAllocation","raw","startTs","weight","isSameRewardAllocation","a","b","index","getValidatorRewardAllocation","client","pubKey","args","config","parseBaseArgs","rawActiveRewardAllocation","rawSetRewardAllocation","beraChefAbi","lastRaUpdateActive","lastRaUpdateSet","activeRewardAllocation","setRewardAllocation","isBaseline","e","isDefaultRewardAllocation","rewardAllocation","getDefaultRewardAllocation","client","args","config","parseBaseArgs","rawDefaultRewardAllocation","beraChefAbi","formatValidatorRewardAllocation","GetValidatorByAccount","getManagedValidatorByAccount","account","args","getApolloClient","GetValidatorByAccount","e","getStakingPoolBatch","client","valPubKey","formatEther","getUserBoostsOnValidator","account","pubkey","publicClient","args","config","parseBaseArgs","activeBoostAmount","queuedBoostAmount","queuedDropBoostAmount","bgtAbi","formatEther","GetUserValidatorInformation","getUserBoosts","account","block","args","getApolloClient","GetUserValidatorInformation","getUserActiveValidators","account","publicClient","chain","args","config","parseBaseArgs","resolvedChain","userBoosts","getUserBoosts","validatorInfoList","onChainBoosts","getAllValidators","t","isSubgraphStale","getUserBoostsOnValidator","validator","userDeposited","data","snowTestWalletPositions","msToSeconds","getUserStakingPositions","account","resolve","GetValidatorAnalytics","getValidatorAnalytics","pubkey","dayRange","args","getApolloClient","GetValidatorAnalytics","calculateTimestampFromDays","getValidatorCommission","client","pubKey","args","config","parseBaseArgs","result","beraChefAbi","getValidatorEstimatedBgtPerYear","validator","totalStakedBeraAmount","blockTime","estimatedBlocksPerYear","yearsInSeconds","getValidatorOperatorAddress","client","pubKey","args","config","parseBaseArgs","beaconDepositAbi","e","getValidatorQueuedCommission","client","pubKey","args","config","parseBaseArgs","result","beraChefAbi","getValidatorQueuedOperatorAddress","client","pubKey","args","config","parseBaseArgs","beaconDepositAbi","e","getValidatorQueuedRewardAllocation","client","pubKey","args","config","parseBaseArgs","result","beraChefAbi","formatValidatorRewardAllocation","e"]}
|