@ape.swap/bonds-sdk 6.1.17-test.1 → 6.2.0-test.0
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/components/ConnectAptosWalletButton/ConnectAptosWalletButton.js +32 -0
- package/dist/components/ConnectAptosWalletButton/ConnectAptosWalletButton.js.map +1 -0
- package/dist/components/ConnectButton/index.js +1 -1
- package/dist/components/ConnectButton/index.js.map +1 -1
- package/dist/components/ConnectSolanaWalletButton/ConnectSolanaWalletButton.js +3 -15
- package/dist/components/ConnectSolanaWalletButton/ConnectSolanaWalletButton.js.map +1 -1
- package/dist/components/ConnectoToVmBanners/ConnectToAptosBanner.js +2 -6
- package/dist/components/ConnectoToVmBanners/ConnectToAptosBanner.js.map +1 -1
- package/dist/components/ConnectoToVmBanners/ConnectToSolanaBanner.js +1 -3
- package/dist/components/ConnectoToVmBanners/ConnectToSolanaBanner.js.map +1 -1
- package/dist/components/ConnectoToVmBanners/ConnectToSuiBanner.js +2 -8
- package/dist/components/ConnectoToVmBanners/ConnectToSuiBanner.js.map +1 -1
- package/dist/components/uikit-sdk/Svg/Icons/NewOffer.js.map +1 -1
- package/dist/components/uikit-sdk/Svg/Icons/Robinhood.d.ts +4 -0
- package/dist/components/uikit-sdk/Svg/Icons/Robinhood.js +9 -0
- package/dist/components/uikit-sdk/Svg/Icons/Robinhood.js.map +1 -0
- package/dist/components/uikit-sdk/Svg/Icons/SellingFast.js.map +1 -1
- package/dist/components/uikit-sdk/Svg/Icons/WhaleActivity.js.map +1 -1
- package/dist/config/constants/addresses.js +3 -1
- package/dist/config/constants/addresses.js.map +1 -1
- package/dist/config/constants/aptosZapTokens.js +15 -1
- package/dist/config/constants/aptosZapTokens.js.map +1 -1
- package/dist/config/constants/chains.js +6 -0
- package/dist/config/constants/chains.js.map +1 -1
- package/dist/config/constants/networks.js +1 -0
- package/dist/config/constants/networks.js.map +1 -1
- package/dist/config/constants/suiZapTokens.js +36 -0
- package/dist/config/constants/suiZapTokens.js.map +1 -0
- package/dist/config/constants/variables.d.ts +1 -1
- package/dist/config/constants/variables.js +1 -0
- package/dist/config/constants/variables.js.map +1 -1
- package/dist/constants/aptosConstants.js +5 -1
- package/dist/constants/aptosConstants.js.map +1 -1
- package/dist/constants/suiConstants.js +3 -1
- package/dist/constants/suiConstants.js.map +1 -1
- package/dist/hooks/accounts/useSOLAccount.js +0 -1
- package/dist/hooks/accounts/useSOLAccount.js.map +1 -1
- package/dist/state/bonds/useBondsData.js +36 -51
- package/dist/state/bonds/useBondsData.js.map +1 -1
- package/dist/state/bonds/useBondsList.d.ts +3 -3
- package/dist/state/bonds/useBondsList.js +25 -6
- package/dist/state/bonds/useBondsList.js.map +1 -1
- package/dist/state/bonds/useUserBonds.d.ts +2 -2
- package/dist/state/bonds/useUserBonds.js +8 -28
- package/dist/state/bonds/useUserBonds.js.map +1 -1
- package/dist/state/historicalPrice/useHistoricalPrice.js +2 -3
- package/dist/state/historicalPrice/useHistoricalPrice.js.map +1 -1
- package/dist/state/useSDKConfig.d.ts +1 -1
- package/dist/state/useSDKConfig.js +5 -2
- package/dist/state/useSDKConfig.js.map +1 -1
- package/dist/state/zap/getChainParam.d.ts +2 -1
- package/dist/state/zap/getChainParam.js +4 -1
- package/dist/state/zap/getChainParam.js.map +1 -1
- package/dist/state/zap/useAptosZapQuote.js +83 -0
- package/dist/state/zap/useAptosZapQuote.js.map +1 -0
- package/dist/state/zap/useSuiZapQuote.js +96 -0
- package/dist/state/zap/useSuiZapQuote.js.map +1 -0
- package/dist/utils/aptosHelpers.js +25 -1
- package/dist/utils/aptosHelpers.js.map +1 -1
- package/dist/views/Bonds/Bonds.js +1 -1
- package/dist/views/Bonds/Bonds.js.map +1 -1
- package/dist/views/Bonds/components/BondRows/ModalHandler.d.ts +2 -1
- package/dist/views/Bonds/components/BondRows/ModalHandler.js +2 -4
- package/dist/views/Bonds/components/BondRows/ModalHandler.js.map +1 -1
- package/dist/views/BuyBond/BuyBondModal.js +3 -14
- package/dist/views/BuyBond/BuyBondModal.js.map +1 -1
- package/dist/views/BuyBond/BuyComponentAptos.js +349 -0
- package/dist/views/BuyBond/BuyComponentAptos.js.map +1 -0
- package/dist/views/BuyBond/BuyComponentSui.js +500 -0
- package/dist/views/BuyBond/BuyComponentSui.js.map +1 -0
- package/dist/views/BuyBond/index.d.ts +2 -2
- package/dist/views/BuyBond/index.js.map +1 -1
- package/dist/views/ProjectView/ProjectView.js +1 -1
- package/dist/views/ProjectView/ProjectView.js.map +1 -1
- package/dist/views/ProjectView/components/ProjectInfo/index.d.ts +2 -2
- package/dist/views/ProjectView/components/ProjectInfo/index.js +3 -7
- package/dist/views/ProjectView/components/ProjectInfo/index.js.map +1 -1
- package/dist/views/ProjectView/components/ProjectInfo/styles.js +1 -24
- package/dist/views/ProjectView/components/ProjectInfo/styles.js.map +1 -1
- package/dist/views/SingleBond/SingleBond.js +12 -5
- package/dist/views/SingleBond/SingleBond.js.map +1 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowSolana.js +2 -10
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowSolana.js.map +1 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionSolana.js +2 -9
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionSolana.js.map +1 -1
- package/package.json +7 -5
- package/dist/state/tokenList/useTokenList.d.ts +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bonds.js","sources":["../../../src/views/Bonds/Bonds.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { BondsData } from '../../types/bonds'\nimport { useTopTags } from '../../hooks/useTopTags'\nimport { isBondSoldOut, isBondSupported, sortBonds } from './utils'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport CheckURL from './components/CheckURL'\nimport PlaceholderMonkey from '../../components/PlaceholderMonkey'\nimport useFavoriteTokens from '../../state/favoriteTokens/useFavoriteTokens'\nimport useChainFilterOption from '../../state/chainFilterOption/useChainFilterOption'\nimport useBondsList from '../../state/bonds/useBondsList'\nimport { BaseBondConfig } from '@ape.swap/apeswap-lists'\nimport RecommendationCards from './components/RecommendationCards'\nimport BondsMenu from './components/BondsMenu/BondsMenu'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport BuyAgainRow from './components/BuyAgainRow'\nimport LoadingSkeleton from './components/LoadingSkeleton/LoadingSkeleton'\nimport useHotBonds from '../../state/hotBonds/useHotBonds'\nimport useBondsListPreTGE from '../../state/bonds/useBondsListPreTGE'\nimport { MAINNET_CHAINS } from '../../config/constants/chains'\nimport ActiveBondRows from './components/BondRows/ActiveBondRows'\nimport SoldOutRows from './components/BondRows/SoldOutRows'\nimport Flex from '../../components/uikit-sdk/Flex'\nimport StarFilled from '../../components/uikit-sdk/Svg/Icons/StarFilled'\n\ntype SortableKeys = 'bonus' | 'arr' | 'terms' | 'tokensRemaining'\ntype SortDirection = 'asc' | 'desc'\n\nexport interface SortOptions {\n key: SortableKeys\n direction: SortDirection\n}\n\nexport type GroupedByChain = Record<number, (BondsData | BaseBondConfig)[]>\nexport type GroupedBySymbol = Record<number, Record<string, (BondsData | BaseBondConfig)[]>>\n\nconst Bonds = () => {\n // Fetch data\n useHotBonds()\n const SDKConfig = useSDKConfig()\n const { favTokens } = useFavoriteTokens()\n const { data: bondData } = useBondsData()\n const { data: allBonds } = useBondsList()\n const { data: allPreBonds } = useBondsListPreTGE()\n const { data: chainFilterOption, setChainFilterOption } = useChainFilterOption()\n const topTags = useTopTags()\n\n // State\n const [sortConfig, setSortConfig] = useState<SortOptions | undefined>({ key: 'bonus', direction: 'desc' })\n const [searchQuery, setSearchQuery] = useState('')\n const [filterOption, setFilterOption] = useState('ALL')\n\n // Static data\n const filterOptions = ['ALL', 'FAVORITES', ...topTags, 'SOLD OUT']\n const validatedChains = SDKConfig?.chains?.filter((chain) => MAINNET_CHAINS.includes(chain))\n\n const billsToRender: GroupedByChain | GroupedBySymbol = useMemo(() => {\n let bondsToUse\n\n if (filterOption === 'SOLD OUT') {\n if (!allBonds || !allPreBonds) return {}\n bondsToUse = [...allPreBonds, ...allBonds]\n } else {\n bondsToUse = sortBonds(sortConfig, bondData)\n }\n\n const filteredBonds = bondsToUse?.filter((bill) => {\n // filter incompatible bonds\n if (!isBondSupported(SDKConfig.highestCompatibleVersion!, bill.version)) return false\n\n // filter onlyPartner Bonds\n if (bill.onlyPartner && SDKConfig.bondPartner !== bill.bondPartner) return false\n\n // filter searchQuery\n if (searchQuery) {\n const matchesSearch = [\n //@ts-ignore\n `${bill?.underlyingEarnToken?.symbol?.toUpperCase()}`,\n `${bill?.earnToken?.symbol.toUpperCase()}`,\n `${bill?.lpToken?.symbol.toUpperCase()}`,\n ].some((property) => property?.includes(searchQuery.toUpperCase()))\n if (!matchesSearch) return false\n }\n\n // filter tiers\n if (!SDKConfig?.useTiers && 'minTier' in bill) {\n if (bill.minTier !== null && bill.minTier !== undefined) return false\n }\n\n // filter bondPartner\n if (SDKConfig?.bondPartner && bill.bondPartner !== SDKConfig.bondPartner) return false\n\n // filter topTags\n if (topTags.includes(filterOption) && !bill?.tags?.includes(filterOption)) return false\n\n // filter chainFilterOption\n if (chainFilterOption && !chainFilterOption?.includes('All Chains')) {\n if (!chainFilterOption?.includes(bill?.chainId?.toString())) return false\n }\n\n // filter SOLD OUT\n if (filterOption === 'SOLD OUT' && !isBondSoldOut(bill as BondsData, SDKConfig.showLowValueBonds)) return false\n\n // filter not SOLD OUT\n if (filterOption !== 'SOLD OUT' && isBondSoldOut(bill as BondsData, SDKConfig.showLowValueBonds)) return false\n\n // filter FAVORITES\n if (filterOption === 'FAVORITES' && !favTokens.includes(bill?.earnToken?.symbol?.toLowerCase())) return false\n\n return true\n })\n\n if (filterOption === 'SOLD OUT') {\n return filteredBonds?.reduce<GroupedBySymbol>((acc, bond) => {\n const symbol = bond?.earnToken?.symbol\n const chainId = bond.chainId\n\n if (!acc[chainId]) acc[chainId] = {}\n\n if (!acc[chainId][symbol]) acc[chainId][symbol] = []\n\n acc[chainId][symbol].push(bond)\n return acc\n }, {})\n } else {\n return filteredBonds?.reduce<GroupedByChain>((acc, bond) => {\n const { chainId } = bond\n if (!acc[chainId]) acc[chainId] = []\n acc[chainId].push(bond)\n return acc\n }, {})\n }\n }, [\n allBonds,\n allPreBonds,\n sortConfig,\n bondData,\n filterOption,\n SDKConfig.highestCompatibleVersion,\n SDKConfig.bondPartner,\n SDKConfig?.useTiers,\n SDKConfig.showLowValueBonds,\n searchQuery,\n topTags,\n chainFilterOption,\n favTokens,\n ])\n\n // Handlers\n const handleSortOptions = useCallback(\n (key: SortableKeys) => {\n let direction: SortDirection = 'desc'\n if (sortConfig?.key === key && sortConfig?.direction === 'desc') {\n direction = 'asc'\n }\n setSortConfig({ key, direction })\n },\n [sortConfig?.key, sortConfig?.direction],\n )\n\n const handleChangeFilterOption = useCallback((newOption: string) => {\n setFilterOption(newOption)\n }, [])\n\n useEffect(() => {\n const hash = window.location.hash\n //@ts-ignore\n if (bondData?.length > 0 && hash) {\n const tryScroll = () => {\n const normalizedHash = decodeURIComponent(hash).replace(/\\s+/g, '')\n const element = document.querySelector(normalizedHash)\n if (element) {\n const y = element.getBoundingClientRect().top + window.scrollY - 70\n window.scrollTo({ top: y, behavior: 'smooth' })\n } else {\n setTimeout(tryScroll, 50)\n }\n }\n tryScroll()\n }\n }, [bondData?.length])\n\n return (\n <Flex className=\"bonds-container\">\n <CheckURL />\n <BondsMenu\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n setChainFilterOption={setChainFilterOption}\n chainFilterOption={chainFilterOption ?? ['All Chains']}\n filterOptions={filterOptions}\n filterOption={filterOption}\n setFilterOption={handleChangeFilterOption}\n onSort={handleSortOptions}\n />\n {SDKConfig.useHotBonds && !SDKConfig.bondPartner && filterOption !== 'SOLD OUT' && <BuyAgainRow />}\n {Object.keys(billsToRender)?.length > 0 ? (\n <Flex className=\"bondrowsbychain\">\n {validatedChains?.map((chain) =>\n filterOption === 'SOLD OUT' ? (\n Object.entries(billsToRender[chain] ?? {}).map((groupedBonds) => (\n <SoldOutRows bonds={groupedBonds[1]} key={groupedBonds[0]} />\n ))\n ) : (\n <ActiveBondRows\n chain={chain}\n bonds={(billsToRender[chain] ?? []) as (BondsData | BaseBondConfig)[]}\n key={chain}\n hideTitles={searchQuery !== ''}\n showHotBonds={!searchQuery && SDKConfig.useHotBonds && SDKConfig?.hotBondChains?.includes(chain)}\n />\n ),\n )}\n </Flex>\n ) : searchQuery || !chainFilterOption.includes('All Chains') ? (\n <Flex className=\"placeholder-monkey-wrapper\">\n <PlaceholderMonkey text={'No results, change filters.'} />\n </Flex>\n ) : filterOption === 'FAVORITES' ? (\n <Flex\n sx={{\n width: '100%',\n height: '300px',\n background: 'white2',\n borderRadius: 'normal',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n mt: '10px',\n }}\n >\n <StarFilled width={75} height={75} />\n <Flex sx={{ mt: '10px' }}>{`You don't have any Favorite Bonds yet!`}</Flex>\n <Flex sx={{ fontSize: '12px', fontWeight: 400, color: 'textDisabledButton', mt: '10px' }}>\n {`Click on the 'star' or 'fire' icon to add Bonds to the list.`}\n </Flex>\n </Flex>\n ) : (\n <LoadingSkeleton />\n )}\n {SDKConfig.useHotBonds && <RecommendationCards />}\n <Flex sx={{ width: '100%', justifyContent: 'center', my: '15px' }} className=\"powered-by-apebond\">\n <img\n src=\"https://res.cloudinary.com/dswmrqgwy/image/upload/v1741643990/poweredbyapebondsdk_cxiouj.png\"\n alt=\"powered-by-apebond\"\n style={{ width: '200px', height: 'auto' }}\n />\n </Flex>\n </Flex>\n )\n}\n\nexport default Bonds\n"],"names":["_jsxs","_jsx","CheckURL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Bonds.js","sources":["../../../src/views/Bonds/Bonds.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { BondsData } from '../../types/bonds'\nimport { useTopTags } from '../../hooks/useTopTags'\nimport { isBondSoldOut, isBondSupported, sortBonds } from './utils'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport CheckURL from './components/CheckURL'\nimport PlaceholderMonkey from '../../components/PlaceholderMonkey'\nimport useFavoriteTokens from '../../state/favoriteTokens/useFavoriteTokens'\nimport useChainFilterOption from '../../state/chainFilterOption/useChainFilterOption'\nimport useBondsList from '../../state/bonds/useBondsList'\nimport { BaseBondConfig } from '@ape.swap/apeswap-lists'\nimport RecommendationCards from './components/RecommendationCards'\nimport BondsMenu from './components/BondsMenu/BondsMenu'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport BuyAgainRow from './components/BuyAgainRow'\nimport LoadingSkeleton from './components/LoadingSkeleton/LoadingSkeleton'\nimport useHotBonds from '../../state/hotBonds/useHotBonds'\nimport useBondsListPreTGE from '../../state/bonds/useBondsListPreTGE'\nimport { MAINNET_CHAINS } from '../../config/constants/chains'\nimport ActiveBondRows from './components/BondRows/ActiveBondRows'\nimport SoldOutRows from './components/BondRows/SoldOutRows'\nimport Flex from '../../components/uikit-sdk/Flex'\nimport StarFilled from '../../components/uikit-sdk/Svg/Icons/StarFilled'\n\ntype SortableKeys = 'bonus' | 'arr' | 'terms' | 'tokensRemaining'\ntype SortDirection = 'asc' | 'desc'\n\nexport interface SortOptions {\n key: SortableKeys\n direction: SortDirection\n}\n\nexport type GroupedByChain = Record<number, (BondsData | BaseBondConfig)[]>\nexport type GroupedBySymbol = Record<number, Record<string, (BondsData | BaseBondConfig)[]>>\n\nconst Bonds = () => {\n // Fetch data\n useHotBonds()\n const SDKConfig = useSDKConfig()\n const { favTokens } = useFavoriteTokens()\n const { data: bondData } = useBondsData()\n const { data: allBonds } = useBondsList()\n const { data: allPreBonds } = useBondsListPreTGE()\n const { data: chainFilterOption, setChainFilterOption } = useChainFilterOption()\n const topTags = useTopTags()\n\n // State\n const [sortConfig, setSortConfig] = useState<SortOptions | undefined>({ key: 'bonus', direction: 'desc' })\n const [searchQuery, setSearchQuery] = useState('')\n const [filterOption, setFilterOption] = useState('ALL')\n\n // Static data\n const filterOptions = ['ALL', 'FAVORITES', ...topTags, 'SOLD OUT']\n const validatedChains = SDKConfig?.chains?.filter((chain) => MAINNET_CHAINS.includes(chain))\n\n const billsToRender: GroupedByChain | GroupedBySymbol = useMemo(() => {\n let bondsToUse\n\n if (filterOption === 'SOLD OUT') {\n if (!allBonds || !allPreBonds) return {}\n bondsToUse = [...allPreBonds, ...Object.values(allBonds).flat()]\n } else {\n bondsToUse = sortBonds(sortConfig, bondData)\n }\n\n const filteredBonds = bondsToUse?.filter((bill) => {\n // filter incompatible bonds\n if (!isBondSupported(SDKConfig.highestCompatibleVersion!, bill.version)) return false\n\n // filter onlyPartner Bonds\n if (bill.onlyPartner && SDKConfig.bondPartner !== bill.bondPartner) return false\n\n // filter searchQuery\n if (searchQuery) {\n const matchesSearch = [\n //@ts-ignore\n `${bill?.underlyingEarnToken?.symbol?.toUpperCase()}`,\n `${bill?.earnToken?.symbol.toUpperCase()}`,\n `${bill?.lpToken?.symbol.toUpperCase()}`,\n ].some((property) => property?.includes(searchQuery.toUpperCase()))\n if (!matchesSearch) return false\n }\n\n // filter tiers\n if (!SDKConfig?.useTiers && 'minTier' in bill) {\n if (bill.minTier !== null && bill.minTier !== undefined) return false\n }\n\n // filter bondPartner\n if (SDKConfig?.bondPartner && bill.bondPartner !== SDKConfig.bondPartner) return false\n\n // filter topTags\n if (topTags.includes(filterOption) && !bill?.tags?.includes(filterOption)) return false\n\n // filter chainFilterOption\n if (chainFilterOption && !chainFilterOption?.includes('All Chains')) {\n if (!chainFilterOption?.includes(bill?.chainId?.toString())) return false\n }\n\n // filter SOLD OUT\n if (filterOption === 'SOLD OUT' && !isBondSoldOut(bill as BondsData, SDKConfig.showLowValueBonds)) return false\n\n // filter not SOLD OUT\n if (filterOption !== 'SOLD OUT' && isBondSoldOut(bill as BondsData, SDKConfig.showLowValueBonds)) return false\n\n // filter FAVORITES\n if (filterOption === 'FAVORITES' && !favTokens.includes(bill?.earnToken?.symbol?.toLowerCase())) return false\n\n return true\n })\n\n if (filterOption === 'SOLD OUT') {\n return filteredBonds?.reduce<GroupedBySymbol>((acc, bond) => {\n const symbol = bond?.earnToken?.symbol\n const chainId = bond.chainId\n\n if (!acc[chainId]) acc[chainId] = {}\n\n if (!acc[chainId][symbol]) acc[chainId][symbol] = []\n\n acc[chainId][symbol].push(bond)\n return acc\n }, {})\n } else {\n return filteredBonds?.reduce<GroupedByChain>((acc, bond) => {\n const { chainId } = bond\n if (!acc[chainId]) acc[chainId] = []\n acc[chainId].push(bond)\n return acc\n }, {})\n }\n }, [\n allBonds,\n allPreBonds,\n sortConfig,\n bondData,\n filterOption,\n SDKConfig.highestCompatibleVersion,\n SDKConfig.bondPartner,\n SDKConfig?.useTiers,\n SDKConfig.showLowValueBonds,\n searchQuery,\n topTags,\n chainFilterOption,\n favTokens,\n ])\n\n // Handlers\n const handleSortOptions = useCallback(\n (key: SortableKeys) => {\n let direction: SortDirection = 'desc'\n if (sortConfig?.key === key && sortConfig?.direction === 'desc') {\n direction = 'asc'\n }\n setSortConfig({ key, direction })\n },\n [sortConfig?.key, sortConfig?.direction],\n )\n\n const handleChangeFilterOption = useCallback((newOption: string) => {\n setFilterOption(newOption)\n }, [])\n\n useEffect(() => {\n const hash = window.location.hash\n //@ts-ignore\n if (bondData?.length > 0 && hash) {\n const tryScroll = () => {\n const normalizedHash = decodeURIComponent(hash).replace(/\\s+/g, '')\n const element = document.querySelector(normalizedHash)\n if (element) {\n const y = element.getBoundingClientRect().top + window.scrollY - 70\n window.scrollTo({ top: y, behavior: 'smooth' })\n } else {\n setTimeout(tryScroll, 50)\n }\n }\n tryScroll()\n }\n }, [bondData?.length])\n\n return (\n <Flex className=\"bonds-container\">\n <CheckURL />\n <BondsMenu\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n setChainFilterOption={setChainFilterOption}\n chainFilterOption={chainFilterOption ?? ['All Chains']}\n filterOptions={filterOptions}\n filterOption={filterOption}\n setFilterOption={handleChangeFilterOption}\n onSort={handleSortOptions}\n />\n {SDKConfig.useHotBonds && !SDKConfig.bondPartner && filterOption !== 'SOLD OUT' && <BuyAgainRow />}\n {Object.keys(billsToRender)?.length > 0 ? (\n <Flex className=\"bondrowsbychain\">\n {validatedChains?.map((chain) =>\n filterOption === 'SOLD OUT' ? (\n Object.entries(billsToRender[chain] ?? {}).map((groupedBonds) => (\n <SoldOutRows bonds={groupedBonds[1]} key={groupedBonds[0]} />\n ))\n ) : (\n <ActiveBondRows\n chain={chain}\n bonds={(billsToRender[chain] ?? []) as (BondsData | BaseBondConfig)[]}\n key={chain}\n hideTitles={searchQuery !== ''}\n showHotBonds={!searchQuery && SDKConfig.useHotBonds && SDKConfig?.hotBondChains?.includes(chain)}\n />\n ),\n )}\n </Flex>\n ) : searchQuery || !chainFilterOption.includes('All Chains') ? (\n <Flex className=\"placeholder-monkey-wrapper\">\n <PlaceholderMonkey text={'No results, change filters.'} />\n </Flex>\n ) : filterOption === 'FAVORITES' ? (\n <Flex\n sx={{\n width: '100%',\n height: '300px',\n background: 'white2',\n borderRadius: 'normal',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n mt: '10px',\n }}\n >\n <StarFilled width={75} height={75} />\n <Flex sx={{ mt: '10px' }}>{`You don't have any Favorite Bonds yet!`}</Flex>\n <Flex sx={{ fontSize: '12px', fontWeight: 400, color: 'textDisabledButton', mt: '10px' }}>\n {`Click on the 'star' or 'fire' icon to add Bonds to the list.`}\n </Flex>\n </Flex>\n ) : (\n <LoadingSkeleton />\n )}\n {SDKConfig.useHotBonds && <RecommendationCards />}\n <Flex sx={{ width: '100%', justifyContent: 'center', my: '15px' }} className=\"powered-by-apebond\">\n <img\n src=\"https://res.cloudinary.com/dswmrqgwy/image/upload/v1741643990/poweredbyapebondsdk_cxiouj.png\"\n alt=\"powered-by-apebond\"\n style={{ width: '200px', height: 'auto' }}\n />\n </Flex>\n </Flex>\n )\n}\n\nexport default Bonds\n"],"names":["_jsxs","_jsx","CheckURL"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
2
3
|
declare const ModalHandler: ({ onDismiss, bondAddress, bondChain, }: {
|
|
3
4
|
onDismiss?: () => void;
|
|
4
5
|
bondAddress: string;
|
|
5
|
-
bondChain:
|
|
6
|
+
bondChain: ChainId;
|
|
6
7
|
}) => React.JSX.Element;
|
|
7
8
|
export default ModalHandler;
|
|
@@ -10,7 +10,6 @@ import useEVMAccount from '../../../../hooks/accounts/useEVMAccount.js';
|
|
|
10
10
|
import useSOLAccount from '../../../../hooks/accounts/useSOLAccount.js';
|
|
11
11
|
import useAPTAccount from '../../../../hooks/accounts/useAPTAccount.js';
|
|
12
12
|
import useSUIAccount from '../../../../hooks/accounts/useSUIAccount.js';
|
|
13
|
-
import useBondsList from '../../../../state/bonds/useBondsList.js';
|
|
14
13
|
import { useQueryClient } from '@tanstack/react-query';
|
|
15
14
|
import { QUERY_KEYS } from '../../../../config/constants/queryKeys.js';
|
|
16
15
|
|
|
@@ -36,7 +35,6 @@ const ModalHandler = ({ onDismiss, bondAddress, bondChain, }) => {
|
|
|
36
35
|
const solanaAccount = publicKey?.toBase58();
|
|
37
36
|
const { address: aptosAccount } = useAPTAccount();
|
|
38
37
|
const { address: suiAccount } = useSUIAccount();
|
|
39
|
-
const { data: bondList } = useBondsList();
|
|
40
38
|
const queryClient = useQueryClient();
|
|
41
39
|
// EVM - Look for billId on tx logs
|
|
42
40
|
if (txReceipt) {
|
|
@@ -62,7 +60,7 @@ const ModalHandler = ({ onDismiss, bondAddress, bondChain, }) => {
|
|
|
62
60
|
if (!hasRefetched.current) {
|
|
63
61
|
if (billId) {
|
|
64
62
|
console.log('Trigger user bonds refetch');
|
|
65
|
-
const bondToRefetch =
|
|
63
|
+
const bondToRefetch = bondsData?.find((bond) => bondAddress?.toLowerCase() === bond?.contractAddress?.[bond?.chainId]?.toLowerCase() &&
|
|
66
64
|
bondChain === bond?.chainId);
|
|
67
65
|
if (!bondToRefetch)
|
|
68
66
|
return;
|
|
@@ -76,7 +74,7 @@ const ModalHandler = ({ onDismiss, bondAddress, bondChain, }) => {
|
|
|
76
74
|
setUserBill(cachedBond);
|
|
77
75
|
return;
|
|
78
76
|
}
|
|
79
|
-
getUserBonds(address, solanaAccount, aptosAccount, suiAccount, [bondToRefetch], queryClient)
|
|
77
|
+
getUserBonds(address, solanaAccount, aptosAccount, suiAccount, { [bondChain]: [bondToRefetch] }, queryClient)
|
|
80
78
|
.then((bonds) => {
|
|
81
79
|
const purchasedBond = bonds.find((bond) => {
|
|
82
80
|
if (bond?.bond?.chainId === ChainId.SOL) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModalHandler.js","sources":["../../../../../src/views/Bonds/components/BondRows/ModalHandler.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef } from 'react'\nimport { getUserBonds } from '../../../../state/bonds/useUserBonds'\nimport YourBondsModal from '../../../YourBondsModal/YourBondsModal'\nimport BuyBondModal from '../../../BuyBond/BuyBondModal'\nimport { useMonitorTx } from '../../../../hooks/useMonitorTx'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport useEVMAccount from '../../../../hooks/accounts/useEVMAccount'\nimport useSOLAccount from '../../../../hooks/accounts/useSOLAccount'\nimport useAPTAccount from '../../../../hooks/accounts/useAPTAccount'\nimport useSUIAccount from '../../../../hooks/accounts/useSUIAccount'\nimport
|
|
1
|
+
{"version":3,"file":"ModalHandler.js","sources":["../../../../../src/views/Bonds/components/BondRows/ModalHandler.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef } from 'react'\nimport { getUserBonds } from '../../../../state/bonds/useUserBonds'\nimport YourBondsModal from '../../../YourBondsModal/YourBondsModal'\nimport BuyBondModal from '../../../BuyBond/BuyBondModal'\nimport { useMonitorTx } from '../../../../hooks/useMonitorTx'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport useEVMAccount from '../../../../hooks/accounts/useEVMAccount'\nimport useSOLAccount from '../../../../hooks/accounts/useSOLAccount'\nimport useAPTAccount from '../../../../hooks/accounts/useAPTAccount'\nimport useSUIAccount from '../../../../hooks/accounts/useSUIAccount'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { UserBill } from '../../../../types/yourbonds'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\n\n/*\n * Basically this is a handler that controls which Modal is displayed to the user.\n * It will start by showing the buy modal and if a user purchases a bond, a hash will be set, this will initially trigger\n * a monitor of the txhash and the search for a bill Id. Finally, if a billId is found the YourBondModal will be shown.\n * */\n\nconst ModalHandler = ({\n onDismiss,\n bondAddress,\n bondChain,\n}: {\n onDismiss?: () => void\n bondAddress: string\n bondChain: ChainId\n}) => {\n // State\n const [billId, setBillId] = useState('')\n const [afterFlowData, setAfterFlowData] = useState<{ buyTxHash: string; lostProfit?: string }>({\n buyTxHash: '',\n lostProfit: undefined,\n })\n const [userBill, setUserBill] = useState<UserBill>()\n\n // Hooks\n const { data: bondsData } = useBondsData()\n const locationPath = window.location.pathname\n const { data: txReceipt } = useMonitorTx(afterFlowData.buyTxHash, bondChain)\n const { address } = useEVMAccount()\n const { publicKey } = useSOLAccount()\n const solanaAccount = publicKey?.toBase58()\n const { address: aptosAccount } = useAPTAccount()\n const { address: suiAccount } = useSUIAccount()\n const queryClient = useQueryClient()\n\n // EVM - Look for billId on tx logs\n if (txReceipt) {\n try {\n const billNftAddress = bondsData?.find(\n (bond) =>\n bond?.contractAddress?.[bond.chainId]?.toLowerCase() === bondAddress?.toLowerCase() &&\n bond.chainId === bondChain,\n )?.billNnftAddress?.[bondChain]\n const { logs } = txReceipt\n const findBillNftLog = logs.find((log: any) => log.address.toLowerCase() === billNftAddress?.toLowerCase())\n const getBillNftIndex = findBillNftLog?.topics[findBillNftLog.topics.length - 1] as string\n const convertHexId = parseInt(getBillNftIndex, 16)\n if (!billId) {\n console.log('set Bill id: ' + convertHexId.toString())\n setBillId(convertHexId.toString())\n }\n } catch (e) {\n console.log(e)\n }\n }\n\n // Trigger refetch once txs are confirmed\n const hasRefetched = useRef(false)\n useEffect(() => {\n if (!hasRefetched.current) {\n if (billId) {\n console.log('Trigger user bonds refetch')\n const bondToRefetch = bondsData?.find(\n (bond) =>\n bondAddress?.toLowerCase() === bond?.contractAddress?.[bond?.chainId]?.toLowerCase() &&\n bondChain === bond?.chainId,\n )\n if (!bondToRefetch) return\n hasRefetched.current = true\n\n // Check cache first — if the bill is already in the cache (e.g. from\n // a recent refetch or optimistic update), skip the network round-trip.\n const cached = queryClient.getQueriesData<UserBill[] | undefined>({ queryKey: [QUERY_KEYS.USER_BONDS] })\n const cachedBills = cached.flatMap(([, bills]) => bills ?? [])\n const cachedBond = cachedBills.find((b) => b.id === billId)\n if (cachedBond) {\n setUserBill(cachedBond)\n return\n }\n\n getUserBonds(\n address!,\n solanaAccount!,\n aptosAccount!,\n suiAccount!,\n { [bondChain]: [bondToRefetch] } as Record<ChainId, BillsConfig[]>,\n queryClient,\n )\n .then((bonds) => {\n const purchasedBond = bonds.find((bond) => {\n if (bond?.bond?.chainId === ChainId.SOL) {\n return bond.asset === billId\n } else if (bond?.bond?.chainId === ChainId.SUI) {\n return bond.id === billId\n } else {\n return bond.id === billId\n }\n })\n console.log(purchasedBond)\n if (!purchasedBond) {\n console.log(`No bond found for ${billId}`)\n }\n setUserBill(purchasedBond)\n })\n .catch((e) => {\n console.error(e)\n })\n }\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [billId])\n\n return billId ? (\n <YourBondsModal userBill={userBill} onDismiss={onDismiss} lostProfit={afterFlowData.lostProfit} />\n ) : (\n <BuyBondModal\n bondAddress={bondAddress}\n bondChain={bondChain}\n handlePurchasedBond={(data) => setAfterFlowData(data)}\n setBillId={setBillId}\n onDismiss={() => {\n window.history.pushState({}, '', `${locationPath !== '/bonds' ? locationPath : '/bonds'}`)\n onDismiss?.()\n }}\n />\n )\n}\n\nexport default ModalHandler\n"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -2,23 +2,12 @@ import { jsx } from 'theme-ui/jsx-runtime';
|
|
|
2
2
|
import Modal from '../../components/uikit-sdk/Modal/index.js';
|
|
3
3
|
import BuyComponent from './BuyComponent.js';
|
|
4
4
|
import BuyComponentSolana from './BuyComponentSolana.js';
|
|
5
|
+
import BuyComponentAptos from './BuyComponentAptos.js';
|
|
6
|
+
import BuyComponentSui from './BuyComponentSui.js';
|
|
5
7
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
6
8
|
|
|
7
9
|
const BuyBondModal = ({ onDismiss, bondAddress, bondChain, handlePurchasedBond, setBillId, }) => {
|
|
8
|
-
return (jsx(Modal, { className: "modal", onDismiss: onDismiss, sx: { width: '400px', maxWidth: '700px', mt: '-10px', p: '0px' }, children: bondChain === ChainId.SOL ? (jsx(BuyComponentSolana, { onDismiss: onDismiss, bondAddress: bondAddress, bondChain: bondChain, setBillId: setBillId })) : (
|
|
9
|
-
// TODO: uncomment this
|
|
10
|
-
//
|
|
11
|
-
// : bondChain === ChainId.APTOS ? (
|
|
12
|
-
// <BuyComponentAptos
|
|
13
|
-
// onDismiss={onDismiss}
|
|
14
|
-
// bondAddress={bondAddress}
|
|
15
|
-
// bondChain={bondChain}
|
|
16
|
-
// setBillId={setBillId}
|
|
17
|
-
// />
|
|
18
|
-
// ) : bondChain === ChainId.SUI ? (
|
|
19
|
-
// <BuyComponentSui onDismiss={onDismiss} bondAddress={bondAddress} bondChain={bondChain} setBillId={setBillId} />
|
|
20
|
-
// )
|
|
21
|
-
jsx(BuyComponent //evm
|
|
10
|
+
return (jsx(Modal, { className: "modal", onDismiss: onDismiss, sx: { width: '400px', maxWidth: '700px', mt: '-10px', p: '0px' }, children: bondChain === ChainId.SOL ? (jsx(BuyComponentSolana, { onDismiss: onDismiss, bondAddress: bondAddress, bondChain: bondChain, setBillId: setBillId })) : bondChain === ChainId.APTOS ? (jsx(BuyComponentAptos, { onDismiss: onDismiss, bondAddress: bondAddress, bondChain: bondChain, setBillId: setBillId })) : bondChain === ChainId.SUI ? (jsx(BuyComponentSui, { onDismiss: onDismiss, bondAddress: bondAddress, bondChain: bondChain, setBillId: setBillId })) : (jsx(BuyComponent //evm
|
|
22
11
|
, { onDismiss: onDismiss, bondAddress: bondAddress, bondChain: bondChain, handlePurchasedBond: handlePurchasedBond })) }));
|
|
23
12
|
};
|
|
24
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuyBondModal.js","sources":["../../../src/views/BuyBond/BuyBondModal.tsx"],"sourcesContent":["import React from 'react'\nimport Modal from '../../components/uikit-sdk/Modal'\nimport BuyBond from './BuyComponent'\nimport BuyComponentSolana from './BuyComponentSolana'\
|
|
1
|
+
{"version":3,"file":"BuyBondModal.js","sources":["../../../src/views/BuyBond/BuyBondModal.tsx"],"sourcesContent":["import React from 'react'\nimport Modal from '../../components/uikit-sdk/Modal'\nimport BuyBond from './BuyComponent'\nimport BuyComponentSolana from './BuyComponentSolana'\nimport BuyComponentAptos from './BuyComponentAptos'\nimport BuyComponentSui from './BuyComponentSui'\nimport { ChainId } from '@ape.swap/apeswap-lists'\n\nexport interface PurchasedBondData {\n buyTxHash: string\n lostProfit?: string\n}\n\nexport interface BuyBondProps {\n onDismiss?: () => void // this is only the modal\n bondAddress?: string\n bondChain?: number\n handlePurchasedBond?: (data: PurchasedBondData) => void\n setBillId?: (id: string) => void\n isProjectView?: boolean\n}\n\nconst BuyBondModal: React.FC<BuyBondProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n handlePurchasedBond,\n setBillId,\n}) => {\n return (\n <Modal className=\"modal\" onDismiss={onDismiss} sx={{ width: '400px', maxWidth: '700px', mt: '-10px', p: '0px' }}>\n {bondChain === ChainId.SOL ? (\n <BuyComponentSolana\n onDismiss={onDismiss}\n bondAddress={bondAddress}\n bondChain={bondChain}\n setBillId={setBillId}\n />\n ) : bondChain === ChainId.APTOS ? (\n <BuyComponentAptos\n onDismiss={onDismiss}\n bondAddress={bondAddress}\n bondChain={bondChain}\n setBillId={setBillId}\n />\n ) : bondChain === ChainId.SUI ? (\n <BuyComponentSui onDismiss={onDismiss} bondAddress={bondAddress} bondChain={bondChain} setBillId={setBillId} />\n ) : (\n <BuyBond //evm\n onDismiss={onDismiss}\n bondAddress={bondAddress}\n bondChain={bondChain}\n handlePurchasedBond={handlePurchasedBond}\n />\n )}\n </Modal>\n )\n}\n\nexport default BuyBondModal\n"],"names":["_jsx","BuyBond"],"mappings":";;;;;;;;AAsBA,MAAM,YAAY,GAA2B,CAAC,EAC5C,SAAS,EACT,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,SAAS,GACV,KAAI;AACH,IAAA,QACEA,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAA,QAAA,EAC5G,SAAS,KAAK,OAAO,CAAC,GAAG,IACxBA,GAAA,CAAC,kBAAkB,EAAA,EACjB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EAAA,CACpB,IACA,SAAS,KAAK,OAAO,CAAC,KAAK,IAC7BA,GAAA,CAAC,iBAAiB,EAAA,EAChB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EAAA,CACpB,IACA,SAAS,KAAK,OAAO,CAAC,GAAG,IAC3BA,GAAA,CAAC,eAAe,EAAA,EAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAA,CAAI,KAE/GA,GAAA,CAACC,YAAO;AACN,UAAA,EAAA,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,mBAAmB,EAAE,mBAAmB,GACxC,CACH,EAAA,CACK;AAEZ;;;;"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'theme-ui/jsx-runtime';
|
|
2
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
3
|
+
import BigNumber from 'bignumber.js';
|
|
4
|
+
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
5
|
+
import useBondsData from '../../state/bonds/useBondsData.js';
|
|
6
|
+
import { useSDKConfig } from '../../state/useSDKConfig.js';
|
|
7
|
+
import { usePopups } from '../../state/popups/usePopups.js';
|
|
8
|
+
import { useSlippage } from '../../state/slippage/useSlippage.js';
|
|
9
|
+
import { formatUSDNumber, getMaxBuy, getPayoutAmount, getPrincipalAmount } from '../../utils/displayHelpers.js';
|
|
10
|
+
import { formatNumberSI } from '../../utils/formatNumber.js';
|
|
11
|
+
import { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers.js';
|
|
12
|
+
import { reportError } from '../../utils/reportError.js';
|
|
13
|
+
import { MCBuyComponentStyles } from '../../utils/campaignStyles.js';
|
|
14
|
+
import track from '../../utils/track.js';
|
|
15
|
+
import { remove0xPrefix } from '../../utils/remove0xPrefix.js';
|
|
16
|
+
import { getSymbol } from '../../utils/getNativeTicker.js';
|
|
17
|
+
import useAPTAccount from '../../hooks/accounts/useAPTAccount.js';
|
|
18
|
+
import useTokenFromZapList from '../../hooks/useTokenFromZapList.js';
|
|
19
|
+
import useSortedZapList from '../../hooks/useSortedZapList.js';
|
|
20
|
+
import useAptosZapQuote from '../../state/zap/useAptosZapQuote.js';
|
|
21
|
+
import { findAptosZapToken } from '../../config/constants/aptosZapTokens.js';
|
|
22
|
+
import ConnectAptosWalletButton from '../../components/ConnectAptosWalletButton/ConnectAptosWalletButton.js';
|
|
23
|
+
import TokenSelectorPanel from '../../components/TokenSelectorPanel/index.js';
|
|
24
|
+
import BondModalHeader from './components/BondModalHeader.js';
|
|
25
|
+
import BondCards from './components/BondCards/BondCards.js';
|
|
26
|
+
import Estimations from './components/Estimations.js';
|
|
27
|
+
import ProjectDescription from './components/ProjectDescription.js';
|
|
28
|
+
import Flex from '../../components/uikit-sdk/Flex/index.js';
|
|
29
|
+
import Text from '../../components/uikit-sdk/Text/index.js';
|
|
30
|
+
import Button from '../../components/uikit-sdk/Button/Button.js';
|
|
31
|
+
import SafeHTMLComponent from '../../components/SafeHTMLComponent/index.js';
|
|
32
|
+
import { APTOS_DEPOSIT_FUNCTION } from '../../constants/aptosConstants.js';
|
|
33
|
+
import { getAptosClient, readAptosMarketInfo, extractDepositEvent, extractBillMinted } from '../../utils/aptosHelpers.js';
|
|
34
|
+
|
|
35
|
+
const BuyComponentAptos = ({ onDismiss, bondAddress, bondChain, isProjectView, setBillId, }) => {
|
|
36
|
+
const SDKConfig = useSDKConfig();
|
|
37
|
+
// Hooks
|
|
38
|
+
const { address: aptosAccount, signAndSubmitTransaction } = useAPTAccount();
|
|
39
|
+
const { data: bonds } = useBondsData();
|
|
40
|
+
const { addToastError, addToastSuccess } = usePopups();
|
|
41
|
+
const { solSlippage: slippage } = useSlippage(); // reuse Sol slippage bucket for Aptos
|
|
42
|
+
const bondData = bonds?.find((bond) => bond?.contractAddress?.[bond?.chainId]?.toLowerCase() === bondAddress?.toLowerCase());
|
|
43
|
+
// Derived pricing (same path the Solana no-tier branch uses).
|
|
44
|
+
const trueBondPriceData = findHighestTrueBondPrice('0', bondData?.trueBondPrices);
|
|
45
|
+
// State
|
|
46
|
+
const [inputValue, setInputValue] = useState('');
|
|
47
|
+
const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData?.chainId]);
|
|
48
|
+
const [loadingTx, setLoadingTx] = useState(false);
|
|
49
|
+
// Token selection — reuses the same infrastructure as Solana
|
|
50
|
+
const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken);
|
|
51
|
+
const principalAddress = bondData?.lpToken?.address?.[bondData?.chainId];
|
|
52
|
+
// APT native ('NATIVE') and APT metadata ('0xa') are the same token — not a zap
|
|
53
|
+
const isNativeMatchingPrincipal = inputTokenString === 'NATIVE' && principalAddress?.toLowerCase() === '0xa';
|
|
54
|
+
const isZap = !!inputTokenString &&
|
|
55
|
+
!!principalAddress &&
|
|
56
|
+
!isNativeMatchingPrincipal &&
|
|
57
|
+
inputTokenString.toLowerCase() !== principalAddress.toLowerCase();
|
|
58
|
+
// Zap quote from Panora DEX aggregator
|
|
59
|
+
const aptosZapToken = findAptosZapToken(inputToken && inputToken !== 'NATIVE'
|
|
60
|
+
? inputToken?.address?.[ChainId.APTOS]
|
|
61
|
+
: inputToken === 'NATIVE'
|
|
62
|
+
? '0xa'
|
|
63
|
+
: undefined);
|
|
64
|
+
const [fetchingZapQuote, panoraQuote, zapDepositAmount, zapError] = useAptosZapQuote(inputValue, aptosZapToken, bondData, aptosAccount, slippage);
|
|
65
|
+
// Sorted zap list (balances + prices)
|
|
66
|
+
const { sortedZapList, isFetched: zapListFetched } = useSortedZapList(bondChain, bondData?.lpToken);
|
|
67
|
+
const enrichedTokenData = sortedZapList.find((item) => item.token === 'NATIVE' || inputToken === 'NATIVE'
|
|
68
|
+
? item.token === inputToken
|
|
69
|
+
: item?.token?.address?.[bondChain]?.toLowerCase() ===
|
|
70
|
+
inputToken?.address?.[bondChain]?.toLowerCase());
|
|
71
|
+
const inputCurrencyBalance = enrichedTokenData?.balance;
|
|
72
|
+
const inputTokenPrice = enrichedTokenData?.price;
|
|
73
|
+
// Estimations — use zapDepositAmount if swapping
|
|
74
|
+
const depositAmount = isZap ? zapDepositAmount : inputValue;
|
|
75
|
+
const youSpendString = `${formatNumberSI(inputValue)} ${getSymbol(inputToken, bondData?.chainId)} = $${formatUSDNumber((parseFloat(inputValue || '0') * (inputTokenPrice ?? 0)).toString())}`;
|
|
76
|
+
const exceedsRealMaxBuy = getMaxBuy(bondData, true).lte(getPayoutAmount(bondData, depositAmount, '0'));
|
|
77
|
+
const exceedsSafeMaxBuy = getMaxBuy(bondData, false)
|
|
78
|
+
.times(isZap ? 0.995 : 0.9995)
|
|
79
|
+
.lte(getPayoutAmount(bondData, depositAmount, '0'));
|
|
80
|
+
const exceedsBalance = new BigNumber(inputCurrencyBalance ?? '0').lt(inputValue);
|
|
81
|
+
const load = loadingTx || (fetchingZapQuote && !!inputValue);
|
|
82
|
+
// Handlers
|
|
83
|
+
const handleCurrencySelect = useCallback((newInputToken) => {
|
|
84
|
+
setInputValue('');
|
|
85
|
+
setInputTokenString(newInputToken);
|
|
86
|
+
}, []);
|
|
87
|
+
const handleMaxButton = () => {
|
|
88
|
+
const balance = new BigNumber(inputCurrencyBalance ?? '0');
|
|
89
|
+
const principalDecimals = bondData?.lpToken?.decimals?.[bondData?.chainId] ?? 6;
|
|
90
|
+
const maxBuyAmount = getMaxBuy(bondData, SDKConfig.showLowValueBonds);
|
|
91
|
+
if (!isZap) {
|
|
92
|
+
const maxPossibleUserPurchase = getPayoutAmount(bondData, balance.toString(), '0');
|
|
93
|
+
if (maxPossibleUserPurchase > maxBuyAmount.toNumber()) {
|
|
94
|
+
const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), '0');
|
|
95
|
+
setInputValue(new BigNumber(principalForMaxBuy).toFixed(principalDecimals));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
setInputValue(balance.toFixed(principalDecimals));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), '0');
|
|
103
|
+
const principalForMaxBuyUSD = new BigNumber(principalForMaxBuy).times(bondData?.principalTokenPrice ?? 0);
|
|
104
|
+
const maxBuyAmountInSelectedToken = principalForMaxBuyUSD.div(inputTokenPrice ?? 0);
|
|
105
|
+
const decimals = enrichedTokenData?.token === 'NATIVE' ? 8 : (enrichedTokenData?.token.decimals[bondData?.chainId] ?? 8);
|
|
106
|
+
if (balance.gte(maxBuyAmountInSelectedToken)) {
|
|
107
|
+
setInputValue(maxBuyAmountInSelectedToken.toFixed(decimals));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
setInputValue(balance.toFixed(decimals));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const handleBuyCallback = async () => {
|
|
115
|
+
if (!aptosAccount || !bondData || !inputValue)
|
|
116
|
+
return;
|
|
117
|
+
track({
|
|
118
|
+
event: 'buyBondClick',
|
|
119
|
+
chain: bondChain,
|
|
120
|
+
data: {
|
|
121
|
+
cat: bondData?.billType,
|
|
122
|
+
bond: bondData?.earnToken.symbol,
|
|
123
|
+
value: parseFloat(inputValue) * (inputTokenPrice ?? 0),
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
try {
|
|
127
|
+
setLoadingTx(true);
|
|
128
|
+
const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 6;
|
|
129
|
+
const atomicAmount = new BigNumber(inputValue)
|
|
130
|
+
.times(new BigNumber(10).pow(principalDecimals))
|
|
131
|
+
.integerValue(BigNumber.ROUND_FLOOR)
|
|
132
|
+
.toFixed(0);
|
|
133
|
+
const market = bondData.contractAddress[bondData.chainId] ?? '';
|
|
134
|
+
// Read fresh pricing from the contract
|
|
135
|
+
const marketInfo = await readAptosMarketInfo(market);
|
|
136
|
+
const trueBillPriceU64 = marketInfo[17]; // u64 scaled 1e8
|
|
137
|
+
const atomicMaxPrice = new BigNumber(trueBillPriceU64)
|
|
138
|
+
.times(new BigNumber(100 + slippage))
|
|
139
|
+
.dividedBy(new BigNumber(100))
|
|
140
|
+
.integerValue(BigNumber.ROUND_CEIL)
|
|
141
|
+
.toFixed(0);
|
|
142
|
+
const response = await signAndSubmitTransaction?.({
|
|
143
|
+
data: {
|
|
144
|
+
function: APTOS_DEPOSIT_FUNCTION,
|
|
145
|
+
typeArguments: [],
|
|
146
|
+
functionArguments: [market, atomicAmount, atomicMaxPrice, aptosAccount],
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (!response?.hash)
|
|
150
|
+
throw new Error('No tx hash returned by wallet');
|
|
151
|
+
const aptos = getAptosClient();
|
|
152
|
+
await aptos.waitForTransaction({ transactionHash: response.hash });
|
|
153
|
+
// waitForTransaction may not include events — fetch full tx details separately
|
|
154
|
+
const txDetails = await aptos.getTransactionByHash({ transactionHash: response.hash });
|
|
155
|
+
const txnWithEvents = txDetails;
|
|
156
|
+
const depositEvent = extractDepositEvent(txnWithEvents);
|
|
157
|
+
const newBillId = depositEvent?.bill_id ?? extractBillMinted(txnWithEvents)?.bill_id ?? '';
|
|
158
|
+
track({
|
|
159
|
+
event: 'bond',
|
|
160
|
+
chain: bondChain,
|
|
161
|
+
data: {
|
|
162
|
+
cat: 'lp-buy',
|
|
163
|
+
type: bondData?.billType ?? '',
|
|
164
|
+
typedValue: inputValue,
|
|
165
|
+
principalToken: bondData?.lpToken.symbol ?? '',
|
|
166
|
+
earnToken: bondData?.earnToken.symbol ?? '',
|
|
167
|
+
address: remove0xPrefix(market),
|
|
168
|
+
usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
addToastSuccess(response.hash, bondChain);
|
|
172
|
+
setBillId?.(newBillId);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error('Error during Aptos bond purchase:', error);
|
|
176
|
+
addToastError(error?.message || 'Unknown error');
|
|
177
|
+
reportError({
|
|
178
|
+
apiUrl: SDKConfig?.urls?.apiV2,
|
|
179
|
+
error: error?.message,
|
|
180
|
+
extraInfo: { type: 'aptosBuyBond', error: error?.message },
|
|
181
|
+
chainId: bondChain,
|
|
182
|
+
account: aptosAccount,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
setLoadingTx(false);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
const handleZapCallback = async () => {
|
|
190
|
+
if (loadingTx || !aptosAccount || !bondData || !panoraQuote || !signAndSubmitTransaction)
|
|
191
|
+
return;
|
|
192
|
+
track({
|
|
193
|
+
event: 'buyBondClick',
|
|
194
|
+
chain: bondChain,
|
|
195
|
+
data: {
|
|
196
|
+
cat: bondData?.billType,
|
|
197
|
+
bond: bondData?.earnToken.symbol,
|
|
198
|
+
value: parseFloat(inputValue) * (inputTokenPrice ?? 0),
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
try {
|
|
202
|
+
setLoadingTx(true);
|
|
203
|
+
const aptos = getAptosClient();
|
|
204
|
+
// TX1: Execute Panora swap — the quote's txData contains the entry
|
|
205
|
+
// function payload ready for the wallet adapter.
|
|
206
|
+
const swapTxData = panoraQuote.txData;
|
|
207
|
+
if (!swapTxData || !swapTxData.function) {
|
|
208
|
+
throw new Error('Panora quote missing txData');
|
|
209
|
+
}
|
|
210
|
+
const swapResponse = await signAndSubmitTransaction({
|
|
211
|
+
data: swapTxData,
|
|
212
|
+
});
|
|
213
|
+
if (!swapResponse?.hash)
|
|
214
|
+
throw new Error('No tx hash returned for swap');
|
|
215
|
+
await aptos.waitForTransaction({ transactionHash: swapResponse.hash });
|
|
216
|
+
// TX2: Deposit into bond with the swapped principal tokens.
|
|
217
|
+
// Use the deposit amount from the quote (what we received from the swap).
|
|
218
|
+
const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 6;
|
|
219
|
+
const depositAmountAtomic = new BigNumber(zapDepositAmount)
|
|
220
|
+
.times(new BigNumber(10).pow(principalDecimals))
|
|
221
|
+
.integerValue(BigNumber.ROUND_FLOOR)
|
|
222
|
+
.toFixed(0);
|
|
223
|
+
const market = bondData.contractAddress[bondData.chainId] ?? '';
|
|
224
|
+
// Read fresh pricing
|
|
225
|
+
const marketInfo = await readAptosMarketInfo(market);
|
|
226
|
+
const trueBillPriceU64 = marketInfo[17];
|
|
227
|
+
const atomicMaxPrice = new BigNumber(trueBillPriceU64)
|
|
228
|
+
.times(new BigNumber(100 + slippage))
|
|
229
|
+
.dividedBy(new BigNumber(100))
|
|
230
|
+
.integerValue(BigNumber.ROUND_CEIL)
|
|
231
|
+
.toFixed(0);
|
|
232
|
+
const depositResponse = await signAndSubmitTransaction({
|
|
233
|
+
data: {
|
|
234
|
+
function: APTOS_DEPOSIT_FUNCTION,
|
|
235
|
+
typeArguments: [],
|
|
236
|
+
functionArguments: [market, depositAmountAtomic, atomicMaxPrice, aptosAccount],
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
if (!depositResponse?.hash)
|
|
240
|
+
throw new Error('No tx hash returned for deposit');
|
|
241
|
+
await aptos.waitForTransaction({ transactionHash: depositResponse.hash });
|
|
242
|
+
const txDetails = await aptos.getTransactionByHash({ transactionHash: depositResponse.hash });
|
|
243
|
+
const txnWithEvents = txDetails;
|
|
244
|
+
const depositEvent = extractDepositEvent(txnWithEvents);
|
|
245
|
+
const newBillId = depositEvent?.bill_id ?? extractBillMinted(txnWithEvents)?.bill_id ?? '';
|
|
246
|
+
// Track zap events
|
|
247
|
+
track({
|
|
248
|
+
event: 'zap',
|
|
249
|
+
chain: bondChain,
|
|
250
|
+
data: {
|
|
251
|
+
cat: 'bond',
|
|
252
|
+
token1: getSymbol(inputToken),
|
|
253
|
+
token2: bondData?.lpToken.symbol ?? '',
|
|
254
|
+
amount: parseFloat(inputValue) * (inputTokenPrice ?? 0),
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
track({
|
|
258
|
+
event: 'bond',
|
|
259
|
+
chain: bondChain,
|
|
260
|
+
data: {
|
|
261
|
+
cat: 'zap-buy-two-tx',
|
|
262
|
+
type: bondData?.billType ?? '',
|
|
263
|
+
typedValue: inputValue,
|
|
264
|
+
principalToken: bondData?.lpToken.symbol ?? '',
|
|
265
|
+
earnToken: bondData?.earnToken.symbol ?? '',
|
|
266
|
+
address: remove0xPrefix(market),
|
|
267
|
+
usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
addToastSuccess(depositResponse.hash, bondChain);
|
|
271
|
+
setBillId?.(newBillId);
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
console.error('Error during Aptos zap + bond purchase:', error);
|
|
275
|
+
addToastError(error?.message || 'Unknown error during swap and bond');
|
|
276
|
+
reportError({
|
|
277
|
+
apiUrl: SDKConfig?.urls?.apiV2,
|
|
278
|
+
error: error?.message,
|
|
279
|
+
extraInfo: { type: 'aptosPanoraZapBuyBond', error: error?.message, quote: panoraQuote },
|
|
280
|
+
chainId: bondChain,
|
|
281
|
+
account: aptosAccount,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
setLoadingTx(false);
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
const handleBuy = () => {
|
|
289
|
+
if (loadingTx)
|
|
290
|
+
return;
|
|
291
|
+
if (isZap) {
|
|
292
|
+
handleZapCallback();
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
handleBuyCallback();
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
// Sync inputTokenString when bondData loads after initial render
|
|
299
|
+
useEffect(() => {
|
|
300
|
+
const addr = bondData?.lpToken?.address?.[bondData?.chainId];
|
|
301
|
+
if (addr && !inputTokenString) {
|
|
302
|
+
setInputTokenString(addr);
|
|
303
|
+
}
|
|
304
|
+
}, [bondData?.lpToken?.address, bondData?.chainId]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
305
|
+
// Auto-select highest balance token when zap list loads
|
|
306
|
+
const [hasChecked, setHasChecked] = useState(false);
|
|
307
|
+
useEffect(() => {
|
|
308
|
+
if (zapListFetched && !hasChecked) {
|
|
309
|
+
if (parseFloat(inputCurrencyBalance ?? '0') < 0.0001) {
|
|
310
|
+
setInputTokenString(sortedZapList[0]?.token === 'NATIVE' ? 'NATIVE' : sortedZapList[0]?.token.address[bondChain]);
|
|
311
|
+
}
|
|
312
|
+
setHasChecked(true);
|
|
313
|
+
}
|
|
314
|
+
/* eslint-disable react-hooks/exhaustive-deps */
|
|
315
|
+
}, [inputCurrencyBalance, zapListFetched]);
|
|
316
|
+
const hasPositiveBonus = (trueBondPriceData?.bonusWithFee ?? 0) > 0;
|
|
317
|
+
const canBuy = !load &&
|
|
318
|
+
!!aptosAccount &&
|
|
319
|
+
!bondData?.soldOut &&
|
|
320
|
+
!!inputValue &&
|
|
321
|
+
parseFloat(inputValue) > 0 &&
|
|
322
|
+
!exceedsRealMaxBuy &&
|
|
323
|
+
!exceedsBalance &&
|
|
324
|
+
hasPositiveBonus &&
|
|
325
|
+
!SDKConfig.blockSales &&
|
|
326
|
+
!zapError &&
|
|
327
|
+
!(isZap && !panoraQuote);
|
|
328
|
+
return bondData ? (jsx(Flex, { className: "modal-content", sx: { ...MCBuyComponentStyles[bondData?.marketingCampaign] }, children: jsxs(Flex, { className: "modaltable-container", children: [jsx(BondModalHeader, { bondData: bondData, onDismiss: onDismiss, hidePromotionUi: true }), jsx(ProjectDescription, { description: bondData.shortDescription, isProjectView: true }), jsx(Flex, { sx: { width: '100%', display: isProjectView ? ['flex', 'flex', 'flex', 'none'] : 'flex' }, children: jsx(BondCards, { bondData: bondData, isDoingMaxBuy: exceedsSafeMaxBuy && !exceedsRealMaxBuy }) }), jsx(Estimations, { depositAmount: depositAmount, inputValue: inputValue, inputTokenPrice: inputTokenPrice, bondData: bondData, youSpendString: youSpendString, isZap: isZap, fetchingZapQuote: fetchingZapQuote, zapError: zapError }), jsx(TokenSelectorPanel, { typedValue: inputValue, setTypedValue: setInputValue, selectedToken: inputToken, handleValueBtn: handleMaxButton, handleCurrencySelect: handleCurrencySelect, bondChainId: ChainId.APTOS, enableZap: true, bondPrincipalToken: bondData?.lpToken, tokenBalance: inputCurrencyBalance ?? undefined, selectedTokenPrice: inputTokenPrice, isConnected: !!aptosAccount }), bondData?.warningCard && (jsx(Flex, { sx: {
|
|
329
|
+
width: '100%',
|
|
330
|
+
background: '#DE62F366',
|
|
331
|
+
justifyContent: 'center',
|
|
332
|
+
mt: '10px',
|
|
333
|
+
borderRadius: 'normal',
|
|
334
|
+
p: '2px 10px',
|
|
335
|
+
}, children: jsx(Text, { sx: { fontSize: '12px', fontWeight: 400, display: 'flex', alignItems: 'center', gap: '10px' }, children: jsx(SafeHTMLComponent, { html: bondData?.warningCard }) }) })), jsx(Flex, { className: "modaltable-container button-container", children: jsx(Flex, { className: "button-container buy", children: !aptosAccount ? (jsx(ConnectAptosWalletButton, {})) : (jsx(Button, { className: "action-button", load: load, disabled: !canBuy, onClick: handleBuy, sx: { width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }, children: SDKConfig.blockSales
|
|
336
|
+
? 'Complete KYC to Buy'
|
|
337
|
+
: exceedsRealMaxBuy
|
|
338
|
+
? 'Exceeds Max Buy. Reduce amount'
|
|
339
|
+
: exceedsBalance
|
|
340
|
+
? 'Insufficient balance'
|
|
341
|
+
: zapError
|
|
342
|
+
? 'Swap quote failed'
|
|
343
|
+
: !inputValue || parseFloat(inputValue) === 0
|
|
344
|
+
? 'Insert amount'
|
|
345
|
+
: 'buy' })) }) })] }) })) : (jsx(Fragment, {}));
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
export { BuyComponentAptos as default };
|
|
349
|
+
//# sourceMappingURL=BuyComponentAptos.js.map
|