@ape.swap/bonds-sdk 7.0.4-test.1 → 7.0.4-test.3
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/adapters/evm/state/fetchBondsDataEVM.js +43 -8
- package/dist/adapters/evm/state/fetchBondsDataEVM.js.map +1 -1
- package/dist/adapters/evm/state/fetchUsersBondsEVM.js +8 -2
- package/dist/adapters/evm/state/fetchUsersBondsEVM.js.map +1 -1
- package/dist/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.js +5 -1
- package/dist/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.js.map +1 -1
- package/dist/adapters/evm/views/lpStaking/BuyComponentLpStaking.js +26 -8
- package/dist/adapters/evm/views/lpStaking/BuyComponentLpStaking.js.map +1 -1
- package/dist/adapters/evm/views/lpStaking/YourLpStakingBondModal.js +1 -1
- package/dist/adapters/evm/views/lpStaking/YourLpStakingBondModal.js.map +1 -1
- package/dist/config/abi/lpStakingVault.json.js +14 -0
- package/dist/config/abi/lpStakingVault.json.js.map +1 -1
- package/dist/state/bonds/useBondsData.js +0 -1
- package/dist/state/bonds/useBondsData.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/displayHelpers.js +19 -0
- package/dist/utils/displayHelpers.js.map +1 -1
- package/dist/views/Bonds/utils.js +1 -0
- package/dist/views/Bonds/utils.js.map +1 -1
- package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js +2 -1
- package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js.map +1 -1
- package/dist/views/YourBondsModal/components/NFTImage/NFTImage.d.ts +2 -1
- package/dist/views/YourBondsModal/components/NFTImage/NFTImage.js +3 -4
- package/dist/views/YourBondsModal/components/NFTImage/NFTImage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuyComponentLpStaking.js","sources":["../../../../../src/adapters/evm/views/lpStaking/BuyComponentLpStaking.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useChainId, useSendTransaction, useSwitchChain } from 'wagmi'\nimport { ChainId, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport type { ChainBuyComponentProps } from '../../../types'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport { useSendReferenceId } from '../../../../hooks/useSendReferenceId'\nimport TokenSelectorPanel from '../../../../components/TokenSelectorPanel'\nimport ConnectButton from '../../../../components/ConnectButton'\nimport ProjectDescription from '../../../../views/BuyBond/components/ProjectDescription'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport { MCBuyComponentStyles } from '../../../../utils/campaignStyles'\nimport { toFixedString } from '../../../../utils/fixedPoint'\nimport { remove0xPrefix } from '../../../../utils/remove0xPrefix'\nimport { reportError } from '../../../../utils/reportError'\nimport track from '../../../../utils/track'\nimport useEVMAccount from '../../state/useEVMAccount'\nimport { ApprovalState, useApproval } from '../../state/useAllowance'\nimport { useMonitorTx } from '../../state/useMonitorTx'\nimport clsx from 'clsx'\nimport BondCards from '../../../../views/BuyBond/components/BondCards/BondCards'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport SafeHTMLComponent from '../../../../components/SafeHTMLComponent'\nimport useSoulZapLpStakingQuote from '../../state/lpStaking/useSoulZapLpStakingQuote'\nimport { parseEther } from 'viem'\nimport useTokenFromZapList from '../../../../hooks/useTokenFromZapList'\nimport { SoulZapTokenManager } from '../../../../config/constants/addresses'\nimport { ZapSupportedChainId } from '../../../../config/constants/variables'\nimport LpBondModalHeader from './LpBondModalHeader'\nimport LpStakingEstimations from './LpStakingEstimations'\nimport useSortedZapList from '../../../../hooks/useSortedZapList'\nimport { getSymbol } from '../../../../utils/getNativeTicker'\nimport { formatUSDNumber } from '../../../../utils/displayHelpers'\n\n/**\n * Buy form of LP staking bonds (`billType === 'lpStaking'`). Kept apart from the regular EVM BuyComponent because the\n * flow is different: no zaps, tiers, bridge or max-buy rules. Rendered inside ModalHandlerLpStaking from the bond list,\n * and directly by ChainBuyComponent elsewhere.\n */\nconst BuyComponentLpStaking: React.FC<ChainBuyComponentProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n handlePurchasedBond,\n setBillId,\n isProjectView,\n}) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const userChainId = useChainId()\n const { switchChainAsync } = useSwitchChain()\n const { address: account } = useEVMAccount()\n const { data: bonds } = useBondsData()\n const { addToastError } = usePopups()\n const sendReferenceId = useSendReferenceId()\n const { sendTransactionAsync } = useSendTransaction()\n\n // Bond to be used\n const bondData = useMemo(\n () =>\n bonds?.find(\n (bond) =>\n bond?.contractAddress?.[bond.chainId]?.toLowerCase() === bondAddress?.toLowerCase() &&\n bond.chainId === bondChain,\n ),\n [bonds, bondAddress, bondChain],\n )\n\n // State\n const [buyTxHash, setBuyTxHash] = useState<string | undefined>()\n const [inputValue, setInputValue] = useState('')\n const [loadingTx, setLoadingTx] = useState(false)\n const { isLoading: isConfirming, isSuccess: isConfirmed, data: buyTxReceipt } = useMonitorTx(buyTxHash, bondChain)\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData.chainId])\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n\n const { sortedZapList } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n\n const inputTokenPrice = enrichedTokenData?.price\n\n // Zap call data\n\n const [zapLoading, zapData, , zapError] = useSoulZapLpStakingQuote(inputValue, inputToken, bondData, account)\n // console.log(zapData)\n\n // Static Data\n const load = loadingTx || (isConfirming && !isConfirmed)\n const isWrongChain = !!bondChain && userChainId !== bondChain\n const exceedsBalance = Number(inputCurrencyBalance ?? '0') < Number(inputValue)\n const isEmptyInput = !inputValue || parseFloat(inputValue) === 0\n\n const spendAmount = parseFloat(inputValue) || 0\n const youSpendString = `${spendAmount.toLocaleString()} ${getSymbol(inputToken, bondData?.chainId)}${inputTokenPrice ? ` ($${formatUSDNumber((spendAmount * inputTokenPrice).toString())})` : ''}`\n const isZapSupported = false\n\n // Once the buy tx is confirmed, report the new position's NFT id so ModalHandlerLpStaking can show it. The adapter's\n // deposit event has it: topics = [event, tokenId, campaignId, buyer]. It's the token_id REAL's API lists the\n // position under, which is the bill's id.\n useEffect(() => {\n if (!buyTxReceipt || !setBillId) return\n try {\n const adapter = bondData?.lpStakingConfig?.adapter?.toLowerCase()\n const campaignId = bondData?.lpStakingConfig?.campaignId?.toLowerCase()\n const depositLog = buyTxReceipt.logs.find(\n (log) => log.address.toLowerCase() === adapter && log.topics[2]?.toLowerCase() === campaignId,\n )\n const tokenIdTopic = depositLog?.topics[1]\n if (tokenIdTopic) setBillId(BigInt(tokenIdTopic).toString())\n } catch (e) {\n console.error(e)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buyTxReceipt])\n\n // State Handlers\n const handleMaxButton = useCallback(() => {\n setInputValue(inputCurrencyBalance ?? '0')\n }, [inputCurrencyBalance])\n\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n // Approve & Purchase Functions\n const [approvalState, approveCallback] = useApproval(\n inputValue,\n inputToken ?? null,\n SoulZapTokenManager?.[bondData?.chainId as ZapSupportedChainId] ?? null,\n account ?? null,\n bondChain ?? null,\n )\n const isApproved = approvalState === ApprovalState.APPROVED\n\n const handleApprove = async () => {\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n await approveCallback()\n track({\n event: 'approveBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n },\n })\n }\n\n const handleBuy = async () => {\n if (!bondData || !bondAddress || !bondChain) return\n\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n\n setLoadingTx(true)\n const usdAmount = parseFloat(inputValue) * parseFloat(bondData?.principalTokenPrice ?? '0')\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: usdAmount,\n },\n })\n try {\n const validated18DecimalAmount = toFixedString(inputValue ?? '0', 18, 'trunc')\n const parsedValue = parseEther(validated18DecimalAmount)\n const hash = await sendTransactionAsync({\n to: zapData.txData.to,\n data: zapData.txData.data,\n value: inputToken === 'NATIVE' ? parsedValue : undefined,\n })\n if (hash) {\n setBuyTxHash(hash)\n sendReferenceId(bondAddress, bondChain, hash)\n handlePurchasedBond?.({ buyTxHash: hash })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-staking-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondAddress),\n usdAmount,\n },\n })\n }\n } catch (error: any) {\n console.error('Buy error', error)\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n extraInfo: { type: 'buyLpStakingBond', bondData, error },\n chainId: bondChain,\n account,\n })\n addToastError(error.shortMessage)\n } finally {\n setLoadingTx(false)\n }\n }\n\n return bondData ? (\n <Flex\n className=\"modal-content ape:flex ape:flex-col ape:rounded-[10px] ape:bg-white2 ape:w-full ape:p-3.75 ape:md:p-5\"\n style={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}\n >\n <Flex className=\"modaltable-container ape:w-full ape:flex ape:flex-col ape:relative ape:gap-2.5\">\n <LpBondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView={isProjectView} />\n <Flex className={clsx('ape:w-full', isProjectView ? 'ape:flex ape:md:hidden!' : 'ape:flex')}>\n <BondCards bondData={bondData} isDoingMaxBuy={false} />\n </Flex>\n <LpStakingEstimations\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZapSupported}\n fetchingZapQuote={zapLoading}\n zapError={zapError}\n protocolQuote={zapData?.protocolQuote}\n lpQuote={zapData?.lpQuote}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={bondData?.chainId}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance}\n selectedTokenPrice={parseFloat(bondData?.principalTokenPrice ?? '0')}\n marketingCampaign={bondData?.marketingCampaign}\n isConnected={!!account}\n />\n {bondData?.warningCard && (\n <Flex className=\"ape:w-full ape:rounded-normal ape:p-[2px_10px]\" style={{ background: '#DE62F366' }}>\n <Text as=\"div\" size=\"12px\" className=\"ape:font-normal ape:flex ape:items-center ape:leading-5.5!\">\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between\">\n <Flex className=\"button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full\">\n {!account ? (\n <ConnectButton />\n ) : (\n <Button\n className=\"action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!\"\n load={load || approvalState === ApprovalState.PENDING || zapLoading}\n disabled={\n load ||\n approvalState === ApprovalState.PENDING ||\n bondData?.soldOut ||\n isEmptyInput ||\n exceedsBalance ||\n SDKConfig.blockSales ||\n zapLoading\n }\n onClick={isApproved ? handleBuy : handleApprove}\n >\n {exceedsBalance\n ? 'Exceeds balance'\n : isEmptyInput\n ? 'Insert amount'\n : isApproved\n ? zapLoading\n ? 'Loading'\n : 'buy'\n : 'approve'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default React.memo(BuyComponentLpStaking)\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BuyComponentLpStaking.js","sources":["../../../../../src/adapters/evm/views/lpStaking/BuyComponentLpStaking.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useChainId, useSendTransaction, useSwitchChain } from 'wagmi'\nimport { ChainId, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport type { ChainBuyComponentProps } from '../../../types'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport { useSendReferenceId } from '../../../../hooks/useSendReferenceId'\nimport TokenSelectorPanel from '../../../../components/TokenSelectorPanel'\nimport ConnectButton from '../../../../components/ConnectButton'\nimport ProjectDescription from '../../../../views/BuyBond/components/ProjectDescription'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport { MCBuyComponentStyles } from '../../../../utils/campaignStyles'\nimport { toFixedString } from '../../../../utils/fixedPoint'\nimport { remove0xPrefix } from '../../../../utils/remove0xPrefix'\nimport { reportError } from '../../../../utils/reportError'\nimport track from '../../../../utils/track'\nimport useEVMAccount from '../../state/useEVMAccount'\nimport { ApprovalState, useApproval } from '../../state/useAllowance'\nimport { useMonitorTx } from '../../state/useMonitorTx'\nimport clsx from 'clsx'\nimport BondCards from '../../../../views/BuyBond/components/BondCards/BondCards'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport SafeHTMLComponent from '../../../../components/SafeHTMLComponent'\nimport useSoulZapLpStakingQuote from '../../state/lpStaking/useSoulZapLpStakingQuote'\nimport { parseEther } from 'viem'\nimport useTokenFromZapList from '../../../../hooks/useTokenFromZapList'\nimport { SoulZapTokenManager } from '../../../../config/constants/addresses'\nimport { ZapSupportedChainId } from '../../../../config/constants/variables'\nimport LpBondModalHeader from './LpBondModalHeader'\nimport LpStakingEstimations from './LpStakingEstimations'\nimport useSortedZapList from '../../../../hooks/useSortedZapList'\nimport { getSymbol } from '../../../../utils/getNativeTicker'\nimport { formatUSDNumber, getMaxBuy } from '../../../../utils/displayHelpers'\n\n/**\n * Buy form of LP staking bonds (`billType === 'lpStaking'`). Kept apart from the regular EVM BuyComponent because the\n * flow is different: no zaps, tiers, bridge or max-buy rules. Rendered inside ModalHandlerLpStaking from the bond list,\n * and directly by ChainBuyComponent elsewhere.\n */\nconst BuyComponentLpStaking: React.FC<ChainBuyComponentProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n handlePurchasedBond,\n setBillId,\n isProjectView,\n}) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const userChainId = useChainId()\n const { switchChainAsync } = useSwitchChain()\n const { address: account } = useEVMAccount()\n const { data: bonds } = useBondsData()\n const { addToastError } = usePopups()\n const sendReferenceId = useSendReferenceId()\n const { sendTransactionAsync } = useSendTransaction()\n\n // Bond to be used\n const bondData = useMemo(\n () =>\n bonds?.find(\n (bond) =>\n bond?.contractAddress?.[bond.chainId]?.toLowerCase() === bondAddress?.toLowerCase() &&\n bond.chainId === bondChain,\n ),\n [bonds, bondAddress, bondChain],\n )\n\n // State\n const [buyTxHash, setBuyTxHash] = useState<string | undefined>()\n const [inputValue, setInputValue] = useState('')\n const [loadingTx, setLoadingTx] = useState(false)\n const { isLoading: isConfirming, isSuccess: isConfirmed, data: buyTxReceipt } = useMonitorTx(buyTxHash, bondChain)\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData.chainId])\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n\n const { sortedZapList } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n\n const inputTokenPrice = enrichedTokenData?.price\n\n // Zap call data\n\n const [zapLoading, zapData, , zapError] = useSoulZapLpStakingQuote(inputValue, inputToken, bondData, account)\n // console.log(zapData)\n\n // Static Data\n const load = loadingTx || (isConfirming && !isConfirmed)\n const isWrongChain = !!bondChain && userChainId !== bondChain\n const exceedsBalance = Number(inputCurrencyBalance ?? '0') < Number(inputValue)\n const isEmptyInput = !inputValue || parseFloat(inputValue) === 0\n\n const spendAmount = parseFloat(inputValue) || 0\n const youSpendString = `${spendAmount.toLocaleString()} ${getSymbol(inputToken, bondData?.chainId)}${inputTokenPrice ? ` ($${formatUSDNumber((spendAmount * inputTokenPrice).toString())})` : ''}`\n const isZapSupported = false\n // Every purchase goes through the zap, so it can't be sent without a quote to send\n const hasZapQuote = !zapError && !!zapData?.txData\n\n // maxPayout and the bond's remaining capacity are in the pool's stablecoin (lpToken1), counted at $1. Paying with it\n // needs no price; other tokens are converted with their USD price, and can't be checked without one (the price\n // guard still reverts the tx).\n const stablecoinAddress = bondData?.lpStakingConfig?.lpToken1?.address?.[bondChain as ChainId]?.toLowerCase()\n const isPayingWithStablecoin =\n inputToken !== 'NATIVE' && inputToken?.address?.[bondChain as ChainId]?.toLowerCase() === stablecoinAddress\n const spendInStablecoin = isPayingWithStablecoin ? spendAmount : spendAmount * (inputTokenPrice ?? 0)\n const maxBuy = getMaxBuy(bondData, true)\n // 0 when the limits couldn't be read; the price guard still applies then\n const exceedsMaxBuy = maxBuy > 0 && spendInStablecoin > maxBuy\n\n // Once the buy tx is confirmed, report the new position's NFT id so ModalHandlerLpStaking can show it. The adapter's\n // deposit event has it: topics = [event, tokenId, campaignId, buyer]. It's the token_id REAL's API lists the\n // position under, which is the bill's id.\n useEffect(() => {\n if (!buyTxReceipt || !setBillId) return\n try {\n const adapter = bondData?.lpStakingConfig?.adapter?.toLowerCase()\n const campaignId = bondData?.lpStakingConfig?.campaignId?.toLowerCase()\n const depositLog = buyTxReceipt.logs.find(\n (log) => log.address.toLowerCase() === adapter && log.topics[2]?.toLowerCase() === campaignId,\n )\n const tokenIdTopic = depositLog?.topics[1]\n if (tokenIdTopic) setBillId(BigInt(tokenIdTopic).toString())\n } catch (e) {\n console.error(e)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buyTxReceipt])\n\n // State Handlers\n const handleMaxButton = useCallback(() => {\n setInputValue(inputCurrencyBalance ?? '0')\n }, [inputCurrencyBalance])\n\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n // Approve & Purchase Functions\n const [approvalState, approveCallback] = useApproval(\n inputValue,\n inputToken ?? null,\n SoulZapTokenManager?.[bondData?.chainId as ZapSupportedChainId] ?? null,\n account ?? null,\n bondChain ?? null,\n )\n const isApproved = approvalState === ApprovalState.APPROVED\n\n const handleApprove = async () => {\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n await approveCallback()\n track({\n event: 'approveBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n },\n })\n }\n\n const handleBuy = async () => {\n if (!bondData || !bondAddress || !bondChain || !hasZapQuote) return\n\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n\n setLoadingTx(true)\n const usdAmount = parseFloat(inputValue) * parseFloat(bondData?.principalTokenPrice ?? '0')\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: usdAmount,\n },\n })\n try {\n const validated18DecimalAmount = toFixedString(inputValue ?? '0', 18, 'trunc')\n const parsedValue = parseEther(validated18DecimalAmount)\n const hash = await sendTransactionAsync({\n to: zapData.txData.to,\n data: zapData.txData.data,\n value: inputToken === 'NATIVE' ? parsedValue : undefined,\n })\n if (hash) {\n setBuyTxHash(hash)\n sendReferenceId(bondAddress, bondChain, hash)\n handlePurchasedBond?.({ buyTxHash: hash })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-staking-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondAddress),\n usdAmount,\n },\n })\n }\n } catch (error: any) {\n console.error('Buy error', error)\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n extraInfo: { type: 'buyLpStakingBond', bondData, error },\n chainId: bondChain,\n account,\n })\n addToastError(error.shortMessage)\n } finally {\n setLoadingTx(false)\n }\n }\n\n return bondData ? (\n <Flex\n className=\"modal-content ape:flex ape:flex-col ape:rounded-[10px] ape:bg-white2 ape:w-full ape:p-3.75 ape:md:p-5\"\n style={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}\n >\n <Flex className=\"modaltable-container ape:w-full ape:flex ape:flex-col ape:relative ape:gap-2.5\">\n <LpBondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView={isProjectView} />\n <Flex className={clsx('ape:w-full', isProjectView ? 'ape:flex ape:md:hidden!' : 'ape:flex')}>\n <BondCards bondData={bondData} isDoingMaxBuy={false} />\n </Flex>\n <LpStakingEstimations\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZapSupported}\n fetchingZapQuote={zapLoading}\n zapError={zapError}\n protocolQuote={zapData?.protocolQuote}\n lpQuote={zapData?.lpQuote}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={bondData?.chainId}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance}\n selectedTokenPrice={parseFloat(bondData?.principalTokenPrice ?? '0')}\n marketingCampaign={bondData?.marketingCampaign}\n isConnected={!!account}\n />\n {bondData?.warningCard && (\n <Flex className=\"ape:w-full ape:rounded-normal ape:p-[2px_10px]\" style={{ background: '#DE62F366' }}>\n <Text as=\"div\" size=\"12px\" className=\"ape:font-normal ape:flex ape:items-center ape:leading-5.5!\">\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between\">\n <Flex className=\"button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full\">\n {!account ? (\n <ConnectButton />\n ) : (\n <Button\n className=\"action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!\"\n load={load || approvalState === ApprovalState.PENDING || zapLoading}\n disabled={\n load ||\n approvalState === ApprovalState.PENDING ||\n bondData?.soldOut ||\n isEmptyInput ||\n exceedsBalance ||\n exceedsMaxBuy ||\n SDKConfig.blockSales ||\n zapLoading ||\n // Approving doesn't need the quote, buying does\n (isApproved && !hasZapQuote)\n }\n onClick={isApproved ? handleBuy : handleApprove}\n >\n {exceedsBalance\n ? 'Exceeds balance'\n : isEmptyInput\n ? 'Insert amount'\n : exceedsMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : isApproved\n ? zapLoading\n ? 'Loading'\n : hasZapQuote\n ? 'buy'\n : 'Quote unavailable'\n : 'approve'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default React.memo(BuyComponentLpStaking)\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -67,7 +67,7 @@ const YourLpStakingBondModal = ({ userBill: userBillProp, lostProfit, onDismiss,
|
|
|
67
67
|
: cliffPeriods.hours > 0
|
|
68
68
|
? `${cliffPeriods.hours} hours`
|
|
69
69
|
: `${cliffPeriods.minutes} minutes`;
|
|
70
|
-
return (jsx(Modal, { className: clsx('ape:w-[480px] ape:[overflow-y:unset]! ape:p-0! ape:top-[56%] ape:overflow-x-visible', showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2'), children: jsxs(Flex, { className: clsx('ape:flex-col ape:rounded-normal ape:relative ape:p-[20px]', showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2'), children: [jsx(NftImage, { userBill: userBill, showNFTImg: showNFTImg, setShowNFTImg: setShowNFTImg }), !showNFTImg && (jsxs(Flex, { className: "ape:flex-col", children: [jsx(YourLpBondModalHeader, { userBill: userBill, onDismiss: onDismiss }), jsxs(Flex, { className: "ape:mt-[10px] ape:flex-col ape:gap-[10px]", children: [jsxs(Flex, { className: "ape:w-full ape:gap-[15px] ape:relative", children: [jsxs(Flex, { className: "ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]", children: [jsx(Flex, { children: "Deposit" }), isLoading ? (jsx(ValueSkeleton, { width: "60px" })) : depositUSD ? (jsxs(Flex, { children: ["$", formatNumberSI(depositUSD)] })) : (jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: ["Indexing...", jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: "Our services are indexing the tx and deposit amount will be calculated shortly" }), width: "230px", placement: "bottomLeft", transformTip: "translate(-5%, 0%)", children: jsx(Flex, { className: "block-header icon ape:text-white ape:font-normal ape:text-[12px]", children: jsx(QuestionCircle, { width: "12px" }) }) })] }))] }), jsx(Flex, { className: "ape:absolute ape:top-1/2 ape:left-1/2 ape:-translate-y-1/2 ape:-translate-x-1/2", children: jsx(Arrow, { direction: "right", width: '5px' }) }), jsxs(Flex, { className: "ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]", children: [jsx(Flex, { children: "Staked" }), jsxs(Flex, { className: "ape:flex-col ape:gap-[4px]", children: [isLoading && (jsxs(Fragment, { children: [jsx(ValueSkeleton, { width: "100px" }), jsx(ValueSkeleton, { width: "100px" })] })), stakedTokens.map((token) => (jsxs(Flex, { className: "ape:items-center ape:justify-center ape:md:justify-end ape:gap-[5px]", children: [jsxs(Flex, { className: "ape:text-[12px]", children: [formatNumberSI(token.amount), " ", token.symbol] }), jsxs(Flex, { className: "ape:text-[10px] ape:font-normal ape:opacity-60", children: ["($", formatNumberSI(token.amountUsd), ")"] })] }, token.address)))] })] })] }), lostProfit && (jsxs(Flex, { className: "ape:bg-white3 ape:rounded-normal ape:w-full ape:p-[10px] ape:justify-between", children: [jsx(Flex, { className: "ape:w-1/5", children: jsx("img", { src: `https://ape.bond/images/launch/mythical.png`, alt: "mythical", style: { width: '90px', height: '90px' } }) }), jsxs(Flex, { className: "ape:w-[75%] ape:flex-col ape:gap-[3px]", children: [jsxs(Flex, { children: ["You missed a", ' ', jsxs(Flex, { className: "ape:px-[3px]", style: { color: 'var(--ape-color-success)' }, children: ["$", lostProfit] }), ' ', "bonus"] }), jsx(Flex, { className: "ape:text-[12px] ape:font-normal", style: { lineHeight: '16px' }, children: "Holding an Ape Tier would\u2019ve gotten you an extra 5% bonus on this purchase and all future ones." }), jsx(Button, { variant: "secondary", className: "ape:w-full ape:text-[14px]! ape:h-[30px] ape:font-semibold", onClick: () => window.open('https://ape.bond/true-yield', '_blank'), children: "Upgrade Your Tier" })] })] })), jsxs(Flex, { className: "ape:flex-col ape:text-[12px] ape:font-normal", children: [jsxs(Flex, { className: "ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white3 ape:h-[26px] ape:rounded-[10px_10px_0px_0px]", children: [jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: [jsx(Flex, { className: "ape:opacity-60", children: "Bonus Reward" }), jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: `Your Bonus Reward unlocks ${cliffLength} after your purchase. Unstaking before it unlocks forfeits the bonus. Once unlocked, you can claim it on REAL's site.` }), width: "230px", placement: "bottomLeft", transformTip: "translate(-5%, 0%)", children: jsx(Flex, { className: "block-header icon ape:text-white ape:font-normal ape:text-[12px]", children: jsx(QuestionCircle, { width: "12px" }) }) })] }), isLoading ? (jsx(ValueSkeleton, { width: "90px" })) : (jsxs(Flex, { className: "ape:items-center", children: [jsxs(Text, { weight: 700, className: "ape:ml-[10px]", size: "12px", children: [formatNumberSI(pending(userBill) + claimable(userBill), 2), " ", payoutTokenSymbol] }), jsxs(Text, { weight: 400, className: "ape:ml-[5px] ape:opacity-60 ape:text-[10px]!", children: ["($", formatNumberSI(pendingUSD(userBill) + claimableUSD(userBill)), ")"] })] }))] }), jsxs(Flex, { className: "ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white4 ape:h-[26px]", children: [jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: [jsx(Flex, { className: "ape:opacity-60", children: "Claim Status" }), jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: UserBillTooltipText.FullyVested }), width: "230px", placement: "bottomLeft", transformTip: "translate(-5%, 0%)", children: jsx(Flex, { className: "block-header icon ape:text-white ape:font-normal ape:text-[12px]", children: jsx(QuestionCircle, { width: "12px" }) }) })] }), jsx(Flex, { className: "ape:items-center", children: isLoading ? (jsx(ValueSkeleton, { width: "90px" })) : userBill?.lpStakingData?.bonusStatus === null ? (jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: ["Not eligible", jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: bonusThreshold !== undefined
|
|
70
|
+
return (jsx(Modal, { className: clsx('ape:w-[480px] ape:[overflow-y:unset]! ape:p-0! ape:top-[56%] ape:overflow-x-visible', showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2'), children: jsxs(Flex, { className: clsx('ape:flex-col ape:rounded-normal ape:relative ape:p-[20px]', showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2'), children: [jsx(NftImage, { userBill: userBill, showNFTImg: showNFTImg, setShowNFTImg: setShowNFTImg, isLpStakingBond: true }), !showNFTImg && (jsxs(Flex, { className: "ape:flex-col", children: [jsx(YourLpBondModalHeader, { userBill: userBill, onDismiss: onDismiss }), jsxs(Flex, { className: "ape:mt-[10px] ape:flex-col ape:gap-[10px]", children: [jsxs(Flex, { className: "ape:w-full ape:gap-[15px] ape:relative", children: [jsxs(Flex, { className: "ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]", children: [jsx(Flex, { children: "Deposit" }), isLoading ? (jsx(ValueSkeleton, { width: "60px" })) : depositUSD ? (jsxs(Flex, { children: ["$", formatNumberSI(depositUSD)] })) : (jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: ["Indexing...", jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: "Our services are indexing the tx and deposit amount will be calculated shortly" }), width: "230px", placement: "bottomLeft", transformTip: "translate(-5%, 0%)", children: jsx(Flex, { className: "block-header icon ape:text-white ape:font-normal ape:text-[12px]", children: jsx(QuestionCircle, { width: "12px" }) }) })] }))] }), jsx(Flex, { className: "ape:absolute ape:top-1/2 ape:left-1/2 ape:-translate-y-1/2 ape:-translate-x-1/2", children: jsx(Arrow, { direction: "right", width: '5px' }) }), jsxs(Flex, { className: "ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]", children: [jsx(Flex, { children: "Staked" }), jsxs(Flex, { className: "ape:flex-col ape:gap-[4px]", children: [isLoading && (jsxs(Fragment, { children: [jsx(ValueSkeleton, { width: "100px" }), jsx(ValueSkeleton, { width: "100px" })] })), stakedTokens.map((token) => (jsxs(Flex, { className: "ape:items-center ape:justify-center ape:md:justify-end ape:gap-[5px]", children: [jsxs(Flex, { className: "ape:text-[12px]", children: [formatNumberSI(token.amount), " ", token.symbol] }), jsxs(Flex, { className: "ape:text-[10px] ape:font-normal ape:opacity-60", children: ["($", formatNumberSI(token.amountUsd), ")"] })] }, token.address)))] })] })] }), lostProfit && (jsxs(Flex, { className: "ape:bg-white3 ape:rounded-normal ape:w-full ape:p-[10px] ape:justify-between", children: [jsx(Flex, { className: "ape:w-1/5", children: jsx("img", { src: `https://ape.bond/images/launch/mythical.png`, alt: "mythical", style: { width: '90px', height: '90px' } }) }), jsxs(Flex, { className: "ape:w-[75%] ape:flex-col ape:gap-[3px]", children: [jsxs(Flex, { children: ["You missed a", ' ', jsxs(Flex, { className: "ape:px-[3px]", style: { color: 'var(--ape-color-success)' }, children: ["$", lostProfit] }), ' ', "bonus"] }), jsx(Flex, { className: "ape:text-[12px] ape:font-normal", style: { lineHeight: '16px' }, children: "Holding an Ape Tier would\u2019ve gotten you an extra 5% bonus on this purchase and all future ones." }), jsx(Button, { variant: "secondary", className: "ape:w-full ape:text-[14px]! ape:h-[30px] ape:font-semibold", onClick: () => window.open('https://ape.bond/true-yield', '_blank'), children: "Upgrade Your Tier" })] })] })), jsxs(Flex, { className: "ape:flex-col ape:text-[12px] ape:font-normal", children: [jsxs(Flex, { className: "ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white3 ape:h-[26px] ape:rounded-[10px_10px_0px_0px]", children: [jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: [jsx(Flex, { className: "ape:opacity-60", children: "Bonus Reward" }), jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: `Your Bonus Reward unlocks ${cliffLength} after your purchase. Unstaking before it unlocks forfeits the bonus. Once unlocked, you can claim it on REAL's site.` }), width: "230px", placement: "bottomLeft", transformTip: "translate(-5%, 0%)", children: jsx(Flex, { className: "block-header icon ape:text-white ape:font-normal ape:text-[12px]", children: jsx(QuestionCircle, { width: "12px" }) }) })] }), isLoading ? (jsx(ValueSkeleton, { width: "90px" })) : (jsxs(Flex, { className: "ape:items-center", children: [jsxs(Text, { weight: 700, className: "ape:ml-[10px]", size: "12px", children: [formatNumberSI(pending(userBill) + claimable(userBill), 2), " ", payoutTokenSymbol] }), jsxs(Text, { weight: 400, className: "ape:ml-[5px] ape:opacity-60 ape:text-[10px]!", children: ["($", formatNumberSI(pendingUSD(userBill) + claimableUSD(userBill)), ")"] })] }))] }), jsxs(Flex, { className: "ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white4 ape:h-[26px]", children: [jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: [jsx(Flex, { className: "ape:opacity-60", children: "Claim Status" }), jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: UserBillTooltipText.FullyVested }), width: "230px", placement: "bottomLeft", transformTip: "translate(-5%, 0%)", children: jsx(Flex, { className: "block-header icon ape:text-white ape:font-normal ape:text-[12px]", children: jsx(QuestionCircle, { width: "12px" }) }) })] }), jsx(Flex, { className: "ape:items-center", children: isLoading ? (jsx(ValueSkeleton, { width: "90px" })) : userBill?.lpStakingData?.bonusStatus === null ? (jsxs(Flex, { className: "ape:items-center ape:gap-[5px]", children: ["Not eligible", jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Flex, { children: bonusThreshold !== undefined
|
|
71
71
|
? `This sale was not eligible for Bonus Rewards as its value was below the minimum threshold of ${formatNumberSI(bonusThreshold)} ${payoutTokenSymbol} ($${formatNumberSI(bonusThreshold * payoutTokenPrice)}).`
|
|
72
72
|
: 'This sale was not eligible for Bonus Rewards as its value was below the minimum threshold.' }), width: "230px", placement: "bottomRight", transformTip: "translate(5%, 0%)", children: jsx(Flex, { className: "block-header icon ape:text-white ape:font-normal ape:text-[12px]", children: jsx(QuestionCircle, { width: "12px" }) }) })] })) : isPendingCliff ? (`Claiming starts in ${cliffCountdown.days !== 0 ? `${cliffCountdown.days} days` : cliffCountdown.hours !== 0 ? `${cliffCountdown.hours} hours` : `${cliffCountdown.minutes} mins`}`) : claimable(userBill) > 0 ? ('Claim now!') : claimed(userBill) > 0 ? ('Claimed') : (
|
|
73
73
|
// Forfeited: unstaked before the cliff
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YourLpStakingBondModal.js","sources":["../../../../../src/adapters/evm/views/lpStaking/YourLpStakingBondModal.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport clsx from 'clsx'\nimport { UserBill } from '../../../../types/yourbonds'\nimport { formatNumberSI } from '../../../../utils/formatNumber'\nimport { UserBillTooltipText } from '../../../../config/constants/tooltips'\nimport { claimable, claimableUSD, claimed, pending, pendingUSD } from '../../../../utils/displayHelpers'\nimport { getTimePeriods } from '../../../../utils/getTimePeriods'\nimport SafeHTMLComponent from '../../../../components/SafeHTMLComponent'\nimport NFTImage from '../../../../views/YourBondsModal/components/NFTImage/NFTImage'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport Modal from '../../../../components/uikit-sdk/Modal'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport TooltipBubble from '../../../../components/uikit-sdk/TooltipBubble'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport useUserBonds from '../../../../state/bonds/useUserBonds'\nimport Arrow from '../../../../components/uikit-sdk/Svg/Icons/Arrow'\nimport QuestionCircle from '../../../../components/uikit-sdk/Svg/Icons/QuestionCircle'\nimport Skeleton from '../../../../components/uikit-sdk/Skeleton'\nimport YourLpBondModalHeader from './YourLpBondModalHeader'\n\n// Stands in for a value while the position isn't loaded yet\nconst ValueSkeleton = ({ width }: { width: string }) => (\n <Skeleton animation=\"waves\" style={{ width, height: '14px', borderRadius: 'var(--ape-radius-normal)' }} />\n)\n\nconst YourLpStakingBondModal = ({\n userBill: userBillProp,\n lostProfit,\n onDismiss,\n}: {\n userBill?: UserBill\n lostProfit?: string\n onDismiss?: () => void\n}) => {\n // Hooks\n const { data: liveBonds } = useBondsData()\n // Subscribes the modal to the user bonds query (refetched every 2 minutes), so the position updates while it's\n // open: the bill passed in is a snapshot from when the modal was opened (e.g. the deposit still \"Indexing...\")\n const { data: userBonds } = useUserBonds()\n const userBill =\n userBonds?.find(\n (bill) =>\n bill.bond?.billType === 'lpStaking' &&\n bill.id === userBillProp?.id &&\n bill.bond?.chainId === userBillProp?.bond?.chainId,\n ) ?? userBillProp\n\n // State\n const [showNFTImg, setShowNFTImg] = useState(false)\n\n // Static Data\n // Right after a purchase the modal opens before REAL's API lists the position (see ModalHandlerLpStaking)\n const isLoading = !userBill\n // REAL's API only prices a fresh purchase some minutes after it shows up, so 0 means it's still being indexed\n const depositUSD = userBill?.nftData?.data?.dollarValue\n // Minimum position value for a purchase to earn the bonus, in the bonus token\n const bonusThreshold = userBill?.lpStakingData?.bonusThreshold\n const payoutTokenPrice = parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n // The position's two pool tokens, as staked now\n const stakedTokens = userBill?.lpStakingData ? [userBill.lpStakingData.token0, userBill.lpStakingData.token1] : []\n const payoutSymbol = userBill?.bond?.showcaseTokenName ?? userBill?.bond?.earnToken.symbol\n const payoutTokenSymbol = payoutSymbol === 'AIX' && userBill?.bond?.chainId === ChainId.SOL ? 'SOLAIX' : payoutSymbol\n // The same bond, if it's still on sale. Matched by index: the bill's copy of the bond has the bonus token as\n // earnToken, so matching by earn token symbol like the regular Actions do wouldn't find it.\n const liveBond = liveBonds?.find(\n (bond) =>\n !bond?.soldOut && !bond?.hide && bond.index === userBill?.bond?.index && bond.chainId === userBill?.bond?.chainId,\n )\n const canPurchaseAgain = !!liveBond\n const positionUrl = userBill?.lpStakingData?.positionUrl\n const poolRewards = userBill?.lpStakingData?.poolRewards\n\n // Cliff display info:\n const vestingCliff = Number(userBill?.bond?.vestingCliff)\n const currentTime = Math.round(new Date().getTime() / 1000)\n const vestingStartTimestamp = parseInt(userBill?.vestingStartTimestamp ?? '0')\n const isPendingCliff = vestingCliff ? currentTime - vestingStartTimestamp < vestingCliff : false\n const cliffCountdown = getTimePeriods(vestingStartTimestamp + (vestingCliff ?? 0) - currentTime, true)\n // The cliff's length, from the campaign (90 days on mainnet, 5 minutes on the Sepolia test stack). Unknown (0)\n // for purchases with no bonus.\n const cliffPeriods = getTimePeriods(vestingCliff || 0, true)\n const cliffLength = !vestingCliff\n ? undefined\n : cliffPeriods.days > 0\n ? `${cliffPeriods.days} days`\n : cliffPeriods.hours > 0\n ? `${cliffPeriods.hours} hours`\n : `${cliffPeriods.minutes} minutes`\n\n return (\n <Modal\n className={clsx(\n 'ape:w-[480px] ape:[overflow-y:unset]! ape:p-0! ape:top-[56%] ape:overflow-x-visible',\n showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2',\n )}\n >\n <Flex\n className={clsx(\n 'ape:flex-col ape:rounded-normal ape:relative ape:p-[20px]',\n showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2',\n )}\n >\n <NFTImage userBill={userBill} showNFTImg={showNFTImg} setShowNFTImg={setShowNFTImg} />\n\n {/* Modal Content */}\n\n {!showNFTImg && (\n <Flex className=\"ape:flex-col\">\n <YourLpBondModalHeader userBill={userBill} onDismiss={onDismiss} />\n <Flex className=\"ape:mt-[10px] ape:flex-col ape:gap-[10px]\">\n <Flex className=\"ape:w-full ape:gap-[15px] ape:relative\">\n {/* On mobile the label goes on top and the amount below it */}\n <Flex className=\"ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]\">\n <Flex>Deposit</Flex>\n {isLoading ? (\n <ValueSkeleton width=\"60px\" />\n ) : depositUSD ? (\n <Flex>${formatNumberSI(depositUSD)}</Flex>\n ) : (\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n Indexing...\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>Our services are indexing the tx and deposit amount will be calculated shortly</Flex>\n }\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n )}\n </Flex>\n <Flex className=\"ape:absolute ape:top-1/2 ape:left-1/2 ape:-translate-y-1/2 ape:-translate-x-1/2\">\n <Arrow direction=\"right\" width={'5px'} />\n </Flex>\n <Flex className=\"ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]\">\n <Flex>Staked</Flex>\n <Flex className=\"ape:flex-col ape:gap-[4px]\">\n {isLoading && (\n <>\n <ValueSkeleton width=\"100px\" />\n <ValueSkeleton width=\"100px\" />\n </>\n )}\n {stakedTokens.map((token) => (\n <Flex\n key={token.address}\n className=\"ape:items-center ape:justify-center ape:md:justify-end ape:gap-[5px]\"\n >\n <Flex className=\"ape:text-[12px]\">\n {formatNumberSI(token.amount)} {token.symbol}\n </Flex>\n <Flex className=\"ape:text-[10px] ape:font-normal ape:opacity-60\">\n (${formatNumberSI(token.amountUsd)})\n </Flex>\n </Flex>\n ))}\n </Flex>\n </Flex>\n </Flex>\n {lostProfit && (\n <Flex className=\"ape:bg-white3 ape:rounded-normal ape:w-full ape:p-[10px] ape:justify-between\">\n <Flex className=\"ape:w-1/5\">\n <img\n src={`https://ape.bond/images/launch/mythical.png`}\n alt=\"mythical\"\n style={{ width: '90px', height: '90px' }}\n />\n </Flex>\n <Flex className=\"ape:w-[75%] ape:flex-col ape:gap-[3px]\">\n <Flex>\n You missed a{' '}\n <Flex className=\"ape:px-[3px]\" style={{ color: 'var(--ape-color-success)' }}>\n ${lostProfit}\n </Flex>{' '}\n bonus\n </Flex>\n <Flex className=\"ape:text-[12px] ape:font-normal\" style={{ lineHeight: '16px' }}>\n Holding an Ape Tier would’ve gotten you an extra 5% bonus on this purchase and all future ones.\n </Flex>\n <Button\n variant=\"secondary\"\n className=\"ape:w-full ape:text-[14px]! ape:h-[30px] ape:font-semibold\"\n onClick={() => window.open('https://ape.bond/true-yield', '_blank')}\n >\n Upgrade Your Tier\n </Button>\n </Flex>\n </Flex>\n )}\n <Flex className=\"ape:flex-col ape:text-[12px] ape:font-normal\">\n <Flex className=\"ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white3 ape:h-[26px] ape:rounded-[10px_10px_0px_0px]\">\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Flex className=\"ape:opacity-60\">Bonus Reward</Flex>\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>\n {`Your Bonus Reward unlocks ${cliffLength} after your purchase. Unstaking before it unlocks forfeits the bonus. Once unlocked, you can claim it on REAL's site.`}\n </Flex>\n }\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n {isLoading ? (\n <ValueSkeleton width=\"90px\" />\n ) : (\n <Flex className=\"ape:items-center\">\n <Text weight={700} className=\"ape:ml-[10px]\" size=\"12px\">\n {/* The bonus, locked or claimable; 0 once claimed */}\n {formatNumberSI(pending(userBill) + claimable(userBill), 2)} {payoutTokenSymbol}\n </Text>\n <Text weight={400} className=\"ape:ml-[5px] ape:opacity-60 ape:text-[10px]!\">\n (${formatNumberSI(pendingUSD(userBill) + claimableUSD(userBill))})\n </Text>\n </Flex>\n )}\n </Flex>\n <Flex className=\"ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white4 ape:h-[26px]\">\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Flex className=\"ape:opacity-60\">Claim Status</Flex>\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={<Flex>{UserBillTooltipText.FullyVested}</Flex>}\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n <Flex className=\"ape:items-center\">\n {isLoading ? (\n <ValueSkeleton width=\"90px\" />\n ) : userBill?.lpStakingData?.bonusStatus === null ? (\n // The purchase was below the campaign's minimum bonus, so it has no bonus at all\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n Not eligible\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>\n {bonusThreshold !== undefined\n ? `This sale was not eligible for Bonus Rewards as its value was below the minimum threshold of ${formatNumberSI(bonusThreshold)} ${payoutTokenSymbol} ($${formatNumberSI(bonusThreshold * payoutTokenPrice)}).`\n : 'This sale was not eligible for Bonus Rewards as its value was below the minimum threshold.'}\n </Flex>\n }\n width=\"230px\"\n placement=\"bottomRight\"\n transformTip=\"translate(5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n ) : isPendingCliff ? (\n `Claiming starts in ${cliffCountdown.days !== 0 ? `${cliffCountdown.days} days` : cliffCountdown.hours !== 0 ? `${cliffCountdown.hours} hours` : `${cliffCountdown.minutes} mins`}`\n ) : claimable(userBill) > 0 ? (\n 'Claim now!'\n ) : claimed(userBill) > 0 ? (\n 'Claimed'\n ) : (\n // Forfeited: unstaked before the cliff\n '-'\n )}\n </Flex>\n </Flex>\n {/* On mobile the rewards stack one per line, so the row grows to fit them */}\n <Flex className=\"ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white3 ape:min-h-[26px] ape:md:h-[26px] ape:rounded-[0px_0px_10px_10px]\">\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Flex className=\"ape:opacity-60\">Pool Rewards</Flex>\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>\n Pool Rewards are accrued per epoch, by the position's weight among all staked positions,\n and only while it's in range.\n </Flex>\n }\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n <Flex className=\"ape:flex-col ape:md:flex-row ape:items-end ape:md:items-center ape:gap-[2px] ape:md:gap-[10px]\">\n {isLoading ? (\n <ValueSkeleton width=\"90px\" />\n ) : poolRewards ? (\n poolRewards.map((reward, index) => (\n <React.Fragment key={reward.address}>\n {/* Separator between the rewards on one line; on mobile they're stacked instead */}\n {index > 0 && (\n <Text as=\"span\" weight={700} className=\"ape:hidden ape:md:inline\" size=\"12px\">\n ·\n </Text>\n )}\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Text weight={700} size=\"12px\">\n {formatNumberSI(reward.amount, 2)} {reward.symbol}\n </Text>\n {reward.amountUsd !== undefined && (\n <Flex className=\"ape:text-[10px] ape:font-normal ape:opacity-60\">\n (${formatNumberSI(reward.amountUsd)})\n </Flex>\n )}\n </Flex>\n </React.Fragment>\n ))\n ) : (\n '-'\n )}\n </Flex>\n </Flex>\n </Flex>\n {userBill?.bond?.warningCard && (\n <Flex className=\"ape:w-full ape:justify-center ape:rounded-normal ape:bg-[#DE62F366]\">\n <Text as=\"div\" weight={400} size=\"12px\" className=\"ape:p-[4px_10px]\" style={{ lineHeight: '16px' }}>\n <SafeHTMLComponent html={userBill?.bond?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"ape:w-full ape:justify-between ape:gap-[10px] ape:md:gap-[15px] ape:h-[40px]\">\n {/* Every claim (bonus and pool rewards) happens on REAL's site, on the position's page */}\n <Button\n className=\"ape:w-full ape:text-[14px]!\"\n disabled={!positionUrl}\n onClick={() => window.open(positionUrl, '_blank', 'noopener,noreferrer')}\n >\n Manage on REAL\n </Button>\n {isLoading ? (\n // Not known yet whether the bond is still on sale, so no \"sold out\" tooltip\n <Button className=\"ape:text-[14px]! ape:w-full\" disabled>\n Buy again\n </Button>\n ) : canPurchaseAgain ? (\n <Button\n className=\"ape:text-[14px]! ape:w-full\"\n onClick={() =>\n (window.location.href = `/bonds?bondAddress=${liveBond.contractAddress[liveBond.chainId]}&bondChain=${liveBond.chainId}`)\n }\n >\n Buy again\n </Button>\n ) : (\n // The tooltip's wrappers are sized to their content, so they're stretched to the button's half.\n // The disabled button lets the pointer through, so hovering or tapping it opens the tooltip.\n <div className=\"ape:w-full ape:flex ape:*:w-full ape:*:*:w-full\">\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={<Flex>Bond sold out</Flex>}\n width=\"150px\"\n placement=\"topRight\"\n >\n <Button className=\"ape:text-[14px]! ape:w-full ape:pointer-events-none\" disabled>\n Buy again\n </Button>\n </TooltipBubble>\n </div>\n )}\n </Flex>\n </Flex>\n </Flex>\n )}\n </Flex>\n </Modal>\n )\n}\n\nexport default YourLpStakingBondModal\n"],"names":["_jsx","_jsxs","NFTImage","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"YourLpStakingBondModal.js","sources":["../../../../../src/adapters/evm/views/lpStaking/YourLpStakingBondModal.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport clsx from 'clsx'\nimport { UserBill } from '../../../../types/yourbonds'\nimport { formatNumberSI } from '../../../../utils/formatNumber'\nimport { UserBillTooltipText } from '../../../../config/constants/tooltips'\nimport { claimable, claimableUSD, claimed, pending, pendingUSD } from '../../../../utils/displayHelpers'\nimport { getTimePeriods } from '../../../../utils/getTimePeriods'\nimport SafeHTMLComponent from '../../../../components/SafeHTMLComponent'\nimport NFTImage from '../../../../views/YourBondsModal/components/NFTImage/NFTImage'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport Modal from '../../../../components/uikit-sdk/Modal'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport TooltipBubble from '../../../../components/uikit-sdk/TooltipBubble'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport useUserBonds from '../../../../state/bonds/useUserBonds'\nimport Arrow from '../../../../components/uikit-sdk/Svg/Icons/Arrow'\nimport QuestionCircle from '../../../../components/uikit-sdk/Svg/Icons/QuestionCircle'\nimport Skeleton from '../../../../components/uikit-sdk/Skeleton'\nimport YourLpBondModalHeader from './YourLpBondModalHeader'\n\n// Stands in for a value while the position isn't loaded yet\nconst ValueSkeleton = ({ width }: { width: string }) => (\n <Skeleton animation=\"waves\" style={{ width, height: '14px', borderRadius: 'var(--ape-radius-normal)' }} />\n)\n\nconst YourLpStakingBondModal = ({\n userBill: userBillProp,\n lostProfit,\n onDismiss,\n}: {\n userBill?: UserBill\n lostProfit?: string\n onDismiss?: () => void\n}) => {\n // Hooks\n const { data: liveBonds } = useBondsData()\n // Subscribes the modal to the user bonds query (refetched every 2 minutes), so the position updates while it's\n // open: the bill passed in is a snapshot from when the modal was opened (e.g. the deposit still \"Indexing...\")\n const { data: userBonds } = useUserBonds()\n const userBill =\n userBonds?.find(\n (bill) =>\n bill.bond?.billType === 'lpStaking' &&\n bill.id === userBillProp?.id &&\n bill.bond?.chainId === userBillProp?.bond?.chainId,\n ) ?? userBillProp\n\n // State\n const [showNFTImg, setShowNFTImg] = useState(false)\n\n // Static Data\n // Right after a purchase the modal opens before REAL's API lists the position (see ModalHandlerLpStaking)\n const isLoading = !userBill\n // REAL's API only prices a fresh purchase some minutes after it shows up, so 0 means it's still being indexed\n const depositUSD = userBill?.nftData?.data?.dollarValue\n // Minimum position value for a purchase to earn the bonus, in the bonus token\n const bonusThreshold = userBill?.lpStakingData?.bonusThreshold\n const payoutTokenPrice = parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n // The position's two pool tokens, as staked now\n const stakedTokens = userBill?.lpStakingData ? [userBill.lpStakingData.token0, userBill.lpStakingData.token1] : []\n const payoutSymbol = userBill?.bond?.showcaseTokenName ?? userBill?.bond?.earnToken.symbol\n const payoutTokenSymbol = payoutSymbol === 'AIX' && userBill?.bond?.chainId === ChainId.SOL ? 'SOLAIX' : payoutSymbol\n // The same bond, if it's still on sale. Matched by index: the bill's copy of the bond has the bonus token as\n // earnToken, so matching by earn token symbol like the regular Actions do wouldn't find it.\n const liveBond = liveBonds?.find(\n (bond) =>\n !bond?.soldOut && !bond?.hide && bond.index === userBill?.bond?.index && bond.chainId === userBill?.bond?.chainId,\n )\n const canPurchaseAgain = !!liveBond\n const positionUrl = userBill?.lpStakingData?.positionUrl\n const poolRewards = userBill?.lpStakingData?.poolRewards\n\n // Cliff display info:\n const vestingCliff = Number(userBill?.bond?.vestingCliff)\n const currentTime = Math.round(new Date().getTime() / 1000)\n const vestingStartTimestamp = parseInt(userBill?.vestingStartTimestamp ?? '0')\n const isPendingCliff = vestingCliff ? currentTime - vestingStartTimestamp < vestingCliff : false\n const cliffCountdown = getTimePeriods(vestingStartTimestamp + (vestingCliff ?? 0) - currentTime, true)\n // The cliff's length, from the campaign (90 days on mainnet, 5 minutes on the Sepolia test stack). Unknown (0)\n // for purchases with no bonus.\n const cliffPeriods = getTimePeriods(vestingCliff || 0, true)\n const cliffLength = !vestingCliff\n ? undefined\n : cliffPeriods.days > 0\n ? `${cliffPeriods.days} days`\n : cliffPeriods.hours > 0\n ? `${cliffPeriods.hours} hours`\n : `${cliffPeriods.minutes} minutes`\n\n return (\n <Modal\n className={clsx(\n 'ape:w-[480px] ape:[overflow-y:unset]! ape:p-0! ape:top-[56%] ape:overflow-x-visible',\n showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2',\n )}\n >\n <Flex\n className={clsx(\n 'ape:flex-col ape:rounded-normal ape:relative ape:p-[20px]',\n showNFTImg ? 'ape:bg-transparent!' : 'ape:bg-white2',\n )}\n >\n {/* The position is a Uniswap v3 NFT with no bond art: the image is a placeholder, with nothing to share */}\n <NFTImage userBill={userBill} showNFTImg={showNFTImg} setShowNFTImg={setShowNFTImg} isLpStakingBond />\n\n {/* Modal Content */}\n\n {!showNFTImg && (\n <Flex className=\"ape:flex-col\">\n <YourLpBondModalHeader userBill={userBill} onDismiss={onDismiss} />\n <Flex className=\"ape:mt-[10px] ape:flex-col ape:gap-[10px]\">\n <Flex className=\"ape:w-full ape:gap-[15px] ape:relative\">\n {/* On mobile the label goes on top and the amount below it */}\n <Flex className=\"ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]\">\n <Flex>Deposit</Flex>\n {isLoading ? (\n <ValueSkeleton width=\"60px\" />\n ) : depositUSD ? (\n <Flex>${formatNumberSI(depositUSD)}</Flex>\n ) : (\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n Indexing...\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>Our services are indexing the tx and deposit amount will be calculated shortly</Flex>\n }\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n )}\n </Flex>\n <Flex className=\"ape:absolute ape:top-1/2 ape:left-1/2 ape:-translate-y-1/2 ape:-translate-x-1/2\">\n <Arrow direction=\"right\" width={'5px'} />\n </Flex>\n <Flex className=\"ape:bg-white3 ape:rounded-normal ape:flex-col ape:md:flex-row ape:justify-center ape:md:justify-between ape:gap-[4px] ape:md:gap-0 ape:p-[10px] ape:w-1/2 ape:items-center ape:text-[14px]\">\n <Flex>Staked</Flex>\n <Flex className=\"ape:flex-col ape:gap-[4px]\">\n {isLoading && (\n <>\n <ValueSkeleton width=\"100px\" />\n <ValueSkeleton width=\"100px\" />\n </>\n )}\n {stakedTokens.map((token) => (\n <Flex\n key={token.address}\n className=\"ape:items-center ape:justify-center ape:md:justify-end ape:gap-[5px]\"\n >\n <Flex className=\"ape:text-[12px]\">\n {formatNumberSI(token.amount)} {token.symbol}\n </Flex>\n <Flex className=\"ape:text-[10px] ape:font-normal ape:opacity-60\">\n (${formatNumberSI(token.amountUsd)})\n </Flex>\n </Flex>\n ))}\n </Flex>\n </Flex>\n </Flex>\n {lostProfit && (\n <Flex className=\"ape:bg-white3 ape:rounded-normal ape:w-full ape:p-[10px] ape:justify-between\">\n <Flex className=\"ape:w-1/5\">\n <img\n src={`https://ape.bond/images/launch/mythical.png`}\n alt=\"mythical\"\n style={{ width: '90px', height: '90px' }}\n />\n </Flex>\n <Flex className=\"ape:w-[75%] ape:flex-col ape:gap-[3px]\">\n <Flex>\n You missed a{' '}\n <Flex className=\"ape:px-[3px]\" style={{ color: 'var(--ape-color-success)' }}>\n ${lostProfit}\n </Flex>{' '}\n bonus\n </Flex>\n <Flex className=\"ape:text-[12px] ape:font-normal\" style={{ lineHeight: '16px' }}>\n Holding an Ape Tier would’ve gotten you an extra 5% bonus on this purchase and all future ones.\n </Flex>\n <Button\n variant=\"secondary\"\n className=\"ape:w-full ape:text-[14px]! ape:h-[30px] ape:font-semibold\"\n onClick={() => window.open('https://ape.bond/true-yield', '_blank')}\n >\n Upgrade Your Tier\n </Button>\n </Flex>\n </Flex>\n )}\n <Flex className=\"ape:flex-col ape:text-[12px] ape:font-normal\">\n <Flex className=\"ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white3 ape:h-[26px] ape:rounded-[10px_10px_0px_0px]\">\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Flex className=\"ape:opacity-60\">Bonus Reward</Flex>\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>\n {`Your Bonus Reward unlocks ${cliffLength} after your purchase. Unstaking before it unlocks forfeits the bonus. Once unlocked, you can claim it on REAL's site.`}\n </Flex>\n }\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n {isLoading ? (\n <ValueSkeleton width=\"90px\" />\n ) : (\n <Flex className=\"ape:items-center\">\n <Text weight={700} className=\"ape:ml-[10px]\" size=\"12px\">\n {/* The bonus, locked or claimable; 0 once claimed */}\n {formatNumberSI(pending(userBill) + claimable(userBill), 2)} {payoutTokenSymbol}\n </Text>\n <Text weight={400} className=\"ape:ml-[5px] ape:opacity-60 ape:text-[10px]!\">\n (${formatNumberSI(pendingUSD(userBill) + claimableUSD(userBill))})\n </Text>\n </Flex>\n )}\n </Flex>\n <Flex className=\"ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white4 ape:h-[26px]\">\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Flex className=\"ape:opacity-60\">Claim Status</Flex>\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={<Flex>{UserBillTooltipText.FullyVested}</Flex>}\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n <Flex className=\"ape:items-center\">\n {isLoading ? (\n <ValueSkeleton width=\"90px\" />\n ) : userBill?.lpStakingData?.bonusStatus === null ? (\n // The purchase was below the campaign's minimum bonus, so it has no bonus at all\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n Not eligible\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>\n {bonusThreshold !== undefined\n ? `This sale was not eligible for Bonus Rewards as its value was below the minimum threshold of ${formatNumberSI(bonusThreshold)} ${payoutTokenSymbol} ($${formatNumberSI(bonusThreshold * payoutTokenPrice)}).`\n : 'This sale was not eligible for Bonus Rewards as its value was below the minimum threshold.'}\n </Flex>\n }\n width=\"230px\"\n placement=\"bottomRight\"\n transformTip=\"translate(5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n ) : isPendingCliff ? (\n `Claiming starts in ${cliffCountdown.days !== 0 ? `${cliffCountdown.days} days` : cliffCountdown.hours !== 0 ? `${cliffCountdown.hours} hours` : `${cliffCountdown.minutes} mins`}`\n ) : claimable(userBill) > 0 ? (\n 'Claim now!'\n ) : claimed(userBill) > 0 ? (\n 'Claimed'\n ) : (\n // Forfeited: unstaked before the cliff\n '-'\n )}\n </Flex>\n </Flex>\n {/* On mobile the rewards stack one per line, so the row grows to fit them */}\n <Flex className=\"ape:w-full ape:justify-between ape:items-center ape:p-[4px_10px] ape:bg-white3 ape:min-h-[26px] ape:md:h-[26px] ape:rounded-[0px_0px_10px_10px]\">\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Flex className=\"ape:opacity-60\">Pool Rewards</Flex>\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Flex>\n Pool Rewards are accrued per epoch, by the position's weight among all staked positions,\n and only while it's in range.\n </Flex>\n }\n width=\"230px\"\n placement=\"bottomLeft\"\n transformTip=\"translate(-5%, 0%)\"\n >\n <Flex className=\"block-header icon ape:text-white ape:font-normal ape:text-[12px]\">\n <QuestionCircle width=\"12px\" />\n </Flex>\n </TooltipBubble>\n </Flex>\n <Flex className=\"ape:flex-col ape:md:flex-row ape:items-end ape:md:items-center ape:gap-[2px] ape:md:gap-[10px]\">\n {isLoading ? (\n <ValueSkeleton width=\"90px\" />\n ) : poolRewards ? (\n poolRewards.map((reward, index) => (\n <React.Fragment key={reward.address}>\n {/* Separator between the rewards on one line; on mobile they're stacked instead */}\n {index > 0 && (\n <Text as=\"span\" weight={700} className=\"ape:hidden ape:md:inline\" size=\"12px\">\n ·\n </Text>\n )}\n <Flex className=\"ape:items-center ape:gap-[5px]\">\n <Text weight={700} size=\"12px\">\n {formatNumberSI(reward.amount, 2)} {reward.symbol}\n </Text>\n {reward.amountUsd !== undefined && (\n <Flex className=\"ape:text-[10px] ape:font-normal ape:opacity-60\">\n (${formatNumberSI(reward.amountUsd)})\n </Flex>\n )}\n </Flex>\n </React.Fragment>\n ))\n ) : (\n '-'\n )}\n </Flex>\n </Flex>\n </Flex>\n {userBill?.bond?.warningCard && (\n <Flex className=\"ape:w-full ape:justify-center ape:rounded-normal ape:bg-[#DE62F366]\">\n <Text as=\"div\" weight={400} size=\"12px\" className=\"ape:p-[4px_10px]\" style={{ lineHeight: '16px' }}>\n <SafeHTMLComponent html={userBill?.bond?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"ape:w-full ape:justify-between ape:gap-[10px] ape:md:gap-[15px] ape:h-[40px]\">\n {/* Every claim (bonus and pool rewards) happens on REAL's site, on the position's page */}\n <Button\n className=\"ape:w-full ape:text-[14px]!\"\n disabled={!positionUrl}\n onClick={() => window.open(positionUrl, '_blank', 'noopener,noreferrer')}\n >\n Manage on REAL\n </Button>\n {isLoading ? (\n // Not known yet whether the bond is still on sale, so no \"sold out\" tooltip\n <Button className=\"ape:text-[14px]! ape:w-full\" disabled>\n Buy again\n </Button>\n ) : canPurchaseAgain ? (\n <Button\n className=\"ape:text-[14px]! ape:w-full\"\n onClick={() =>\n (window.location.href = `/bonds?bondAddress=${liveBond.contractAddress[liveBond.chainId]}&bondChain=${liveBond.chainId}`)\n }\n >\n Buy again\n </Button>\n ) : (\n // The tooltip's wrappers are sized to their content, so they're stretched to the button's half.\n // The disabled button lets the pointer through, so hovering or tapping it opens the tooltip.\n <div className=\"ape:w-full ape:flex ape:*:w-full ape:*:*:w-full\">\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={<Flex>Bond sold out</Flex>}\n width=\"150px\"\n placement=\"topRight\"\n >\n <Button className=\"ape:text-[14px]! ape:w-full ape:pointer-events-none\" disabled>\n Buy again\n </Button>\n </TooltipBubble>\n </div>\n )}\n </Flex>\n </Flex>\n </Flex>\n )}\n </Flex>\n </Modal>\n )\n}\n\nexport default YourLpStakingBondModal\n"],"names":["_jsx","_jsxs","NFTImage","_Fragment"],"mappings":"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"}
|
|
@@ -27,6 +27,20 @@ var LP_STAKING_VAULT_ABI = [
|
|
|
27
27
|
],
|
|
28
28
|
stateMutability: "view",
|
|
29
29
|
type: "function"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
inputs: [
|
|
33
|
+
],
|
|
34
|
+
name: "depositsPaused",
|
|
35
|
+
outputs: [
|
|
36
|
+
{
|
|
37
|
+
internalType: "bool",
|
|
38
|
+
name: "",
|
|
39
|
+
type: "bool"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
stateMutability: "view",
|
|
43
|
+
type: "function"
|
|
30
44
|
}
|
|
31
45
|
];
|
|
32
46
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lpStakingVault.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lpStakingVault.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -36,7 +36,6 @@ const calculateBondsData = async (queryClient) => {
|
|
|
36
36
|
// Fetch the realtime-API adapters' bonds (EVM incl. PreTGE, Solana)
|
|
37
37
|
let evmSolBondsData = [];
|
|
38
38
|
try {
|
|
39
|
-
throw new Error('Force fallback to on-chain reads');
|
|
40
39
|
// We first try to fetch from realtime; if it fails we fall back to each adapter's on-chain reads.
|
|
41
40
|
const realTimeApiResponse = await apiGet(`${realTimeApiUrl}/bonds`);
|
|
42
41
|
evmSolBondsData = realTimeApiResponse.bonds.filter((bond) => chains.includes(bond.chainId) && usesRealtimeApi(bond.chainId));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBondsData.js","sources":["../../../src/state/bonds/useBondsData.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport { apiGet } from '../../utils/httpClient'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport useBondsList from './useBondsList'\nimport { BillsConfig, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport useBondsListPreTGE from './useBondsListPreTGE'\nimport { getAdapterForChain } from '../../adapters/registry'\n\nexport default function useBondsData(): UseQueryResult<BondsData[]> {\n const { data: bondList } = useBondsList()\n const { data: preTGEList } = useBondsListPreTGE()\n const { data: tokenPrices } = useTokenPrices()\n const tokenPricesKey = Object.keys(tokenPrices ?? {})?.length\n\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_DATA],\n queryFn: ({ client }) => calculateBondsData(client),\n refetchInterval: 25000, // i.e. 25 sec\n enabled: !!bondList && !!preTGEList && !!tokenPricesKey,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 0,\n staleTime: 25000, // i.e. 25 sec\n })\n}\n\nexport const calculateBondsData = async (queryClient: QueryClient): Promise<BondsData[]> => {\n // ----------------------- Step 1 -----------------------\n // Fetch necessary data from the queryClient\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiUrl = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n // Adapters that don't use the realtime API are read on-chain in step 3. Chains without a registered adapter are\n // unsupported.\n const usesRealtimeApi = (chainId: ChainId) => getAdapterForChain(chainId)?.usesRealtimeApi ?? false\n\n // ----------------------- Step 2 -----------------------\n // Fetch the realtime-API adapters' bonds (EVM incl. PreTGE, Solana)\n let evmSolBondsData: BondsData[] = []\n\n try {\n
|
|
1
|
+
{"version":3,"file":"useBondsData.js","sources":["../../../src/state/bonds/useBondsData.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport { apiGet } from '../../utils/httpClient'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport useBondsList from './useBondsList'\nimport { BillsConfig, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport useBondsListPreTGE from './useBondsListPreTGE'\nimport { getAdapterForChain } from '../../adapters/registry'\n\nexport default function useBondsData(): UseQueryResult<BondsData[]> {\n const { data: bondList } = useBondsList()\n const { data: preTGEList } = useBondsListPreTGE()\n const { data: tokenPrices } = useTokenPrices()\n const tokenPricesKey = Object.keys(tokenPrices ?? {})?.length\n\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_DATA],\n queryFn: ({ client }) => calculateBondsData(client),\n refetchInterval: 25000, // i.e. 25 sec\n enabled: !!bondList && !!preTGEList && !!tokenPricesKey,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 0,\n staleTime: 25000, // i.e. 25 sec\n })\n}\n\nexport const calculateBondsData = async (queryClient: QueryClient): Promise<BondsData[]> => {\n // ----------------------- Step 1 -----------------------\n // Fetch necessary data from the queryClient\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiUrl = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n // Adapters that don't use the realtime API are read on-chain in step 3. Chains without a registered adapter are\n // unsupported.\n const usesRealtimeApi = (chainId: ChainId) => getAdapterForChain(chainId)?.usesRealtimeApi ?? false\n\n // ----------------------- Step 2 -----------------------\n // Fetch the realtime-API adapters' bonds (EVM incl. PreTGE, Solana)\n let evmSolBondsData: BondsData[] = []\n\n try {\n // We first try to fetch from realtime; if it fails we fall back to each adapter's on-chain reads.\n const realTimeApiResponse = await apiGet<{ bonds: BondsData[] }>(`${realTimeApiUrl}/bonds`)\n evmSolBondsData = realTimeApiResponse.bonds.filter(\n (bond: BondsData) => chains.includes(bond.chainId) && usesRealtimeApi(bond.chainId),\n )\n } catch {\n // Fallback strategy\n console.time('Fallback BondsData')\n const bondList = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST]) as Record<ChainId, BillsConfig[]>\n const preTGEList = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST_PRE_TGE]) as PreTGEConfig[]\n const tokenPrices = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES]) as Partial<Record<ChainId, TokenPrices[]>>\n const billData = await Promise.all([\n ...chains\n .filter((c) => usesRealtimeApi(c))\n .map(async (chainId: ChainId) => {\n if (!bondList[chainId]) return []\n return await getAdapterForChain(chainId)!.fetchBondsData(\n chainId,\n bondList[chainId],\n tokenPrices[chainId],\n apiUrl,\n )\n }),\n ...chains.map(async (chainId: ChainId) => {\n const preTGE = getAdapterForChain(chainId)?.preTGE\n if (!preTGE) return []\n const filteredBonds = preTGEList?.filter((bond) => bond.chainId === chainId) ?? []\n return await preTGE.fetchBondsData(chainId, tokenPrices, filteredBonds, apiUrl)\n }),\n ])\n console.timeEnd('Fallback BondsData')\n evmSolBondsData = billData.flat()\n }\n\n // ----------------------- Step 3 -----------------------\n // Fetch on-chain-only bonds: adapters that don't use the realtime API (e.g. Aptos, Sui)\n let onChainBonds: BondsData[] = []\n const onChainAdapterChains = (chains as ChainId[]).filter((chainId) => {\n const adapter = getAdapterForChain(chainId)\n return !!adapter && !adapter.usesRealtimeApi\n })\n\n if (onChainAdapterChains.length > 0) {\n try {\n const bondList = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST]) as Record<ChainId, BillsConfig[]>\n const tokenPrices = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES]) as Partial<\n Record<ChainId, TokenPrices[]>\n >\n const results = await Promise.all(\n onChainAdapterChains.map((chainId) =>\n getAdapterForChain(chainId)!.fetchBondsData(chainId, bondList[chainId] ?? [], tokenPrices[chainId], apiUrl),\n ),\n )\n onChainBonds = results.flat()\n } catch (e) {\n console.error(e)\n }\n }\n\n return [...evmSolBondsData, ...onChainBonds]\n}\n"],"names":[],"mappings":"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"}
|