@ape.swap/bonds-sdk 7.0.0-test.0 → 7.0.0-test.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/adapters/evm/BuyComponent.js +1 -1
- package/dist/adapters/evm/BuyComponent.js.map +1 -1
- package/dist/adapters/lifi/LifiModal.d.ts +1 -0
- package/dist/adapters/lifi/LifiModal.js +44 -60
- package/dist/adapters/lifi/LifiModal.js.map +1 -1
- package/dist/adapters/lifi/LifiWidgetContent.d.ts +8 -0
- package/dist/adapters/lifi/LifiWidgetContent.js +69 -0
- package/dist/adapters/lifi/LifiWidgetContent.js.map +1 -0
- package/dist/adapters/lifi/index.d.ts +2 -1
- package/dist/adapters/lifi/index.js +7 -2
- package/dist/adapters/lifi/index.js.map +1 -1
- package/dist/adapters/solana/BuyComponentSolana.js +1 -1
- package/dist/adapters/solana/BuyComponentSolana.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -0
- package/dist/components/ConnectButton/index.js +2 -1
- package/dist/components/ConnectButton/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -59,6 +59,7 @@ The chain libraries are **optional peer dependencies**: npm doesn't install them
|
|
|
59
59
|
Notes:
|
|
60
60
|
|
|
61
61
|
- **LiFi:** `@lifi/widget` v3 itself requires `wagmi`, `@mysten/dapp-kit` and `@solana/wallet-adapter-react`, whichever chains you show. If you want an app without EVM or Sui packages, don't register `lifiAdapter`; the buy flows then simply hide the bridge option.
|
|
62
|
+
- **LiFi is lazy-loaded:** the widget (about 1 MB gzipped) is only downloaded when a user opens the "Swap & Bridge" modal (or hovers its button), not on page load, provided your bundler supports dynamic `import()` (Vite, webpack, Next.js and Rollup all do). Nothing changes on your side: `@lifi/widget` and its peers must still be installed when you register `lifiAdapter`.
|
|
62
63
|
- **Solana** needs a custom RPC: see [Custom RPCs](#custom-rpcs). The Solana adapter sets the `Buffer` global its libraries need, so you don't need a polyfill.
|
|
63
64
|
- **Aptos** runs on Aptos **testnet** unless `NEXT_PUBLIC_APTOS_NETWORK=mainnet` is set in your build environment.
|
|
64
65
|
- `@tanstack/react-query`'s `QueryClientProvider` must wrap the SDK in every setup; the SDK shares your `QueryClient` (its query keys are prefixed with `ApeBond-SDK-`).
|
|
@@ -394,7 +394,7 @@ const BuyComponent = ({ onDismiss, bondAddress, bondChain, handlePurchasedBond,
|
|
|
394
394
|
return bondData ? (jsx(Flex, { 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", style: { ...MCBuyComponentStyles[bondData?.marketingCampaign] }, children: jsxs(Flex, { className: "modaltable-container ape:w-full ape:flex ape:flex-col ape:relative ape:gap-2.5", children: [jsx(BondModalHeader, { bondData: bondData, onDismiss: onDismiss, showProjectInfoButton: SDKConfig?.referenceId === 'apebond' }), jsx(ProjectDescription, { description: bondData.shortDescription, isProjectView: true }), jsx(Flex, { className: clsx('ape:w-full', isProjectView ? 'ape:flex ape:md:hidden!' : 'ape:flex'), children: jsx(BondCards, { bondData: bondData, isDoingMaxBuy: exceedsSafeMaxBuy && !exceedsRealMaxBuy }) }), jsx(Estimations, { depositAmount: depositAmount, inputValue: inputValue, inputTokenPrice: inputTokenPrice, bondData: bondData, youSpendString: youSpendString, isZap: isZapSupported, fetchingZapQuote: fetchingZapQuote, zapError: zapError }), jsx(TokenSelectorPanel, { typedValue: inputValue, setTypedValue: setInputValue, selectedToken: inputToken, handleValueBtn: handleMaxButton, handleCurrencySelect: handleCurrencySelect, bondChainId: bondData?.chainId, enableZap: isZapSupported, bondPrincipalToken: bondData?.lpToken, tokenBalance: inputCurrencyBalance, selectedTokenPrice: inputTokenPrice, inputDisabled: isUserRestricted, marketingCampaign: bondData?.marketingCampaign, isConnected: !!account }), SDKConfig.useTiers &&
|
|
395
395
|
userTier !== LaunchBondTiers.Mythical &&
|
|
396
396
|
bondData?.billVersion === BillVersion.V4 &&
|
|
397
|
-
account && (jsx(PointsLeftForNextTier, { bond: bondData, inputAmount: inputValue, setInputValue: setInputValue, inputTokenPrice: inputTokenPrice, inputTokenDecimals: inputToken === 'NATIVE' ? 18 : (inputToken?.decimals?.[bondData?.chainId] ?? 18) })), bondData?.warningCard && (jsx(Flex, { className: "ape:w-full ape:rounded-normal ape:p-[2px_10px]", style: { background: '#DE62F366' }, children: jsx(Text, { as: "div", size: "12px", className: "ape:font-normal ape:flex ape:items-center ape:leading-5.5!", children: jsx(SafeHTMLComponent, { html: bondData?.warningCard }) }) })), jsx(Flex, { className: "modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between", children: jsx(Flex, { className: "button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full", children: !account ? (jsx(ConnectButton, {})) : (jsxs(Flex, { className: "ape:w-full ape:gap-[10px] ape:flex-col ape:md:flex-row", children: [jsx(Button, { variant: "secondary", onClick: () => canBridge ? onOpenBridgeModal() : bondChain === ChainId.L1X ? onOpenl1xIframe() : openExternal(), className: "ape:w-full ape:md:w-[35%] ape:text-[14px]! ape:lg:text-[16px]!", children: canBridge
|
|
397
|
+
account && (jsx(PointsLeftForNextTier, { bond: bondData, inputAmount: inputValue, setInputValue: setInputValue, inputTokenPrice: inputTokenPrice, inputTokenDecimals: inputToken === 'NATIVE' ? 18 : (inputToken?.decimals?.[bondData?.chainId] ?? 18) })), bondData?.warningCard && (jsx(Flex, { className: "ape:w-full ape:rounded-normal ape:p-[2px_10px]", style: { background: '#DE62F366' }, children: jsx(Text, { as: "div", size: "12px", className: "ape:font-normal ape:flex ape:items-center ape:leading-5.5!", children: jsx(SafeHTMLComponent, { html: bondData?.warningCard }) }) })), jsx(Flex, { className: "modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between", children: jsx(Flex, { className: "button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full", children: !account ? (jsx(ConnectButton, {})) : (jsxs(Flex, { className: "ape:w-full ape:gap-[10px] ape:flex-col ape:md:flex-row", children: [jsx(Button, { variant: "secondary", onClick: () => canBridge ? onOpenBridgeModal() : bondChain === ChainId.L1X ? onOpenl1xIframe() : openExternal(), onMouseEnter: canBridge ? bridge.preload : undefined, onFocus: canBridge ? bridge.preload : undefined, className: "ape:w-full ape:md:w-[35%] ape:text-[14px]! ape:lg:text-[16px]!", children: canBridge
|
|
398
398
|
? isProjectView
|
|
399
399
|
? 'Bridge funds'
|
|
400
400
|
: `Bridge to ${SHORT_NETWORK_LABEL[bondData?.chainId]}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuyComponent.js","sources":["../../../src/adapters/evm/BuyComponent.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport clsx from 'clsx'\nimport { convertToBigish } from '../../utils/convertToBigish'\nimport { mulDivRound, toFixedString } from '../../utils/fixedPoint'\nimport ABI_DEPOSIT from '../../config/abi/deposit.json'\nimport ABI_DEPOSIT_SIG from '../../config/abi/depositSig.json'\nimport type { ChainBuyComponentProps } from '../types'\nimport {\n useChainId,\n useSendTransaction,\n useWriteContract,\n // useConfig\n} from 'wagmi'\nimport useModal from '../../hooks/useModal'\n// import ZapModal from '../ZapModal'\nimport { BillVersion, ChainId, LaunchBondTiers, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport TokenSelectorPanel from '../../components/TokenSelectorPanel'\nimport { useApproval } from './useAllowance'\nimport { SoulZapTokenManager } from '../../config/constants/addresses'\nimport useSoulZapBondQuote from './useSoulZapBondQuote'\nimport { parseEther } from 'viem'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport useTokenFromZapList from '../../hooks/useTokenFromZapList'\nimport { useMonitorTx } from './useMonitorTx'\nimport { usePopups } from '../../state/popups/usePopups'\nimport {\n formatUSDNumber,\n getMaxBuy,\n getPayoutAmount,\n getPrincipalAmount,\n getRawBonus,\n} from '../../utils/displayHelpers'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport { zapSupported, ZapSupportedChainId } from '../../config/constants/variables'\nimport { getSymbol } from '../../utils/getNativeTicker'\nimport { useSendReferenceId } from '../../hooks/useSendReferenceId'\nimport ConnectButton from '../../components/ConnectButton'\nimport BondModalHeader from '../../views/BuyBond/components/BondModalHeader'\nimport BondCards from '../../views/BuyBond/components/BondCards/BondCards'\nimport Estimations from '../../views/BuyBond/components/Estimations'\nimport ProjectDescription from '../../views/BuyBond/components/ProjectDescription'\nimport track from '../../utils/track'\nimport { remove0xPrefix } from '../../utils/remove0xPrefix'\nimport useTierPoints from '../../state/tiers/useTierPoints'\nimport { getUserTier, Promotions, TIERS_WEIGHT } from '../../state/tiers/tiers'\nimport NewRateModal from '../../views/BuyBond/components/NewRateModal/NewRateModal'\nimport NoBonusModal from '../../views/BuyBond/components/NoBonusModal/NoBonusModal'\nimport useTierProofSignature from './useTierProofSignature'\nimport PointsLeftForNextTier from '../../views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier'\nimport SafeHTMLComponent from '../../components/SafeHTMLComponent'\nimport useSortedZapList from '../../hooks/useSortedZapList'\nimport TransactionModal from './TransactionModal'\nimport { reportError } from '../../utils/reportError'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { MCBuyComponentStyles } from '../../utils/campaignStyles'\nimport useEVMAccount from './useEVMAccount'\nimport { getBridgeAdapter } from '../registry'\n// import useTierOptimizationPreview from '../../state/zap/useTierOptimizationPreview'\nimport { SHORT_NETWORK_LABEL } from '../../config/constants/chains'\nimport Flex from '../../components/uikit-sdk/Flex'\nimport Text from '../../components/uikit-sdk/Text'\nimport Button from '../../components/uikit-sdk/Button/Button'\nimport { formatNumberSI } from '../../utils/formatNumber'\nimport L1xIframe from '../../views/BuyBond/components/L1xIframe/L1xIframe'\n// import { simulateContract } from 'wagmi/actions'\n\nexport type BuyComponentProps = ChainBuyComponentProps\n\nconst PROMOTION_TRACKING_SUFFIXES: Partial<Record<Promotions, string>> = {\n [Promotions.WelcomeBonus]: 'welcome-bonus',\n [Promotions.BonusWeek]: 'bonus-week',\n}\n\nconst getPromotionTrackingSuffix = (promotion?: Promotions | null): string => {\n if (!promotion) return ''\n return PROMOTION_TRACKING_SUFFIXES[promotion] ?? ''\n}\n\nconst BuyComponent: React.FC<BuyComponentProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n handlePurchasedBond,\n setBillId,\n isProjectView,\n}) => {\n // Hooks\n // const config = useConfig()\n const SDKConfig = useSDKConfig()\n const userChainId = useChainId()\n const { address: account } = useEVMAccount()\n const { writeContractAsync } = useWriteContract()\n const { sendTransactionAsync } = useSendTransaction()\n const { data: bonds, refetch: refetchBondState } = useBondsData()\n const sendReferenceId = useSendReferenceId()\n const { data: tierPointsState } = useTierPoints()\n const { promotionalPoints, promotion, eligibleChains, onChainPoints } = tierPointsState || {}\n // if promotion comes with eligibleChains undefined means it should be used for every chain\n const isBondEligibleForPromotion = eligibleChains === undefined || eligibleChains?.includes(bondChain as ChainId)\n const pointsToBeUsed = isBondEligibleForPromotion ? promotionalPoints : onChainPoints\n // Bond To be used\n const bondData = useMemo(() => {\n return bonds?.find((bond) => bond?.contractAddress?.[bond.chainId]?.toLowerCase() === bondAddress?.toLowerCase())!\n }, [bonds, bondAddress])\n\n // Tier Gating\n const userTier = getUserTier(pointsToBeUsed ?? '0')\n const minTier = bondData?.minTier !== undefined ? bondData.minTier : null\n const isUserRestricted = minTier !== null && (userTier === null || userTier < minTier)\n const trueBondPriceData = findHighestTrueBondPrice(pointsToBeUsed, bondData?.trueBondPrices)\n const trueBondPrice = trueBondPriceData?.trueBondPrice\n const { data: tierProofSig } = useTierProofSignature(bondAddress, bondChain, isUserRestricted)\n\n // State\n const [buyTxHash, setBuyTxHash] = useState<string | undefined>()\n const [inputValue, setInputValue] = useState('')\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData.chainId])\n\n // On-chain Data\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n const isZapSupported = zapSupported.includes(bondData?.chainId as ZapSupportedChainId)\n\n const [fetchingZapQuote, zapData, zapDepositAmount, zapError, zapTrueBondPrice] = useSoulZapBondQuote(\n inputValue,\n inputToken,\n bondData,\n account,\n tierProofSig ?? undefined,\n )\n\n const { sortedZapList, isFetched: zapListFetched } = 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 const inputTokenPrice = enrichedTokenData?.price\n const rateChanged = parseFloat(zapTrueBondPrice ?? '0') > parseFloat(trueBondPrice ?? '0') * 1.01 && isZapSupported\n const promotionTrackingSuffix = getPromotionTrackingSuffix(promotion)\n const getTrackingCategory = useCallback(\n (baseCategory: string) => (promotionTrackingSuffix ? `${baseCategory}-${promotionTrackingSuffix}` : baseCategory),\n [promotionTrackingSuffix],\n )\n\n // Estimations\n const depositAmount = isZapSupported ? zapDepositAmount : inputValue\n const youSpendString = `${formatNumberSI(inputValue)} ${getSymbol(inputToken, bondData?.chainId)} = \n $${formatUSDNumber((parseFloat(inputValue) * (inputTokenPrice ?? 0)).toString())}`\n\n // Validations\n const exceedsRealMaxBuy = getMaxBuy(bondData, true) <= getPayoutAmount(bondData, depositAmount, pointsToBeUsed)\n const exceedsSafeMaxBuy =\n getMaxBuy(bondData, false) * (isZapSupported ? 0.995 : 0.9995) <=\n getPayoutAmount(bondData, depositAmount, pointsToBeUsed)\n const exceedsBalance = Number(inputCurrencyBalance ?? '0') < Number(inputValue)\n const isPrincipalTokenLP = bondData?.lpToken?.symbol?.includes('-')\n\n // Loading State\n const [loadingTx, setLoadingTx] = useState(false)\n const { addToastError } = usePopups()\n const { isLoading: isConfirming, isSuccess: isConfirmed, data: buyTxReceipt } = useMonitorTx(buyTxHash, userChainId)\n\n // Once the buy tx is confirmed, report the new bill id (the last topic of the bill NFT's log), like the other chain\n // families do, so the bond list can open it in YourBondsModal.\n useEffect(() => {\n if (!buyTxReceipt || !setBillId) return\n try {\n const billNftAddress = bondData?.billNnftAddress?.[bondData?.chainId]?.toLowerCase()\n const billNftLog = buyTxReceipt.logs.find((log) => log.address.toLowerCase() === billNftAddress)\n const billIdTopic = billNftLog?.topics[billNftLog.topics.length - 1]\n if (billIdTopic) setBillId(parseInt(billIdTopic, 16).toString())\n } catch (e) {\n console.log(e)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buyTxReceipt])\n const load = loadingTx || (isConfirming && !isConfirmed)\n\n // State Handlers\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n const handleMaxButton = useCallback(() => {\n const balance = Number(inputCurrencyBalance ?? '0')\n const maxBuyAmount = getMaxBuy(bondData, SDKConfig.showLowValueBonds)\n\n if (!isZapSupported) {\n const maxPossibleUserPurchase = getPayoutAmount(bondData, balance.toString(), pointsToBeUsed)\n const principalDecimals = bondData?.lpToken?.decimals?.[bondData?.chainId] ?? 18\n if (maxPossibleUserPurchase > maxBuyAmount) {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), pointsToBeUsed)\n setInputValue(toFixedString(principalForMaxBuy, principalDecimals))\n } else {\n setInputValue(toFixedString(balance, principalDecimals))\n }\n } else {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), pointsToBeUsed)\n const principalForMaxBuyUSD = principalForMaxBuy * Number(bondData?.principalTokenPrice ?? 0)\n const maxBuyAmountInSelectedToken = principalForMaxBuyUSD / (inputTokenPrice ?? 0)\n const decimals =\n enrichedTokenData?.token === 'NATIVE' ? 18 : (enrichedTokenData?.token.decimals[bondData?.chainId] ?? 18)\n\n if (balance >= maxBuyAmountInSelectedToken) {\n setInputValue(toFixedString(maxBuyAmountInSelectedToken, decimals))\n } else {\n setInputValue(toFixedString(balance, decimals))\n }\n }\n }, [\n bondData,\n isZapSupported,\n pointsToBeUsed,\n SDKConfig.showLowValueBonds,\n inputTokenPrice,\n enrichedTokenData?.token,\n inputCurrencyBalance,\n ])\n\n // Approve & Purchase Functions\n const [approvalState, approveCallback] = useApproval(\n inputValue,\n inputToken ?? null,\n (isZapSupported\n ? SoulZapTokenManager?.[bondData?.chainId as ZapSupportedChainId]\n : bondData?.contractAddress?.[bondData.chainId]) ?? null,\n account ?? null,\n bondData?.chainId ?? null,\n )\n const handleApprove = async () => {\n return approveCallback().then(() => {\n track({\n event: 'approveBondClick',\n chain: userChainId,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n },\n })\n })\n }\n\n const handleBuyCallback = async () => {\n const billAddress: `0x${string}` = bondData?.contractAddress?.[bondData.chainId] as `0x${string}`\n const decimals = bondData?.lpToken.decimals?.[bondData?.chainId] ?? 18\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n try {\n const maxPrice = mulDivRound(BigInt(trueBondPrice ?? '0'), 102n, 100n, 'halfUp').toString() // multiply it by 1.02\n const amount = convertToBigish(inputValue, decimals)\n\n const shouldUseSig = bondData?.billVersion === BillVersion.V4 && SDKConfig.useTiers\n const args = shouldUseSig ? [amount, maxPrice, account, tierProofSig] : [amount, maxPrice, account]\n\n // const simulationResult = await simulateContract(config, {\n // address: billAddress,\n // abi: ABI_DEPOSIT_SIG,\n // functionName: 'deposit',\n // args: args,\n // chainId: bondData?.chainId as any,\n // account,\n // })\n // .then((e) => console.log('success!', e))\n // .catch((e) => {\n // console.error(e)\n // })\n\n const hash = await writeContractAsync({\n address: billAddress,\n abi: shouldUseSig ? ABI_DEPOSIT_SIG : ABI_DEPOSIT,\n functionName: 'deposit',\n args: args,\n chain: bondData?.chainId as any,\n account,\n })\n if (hash) {\n setBuyTxHash(hash)\n await sendReferenceId(billAddress, userChainId, hash)\n\n // lostProfit\n const bonusString = getRawBonus(bondData, depositAmount, TIERS_WEIGHT[LaunchBondTiers.Mythical])\n const noTierAmount = getRawBonus(bondData, depositAmount, '0')\n const lostProfit = parseFloat(bonusString) - parseFloat(noTierAmount)\n\n handlePurchasedBond?.({\n buyTxHash: hash,\n lostProfit: SDKConfig.useTiers && !userTier && lostProfit > 0.01 ? lostProfit.toFixed(2) : undefined,\n })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: getTrackingCategory('lp-buy'),\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondData?.contractAddress?.[bondData.chainId]),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\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: 'buyBond', bondData, error },\n chainId: bondChain,\n account,\n })\n addToastError(error.shortMessage)\n }\n }\n\n const handleZapCallback = async () => {\n if (zapData && zapData?.txData?.to && zapData?.txData?.data) {\n console.log('Attempting zap tx')\n track({\n event: 'buyBondClick',\n chain: bondData?.chainId,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol ?? '',\n value: zapData.lpQuote.fromAmountUSD,\n },\n })\n try {\n console.log(zapData)\n const validated18DecimalAmount = toFixedString(inputValue ?? '0', 18, 'trunc')\n const parsedValue = parseEther(validated18DecimalAmount)\n\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 await sendReferenceId(bondData?.contractAddress?.[bondData.chainId] ?? '', userChainId, hash)\n\n // lostProfit\n const bonusString = getRawBonus(bondData, depositAmount, TIERS_WEIGHT[LaunchBondTiers.Mythical])\n const noTierAmount = getRawBonus(bondData, depositAmount, '0')\n const lostProfit = parseFloat(bonusString) - parseFloat(noTierAmount)\n\n handlePurchasedBond?.({\n buyTxHash: hash,\n lostProfit: SDKConfig.useTiers && !userTier && lostProfit > 0.01 ? lostProfit.toFixed(2) : undefined,\n })\n track({\n event: 'zap',\n chain: bondChain,\n data: {\n cat: 'bill',\n token1: getSymbol(inputToken),\n token2: `${bondData?.lpToken.symbol ?? ''}`,\n amount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: getTrackingCategory('zap-buy'),\n type: bondData?.billType ?? '',\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondData?.contractAddress?.[bondData.chainId]),\n amount: inputValue,\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n }\n } catch (e: any) {\n console.log(e)\n addToastError(e.shortMessage)\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: e,\n extraInfo: { type: 'zapBuyBond', bondData, zapData, e },\n chainId: bondChain,\n account,\n })\n }\n }\n }\n\n const handleBothPurchases = () => {\n setLoadingTx(true)\n if (isZapSupported) {\n handleZapCallback().finally(() => setLoadingTx(false))\n } else {\n handleBuyCallback().finally(() => setLoadingTx(false))\n }\n }\n\n const handleOpenModal = () => {\n const bonus = trueBondPriceData?.bonusWithFee ?? 0\n if (bonus <= 0) {\n openNoBonusModal()\n } else {\n openTxModal()\n }\n }\n\n const openExternal = () => {\n if (bondData?.lpToken?.getLpUrl?.[bondData?.chainId]) {\n window.open(bondData.lpToken.getLpUrl?.[bondData?.chainId], '_blank')\n } else {\n window.open(\n `https://ape.bond/swap?outputcurrency=${bondData?.lpToken.address[bondData?.chainId]}&outputChain=${bondData?.chainId}`,\n '_blank',\n )\n }\n }\n\n // Modals\n const [onOpenl1xIframe] = useModal(<L1xIframe />)\n\n // Optional bridge (LiFi adapter); without it the secondary button falls back to its non-bridge options.\n const bridge = getBridgeAdapter()\n const canBridge = !!bridge && !!bondChain && bridge.supportsChain(bondChain)\n const [onOpenBridgeModal] = useModal(\n canBridge ? (\n <bridge.BridgeModal\n bondChain={bondChain}\n principalToken={isPrincipalTokenLP ? 'ETH' : bondData?.lpToken?.address?.[bondData?.chainId]}\n />\n ) : null,\n )\n\n const [openNewRateModal] = useModal(\n <NewRateModal\n bond={bondData}\n zapTrueBondPrice={zapTrueBondPrice}\n depositAmount={depositAmount}\n youSpendString={youSpendString}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />,\n true,\n false,\n 'newRateModal',\n )\n\n const [openTxModal] = useModal(\n <TransactionModal\n txChain={bondChain}\n approvalState={approvalState}\n approveCallback={handleApprove}\n loadingTx={loadingTx}\n txCallback={handleBothPurchases}\n bondData={bondData!}\n inputToken={inputToken}\n inputValue={inputValue}\n depositAmount={depositAmount}\n buyTxHash={buyTxHash}\n rateChanged={rateChanged}\n />,\n false,\n true,\n 'transactionModal',\n )\n\n const [openNoBonusModal] = useModal(\n <NoBonusModal onAcknowledge={openTxModal} showcaseTokenName={bondData?.showcaseTokenName} />,\n true,\n true,\n 'NoBonusModal',\n )\n\n // Effects\n const [hasChecked, setHasChecked] = useState(false)\n useEffect(() => {\n if (zapListFetched && !hasChecked) {\n if (parseFloat(inputCurrencyBalance ?? '0') < 0.0001) {\n setInputTokenString(\n sortedZapList[0].token === 'NATIVE' ? 'NATIVE' : sortedZapList[0].token.address[bondChain as ChainId],\n )\n }\n setHasChecked(true)\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [inputCurrencyBalance, zapListFetched])\n\n // If rateChanged meaning the zap quote has a >1% difference from the true bond price, we let the user know and we update state\n useEffect(() => {\n if (rateChanged) {\n console.log('rate changed, refetch state and let user know')\n openNewRateModal()\n refetchBondState()\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [rateChanged])\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 <BondModalHeader\n bondData={bondData}\n onDismiss={onDismiss}\n showProjectInfoButton={SDKConfig?.referenceId === 'apebond'}\n />\n <ProjectDescription description={bondData.shortDescription} isProjectView />\n <Flex className={clsx('ape:w-full', isProjectView ? 'ape:flex ape:md:hidden!' : 'ape:flex')}>\n <BondCards bondData={bondData} isDoingMaxBuy={exceedsSafeMaxBuy && !exceedsRealMaxBuy} />\n </Flex>\n <Estimations\n depositAmount={depositAmount}\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZapSupported}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={bondData?.chainId}\n enableZap={isZapSupported}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance}\n selectedTokenPrice={inputTokenPrice}\n inputDisabled={isUserRestricted}\n marketingCampaign={bondData?.marketingCampaign}\n isConnected={!!account}\n />\n {SDKConfig.useTiers &&\n userTier !== LaunchBondTiers.Mythical &&\n bondData?.billVersion === BillVersion.V4 &&\n account && (\n <PointsLeftForNextTier\n bond={bondData}\n inputAmount={inputValue}\n setInputValue={setInputValue}\n inputTokenPrice={inputTokenPrice}\n inputTokenDecimals={inputToken === 'NATIVE' ? 18 : (inputToken?.decimals?.[bondData?.chainId] ?? 18)}\n />\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 <Flex className=\"ape:w-full ape:gap-[10px] ape:flex-col ape:md:flex-row\">\n <Button\n variant=\"secondary\"\n onClick={() =>\n canBridge ? onOpenBridgeModal() : bondChain === ChainId.L1X ? onOpenl1xIframe() : openExternal()\n }\n className=\"ape:w-full ape:md:w-[35%] ape:text-[14px]! ape:lg:text-[16px]!\"\n >\n {canBridge\n ? isProjectView\n ? 'Bridge funds'\n : `Bridge to ${SHORT_NETWORK_LABEL[bondData?.chainId as ChainId]}`\n : `Get ${getSymbol(bondData?.lpToken, bondData?.chainId)}`}\n </Button>\n {isUserRestricted ? (\n <Button className=\"action-button ape:w-full\" disabled>\n INSUFFICIENT TIER\n </Button>\n ) : (\n <Button\n className=\"action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!\"\n load={load || fetchingZapQuote}\n disabled={\n load ||\n bondData?.soldOut ||\n !account ||\n !inputValue ||\n parseFloat(inputValue) === 0 ||\n fetchingZapQuote ||\n zapError ||\n exceedsRealMaxBuy ||\n exceedsBalance ||\n (isZapSupported && !zapData) ||\n SDKConfig.blockSales\n }\n onClick={handleOpenModal}\n >\n {SDKConfig.blockSales\n ? 'Complete KYC to Buy'\n : exceedsRealMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : exceedsBalance\n ? 'Exceeds balance'\n : zapError\n ? 'something went wrong'\n : !inputValue || parseFloat(inputValue) === 0\n ? 'Insert amount'\n : `buy`}\n </Button>\n )}\n </Flex>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\nexport default React.memo(BuyComponent)\n"],"names":["_jsx","L1xIframe","_jsxs","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BuyComponent.js","sources":["../../../src/adapters/evm/BuyComponent.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport clsx from 'clsx'\nimport { convertToBigish } from '../../utils/convertToBigish'\nimport { mulDivRound, toFixedString } from '../../utils/fixedPoint'\nimport ABI_DEPOSIT from '../../config/abi/deposit.json'\nimport ABI_DEPOSIT_SIG from '../../config/abi/depositSig.json'\nimport type { ChainBuyComponentProps } from '../types'\nimport {\n useChainId,\n useSendTransaction,\n useWriteContract,\n // useConfig\n} from 'wagmi'\nimport useModal from '../../hooks/useModal'\n// import ZapModal from '../ZapModal'\nimport { BillVersion, ChainId, LaunchBondTiers, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport TokenSelectorPanel from '../../components/TokenSelectorPanel'\nimport { useApproval } from './useAllowance'\nimport { SoulZapTokenManager } from '../../config/constants/addresses'\nimport useSoulZapBondQuote from './useSoulZapBondQuote'\nimport { parseEther } from 'viem'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport useTokenFromZapList from '../../hooks/useTokenFromZapList'\nimport { useMonitorTx } from './useMonitorTx'\nimport { usePopups } from '../../state/popups/usePopups'\nimport {\n formatUSDNumber,\n getMaxBuy,\n getPayoutAmount,\n getPrincipalAmount,\n getRawBonus,\n} from '../../utils/displayHelpers'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport { zapSupported, ZapSupportedChainId } from '../../config/constants/variables'\nimport { getSymbol } from '../../utils/getNativeTicker'\nimport { useSendReferenceId } from '../../hooks/useSendReferenceId'\nimport ConnectButton from '../../components/ConnectButton'\nimport BondModalHeader from '../../views/BuyBond/components/BondModalHeader'\nimport BondCards from '../../views/BuyBond/components/BondCards/BondCards'\nimport Estimations from '../../views/BuyBond/components/Estimations'\nimport ProjectDescription from '../../views/BuyBond/components/ProjectDescription'\nimport track from '../../utils/track'\nimport { remove0xPrefix } from '../../utils/remove0xPrefix'\nimport useTierPoints from '../../state/tiers/useTierPoints'\nimport { getUserTier, Promotions, TIERS_WEIGHT } from '../../state/tiers/tiers'\nimport NewRateModal from '../../views/BuyBond/components/NewRateModal/NewRateModal'\nimport NoBonusModal from '../../views/BuyBond/components/NoBonusModal/NoBonusModal'\nimport useTierProofSignature from './useTierProofSignature'\nimport PointsLeftForNextTier from '../../views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier'\nimport SafeHTMLComponent from '../../components/SafeHTMLComponent'\nimport useSortedZapList from '../../hooks/useSortedZapList'\nimport TransactionModal from './TransactionModal'\nimport { reportError } from '../../utils/reportError'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { MCBuyComponentStyles } from '../../utils/campaignStyles'\nimport useEVMAccount from './useEVMAccount'\nimport { getBridgeAdapter } from '../registry'\n// import useTierOptimizationPreview from '../../state/zap/useTierOptimizationPreview'\nimport { SHORT_NETWORK_LABEL } from '../../config/constants/chains'\nimport Flex from '../../components/uikit-sdk/Flex'\nimport Text from '../../components/uikit-sdk/Text'\nimport Button from '../../components/uikit-sdk/Button/Button'\nimport { formatNumberSI } from '../../utils/formatNumber'\nimport L1xIframe from '../../views/BuyBond/components/L1xIframe/L1xIframe'\n// import { simulateContract } from 'wagmi/actions'\n\nexport type BuyComponentProps = ChainBuyComponentProps\n\nconst PROMOTION_TRACKING_SUFFIXES: Partial<Record<Promotions, string>> = {\n [Promotions.WelcomeBonus]: 'welcome-bonus',\n [Promotions.BonusWeek]: 'bonus-week',\n}\n\nconst getPromotionTrackingSuffix = (promotion?: Promotions | null): string => {\n if (!promotion) return ''\n return PROMOTION_TRACKING_SUFFIXES[promotion] ?? ''\n}\n\nconst BuyComponent: React.FC<BuyComponentProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n handlePurchasedBond,\n setBillId,\n isProjectView,\n}) => {\n // Hooks\n // const config = useConfig()\n const SDKConfig = useSDKConfig()\n const userChainId = useChainId()\n const { address: account } = useEVMAccount()\n const { writeContractAsync } = useWriteContract()\n const { sendTransactionAsync } = useSendTransaction()\n const { data: bonds, refetch: refetchBondState } = useBondsData()\n const sendReferenceId = useSendReferenceId()\n const { data: tierPointsState } = useTierPoints()\n const { promotionalPoints, promotion, eligibleChains, onChainPoints } = tierPointsState || {}\n // if promotion comes with eligibleChains undefined means it should be used for every chain\n const isBondEligibleForPromotion = eligibleChains === undefined || eligibleChains?.includes(bondChain as ChainId)\n const pointsToBeUsed = isBondEligibleForPromotion ? promotionalPoints : onChainPoints\n // Bond To be used\n const bondData = useMemo(() => {\n return bonds?.find((bond) => bond?.contractAddress?.[bond.chainId]?.toLowerCase() === bondAddress?.toLowerCase())!\n }, [bonds, bondAddress])\n\n // Tier Gating\n const userTier = getUserTier(pointsToBeUsed ?? '0')\n const minTier = bondData?.minTier !== undefined ? bondData.minTier : null\n const isUserRestricted = minTier !== null && (userTier === null || userTier < minTier)\n const trueBondPriceData = findHighestTrueBondPrice(pointsToBeUsed, bondData?.trueBondPrices)\n const trueBondPrice = trueBondPriceData?.trueBondPrice\n const { data: tierProofSig } = useTierProofSignature(bondAddress, bondChain, isUserRestricted)\n\n // State\n const [buyTxHash, setBuyTxHash] = useState<string | undefined>()\n const [inputValue, setInputValue] = useState('')\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData.chainId])\n\n // On-chain Data\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n const isZapSupported = zapSupported.includes(bondData?.chainId as ZapSupportedChainId)\n\n const [fetchingZapQuote, zapData, zapDepositAmount, zapError, zapTrueBondPrice] = useSoulZapBondQuote(\n inputValue,\n inputToken,\n bondData,\n account,\n tierProofSig ?? undefined,\n )\n\n const { sortedZapList, isFetched: zapListFetched } = 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 const inputTokenPrice = enrichedTokenData?.price\n const rateChanged = parseFloat(zapTrueBondPrice ?? '0') > parseFloat(trueBondPrice ?? '0') * 1.01 && isZapSupported\n const promotionTrackingSuffix = getPromotionTrackingSuffix(promotion)\n const getTrackingCategory = useCallback(\n (baseCategory: string) => (promotionTrackingSuffix ? `${baseCategory}-${promotionTrackingSuffix}` : baseCategory),\n [promotionTrackingSuffix],\n )\n\n // Estimations\n const depositAmount = isZapSupported ? zapDepositAmount : inputValue\n const youSpendString = `${formatNumberSI(inputValue)} ${getSymbol(inputToken, bondData?.chainId)} = \n $${formatUSDNumber((parseFloat(inputValue) * (inputTokenPrice ?? 0)).toString())}`\n\n // Validations\n const exceedsRealMaxBuy = getMaxBuy(bondData, true) <= getPayoutAmount(bondData, depositAmount, pointsToBeUsed)\n const exceedsSafeMaxBuy =\n getMaxBuy(bondData, false) * (isZapSupported ? 0.995 : 0.9995) <=\n getPayoutAmount(bondData, depositAmount, pointsToBeUsed)\n const exceedsBalance = Number(inputCurrencyBalance ?? '0') < Number(inputValue)\n const isPrincipalTokenLP = bondData?.lpToken?.symbol?.includes('-')\n\n // Loading State\n const [loadingTx, setLoadingTx] = useState(false)\n const { addToastError } = usePopups()\n const { isLoading: isConfirming, isSuccess: isConfirmed, data: buyTxReceipt } = useMonitorTx(buyTxHash, userChainId)\n\n // Once the buy tx is confirmed, report the new bill id (the last topic of the bill NFT's log), like the other chain\n // families do, so the bond list can open it in YourBondsModal.\n useEffect(() => {\n if (!buyTxReceipt || !setBillId) return\n try {\n const billNftAddress = bondData?.billNnftAddress?.[bondData?.chainId]?.toLowerCase()\n const billNftLog = buyTxReceipt.logs.find((log) => log.address.toLowerCase() === billNftAddress)\n const billIdTopic = billNftLog?.topics[billNftLog.topics.length - 1]\n if (billIdTopic) setBillId(parseInt(billIdTopic, 16).toString())\n } catch (e) {\n console.log(e)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buyTxReceipt])\n const load = loadingTx || (isConfirming && !isConfirmed)\n\n // State Handlers\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n const handleMaxButton = useCallback(() => {\n const balance = Number(inputCurrencyBalance ?? '0')\n const maxBuyAmount = getMaxBuy(bondData, SDKConfig.showLowValueBonds)\n\n if (!isZapSupported) {\n const maxPossibleUserPurchase = getPayoutAmount(bondData, balance.toString(), pointsToBeUsed)\n const principalDecimals = bondData?.lpToken?.decimals?.[bondData?.chainId] ?? 18\n if (maxPossibleUserPurchase > maxBuyAmount) {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), pointsToBeUsed)\n setInputValue(toFixedString(principalForMaxBuy, principalDecimals))\n } else {\n setInputValue(toFixedString(balance, principalDecimals))\n }\n } else {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), pointsToBeUsed)\n const principalForMaxBuyUSD = principalForMaxBuy * Number(bondData?.principalTokenPrice ?? 0)\n const maxBuyAmountInSelectedToken = principalForMaxBuyUSD / (inputTokenPrice ?? 0)\n const decimals =\n enrichedTokenData?.token === 'NATIVE' ? 18 : (enrichedTokenData?.token.decimals[bondData?.chainId] ?? 18)\n\n if (balance >= maxBuyAmountInSelectedToken) {\n setInputValue(toFixedString(maxBuyAmountInSelectedToken, decimals))\n } else {\n setInputValue(toFixedString(balance, decimals))\n }\n }\n }, [\n bondData,\n isZapSupported,\n pointsToBeUsed,\n SDKConfig.showLowValueBonds,\n inputTokenPrice,\n enrichedTokenData?.token,\n inputCurrencyBalance,\n ])\n\n // Approve & Purchase Functions\n const [approvalState, approveCallback] = useApproval(\n inputValue,\n inputToken ?? null,\n (isZapSupported\n ? SoulZapTokenManager?.[bondData?.chainId as ZapSupportedChainId]\n : bondData?.contractAddress?.[bondData.chainId]) ?? null,\n account ?? null,\n bondData?.chainId ?? null,\n )\n const handleApprove = async () => {\n return approveCallback().then(() => {\n track({\n event: 'approveBondClick',\n chain: userChainId,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n },\n })\n })\n }\n\n const handleBuyCallback = async () => {\n const billAddress: `0x${string}` = bondData?.contractAddress?.[bondData.chainId] as `0x${string}`\n const decimals = bondData?.lpToken.decimals?.[bondData?.chainId] ?? 18\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n try {\n const maxPrice = mulDivRound(BigInt(trueBondPrice ?? '0'), 102n, 100n, 'halfUp').toString() // multiply it by 1.02\n const amount = convertToBigish(inputValue, decimals)\n\n const shouldUseSig = bondData?.billVersion === BillVersion.V4 && SDKConfig.useTiers\n const args = shouldUseSig ? [amount, maxPrice, account, tierProofSig] : [amount, maxPrice, account]\n\n // const simulationResult = await simulateContract(config, {\n // address: billAddress,\n // abi: ABI_DEPOSIT_SIG,\n // functionName: 'deposit',\n // args: args,\n // chainId: bondData?.chainId as any,\n // account,\n // })\n // .then((e) => console.log('success!', e))\n // .catch((e) => {\n // console.error(e)\n // })\n\n const hash = await writeContractAsync({\n address: billAddress,\n abi: shouldUseSig ? ABI_DEPOSIT_SIG : ABI_DEPOSIT,\n functionName: 'deposit',\n args: args,\n chain: bondData?.chainId as any,\n account,\n })\n if (hash) {\n setBuyTxHash(hash)\n await sendReferenceId(billAddress, userChainId, hash)\n\n // lostProfit\n const bonusString = getRawBonus(bondData, depositAmount, TIERS_WEIGHT[LaunchBondTiers.Mythical])\n const noTierAmount = getRawBonus(bondData, depositAmount, '0')\n const lostProfit = parseFloat(bonusString) - parseFloat(noTierAmount)\n\n handlePurchasedBond?.({\n buyTxHash: hash,\n lostProfit: SDKConfig.useTiers && !userTier && lostProfit > 0.01 ? lostProfit.toFixed(2) : undefined,\n })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: getTrackingCategory('lp-buy'),\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondData?.contractAddress?.[bondData.chainId]),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\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: 'buyBond', bondData, error },\n chainId: bondChain,\n account,\n })\n addToastError(error.shortMessage)\n }\n }\n\n const handleZapCallback = async () => {\n if (zapData && zapData?.txData?.to && zapData?.txData?.data) {\n console.log('Attempting zap tx')\n track({\n event: 'buyBondClick',\n chain: bondData?.chainId,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol ?? '',\n value: zapData.lpQuote.fromAmountUSD,\n },\n })\n try {\n console.log(zapData)\n const validated18DecimalAmount = toFixedString(inputValue ?? '0', 18, 'trunc')\n const parsedValue = parseEther(validated18DecimalAmount)\n\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 await sendReferenceId(bondData?.contractAddress?.[bondData.chainId] ?? '', userChainId, hash)\n\n // lostProfit\n const bonusString = getRawBonus(bondData, depositAmount, TIERS_WEIGHT[LaunchBondTiers.Mythical])\n const noTierAmount = getRawBonus(bondData, depositAmount, '0')\n const lostProfit = parseFloat(bonusString) - parseFloat(noTierAmount)\n\n handlePurchasedBond?.({\n buyTxHash: hash,\n lostProfit: SDKConfig.useTiers && !userTier && lostProfit > 0.01 ? lostProfit.toFixed(2) : undefined,\n })\n track({\n event: 'zap',\n chain: bondChain,\n data: {\n cat: 'bill',\n token1: getSymbol(inputToken),\n token2: `${bondData?.lpToken.symbol ?? ''}`,\n amount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: getTrackingCategory('zap-buy'),\n type: bondData?.billType ?? '',\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondData?.contractAddress?.[bondData.chainId]),\n amount: inputValue,\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n }\n } catch (e: any) {\n console.log(e)\n addToastError(e.shortMessage)\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: e,\n extraInfo: { type: 'zapBuyBond', bondData, zapData, e },\n chainId: bondChain,\n account,\n })\n }\n }\n }\n\n const handleBothPurchases = () => {\n setLoadingTx(true)\n if (isZapSupported) {\n handleZapCallback().finally(() => setLoadingTx(false))\n } else {\n handleBuyCallback().finally(() => setLoadingTx(false))\n }\n }\n\n const handleOpenModal = () => {\n const bonus = trueBondPriceData?.bonusWithFee ?? 0\n if (bonus <= 0) {\n openNoBonusModal()\n } else {\n openTxModal()\n }\n }\n\n const openExternal = () => {\n if (bondData?.lpToken?.getLpUrl?.[bondData?.chainId]) {\n window.open(bondData.lpToken.getLpUrl?.[bondData?.chainId], '_blank')\n } else {\n window.open(\n `https://ape.bond/swap?outputcurrency=${bondData?.lpToken.address[bondData?.chainId]}&outputChain=${bondData?.chainId}`,\n '_blank',\n )\n }\n }\n\n // Modals\n const [onOpenl1xIframe] = useModal(<L1xIframe />)\n\n // Optional bridge (LiFi adapter); without it the secondary button falls back to its non-bridge options.\n const bridge = getBridgeAdapter()\n const canBridge = !!bridge && !!bondChain && bridge.supportsChain(bondChain)\n const [onOpenBridgeModal] = useModal(\n canBridge ? (\n <bridge.BridgeModal\n bondChain={bondChain}\n principalToken={isPrincipalTokenLP ? 'ETH' : bondData?.lpToken?.address?.[bondData?.chainId]}\n />\n ) : null,\n )\n\n const [openNewRateModal] = useModal(\n <NewRateModal\n bond={bondData}\n zapTrueBondPrice={zapTrueBondPrice}\n depositAmount={depositAmount}\n youSpendString={youSpendString}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />,\n true,\n false,\n 'newRateModal',\n )\n\n const [openTxModal] = useModal(\n <TransactionModal\n txChain={bondChain}\n approvalState={approvalState}\n approveCallback={handleApprove}\n loadingTx={loadingTx}\n txCallback={handleBothPurchases}\n bondData={bondData!}\n inputToken={inputToken}\n inputValue={inputValue}\n depositAmount={depositAmount}\n buyTxHash={buyTxHash}\n rateChanged={rateChanged}\n />,\n false,\n true,\n 'transactionModal',\n )\n\n const [openNoBonusModal] = useModal(\n <NoBonusModal onAcknowledge={openTxModal} showcaseTokenName={bondData?.showcaseTokenName} />,\n true,\n true,\n 'NoBonusModal',\n )\n\n // Effects\n const [hasChecked, setHasChecked] = useState(false)\n useEffect(() => {\n if (zapListFetched && !hasChecked) {\n if (parseFloat(inputCurrencyBalance ?? '0') < 0.0001) {\n setInputTokenString(\n sortedZapList[0].token === 'NATIVE' ? 'NATIVE' : sortedZapList[0].token.address[bondChain as ChainId],\n )\n }\n setHasChecked(true)\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [inputCurrencyBalance, zapListFetched])\n\n // If rateChanged meaning the zap quote has a >1% difference from the true bond price, we let the user know and we update state\n useEffect(() => {\n if (rateChanged) {\n console.log('rate changed, refetch state and let user know')\n openNewRateModal()\n refetchBondState()\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [rateChanged])\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 <BondModalHeader\n bondData={bondData}\n onDismiss={onDismiss}\n showProjectInfoButton={SDKConfig?.referenceId === 'apebond'}\n />\n <ProjectDescription description={bondData.shortDescription} isProjectView />\n <Flex className={clsx('ape:w-full', isProjectView ? 'ape:flex ape:md:hidden!' : 'ape:flex')}>\n <BondCards bondData={bondData} isDoingMaxBuy={exceedsSafeMaxBuy && !exceedsRealMaxBuy} />\n </Flex>\n <Estimations\n depositAmount={depositAmount}\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZapSupported}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={bondData?.chainId}\n enableZap={isZapSupported}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance}\n selectedTokenPrice={inputTokenPrice}\n inputDisabled={isUserRestricted}\n marketingCampaign={bondData?.marketingCampaign}\n isConnected={!!account}\n />\n {SDKConfig.useTiers &&\n userTier !== LaunchBondTiers.Mythical &&\n bondData?.billVersion === BillVersion.V4 &&\n account && (\n <PointsLeftForNextTier\n bond={bondData}\n inputAmount={inputValue}\n setInputValue={setInputValue}\n inputTokenPrice={inputTokenPrice}\n inputTokenDecimals={inputToken === 'NATIVE' ? 18 : (inputToken?.decimals?.[bondData?.chainId] ?? 18)}\n />\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 <Flex className=\"ape:w-full ape:gap-[10px] ape:flex-col ape:md:flex-row\">\n <Button\n variant=\"secondary\"\n onClick={() =>\n canBridge ? onOpenBridgeModal() : bondChain === ChainId.L1X ? onOpenl1xIframe() : openExternal()\n }\n onMouseEnter={canBridge ? bridge.preload : undefined}\n onFocus={canBridge ? bridge.preload : undefined}\n className=\"ape:w-full ape:md:w-[35%] ape:text-[14px]! ape:lg:text-[16px]!\"\n >\n {canBridge\n ? isProjectView\n ? 'Bridge funds'\n : `Bridge to ${SHORT_NETWORK_LABEL[bondData?.chainId as ChainId]}`\n : `Get ${getSymbol(bondData?.lpToken, bondData?.chainId)}`}\n </Button>\n {isUserRestricted ? (\n <Button className=\"action-button ape:w-full\" disabled>\n INSUFFICIENT TIER\n </Button>\n ) : (\n <Button\n className=\"action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!\"\n load={load || fetchingZapQuote}\n disabled={\n load ||\n bondData?.soldOut ||\n !account ||\n !inputValue ||\n parseFloat(inputValue) === 0 ||\n fetchingZapQuote ||\n zapError ||\n exceedsRealMaxBuy ||\n exceedsBalance ||\n (isZapSupported && !zapData) ||\n SDKConfig.blockSales\n }\n onClick={handleOpenModal}\n >\n {SDKConfig.blockSales\n ? 'Complete KYC to Buy'\n : exceedsRealMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : exceedsBalance\n ? 'Exceeds balance'\n : zapError\n ? 'something went wrong'\n : !inputValue || parseFloat(inputValue) === 0\n ? 'Insert amount'\n : `buy`}\n </Button>\n )}\n </Flex>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\nexport default React.memo(BuyComponent)\n"],"names":["_jsx","L1xIframe","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -1,71 +1,55 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
3
|
-
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
2
|
+
import React, { useState } from 'react';
|
|
4
3
|
import Modal from '../../components/uikit-sdk/Modal/index.js';
|
|
5
4
|
import ModalHeader from '../../components/uikit-sdk/Modal/ModalHeader.js';
|
|
5
|
+
import Spinner from '../../components/uikit-sdk/Spinner/index.js';
|
|
6
|
+
import Button from '../../components/uikit-sdk/Button/Button.js';
|
|
7
|
+
import Text from '../../components/uikit-sdk/Text/index.js';
|
|
6
8
|
|
|
7
|
-
// LiFi
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
// The LiFi widget is about 1 MB gzipped, so it's loaded on demand: the modal frame opens instantly and the widget
|
|
10
|
+
// streams in. The promise is shared, so `lifiAdapter.preload()` (hover/focus on the bridge buttons) and the modal
|
|
11
|
+
// reuse one download; a failed download is forgotten so the next attempt retries it.
|
|
12
|
+
let widgetModule = null;
|
|
13
|
+
const loadLifiWidget = () => {
|
|
14
|
+
if (!widgetModule) {
|
|
15
|
+
widgetModule = import('./LifiWidgetContent.js').catch((error) => {
|
|
16
|
+
widgetModule = null;
|
|
17
|
+
throw error;
|
|
18
|
+
});
|
|
16
19
|
}
|
|
17
|
-
return
|
|
20
|
+
return widgetModule;
|
|
18
21
|
};
|
|
22
|
+
// React.lazy caches a rejection forever, so retrying needs a new lazy component.
|
|
23
|
+
const createLazyWidget = () => React.lazy(loadLifiWidget);
|
|
24
|
+
let LazyLifiWidget = createLazyWidget();
|
|
25
|
+
// Roughly the compact widget's size, so the modal doesn't jump when it loads.
|
|
26
|
+
const WIDGET_BOX = 'ape:flex ape:flex-col ape:items-center ape:justify-center ape:w-[416px] ape:max-w-full ape:min-h-[480px]';
|
|
27
|
+
class WidgetErrorBoundary extends React.Component {
|
|
28
|
+
constructor() {
|
|
29
|
+
super(...arguments);
|
|
30
|
+
this.state = { failed: false };
|
|
31
|
+
}
|
|
32
|
+
static getDerivedStateFromError() {
|
|
33
|
+
return { failed: true };
|
|
34
|
+
}
|
|
35
|
+
componentDidCatch(error) {
|
|
36
|
+
console.error('[ApeBond SDK] The LiFi widget failed to load', error);
|
|
37
|
+
}
|
|
38
|
+
render() {
|
|
39
|
+
if (!this.state.failed)
|
|
40
|
+
return this.props.children;
|
|
41
|
+
return (jsxs("div", { className: `${WIDGET_BOX} ape:gap-4 ape:px-6`, children: [jsx(Text, { className: "ape:text-center", children: "Couldn't load Swap & Bridge. Check your connection and try again." }), jsx(Button, { onClick: this.props.onRetry, children: "Retry" })] }));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
19
44
|
const LifiModal = ({ bondChain, principalToken, onDismiss }) => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
fontFamily: 'Poppins',
|
|
26
|
-
},
|
|
27
|
-
colorSchemes: {
|
|
28
|
-
dark: {
|
|
29
|
-
palette: {
|
|
30
|
-
background: {
|
|
31
|
-
default: '#161420',
|
|
32
|
-
paper: '#1F1D29',
|
|
33
|
-
},
|
|
34
|
-
primary: {
|
|
35
|
-
main: '#6560C5',
|
|
36
|
-
},
|
|
37
|
-
secondary: {
|
|
38
|
-
main: '#6560C5',
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
container: {
|
|
44
|
-
boxShadow: '0px 8px 32px rgba(0, 0, 0, 0.08)',
|
|
45
|
-
borderRadius: '16px',
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
// fromToken: 'BNB',
|
|
49
|
-
// fromChain: ChainId.BSC,
|
|
50
|
-
toChain: toLifiChainId(bondChain),
|
|
51
|
-
toToken: principalToken,
|
|
52
|
-
sdkConfig: {
|
|
53
|
-
rpcUrls: {
|
|
54
|
-
[LIFI_SOLANA_CHAIN_ID]: [
|
|
55
|
-
'https://ancient-cold-sailboat.solana-mainnet.quiknode.pro/da13400ad8d0035313f3e71c6a37c107d0d0334b',
|
|
56
|
-
],
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
variant: 'compact',
|
|
60
|
-
integrator: 'apeswap',
|
|
61
|
-
feeConfig: {
|
|
62
|
-
calculateFee: async (params) => {
|
|
63
|
-
return getFees(params.fromToken.symbol, params.toToken.symbol);
|
|
64
|
-
},
|
|
65
|
-
},
|
|
45
|
+
// Remounts the boundary (and the new lazy component) on retry.
|
|
46
|
+
const [attempt, setAttempt] = useState(0);
|
|
47
|
+
const retry = () => {
|
|
48
|
+
LazyLifiWidget = createLazyWidget();
|
|
49
|
+
setAttempt((n) => n + 1);
|
|
66
50
|
};
|
|
67
|
-
return (jsxs(Modal, { className: "lifi-bridge-modal ape:justify-center ape:items-center ape:p-0! ape:h-fit!", children: [jsx(ModalHeader, { className: "ape:px-6 ape:pt-4", onDismiss: onDismiss, hideDivider: true, children: "Swap & Bridge with LIFI" }), jsx(
|
|
51
|
+
return (jsxs(Modal, { className: "lifi-bridge-modal ape:justify-center ape:items-center ape:p-0! ape:h-fit!", children: [jsx(ModalHeader, { className: "ape:px-6 ape:pt-4", onDismiss: onDismiss, hideDivider: true, children: "Swap & Bridge with LIFI" }), jsx(WidgetErrorBoundary, { onRetry: retry, children: jsx(React.Suspense, { fallback: jsx("div", { className: WIDGET_BOX, children: jsx(Spinner, { size: 40, title: "Loading Swap & Bridge" }) }), children: jsx(LazyLifiWidget, { bondChain: bondChain, principalToken: principalToken }) }) }, attempt)] }));
|
|
68
52
|
};
|
|
69
53
|
|
|
70
|
-
export { LifiModal as default };
|
|
54
|
+
export { LifiModal as default, loadLifiWidget };
|
|
71
55
|
//# sourceMappingURL=LifiModal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LifiModal.js","sources":["../../../src/adapters/lifi/LifiModal.tsx"],"sourcesContent":["import React from 'react'\nimport
|
|
1
|
+
{"version":3,"file":"LifiModal.js","sources":["../../../src/adapters/lifi/LifiModal.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport Modal from '../../components/uikit-sdk/Modal'\nimport ModalHeader from '../../components/uikit-sdk/Modal/ModalHeader'\nimport Spinner from '../../components/uikit-sdk/Spinner'\nimport Button from '../../components/uikit-sdk/Button/Button'\nimport Text from '../../components/uikit-sdk/Text'\nimport type { BridgeModalProps } from '../types'\n\n// The LiFi widget is about 1 MB gzipped, so it's loaded on demand: the modal frame opens instantly and the widget\n// streams in. The promise is shared, so `lifiAdapter.preload()` (hover/focus on the bridge buttons) and the modal\n// reuse one download; a failed download is forgotten so the next attempt retries it.\nlet widgetModule: Promise<typeof import('./LifiWidgetContent')> | null = null\n\nexport const loadLifiWidget = () => {\n if (!widgetModule) {\n widgetModule = import('./LifiWidgetContent').catch((error) => {\n widgetModule = null\n throw error\n })\n }\n return widgetModule\n}\n\n// React.lazy caches a rejection forever, so retrying needs a new lazy component.\nconst createLazyWidget = () => React.lazy(loadLifiWidget)\nlet LazyLifiWidget = createLazyWidget()\n\n// Roughly the compact widget's size, so the modal doesn't jump when it loads.\nconst WIDGET_BOX = 'ape:flex ape:flex-col ape:items-center ape:justify-center ape:w-[416px] ape:max-w-full ape:min-h-[480px]'\n\nclass WidgetErrorBoundary extends React.Component<\n { onRetry: () => void; children: React.ReactNode },\n { failed: boolean }\n> {\n state = { failed: false }\n\n static getDerivedStateFromError() {\n return { failed: true }\n }\n\n componentDidCatch(error: unknown) {\n console.error('[ApeBond SDK] The LiFi widget failed to load', error)\n }\n\n render() {\n if (!this.state.failed) return this.props.children\n return (\n <div className={`${WIDGET_BOX} ape:gap-4 ape:px-6`}>\n <Text className=\"ape:text-center\">Couldn't load Swap & Bridge. Check your connection and try again.</Text>\n <Button onClick={this.props.onRetry}>Retry</Button>\n </div>\n )\n }\n}\n\nconst LifiModal: React.FC<BridgeModalProps> = ({ bondChain, principalToken, onDismiss }) => {\n // Remounts the boundary (and the new lazy component) on retry.\n const [attempt, setAttempt] = useState(0)\n\n const retry = () => {\n LazyLifiWidget = createLazyWidget()\n setAttempt((n) => n + 1)\n }\n\n return (\n <Modal className=\"lifi-bridge-modal ape:justify-center ape:items-center ape:p-0! ape:h-fit!\">\n <ModalHeader className=\"ape:px-6 ape:pt-4\" onDismiss={onDismiss} hideDivider>\n Swap & Bridge with LIFI\n </ModalHeader>\n <WidgetErrorBoundary key={attempt} onRetry={retry}>\n <React.Suspense\n fallback={\n <div className={WIDGET_BOX}>\n <Spinner size={40} title=\"Loading Swap & Bridge\" />\n </div>\n }\n >\n <LazyLifiWidget bondChain={bondChain} principalToken={principalToken} />\n </React.Suspense>\n </WidgetErrorBoundary>\n </Modal>\n )\n}\n\nexport default LifiModal\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;AAQA;AACA;AACA;AACA,IAAI,YAAY,GAAyD,IAAI;AAEtE,MAAM,cAAc,GAAG,MAAK;IACjC,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,OAAO,wBAAqB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;YAC3D,YAAY,GAAG,IAAI;AACnB,YAAA,MAAM,KAAK;AACb,QAAA,CAAC,CAAC;IACJ;AACA,IAAA,OAAO,YAAY;AACrB;AAEA;AACA,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;AACzD,IAAI,cAAc,GAAG,gBAAgB,EAAE;AAEvC;AACA,MAAM,UAAU,GAAG,0GAA0G;AAE7H,MAAM,mBAAoB,SAAQ,KAAK,CAAC,SAGvC,CAAA;AAHD,IAAA,WAAA,GAAA;;AAIE,QAAA,IAAA,CAAA,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;IAmB3B;AAjBE,IAAA,OAAO,wBAAwB,GAAA;AAC7B,QAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;IACzB;AAEA,IAAA,iBAAiB,CAAC,KAAc,EAAA;AAC9B,QAAA,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC;IACtE;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ;AAClD,QAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAA,EAAG,UAAU,CAAA,mBAAA,CAAqB,EAAA,QAAA,EAAA,CAChDC,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,mEAAA,EAAA,CAA8E,EAC/GA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAA,QAAA,EAAA,OAAA,EAAA,CAAgB,CAAA,EAAA,CAC/C;IAEV;AACD;AAED,MAAM,SAAS,GAA+B,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,KAAI;;IAEzF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAK;QACjB,cAAc,GAAG,gBAAgB,EAAE;QACnC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1B,IAAA,CAAC;AAED,IAAA,QACED,IAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,2EAA2E,EAAA,QAAA,EAAA,CAC1FC,GAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,mBAAmB,EAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,CAE9D,EACdA,IAAC,mBAAmB,EAAA,EAAe,OAAO,EAAE,KAAK,EAAA,QAAA,EAC/CA,GAAA,CAAC,KAAK,CAAC,QAAQ,EAAA,EACb,QAAQ,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,EAAA,QAAA,EACxBA,IAAC,OAAO,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,uBAAuB,GAAG,EAAA,CAC/C,EAAA,QAAA,EAGRA,GAAA,CAAC,cAAc,EAAA,EAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAA,CAAI,GACzD,EAAA,EATO,OAAO,CAUX,CAAA,EAAA,CAChB;AAEZ;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
3
|
+
export interface LifiWidgetContentProps {
|
|
4
|
+
bondChain: ChainId;
|
|
5
|
+
principalToken?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const LifiWidgetContent: React.FC<LifiWidgetContentProps>;
|
|
8
|
+
export default LifiWidgetContent;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { LiFiWidget } from '@lifi/widget';
|
|
3
|
+
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
4
|
+
|
|
5
|
+
// LiFi identifies Solana with its own chain id instead of ApeBond's ChainId.SOL.
|
|
6
|
+
const LIFI_SOLANA_CHAIN_ID = 1151111081099710;
|
|
7
|
+
const toLifiChainId = (chainId) => (chainId === ChainId.SOL ? LIFI_SOLANA_CHAIN_ID : chainId);
|
|
8
|
+
const getFees = async (fromTokenSymbol, toTokenSymbol) => {
|
|
9
|
+
const stableCoins = ['FRAX', 'USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'USDD', 'FDUSD'];
|
|
10
|
+
const isFromStable = stableCoins.includes(fromTokenSymbol);
|
|
11
|
+
const isToStable = stableCoins.includes(toTokenSymbol);
|
|
12
|
+
if (toTokenSymbol.toLowerCase() === 'abond') {
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
return isFromStable && isToStable ? 0.001 : 0.003;
|
|
16
|
+
};
|
|
17
|
+
const LifiWidgetContent = ({ bondChain, principalToken }) => {
|
|
18
|
+
const config = {
|
|
19
|
+
appearance: 'dark',
|
|
20
|
+
loadFonts: false,
|
|
21
|
+
theme: {
|
|
22
|
+
typography: {
|
|
23
|
+
fontFamily: 'Poppins',
|
|
24
|
+
},
|
|
25
|
+
colorSchemes: {
|
|
26
|
+
dark: {
|
|
27
|
+
palette: {
|
|
28
|
+
background: {
|
|
29
|
+
default: '#161420',
|
|
30
|
+
paper: '#1F1D29',
|
|
31
|
+
},
|
|
32
|
+
primary: {
|
|
33
|
+
main: '#6560C5',
|
|
34
|
+
},
|
|
35
|
+
secondary: {
|
|
36
|
+
main: '#6560C5',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
container: {
|
|
42
|
+
boxShadow: '0px 8px 32px rgba(0, 0, 0, 0.08)',
|
|
43
|
+
borderRadius: '16px',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
// fromToken: 'BNB',
|
|
47
|
+
// fromChain: ChainId.BSC,
|
|
48
|
+
toChain: toLifiChainId(bondChain),
|
|
49
|
+
toToken: principalToken,
|
|
50
|
+
sdkConfig: {
|
|
51
|
+
rpcUrls: {
|
|
52
|
+
[LIFI_SOLANA_CHAIN_ID]: [
|
|
53
|
+
'https://ancient-cold-sailboat.solana-mainnet.quiknode.pro/da13400ad8d0035313f3e71c6a37c107d0d0334b',
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
variant: 'compact',
|
|
58
|
+
integrator: 'apeswap',
|
|
59
|
+
feeConfig: {
|
|
60
|
+
calculateFee: async (params) => {
|
|
61
|
+
return getFees(params.fromToken.symbol, params.toToken.symbol);
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
return jsx(LiFiWidget, { ...config });
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export { LifiWidgetContent as default };
|
|
69
|
+
//# sourceMappingURL=LifiWidgetContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LifiWidgetContent.js","sources":["../../../src/adapters/lifi/LifiWidgetContent.tsx"],"sourcesContent":["// The only module that imports @lifi/widget. LifiModal loads it with a dynamic import, so the widget (and the\n// packages it pulls in) is only downloaded when the \"Swap & Bridge\" modal opens. Keep it that way: a static import of\n// this file or of @lifi/widget from anywhere else puts the widget back in every consumer's entry chunk.\nimport React from 'react'\nimport { LiFiWidget } from '@lifi/widget'\nimport { ChainId } from '@ape.swap/apeswap-lists'\n\n// LiFi identifies Solana with its own chain id instead of ApeBond's ChainId.SOL.\nconst LIFI_SOLANA_CHAIN_ID = 1151111081099710\n\nconst toLifiChainId = (chainId: ChainId): number => (chainId === ChainId.SOL ? LIFI_SOLANA_CHAIN_ID : chainId)\n\nconst getFees = async (fromTokenSymbol: string, toTokenSymbol: string): Promise<number> => {\n const stableCoins = ['FRAX', 'USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'USDD', 'FDUSD']\n const isFromStable = stableCoins.includes(fromTokenSymbol)\n const isToStable = stableCoins.includes(toTokenSymbol)\n if (toTokenSymbol.toLowerCase() === 'abond') {\n return 0\n }\n return isFromStable && isToStable ? 0.001 : 0.003\n}\n\nexport interface LifiWidgetContentProps {\n bondChain: ChainId\n principalToken?: string\n}\n\nconst LifiWidgetContent: React.FC<LifiWidgetContentProps> = ({ bondChain, principalToken }) => {\n const config = {\n appearance: 'dark' as const,\n loadFonts: false,\n theme: {\n typography: {\n fontFamily: 'Poppins',\n },\n colorSchemes: {\n dark: {\n palette: {\n background: {\n default: '#161420',\n paper: '#1F1D29',\n },\n primary: {\n main: '#6560C5',\n },\n secondary: {\n main: '#6560C5',\n },\n },\n },\n },\n container: {\n boxShadow: '0px 8px 32px rgba(0, 0, 0, 0.08)',\n borderRadius: '16px',\n },\n },\n // fromToken: 'BNB',\n // fromChain: ChainId.BSC,\n toChain: toLifiChainId(bondChain),\n toToken: principalToken,\n sdkConfig: {\n rpcUrls: {\n [LIFI_SOLANA_CHAIN_ID]: [\n 'https://ancient-cold-sailboat.solana-mainnet.quiknode.pro/da13400ad8d0035313f3e71c6a37c107d0d0334b',\n ],\n },\n },\n variant: 'compact' as const,\n integrator: 'apeswap',\n feeConfig: {\n calculateFee: async (params: any) => {\n return getFees(params.fromToken.symbol, params.toToken.symbol)\n },\n },\n }\n\n return <LiFiWidget {...config} />\n}\n\nexport default LifiWidgetContent\n"],"names":["_jsx"],"mappings":";;;;AAOA;AACA,MAAM,oBAAoB,GAAG,gBAAgB;AAE7C,MAAM,aAAa,GAAG,CAAC,OAAgB,MAAc,OAAO,KAAK,OAAO,CAAC,GAAG,GAAG,oBAAoB,GAAG,OAAO,CAAC;AAE9G,MAAM,OAAO,GAAG,OAAO,eAAuB,EAAE,aAAqB,KAAqB;AACxF,IAAA,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;IACpF,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC1D,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC;AACtD,IAAA,IAAI,aAAa,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;AAC3C,QAAA,OAAO,CAAC;IACV;IACA,OAAO,YAAY,IAAI,UAAU,GAAG,KAAK,GAAG,KAAK;AACnD,CAAC;AAOD,MAAM,iBAAiB,GAAqC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,KAAI;AAC5F,IAAA,MAAM,MAAM,GAAG;AACb,QAAA,UAAU,EAAE,MAAe;AAC3B,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,KAAK,EAAE;AACL,YAAA,UAAU,EAAE;AACV,gBAAA,UAAU,EAAE,SAAS;AACtB,aAAA;AACD,YAAA,YAAY,EAAE;AACZ,gBAAA,IAAI,EAAE;AACJ,oBAAA,OAAO,EAAE;AACP,wBAAA,UAAU,EAAE;AACV,4BAAA,OAAO,EAAE,SAAS;AAClB,4BAAA,KAAK,EAAE,SAAS;AACjB,yBAAA;AACD,wBAAA,OAAO,EAAE;AACP,4BAAA,IAAI,EAAE,SAAS;AAChB,yBAAA;AACD,wBAAA,SAAS,EAAE;AACT,4BAAA,IAAI,EAAE,SAAS;AAChB,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,SAAS,EAAE;AACT,gBAAA,SAAS,EAAE,kCAAkC;AAC7C,gBAAA,YAAY,EAAE,MAAM;AACrB,aAAA;AACF,SAAA;;;AAGD,QAAA,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC;AACjC,QAAA,OAAO,EAAE,cAAc;AACvB,QAAA,SAAS,EAAE;AACT,YAAA,OAAO,EAAE;gBACP,CAAC,oBAAoB,GAAG;oBACtB,oGAAoG;AACrG,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,EAAE,SAAkB;AAC3B,QAAA,UAAU,EAAE,SAAS;AACrB,QAAA,SAAS,EAAE;AACT,YAAA,YAAY,EAAE,OAAO,MAAW,KAAI;AAClC,gBAAA,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAChE,CAAC;AACF,SAAA;KACF;AAED,IAAA,OAAOA,GAAA,CAAC,UAAU,EAAA,EAAA,GAAK,MAAM,GAAI;AACnC;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BridgeAdapter } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* Cross-chain "Swap & Bridge" through the LiFi widget (v3). Optional: without it, the buy flows fall back to their
|
|
4
|
-
* non-bridge options. Requires `@lifi/widget` and its peers (see
|
|
4
|
+
* non-bridge options. Requires `@lifi/widget` and its peers (see the README). The widget itself is lazy-loaded when the
|
|
5
|
+
* modal opens (see LifiModal).
|
|
5
6
|
*/
|
|
6
7
|
export declare const lifiAdapter: BridgeAdapter;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
2
|
-
import LifiModal from './LifiModal.js';
|
|
2
|
+
import LifiModal, { loadLifiWidget } from './LifiModal.js';
|
|
3
3
|
|
|
4
4
|
// Bond chains the LiFi widget can bridge funds to.
|
|
5
5
|
const LIFI_SUPPORTED_CHAINS = [
|
|
@@ -22,12 +22,17 @@ const LIFI_SUPPORTED_CHAINS = [
|
|
|
22
22
|
];
|
|
23
23
|
/**
|
|
24
24
|
* Cross-chain "Swap & Bridge" through the LiFi widget (v3). Optional: without it, the buy flows fall back to their
|
|
25
|
-
* non-bridge options. Requires `@lifi/widget` and its peers (see
|
|
25
|
+
* non-bridge options. Requires `@lifi/widget` and its peers (see the README). The widget itself is lazy-loaded when the
|
|
26
|
+
* modal opens (see LifiModal).
|
|
26
27
|
*/
|
|
27
28
|
const lifiAdapter = {
|
|
28
29
|
kind: 'lifi',
|
|
29
30
|
supportsChain: (chainId) => LIFI_SUPPORTED_CHAINS.includes(chainId),
|
|
30
31
|
BridgeModal: LifiModal,
|
|
32
|
+
// Load failures are handled (with a retry) when the modal renders the widget.
|
|
33
|
+
preload: () => {
|
|
34
|
+
loadLifiWidget().catch(() => undefined);
|
|
35
|
+
},
|
|
31
36
|
};
|
|
32
37
|
|
|
33
38
|
export { lifiAdapter };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/adapters/lifi/index.ts"],"sourcesContent":["import { ChainId } from '@ape.swap/apeswap-lists'\nimport type { BridgeAdapter } from '../types'\nimport LifiModal from './LifiModal'\n\n// Bond chains the LiFi widget can bridge funds to.\nconst LIFI_SUPPORTED_CHAINS: ChainId[] = [\n ChainId.MAINNET,\n ChainId.MATIC,\n ChainId.BSC,\n ChainId.BASE,\n ChainId.ARBITRUM,\n ChainId.HYPEREVM,\n ChainId.ROBINHOOD,\n ChainId.LINEA,\n ChainId.AVAX,\n ChainId.BLAST,\n ChainId.SONIC,\n ChainId.BERACHAIN,\n ChainId.UNICHAIN,\n ChainId.MONAD,\n ChainId.KATANA,\n ChainId.SOL,\n]\n\n/**\n * Cross-chain \"Swap & Bridge\" through the LiFi widget (v3). Optional: without it, the buy flows fall back to their\n * non-bridge options. Requires `@lifi/widget` and its peers (see
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/adapters/lifi/index.ts"],"sourcesContent":["import { ChainId } from '@ape.swap/apeswap-lists'\nimport type { BridgeAdapter } from '../types'\nimport LifiModal, { loadLifiWidget } from './LifiModal'\n\n// Bond chains the LiFi widget can bridge funds to.\nconst LIFI_SUPPORTED_CHAINS: ChainId[] = [\n ChainId.MAINNET,\n ChainId.MATIC,\n ChainId.BSC,\n ChainId.BASE,\n ChainId.ARBITRUM,\n ChainId.HYPEREVM,\n ChainId.ROBINHOOD,\n ChainId.LINEA,\n ChainId.AVAX,\n ChainId.BLAST,\n ChainId.SONIC,\n ChainId.BERACHAIN,\n ChainId.UNICHAIN,\n ChainId.MONAD,\n ChainId.KATANA,\n ChainId.SOL,\n]\n\n/**\n * Cross-chain \"Swap & Bridge\" through the LiFi widget (v3). Optional: without it, the buy flows fall back to their\n * non-bridge options. Requires `@lifi/widget` and its peers (see the README). The widget itself is lazy-loaded when the\n * modal opens (see LifiModal).\n */\nexport const lifiAdapter: BridgeAdapter = {\n kind: 'lifi',\n supportsChain: (chainId) => LIFI_SUPPORTED_CHAINS.includes(chainId),\n BridgeModal: LifiModal,\n // Load failures are handled (with a retry) when the modal renders the widget.\n preload: () => {\n loadLifiWidget().catch(() => undefined)\n },\n}\n"],"names":[],"mappings":";;;AAIA;AACA,MAAM,qBAAqB,GAAc;AACvC,IAAA,OAAO,CAAC,OAAO;AACf,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,SAAS;AACjB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,SAAS;AACjB,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,MAAM;AACd,IAAA,OAAO,CAAC,GAAG;CACZ;AAED;;;;AAIG;AACI,MAAM,WAAW,GAAkB;AACxC,IAAA,IAAI,EAAE,MAAM;IACZ,aAAa,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC;AACnE,IAAA,WAAW,EAAE,SAAS;;IAEtB,OAAO,EAAE,MAAK;QACZ,cAAc,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;IACzC,CAAC;;;;;"}
|
|
@@ -590,7 +590,7 @@ const BuyComponentSolana = ({ onDismiss, bondAddress, bondChain, isProjectView,
|
|
|
590
590
|
}
|
|
591
591
|
/* eslint-disable react-hooks/exhaustive-deps */
|
|
592
592
|
}, [inputCurrencyBalance, zapListFetched]);
|
|
593
|
-
return bondData ? (jsx(Flex, { 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", style: { ...MCBuyComponentStyles[bondData?.marketingCampaign] }, children: jsxs(Flex, { className: "modaltable-container ape:w-full ape:flex ape:flex-col ape:relative ape:gap-2.5", children: [jsx(BondModalHeader, { bondData: bondData, onDismiss: onDismiss, hidePromotionUi: true }), jsx(ProjectDescription, { description: bondData.shortDescription, isProjectView: true }), jsx(Flex, { className: clsx('ape:w-full', isProjectView ? 'ape:hidden ape:lg:flex' : 'ape:flex'), children: jsx(BondCards, { bondData: bondData, isDoingMaxBuy: exceedsSafeMaxBuy && !exceedsRealMaxBuy }) }), jsx(Estimations, { depositAmount: depositAmount, bondData: bondData, youSpendString: youSpendString, isZap: isZap, fetchingZapQuote: fetchingZapQuote, zapError: zapError, hidePromotionUi: true }), jsx(TokenSelectorPanel, { typedValue: inputValue, setTypedValue: setInputValue, selectedToken: inputToken, handleValueBtn: handleMaxButton, handleCurrencySelect: handleCurrencySelect, bondChainId: bondData?.chainId, enableZap: true, bondPrincipalToken: bondData?.lpToken, tokenBalance: inputCurrencyBalance ?? undefined, selectedTokenPrice: inputTokenPrice, isConnected: !!accountSolana }), bondData?.warningCard && (jsx(Flex, { className: "ape:w-full ape:justify-center ape:mt-[10px] ape:rounded-normal ape:p-[2px_10px]", style: { background: '#DE62F366' }, children: jsxs(Text, { as: "div", size: "12px", className: "ape:font-normal ape:flex ape:items-center ape:gap-[10px]", children: [jsx(SafeHTMLComponent, { html: bondData?.warningCard }), bondData?.chainId === ChainId.SONIC && bondData?.earnToken.symbol.toLowerCase() === 'moon' && (jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Text, { className: "ape:normal-case", children: "Open the 'cog' icon menu in the top right and set the Slippage Tolerance to 5% or more." }), width: "315px", placement: "topRight", transformTip: "translate(9%, -10%)", children: jsx(QuestionCircle, { width: 14, color: "textDisabledButton" }) }))] }) })), jsx(Flex, { className: "modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between", children: jsx(Flex, { className: "button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full", children: !accountSolana ? (jsx(ConnectSolanaWallet, {})) : (jsxs(Flex, { className: "ape:w-full ape:gap-[10px] ape:flex-col ape:lg:flex-row", children: [canBridge && (jsx(Button, { variant: "secondary", onClick: () => onOpenBridgeModal(), className: "ape:w-full ape:lg:w-[35%] ape:text-[14px]! ape:lg:text-[16px]!", children: "bridge to sol" })), jsx(Button, { className: clsx('action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!', canBridge && 'ape:lg:w-[65%]'), load: load, disabled: load ||
|
|
593
|
+
return bondData ? (jsx(Flex, { 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", style: { ...MCBuyComponentStyles[bondData?.marketingCampaign] }, children: jsxs(Flex, { className: "modaltable-container ape:w-full ape:flex ape:flex-col ape:relative ape:gap-2.5", children: [jsx(BondModalHeader, { bondData: bondData, onDismiss: onDismiss, hidePromotionUi: true }), jsx(ProjectDescription, { description: bondData.shortDescription, isProjectView: true }), jsx(Flex, { className: clsx('ape:w-full', isProjectView ? 'ape:hidden ape:lg:flex' : 'ape:flex'), children: jsx(BondCards, { bondData: bondData, isDoingMaxBuy: exceedsSafeMaxBuy && !exceedsRealMaxBuy }) }), jsx(Estimations, { depositAmount: depositAmount, bondData: bondData, youSpendString: youSpendString, isZap: isZap, fetchingZapQuote: fetchingZapQuote, zapError: zapError, hidePromotionUi: true }), jsx(TokenSelectorPanel, { typedValue: inputValue, setTypedValue: setInputValue, selectedToken: inputToken, handleValueBtn: handleMaxButton, handleCurrencySelect: handleCurrencySelect, bondChainId: bondData?.chainId, enableZap: true, bondPrincipalToken: bondData?.lpToken, tokenBalance: inputCurrencyBalance ?? undefined, selectedTokenPrice: inputTokenPrice, isConnected: !!accountSolana }), bondData?.warningCard && (jsx(Flex, { className: "ape:w-full ape:justify-center ape:mt-[10px] ape:rounded-normal ape:p-[2px_10px]", style: { background: '#DE62F366' }, children: jsxs(Text, { as: "div", size: "12px", className: "ape:font-normal ape:flex ape:items-center ape:gap-[10px]", children: [jsx(SafeHTMLComponent, { html: bondData?.warningCard }), bondData?.chainId === ChainId.SONIC && bondData?.earnToken.symbol.toLowerCase() === 'moon' && (jsx(TooltipBubble, { className: "tooltip-bubble", body: jsx(Text, { className: "ape:normal-case", children: "Open the 'cog' icon menu in the top right and set the Slippage Tolerance to 5% or more." }), width: "315px", placement: "topRight", transformTip: "translate(9%, -10%)", children: jsx(QuestionCircle, { width: 14, color: "textDisabledButton" }) }))] }) })), jsx(Flex, { className: "modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between", children: jsx(Flex, { className: "button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full", children: !accountSolana ? (jsx(ConnectSolanaWallet, {})) : (jsxs(Flex, { className: "ape:w-full ape:gap-[10px] ape:flex-col ape:lg:flex-row", children: [canBridge && (jsx(Button, { variant: "secondary", onClick: () => onOpenBridgeModal(), onMouseEnter: bridge.preload, onFocus: bridge.preload, className: "ape:w-full ape:lg:w-[35%] ape:text-[14px]! ape:lg:text-[16px]!", children: "bridge to sol" })), jsx(Button, { className: clsx('action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!', canBridge && 'ape:lg:w-[65%]'), load: load, disabled: load ||
|
|
594
594
|
bondData?.soldOut ||
|
|
595
595
|
!accountSolana ||
|
|
596
596
|
!inputValue ||
|