@liberfi.io/ui-tokens 2.0.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -13
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/components/pulse/pulse-list-header.ui.tsx","../src/components/pulse/pulse-list-item-skeleton.ui.tsx","../src/utils/protocol-styles.ts","../src/components/token-avatar/token-avatar.ui.tsx","../src/components/pulse/pulse-list-item.ui.tsx","../src/components/pulse/pulse-list.ui.tsx","../src/utils/merge.ts","../src/components/pulse/pulse-new-list.script.ts","../src/components/pulse/pulse-new-list.widget.tsx","../src/components/pulse/pulse-migrated-list.script.ts","../src/components/pulse/pulse-migrated-list.widget.tsx","../src/components/pulse/pulse-final-stretch-list.script.ts","../src/components/pulse/pulse-final-stretch-list.widget.tsx","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list-header.ui.tsx","../src/components/search/search-result-list-skeleton.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/token-list/trending-token-list.script.ts","../src/components/search/search-trending-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-tokens-button.tsx","../src/components/shared/trader-tag-badge/trader-tag-badge.ui.tsx","../src/components/shared/holder-tag-badge/holder-tag-badge.ui.tsx","../src/components/token-detail/shared/format.ts","../src/components/token-detail/shared/age.ts","../src/components/token-detail/shared/use-live-token.ts","../src/components/token-detail/shared/buy-sell-overview.ui.tsx","../src/components/token-detail/token-detail-header/token-detail-header.ui.tsx","../src/components/token-detail/token-detail-header/token-detail-header.script.ts","../src/components/token-detail/token-basic-info/token-basic-info.ui.tsx","../src/components/token-detail/token-basic-info/token-basic-info.script.ts","../src/components/token-detail/token-holders-count/token-holders-count.ui.tsx","../src/components/token-detail/token-holders-count/token-holders-count.script.ts","../src/components/token-detail/token-holders-count/token-holders-count.widget.tsx","../src/components/token-detail/token-market-cap/token-market-cap.ui.tsx","../src/components/token-detail/token-market-cap/token-market-cap.script.ts","../src/components/token-detail/token-market-cap/token-market-cap.widget.tsx","../src/components/token-detail/token-price/token-price.ui.tsx","../src/components/token-detail/token-price/token-price.script.ts","../src/components/token-detail/token-price/token-price.widget.tsx","../src/components/token-detail/token-social-media/token-social-media.ui.tsx","../src/components/token-detail/token-social-media/token-social-media.script.ts","../src/components/token-detail/token-social-media/token-social-media.widget.tsx","../src/components/token-detail/token-volume/token-volume.ui.tsx","../src/components/token-detail/token-volume/token-volume.script.ts","../src/components/token-detail/token-volume/token-volume.widget.tsx","../src/components/token-detail/token-basic-info/token-basic-info.widget.tsx","../src/components/token-detail/token-detail-header/token-detail-header.widget.tsx","../src/components/token-detail/token-holders-list/token-holders-list.ui.tsx","../src/components/token-detail/token-holders-list/token-holders-list.script.ts","../src/components/token-detail/token-holders-list/token-holders-list.widget.tsx","../src/components/token-detail/token-activities-list/token-activities-list.ui.tsx","../src/components/token-detail/token-activities-list/token-activities-list.script.ts","../src/components/token-detail/token-activities-list/token-activities-list.widget.tsx","../src/components/token-detail/token-traders-overview/token-traders-overview.ui.tsx","../src/components/token-detail/token-traders-overview/token-traders-overview.script.ts","../src/components/token-detail/token-traders-overview/token-traders-overview.widget.tsx","../src/components/token-detail/token-transactions-overview/token-transactions-overview.ui.tsx","../src/components/token-detail/token-transactions-overview/token-transactions-overview.script.ts","../src/components/token-detail/token-transactions-overview/token-transactions-overview.widget.tsx","../src/components/token-detail/token-volumes-overview/token-volumes-overview.ui.tsx","../src/components/token-detail/token-volumes-overview/token-volumes-overview.script.ts","../src/components/token-detail/token-volumes-overview/token-volumes-overview.widget.tsx","../src/components/token-detail/token-security/token-security.ui.tsx","../src/components/token-detail/token-security/token-security.script.ts","../src/components/token-detail/token-security/token-security.widget.tsx","../src/components/token-detail/token-about/token-about.ui.tsx","../src/components/token-detail/token-about/token-about.script.ts","../src/components/token-detail/token-about/token-about.widget.tsx","../src/components/token-detail/token-liquidities/token-liquidities.ui.tsx","../src/components/token-detail/token-liquidities/token-liquidities.script.ts","../src/components/token-detail/token-liquidities/token-liquidities.widget.tsx","../src/components/token-detail/token-cex-listing/token-cex-listing.ui.tsx","../src/components/token-detail/token-cex-listing/token-cex-listing.script.ts","../src/components/token-detail/token-cex-listing/token-cex-listing.widget.tsx","../src/components/token-detail/token-categories/token-categories.ui.tsx","../src/components/token-detail/token-categories/token-categories.script.ts","../src/components/token-detail/token-categories/token-categories.widget.tsx","../src/components/token-detail/token-stats-flip/token-stats-flip.ui.tsx","../src/components/token-detail/token-stats-flip/token-stats-flip.script.ts","../src/components/token-detail/token-stats-flip/token-stats-flip.widget.tsx","../src/components/token-detail/token-positions-list/token-positions-list.ui.tsx","../src/components/token-detail/token-positions-list/token-positions-list.script.ts","../src/components/token-detail/token-positions-list/token-positions-list.widget.tsx","../src/components/token-detail/token-orders-list/token-orders-list.ui.tsx","../src/components/token-detail/token-orders-list/token-orders-list.script.ts","../src/components/token-detail/token-orders-list/token-orders-list.widget.tsx","../src/components/token-detail/token-top-traders-list/token-top-traders-list.ui.tsx","../src/components/token-detail/token-top-traders-list/token-top-traders-list.script.ts","../src/components/token-detail/token-top-traders-list/token-top-traders-list.widget.tsx","../src/components/token-detail/token-dev-tokens-list/token-dev-tokens-list.ui.tsx","../src/components/token-detail/token-dev-tokens-list/token-dev-tokens-list.script.ts","../src/components/token-detail/token-dev-tokens-list/token-dev-tokens-list.widget.tsx","../src/components/token-detail/token-chart-banner/token-chart-banner.ui.tsx","../src/components/token-detail/token-chart-banner/token-chart-banner.script.ts","../src/components/token-detail/token-chart-banner/token-chart-banner.widget.tsx","../src/components/token-detail/token-similar-tokens/token-similar-tokens.ui.tsx","../src/components/token-detail/token-similar-tokens/token-similar-tokens.script.ts","../src/components/token-detail/token-similar-tokens/token-similar-tokens.widget.tsx","../src/components/token-detail/token-reused-image-list/token-reused-image-list.ui.tsx","../src/components/token-detail/token-reused-image-list/token-reused-image-list.script.ts","../src/components/token-detail/token-reused-image-list/token-reused-image-list.widget.tsx","../src/components/token-list/filters/token-list-keywords-filter.ui.tsx","../src/components/token-list/filters/token-list-protocol-filter.ui.tsx","../src/components/token-list/filters/token-list-minmax-filter.ui.tsx","../src/components/token-list/filters/token-list-audits-filter.ui.tsx","../src/components/token-list/filters/token-list-metrics-filter.ui.tsx","../src/components/token-list/filters/token-list-stats-filter.ui.tsx","../src/components/token-list/token-list-filter.ui.tsx","../src/components/token-list/token-list-filter-modal.ui.tsx","../src/components/token-list/token-list-filter-popover.ui.tsx","../src/components/token-list/token-list-filter.widget.tsx","../src/components/token-list/token-list-resolution-selector-desktop.ui.tsx","../src/components/token-list/token-list-resolution-selector-mobile.ui.tsx","../src/components/token-list/token-list-resolution-selector.widget.tsx","../src/components/token-list/cells/token-bluechip-cell.ui.tsx","../src/components/token-list/cells/token-cell.ui.tsx","../src/components/token-list/cells/token-info-cell.ui.tsx","../src/components/token-list/cells/token-liquidity-cell.ui.tsx","../src/components/token-list/cells/token-market-cap-cell.ui.tsx","../src/components/token-list/cells/token-price-cell.ui.tsx","../src/components/token-list/cells/token-traders-cell.ui.tsx","../src/components/token-list/cells/token-trades-cell.ui.tsx","../src/components/token-list/cells/token-volumes-cell.ui.tsx","../src/components/token-list/token-list-skeleton.ui.tsx","../src/components/token-list/token-list.ui.tsx","../src/components/token-list/new-token-list.script.ts","../src/components/token-list/new-token-list.widget.tsx","../src/components/token-list/stock-token-list.script.ts","../src/components/token-list/stock-token-list.widget.tsx","../src/components/token-list/trending-token-list.widget.tsx","../src/hooks/useTokens.ts"],"names":["version_default","PulseListHeader","title","isPaused","extra","className","t","useTranslation","jsxs","cn","jsx","PauseIcon","PulseListItemSkeleton","isLast","Skeleton","CLASSES","SolanaTokenProtocol","FALLBACK","protocolClasses","protocol","TokenAvatar","token","enablePreview","enableSearch","showProgress","showProtocolFamily","radius","classNames","formattedProtocolFamily","useMemo","parseTokenProtocolFamily","displayProtocolFamily","displayProgress","SafeBigNumber","displaySearch","fallbackName","isHovered","setIsHovered","useState","handleMouseEnter","useCallback","handleMouseLeave","handleSearch","e","url","searchImageUrl","ProgressTrack","PreviewWrapper","Avatar","CameraIcon","StyledTooltip","Image","children","Preview","progress","strokeDashoffset","PulseListItem","renderAction","onSelectToken","copyToClipboard","useCopyToClipboard","age","useTickAge","handleClick","handleCopyAddress","toast","top10Warning","devWarning","insiderWarning","sniperWarning","bundleWarning","buyW","sellW","buys","sells","total","buyWidth","marketCapColorClass","cap","truncateAddress","CopyIcon","formatAge","Link","TwitterIcon","TelegramIcon","WebsiteIcon","searchTwitterUrl","SearchIcon","PeopleIcon","formatAmount","KlineCandlesIcon","StarIcon","HoldingRatioChip","UserWithStarBadgeIcon","formatPercent","CookIcon","RatIcon","SniperIcon","BundlesIcon","formatAmountUSDCompact","icon","value","tooltip","warning","DEFAULT_ITEM_HEIGHT","SKELETON_COUNT","PulseListRow","index","style","data","skeletonCount","renderItemAction","PulseList","tokens","isLoading","itemHeight","renderHeaderExtra","onPauseChange","hideHeader","itemCount","rowProps","setIsPaused","List","assignDefined","existing","incoming","result","key","STATS_TIMEFRAMES","mergeStats","tf","mergeMarketData","mergeOptional","mergeToken","_c","_a","stats","marketData","socialMedias","security","launchedFrom","migratedTo","rest","merged","MAX_ITEMS","tokenFromSubscribed","sub","sortAndLimit","a","b","at","usePulseNewListScript","chain","refetchInterval","queryParams","pausedRef","useRef","prevChainRef","isChainChanged","setIsChainChanged","setTokens","useEffect","fetchedTokens","isPending","useNewTokensQuery","prev","paused","isFirstFill","idx","handleUpdate","changed","useNewTokensSubscription","PulseNewListWidget","handlePauseChange","usePulseMigratedListScript","useMigratedTokensQuery","handleDataUpdate","item","useMigratedTokensSubscription","PulseMigratedListWidget","sortByMigrateProgress","ar","usePulseFinalStretchListScript","useFinalStretchTokensQuery","useFinalStretchTokensSubscription","PulseFinalStretchListWidget","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","useSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","filtered","h","clearHistories","SearchHistoryUI","onSelect","onClear","Button","TrashIcon","Chip","SearchHistoryWidget","SearchInputUI","onValueChange","onEscape","StyledInput","XCloseIcon","Kbd","SearchResultItemUI","price","marketCap","tvl","priceChange","priceChangeAbs","bullish","formatAmountUSD","formatPriceUSD","TriangleUpIcon","TriangleDownIcon","SearchResultListHeader","SkeletonRow","SearchResultListSkeleton","rows","_","i","useSearchResultListScript","chains","limit","params","isFetchingNextPage","hasNextPage","fetchNextPage","useSearchTokensInfiniteQuery","page","ROW_HEIGHT","SearchResultListWidget","scriptParams","ref","height","useResizeObserver","isItemLoaded","loadMoreItems","onRowsLoaded","useInfiniteLoader","EmptyState","SearchResultRow","Spinner","EmptyIcon","useTrendingTokensScript","resolution","options","prevParamsRef","isParamsChanged","setIsParamsChanged","useTrendingTokensQuery","useTrendingTokensSubscription","DEFAULT_CHAIN","Chain","DEFAULT_RESOLUTION","SearchTrendingListWidget","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","v","setText_","setKeyword_","clearKeyword","SearchWidget","SEARCH_MODAL_ID","SearchModal","id","AsyncModal","modalProps","SearchModalContent","isOpen","onOpenChange","onResult","isMobile","useScreen","handleSelectToken","StyledModal","ModalContent","ModalHeader","ModalBody","SearchTokensButton","isDesktop","onOpen","onClose","useAsyncModal","onSelectTokenStable","handleOpen","handleClose","handleKeyDown","event","activeElement","isInEditableElement","TRADER_TAG_META","TraderTagBadge","tag","meta","TraderTagBadgeList","tags","max","visible","overflow","HolderTagBadge","HolderTagBadgeList","formatRatioFrom100","formatPercentUtil","truncateMiddle","input","head","tail","formatAgeShort","from","now","start","end","diffSec","diffMin","diffHour","diffDay","diffMon","useLiveToken","address","useTokenQuery","setToken","useTokenSubscription","updates","next","u","BuySellOverview","label","totalFormatted","buysFormatted","sellsFormatted","totalValue","buysValue","buyPercentage","Progress","TokenDetailHeader","actions","dataStrip","onCopyAddress","useTokenDetailHeaderScript","TokenBasicInfo","volume","holdersCount","socialMedia","useTokenBasicInfoScript","TokenHoldersCount","holders","top10HoldingsRatio","top100HoldingsRatio","useTokenHoldersCountScript","TokenHoldersCountWidget","TokenMarketCap","marketCapInUsd","tvlInUsd","createdAt","useTokenMarketCapScript","TokenMarketCapWidget","TokenPrice","priceInUsd","price24hAgoInUsd","bearish","cur","useTokenPriceScript","TokenPriceWidget","renderIcon","size","DiscordIcon","TokenSocialMedia","socials","iconSize","available","k","useTokenSocialMediaScript","TokenSocialMediaWidget","TokenVolume","volumesInUsd","trades","traders","useTokenVolumeScript","TokenVolumeWidget","TokenBasicInfoWidget","TokenDetailHeaderWidget","SORT_OPTIONS","TokenHoldersList","sortBy","onSortByChange","onlyTracked","onOnlyTrackedChange","onLoadMore","hasMore","wellKnownAddresses","renderAddress","visibleHolders","opt","HolderRow","holder","wellKnownLabel","addressCell","useTokenHoldersListScript","initialSortBy","setSortByState","cursor","setCursor","pages","setPages","resetOnSortChange","setSortBy","s","isFetching","useTokenHoldersQuery","p","lastPage","loadMore","TokenHoldersListWidget","initialOnlyTracked","setOnlyTracked","TYPE_OPTIONS","TRADER_OPTIONS","TokenActivitiesList","activities","typeFilter","onTypeFilterChange","traderFilter","onTraderFilterChange","youWalletAddress","currency","onCurrencyChange","nativeDecimals","nativeSymbol","onRowClick","filteredActivities","filterByTraderFilter","active","disabled","CurrencyToggle","ActivityRow","pickPrimaryToken","filter","normalised","trackedTags","onChange","o","formatGasFee","gasFee","n","activity","primary","sideLabel","sideColor","formatPrice","useTokenActivitiesListScript","initialTypeFilter","setTypeFilterState","liveFront","setLiveFront","reset","setTypeFilter","queryType","useTokenActivitiesQuery","liveEligible","useTokenActivitiesSubscription","seen","fresh","paged","TokenActivitiesListWidget","initialTraderFilter","initialCurrency","setTraderFilter","setCurrency","TokenTradersOverview","r","useTokenTradersOverviewScript","TokenTradersOverviewWidget","TokenTransactionsOverview","useTokenTransactionsOverviewScript","TokenTransactionsOverviewWidget","TokenVolumesOverview","useTokenVolumesOverviewScript","TokenVolumesOverviewWidget","TokenSecurity","externalUrl","externalLabel","items","allSafe","it","SecurityItem","safeWhen","description","safe","display","useTokenSecurityScript","useTokenSecurityQuery","TokenSecurityWidget","TokenAbout","useTokenAboutScript","TokenAboutWidget","TokenLiquidities","liquidities","totalTvlInUsd","collapseAt","onPoolClick","expanded","setExpanded","toggle","lq","useTokenLiquiditiesScript","TokenLiquiditiesWidget","TokenCexListing","cexes","cex","hidden","chip","useTokenCexListingScript","TokenCexListingWidget","cexesProp","TokenCategories","categories","onCategoryClick","useTokenCategoriesScript","TokenCategoriesWidget","DEFAULT_FLIP_HOVER_RESOLUTIONS","TokenStatsFlipBase","buyUsd","sellUsd","totalUsd","netUsd","buySharePct","cells","TokenStatsFlipHover","resolutions","res","raw","bn","isPositive","useTokenStatsFlipScript","useTokenStatsQuery","TokenStatsFlipWidget","baseResolution","hoverResolutions","StatsFlipPanel","TokenPositionsList","positions","showHidden","onShowHiddenChange","renderActions","PositionRow","position","bought","sold","remaining","pnl","computePositionFields","tokenCell","buyRaw","sellRaw","remainingRaw","pnlRaw","pnlBn","pnlAmount","pnlRatio","useTokenPositionsListScript","wallet","initialShowHidden","setShowHidden","useWalletTokenPositionsQuery","TokenPositionsListWidget","TokenOrdersList","orders","unavailable","stateFilter","onStateFilterChange","onlyThisToken","onOnlyThisTokenChange","tokenSymbol","onCancelAll","OrderRow","order","amountDisplay","side","sideClass","isNotImplementedError","error","mapStateFilter","useTokenOrdersListScript","tokenAddress","initialStateFilter","initialOnlyThisToken","setStateFilterState","setOnlyThisToken","setStateFilter","useWalletLimitOrdersQuery","TokenOrdersListWidget","TokenTopTradersList","TraderRow","trader","useTokenTopTradersListScript","useTokenTopTradersQuery","rawTraders","TokenTopTradersListWidget","TokenDevTokensList","renderTokenLink","DevTokenRow","liquidity","vol1h","migrated","TokenDevTokensSummary","migratedCount","migratedPct","totalVol1h","acc","totalMarketCap","SummaryCell","useTokenDevTokensListScript","creator","useTokensByCreatorQuery","TokenDevTokensListWidget","showSummary","TokenChartBanner","athInUsd","athAt","globalFeesPaidInUsd","rank","onTogglePin","pinned","supply","Cell","useTokenChartBannerScript","TokenChartBannerWidget","TokenSimilarTokens","onTokenClick","useTokenSimilarTokensScript","enabled","useSearchTokensQuery","TokenSimilarTokensWidget","TokenReusedImageList","useTokenReusedImageListScript","_params","TokenReusedImageListWidget","TokenListKeywordsFilter","keywords","excludeKeywords","onKeywordsChange","onExcludeKeywordsChange","keywordsText","setKeywordsText","excludeKeywordsText","setExcludeKeywordsText","prevKeywords","parseKeywords","prevExcludeKeywords","handleKeywordsValueChange","handleExcludeKeywordsValueChange","parsedKeywords","TokenListProtocolFilter","protocols","selectedProtocols","onSelectedProtocolsChange","selected","setSelected","isAllSelected","handleSelectAll","handleSelect","newSelected","pc","formatTokenProtocolName","TokenListMinMaxFilter","field","min","setMin","parseValue","setMax","handleMinChange","formatValue","handleMaxChange","StyledNumberInput","TokenListAuditsFilter","values","onValuesChange","currentValues","setCurrentValues","handleValueChange","newValues","TokenListMetricsFilter","TokenListStatsFilter","curTab","setCurTab","handleValuesChange","auditsFiltersCount","fields","metricsFiltersCount","StyledLightTabs","Tab","StyledBadge","TokenListFilter","filters","onFiltersChange","setSelectedProtocols","parseSelectedProtocols","searchKeywords","setSearchKeywords","excludeSearchKeywords","setExcludeSearchKeywords","filterValues","setFilterValues","handleProtocolsChange","toFilters","handleKeywordsChange","handleExcludeKeywordsChange","handleFilterValuesChange","Fragment","TokenListFilterModal","useDisclosure","editingFilters","setEditingFilters","handleReset","handleApply","isEmptyFilters","FilterIcon","ScrollShadow","ModalFooter","RefreshIcon","triggerStyle","dropdownStyle","dividerStyle","TokenListFilterPopover","setIsOpen","containerRef","handleClickOutside","ChevronDown","open","TokenListFilterWidget","popoverPlacement","filterProps","TokenListResolutionSelectorDesktop","onResolutionChange","resolutionOptions","handleResolutionChange","StyledPlainTabs","option","TokenListResolutionSelectorMobile","handleEscape","ChevronDownIcon","TokenListResolutionSelectorWidget","props","TokenBlueChipCell","bluechipHoldingsRatio","ratioHigh","ratioLow","HorsePowerHighIcon","HorsePowerLowIcon","HorsePowerIcon","TokenCell","handleCopyToClipboard","COLOR_CLASS","InfoItem","color","TokenInfoCell","md","top10Warn","devWarn","sniperWarn","insiderWarn","bundleWarn","ratioColor","warn","TokenLiquidityCell","TokenMarketCapCell","TokenPriceCell","TokenTradersCell","buyers","sellers","TokenTradesCell","txs","TokenVolumesCell","volumes","buyVolumes","sellVolumes","SHIMMER_CSS","shimmer","bar","delay","w","ROW_COUNT","TokenListSkeleton","rowHeight","hasActions","d","TokenList","ActionsComponent","sortDirections","onSortChange","itemHeightMobile","handleRowClick","sorts","setSorts","handleSortChange","sort","StyledTable","TableHeader","TableColumn","Sortable","TableBody","TableRow","TableCell","useNewTokensScript","NewTokenListWidget","setSortDirections","sortDirection","useStockTokensScript","useStockTokensQuery","useStockTokensSubscription","StockTokenListWidget","TrendingTokenListWidget","DEFAULT_POLL_MS","useTokens","addresses","pollMs","query","useTokensQuery","subscribeClient","useDexClient","addrKeyRef","addrKey","subs","updated","refetch"],"mappings":"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","file":"index.mjs","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-tokens\"] = \"2.0.2\";\n}\n\nexport default \"2.0.2\";\n","import { ReactNode } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, PauseIcon } from \"@liberfi.io/ui\";\n\nexport interface PulseListHeaderProps {\n title: string;\n isPaused?: boolean;\n extra?: ReactNode;\n className?: string;\n}\n\nexport function PulseListHeader({\n title,\n isPaused,\n extra,\n className,\n}: PulseListHeaderProps) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"w-full h-12 px-3 flex-none bg-content1 flex items-center justify-between gap-4 border-b border-border\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <h2 className=\"font-semibold\">{title}</h2>\n {isPaused && (\n <div className=\"flex items-center gap-1 text-primary\">\n <PauseIcon className=\"w-4 h-4\" />\n <span className=\"text-xs hidden sm:inline\">\n {t(\"tokens.pulse.paused\")}\n </span>\n </div>\n )}\n </div>\n {extra && <div className=\"flex items-center gap-3\">{extra}</div>}\n </div>\n );\n}\n","import { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface PulseListItemSkeletonProps {\n isLast?: boolean;\n className?: string;\n}\n\nexport function PulseListItemSkeleton({\n isLast = false,\n className,\n}: PulseListItemSkeletonProps) {\n return (\n <div\n className={cn(\n \"w-full h-full px-3 py-3 overflow-hidden flex gap-3 items-center\",\n !isLast && \"border-b border-border\",\n className,\n )}\n >\n <Skeleton className=\"flex-none w-15 h-15 rounded-sm\" />\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"w-32 h-5 rounded-md\" />\n <Skeleton className=\"w-48 h-4 rounded-md\" />\n </div>\n </div>\n );\n}\n","import { SolanaTokenProtocol, type TokenProtocol } from \"@liberfi.io/types\";\n\n/**\n * Static class-name lookup for protocol brand colors.\n *\n * Tailwind uses static analysis — dynamically constructed class names like\n * `text-${protocol}` are invisible to the scanner. This map ensures every\n * class appears as a complete string literal so Tailwind generates the CSS.\n */\n\ninterface ProtocolClasses {\n text: string;\n bg: string;\n /** bg at 5 % opacity */\n bg5: string;\n /** bg at 20 % opacity */\n bg20: string;\n border: string;\n}\n\nconst CLASSES: Record<SolanaTokenProtocol, ProtocolClasses> = {\n [SolanaTokenProtocol.BAGS]: {\n text: \"text-bags\",\n bg: \"bg-bags\",\n bg5: \"bg-bags/5\",\n bg20: \"bg-bags/20\",\n border: \"border-bags\",\n },\n [SolanaTokenProtocol.BELIEVE]: {\n text: \"text-believe\",\n bg: \"bg-believe\",\n bg5: \"bg-believe/5\",\n bg20: \"bg-believe/20\",\n border: \"border-believe\",\n },\n [SolanaTokenProtocol.BONK]: {\n text: \"text-bonk\",\n bg: \"bg-bonk\",\n bg5: \"bg-bonk/5\",\n bg20: \"bg-bonk/20\",\n border: \"border-bonk\",\n },\n [SolanaTokenProtocol.BOOP]: {\n text: \"text-boop\",\n bg: \"bg-boop\",\n bg5: \"bg-boop/5\",\n bg20: \"bg-boop/20\",\n border: \"border-boop\",\n },\n [SolanaTokenProtocol.HEAVEN]: {\n text: \"text-heaven\",\n bg: \"bg-heaven\",\n bg5: \"bg-heaven/5\",\n bg20: \"bg-heaven/20\",\n border: \"border-heaven\",\n },\n [SolanaTokenProtocol.JUPSTUDIO]: {\n text: \"text-jupstudio\",\n bg: \"bg-jupstudio\",\n bg5: \"bg-jupstudio/5\",\n bg20: \"bg-jupstudio/20\",\n border: \"border-jupstudio\",\n },\n [SolanaTokenProtocol.LAUNCHLAB]: {\n text: \"text-launchlab\",\n bg: \"bg-launchlab\",\n bg5: \"bg-launchlab/5\",\n bg20: \"bg-launchlab/20\",\n border: \"border-launchlab\",\n },\n [SolanaTokenProtocol.METEORA]: {\n text: \"text-meteora\",\n bg: \"bg-meteora\",\n bg5: \"bg-meteora/5\",\n bg20: \"bg-meteora/20\",\n border: \"border-meteora\",\n },\n [SolanaTokenProtocol.MOONIT]: {\n text: \"text-moonit\",\n bg: \"bg-moonit\",\n bg5: \"bg-moonit/5\",\n bg20: \"bg-moonit/20\",\n border: \"border-moonit\",\n },\n [SolanaTokenProtocol.MOONSHOT]: {\n text: \"text-moonshot\",\n bg: \"bg-moonshot\",\n bg5: \"bg-moonshot/5\",\n bg20: \"bg-moonshot/20\",\n border: \"border-moonshot\",\n },\n [SolanaTokenProtocol.ORCA]: {\n text: \"text-orca\",\n bg: \"bg-orca\",\n bg5: \"bg-orca/5\",\n bg20: \"bg-orca/20\",\n border: \"border-orca\",\n },\n [SolanaTokenProtocol.PUMP]: {\n text: \"text-pump\",\n bg: \"bg-pump\",\n bg5: \"bg-pump/5\",\n bg20: \"bg-pump/20\",\n border: \"border-pump\",\n },\n [SolanaTokenProtocol.RAYDIUM]: {\n text: \"text-raydium\",\n bg: \"bg-raydium\",\n bg5: \"bg-raydium/5\",\n bg20: \"bg-raydium/20\",\n border: \"border-raydium\",\n },\n [SolanaTokenProtocol.SUGAR]: {\n text: \"text-sugar\",\n bg: \"bg-sugar\",\n bg5: \"bg-sugar/5\",\n bg20: \"bg-sugar/20\",\n border: \"border-sugar\",\n },\n [SolanaTokenProtocol.VIRTUAL_CURVE]: {\n text: \"text-virtual-curve\",\n bg: \"bg-virtual-curve\",\n bg5: \"bg-virtual-curve/5\",\n bg20: \"bg-virtual-curve/20\",\n border: \"border-virtual-curve\",\n },\n [SolanaTokenProtocol.PUMP_AMM]: {\n text: \"text-pump-amm\",\n bg: \"bg-pump-amm\",\n bg5: \"bg-pump-amm/5\",\n bg20: \"bg-pump-amm/20\",\n border: \"border-pump-amm\",\n },\n};\n\nconst FALLBACK: ProtocolClasses = {\n text: \"text-neutral\",\n bg: \"bg-neutral\",\n bg5: \"bg-neutral/5\",\n bg20: \"bg-neutral/20\",\n border: \"border-neutral\",\n};\n\nexport function protocolClasses(protocol: TokenProtocol): ProtocolClasses {\n return CLASSES[protocol as SolanaTokenProtocol] ?? FALLBACK;\n}\n","import {\n MouseEvent,\n PropsWithChildren,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { Token } from \"@liberfi.io/types\";\nimport { Avatar, CameraIcon, Image, StyledTooltip, cn } from \"@liberfi.io/ui\";\nimport {\n parseTokenProtocolFamily,\n searchImageUrl,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { protocolClasses } from \"../../utils/protocol-styles\";\n\nexport type TokenAvatarProps = {\n /** token data to display */\n token: Token;\n /** whether hover to preview the avatar */\n enablePreview?: boolean;\n /** whether click to search the avatar */\n enableSearch?: boolean;\n /** whether show the bonding curve progress */\n showProgress?: boolean;\n /** whether show the launch protocol family icon */\n showProtocolFamily?: boolean;\n /** radius of the avatar */\n radius?: \"none\" | \"sm\" | \"md\" | \"lg\";\n /** use this class to adjust the size of the avatar */\n className?: string;\n /** customize the styles */\n classNames?: {\n /** use this class to adjust the color of the avatar background, background is displayed when progress is not displayed */\n background?: string;\n /** use this class to adjust the color of the progress track */\n progress?: string;\n /** use this class to adjust the color of the avatar wrapper */\n avatarWrapper?: string;\n /** use this class to adjust the size of the avatar */\n avatar?: string;\n /** use this class to adjust the size of the protocol family icon's wrapper */\n protocolFamilyIconWrapper?: string;\n /** use this class to adjust the size of the protocol family icon */\n protocolFamilyIcon?: string;\n /** use this class to adjust the size & background color of the search wrapper */\n searchWrapper?: string;\n /** use this class to adjust the size & color of the search icon */\n searchIcon?: string;\n /** use this class to adjust the size of the preview wrapper */\n previewWrapper?: string;\n /** use this class to adjust the size of the avatar in the preview */\n previewAvatar?: string;\n /** use this class to adjust the size & background color of the search wrapper in the preview */\n previewSearchWrapper?: string;\n /** use this class to adjust the size & color of the search icon in the preview */\n previewSearchIcon?: string;\n };\n};\n\nexport function TokenAvatar({\n token,\n enablePreview = true,\n enableSearch = true,\n showProgress = true,\n showProtocolFamily = true,\n radius = \"sm\",\n className,\n classNames,\n}: TokenAvatarProps) {\n const formattedProtocolFamily = useMemo(\n () =>\n token.launchedFrom?.protocolFamily\n ? parseTokenProtocolFamily(\n token.chain,\n token.launchedFrom.protocolFamily,\n )\n : undefined,\n [token.chain, token.launchedFrom?.protocolFamily],\n );\n\n const displayProtocolFamily = useMemo(\n () => showProtocolFamily && formattedProtocolFamily,\n [showProtocolFamily, formattedProtocolFamily],\n );\n\n const displayProgress = useMemo(\n () =>\n showProgress &&\n token.migrateProgress &&\n new SafeBigNumber(token.migrateProgress).lt(100),\n [showProgress, token.migrateProgress],\n );\n\n const displaySearch = useMemo(\n () => enableSearch && token.image,\n [enableSearch, token.image],\n );\n\n const fallbackName = useMemo(\n () =>\n (token.symbol ?? token.name ?? token.address ?? \"L\")\n .slice(0, 1)\n .toUpperCase(),\n [token.symbol, token.name, token.address],\n );\n\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n // TODO use router adapter\n const handleSearch = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (!token.image) return;\n const url = searchImageUrl(token.image);\n window.open(url, \"_blank\");\n },\n [token.image],\n );\n\n return (\n <div\n className={cn(\n \"relative justify-center items-center\",\n className ?? \"w-15 h-15\",\n )}\n >\n {/* if progress is not displayed, fill the background with the protocol family color */}\n {!displayProgress && (\n <div\n className={cn(\n \"absolute inset-0\",\n `rounded-${radius}`,\n formattedProtocolFamily\n ? protocolClasses(formattedProtocolFamily).bg\n : \"bg-bullish\",\n classNames?.background,\n )}\n />\n )}\n\n {/* if progress is displayed, display the progress track with the protocol family color */}\n {displayProgress && (\n <div className={cn(\"absolute -inset-0.5\", `rounded-${radius}`)}>\n <ProgressTrack\n className={cn(\n formattedProtocolFamily\n ? protocolClasses(formattedProtocolFamily).text\n : \"text-bullish\",\n classNames?.progress,\n )}\n progress={token.migrateProgress ?? \"0\"}\n />\n </div>\n )}\n\n {/* avatar fallback border */}\n <div\n className={cn(\n \"absolute inset-0 p-px flex items-center justify-center\",\n `rounded-${radius}`,\n formattedProtocolFamily\n ? protocolClasses(formattedProtocolFamily).bg20\n : \"bg-bullish/20\",\n classNames?.avatarWrapper,\n )}\n >\n {/* preview the avatar */}\n <PreviewWrapper\n token={token}\n radius={radius}\n enableSearch={enableSearch}\n enablePreview={enablePreview}\n classNames={classNames}\n >\n {/* this is the gap between border & avatar, should fill with the gray background color */}\n <div\n className={cn(\n \"relative w-full h-full bg-content1 flex items-center justify-center p-0.5\",\n `rounded-${radius}`,\n // click to search\n isHovered && displaySearch && \"cursor-pointer\",\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* avatar */}\n <Avatar\n showFallback\n src={token.image}\n name={fallbackName}\n className={cn(\n \"w-full h-full bg-content1 text-neutral text-2xl\",\n `rounded-${radius}`,\n classNames?.avatar,\n )}\n />\n\n {/* hover to search mask */}\n {isHovered && displaySearch && (\n <div\n className={cn(\n \"absolute inset-0 bg-content1/80 flex items-center justify-center\",\n `rounded-${radius}`,\n classNames?.searchWrapper,\n )}\n onClick={handleSearch}\n >\n <CameraIcon className={cn(\"w-6 h-6\", classNames?.searchIcon)} />\n </div>\n )}\n </div>\n </PreviewWrapper>\n </div>\n\n {/* protocol family icon */}\n {displayProtocolFamily && (\n <div className=\"contents\">\n <StyledTooltip\n content={\n token.launchedFrom?.protocolFamily ?? formattedProtocolFamily\n }\n placement=\"bottom\"\n >\n <div\n className={cn(\n \"absolute -bottom-1 -right-1 rounded-full p-px w-4 h-4\",\n formattedProtocolFamily &&\n protocolClasses(formattedProtocolFamily).bg,\n classNames?.protocolFamilyIconWrapper,\n )}\n >\n <Image\n removeWrapper\n src={`/images/protocols/${formattedProtocolFamily}.svg`}\n className={cn(\n \"w-full h-full rounded-full bg-content1\",\n classNames?.protocolFamilyIcon,\n )}\n />\n </div>\n </StyledTooltip>\n </div>\n )}\n </div>\n );\n}\n\nfunction PreviewWrapper({\n token,\n radius,\n enableSearch,\n enablePreview,\n classNames,\n children,\n}: PropsWithChildren<\n Pick<\n TokenAvatarProps,\n \"token\" | \"radius\" | \"enableSearch\" | \"enablePreview\" | \"classNames\"\n >\n>) {\n const displayPreview = useMemo(\n () => enablePreview && token.image,\n [enablePreview, token.image],\n );\n\n return displayPreview ? (\n <StyledTooltip\n content={\n <Preview\n token={token}\n radius={radius}\n enableSearch={enableSearch}\n classNames={classNames}\n />\n }\n closeDelay={100}\n placement=\"bottom-start\"\n classNames={{ content: \"p-1\" }}\n >\n {children}\n </StyledTooltip>\n ) : (\n children\n );\n}\n\nfunction Preview({\n token,\n enableSearch,\n radius,\n classNames,\n}: Pick<TokenAvatarProps, \"token\" | \"radius\" | \"enableSearch\" | \"classNames\">) {\n const displaySearch = useMemo(\n () => enableSearch && token.image,\n [enableSearch, token.image],\n );\n\n const fallbackName = useMemo(\n () =>\n (token.symbol ?? token.name ?? token.address ?? \"L\")\n .slice(0, 1)\n .toUpperCase(),\n [token.symbol, token.name, token.address],\n );\n\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n // TODO use router adapter\n const handleSearch = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (!token.image) return;\n const url = searchImageUrl(token.image);\n window.open(url, \"_blank\");\n },\n [token.image],\n );\n\n return (\n <div\n className={cn(\n \"relative flex items-center justify-center w-60 h-60\",\n `rounded-${radius}`,\n isHovered && displaySearch && \"cursor-pointer\",\n classNames?.previewWrapper,\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <Avatar\n showFallback\n src={token.image}\n name={fallbackName}\n className={cn(\n \"w-full h-full bg-content1 text-neutral text-3xl\",\n `rounded-${radius}`,\n classNames?.previewAvatar,\n )}\n />\n\n {/* hover to search mask */}\n {isHovered && displaySearch && (\n <div\n className={cn(\n \"absolute inset-0 bg-content1/80 flex items-center justify-center\",\n `rounded-${radius}`,\n classNames?.previewSearchWrapper,\n )}\n onClick={handleSearch}\n >\n <CameraIcon\n className={cn(\"w-10 h-10\", classNames?.previewSearchIcon)}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction ProgressTrack({\n progress,\n className,\n}: {\n progress: string | number;\n className?: string;\n}) {\n const strokeDashoffset = useMemo(\n () => 296 - (Number(progress) * 296) / 100,\n [progress],\n );\n return (\n <svg viewBox=\"0 0 78 78\" className=\"w-full h-full\">\n <path\n className={`${className} opacity-40`}\n stroke=\"currentColor\"\n fill=\"transparent\"\n strokeWidth=\"1\"\n d=\"\n M 76 76\n L 6 76\n Q 2 76 2 72\n L 2 6\n Q 2 2 6 2\n L 72 2\n Q 76 2 76 6\n L 76 72\n Q 76 76 76 76\n \"\n ></path>\n <path\n className={`${className} transition-all duration-300 ease-in-out`}\n stroke=\"currentColor\"\n fill=\"transparent\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeDasharray=\"296\"\n strokeDashoffset={strokeDashoffset}\n d=\"\n M 76 76\n L 6 76\n Q 2 76 2 72\n L 2 6\n Q 2 2 6 2\n L 72 2\n Q 76 2 76 6\n L 76 72\n Q 76 76 76 76\n \"\n ></path>\n </svg>\n );\n}\n","import { MouseEvent, ReactNode, useCallback, useMemo } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport {\n BundlesIcon,\n cn,\n CookIcon,\n CopyIcon,\n KlineCandlesIcon,\n Link,\n PeopleIcon,\n RatIcon,\n SearchIcon,\n SniperIcon,\n StarIcon,\n StyledTooltip,\n TelegramIcon,\n TwitterIcon,\n toast,\n useCopyToClipboard,\n UserWithStarBadgeIcon,\n WebsiteIcon,\n} from \"@liberfi.io/ui\";\nimport {\n formatAge,\n formatAmount,\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n searchTwitterUrl,\n truncateAddress,\n} from \"@liberfi.io/utils\";\nimport { TokenAvatar } from \"../token-avatar\";\n\nexport interface PulseListItemProps {\n /** token data */\n token: Token;\n /** custom render for item action (e.g. instant buy button) */\n renderAction?: (token: Token) => ReactNode;\n /** whether this is the last item */\n isLast?: boolean;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function PulseListItem({\n token,\n renderAction,\n isLast = false,\n onSelectToken,\n className,\n}: PulseListItemProps) {\n const { t } = useTranslation();\n const copyToClipboard = useCopyToClipboard();\n const age = useTickAge(token.createdAt);\n\n const handleClick = useCallback(() => {\n onSelectToken?.(token);\n }, [onSelectToken, token]);\n\n const handleCopyAddress = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation();\n copyToClipboard(token.address, () =>\n toast.success(t(\"tokens.copied.address\")),\n );\n },\n [copyToClipboard, token.address, t],\n );\n\n const top10Warning = useMemo(\n () => new SafeBigNumber(token.marketData?.top10HoldingsRatio).gte(0.1),\n [token.marketData?.top10HoldingsRatio],\n );\n\n const devWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.devHoldingsRatio).gte(0.1),\n [token.marketData?.devHoldingsRatio],\n );\n\n const insiderWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.insiderHoldingsRatio).gte(0.1),\n [token.marketData?.insiderHoldingsRatio],\n );\n\n const sniperWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.sniperHoldingsRatio).gte(0.1),\n [token.marketData?.sniperHoldingsRatio],\n );\n\n const bundleWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.bundleHoldingsRatio).gte(0.1),\n [token.marketData?.bundleHoldingsRatio],\n );\n\n const [buyW, sellW] = useMemo(() => {\n const buys = Number(token.stats?.[\"1h\"]?.buys ?? 0);\n const sells = Number(token.stats?.[\"1h\"]?.sells ?? 0);\n const total = buys + sells;\n if (total === 0) return [12, 12];\n const buyWidth = Math.round((buys / total) * 24);\n return [buyWidth, 24 - buyWidth];\n }, [token.stats]);\n\n const marketCapColorClass = useMemo(() => {\n const cap = new SafeBigNumber(token.marketData?.marketCapInUsd);\n if (cap.lt(1000)) return \"text-foreground\";\n if (cap.lt(1_000_000)) return \"text-secondary\";\n return \"text-primary\";\n }, [token.marketData?.marketCapInUsd]);\n\n return (\n <div\n className={cn(\n \"w-full h-full px-3 pt-3 pb-1 hover:bg-content2/40 cursor-pointer\",\n !isLast && \"border-b border-border\",\n className,\n )}\n onClick={onSelectToken ? handleClick : undefined}\n >\n <div className=\"relative flex justify-between gap-3\">\n {/* left: avatar + address */}\n <div className=\"flex-none flex flex-col items-center gap-1\">\n <TokenAvatar\n token={token}\n enableSearch\n enablePreview={!!token.image}\n showProgress\n className=\"w-15 h-15\"\n />\n <StyledTooltip content={token.address}>\n <div\n className=\"text-xs text-neutral hover:text-primary/50 max-w-18 truncate cursor-pointer\"\n onClick={handleCopyAddress}\n >\n {truncateAddress(token.address, 4, 4)}\n </div>\n </StyledTooltip>\n </div>\n\n {/* center: token infos */}\n <div className=\"flex-1 flex flex-col justify-between gap-3 min-w-0\">\n {/* top: symbol + name + age + links + holders */}\n <div className=\"flex flex-col gap-1.5\">\n {/* symbol + name + copy */}\n <div className=\"flex items-center gap-1 pr-24\">\n <span className=\"flex-none text-base font-semibold whitespace-nowrap overflow-hidden text-ellipsis max-w-20\">\n {token.symbol}\n </span>\n <StyledTooltip content={token.name}>\n <div\n className=\"flex items-center gap-1 min-w-0 text-neutral hover:text-primary/50 cursor-pointer\"\n onClick={handleCopyAddress}\n >\n <span className=\"text-base whitespace-nowrap overflow-hidden text-ellipsis\">\n {token.name}\n </span>\n <CopyIcon className=\"flex-none w-3.5 h-3.5\" />\n </div>\n </StyledTooltip>\n </div>\n\n {/* age + social links + holders */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm text-primary font-medium\">\n {formatAge(age)}\n </span>\n\n {token.socialMedias?.twitter && (\n <Link\n href={token.socialMedias.twitter}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <TwitterIcon className=\"w-4 h-4\" />\n </Link>\n )}\n {token.socialMedias?.telegram && (\n <Link\n href={token.socialMedias.telegram}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <TelegramIcon className=\"w-4 h-4\" />\n </Link>\n )}\n {token.socialMedias?.website && (\n <Link\n href={token.socialMedias.website}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <WebsiteIcon className=\"w-4 h-4\" />\n </Link>\n )}\n <Link\n href={searchTwitterUrl(`${token.symbol} OR ${token.address}`)}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <SearchIcon className=\"w-4 h-4\" />\n </Link>\n\n <StyledTooltip content={t(\"tokens.tokenInfo.holders\")}>\n <div className=\"flex items-center gap-0.5 text-neutral\">\n <PeopleIcon width={14} height={14} />\n <span className=\"text-foreground text-xs\">\n {formatAmount(token.marketData?.holders)}\n </span>\n </div>\n </StyledTooltip>\n\n <StyledTooltip content={t(\"tokens.tokenInfo.proHolders\")}>\n <div className=\"flex items-center gap-0.5 text-neutral\">\n <KlineCandlesIcon width={16} height={16} />\n <span className=\"text-foreground text-xs\">\n {formatAmount(token.marketData?.proHolders)}\n </span>\n </div>\n </StyledTooltip>\n\n <StyledTooltip content={t(\"tokens.tokenInfo.kolHolders\")}>\n <div className=\"flex items-center gap-0.5 text-neutral\">\n <StarIcon width={14} height={14} />\n <span className=\"text-foreground text-xs\">\n {formatAmount(token.marketData?.kolHolders)}\n </span>\n </div>\n </StyledTooltip>\n </div>\n </div>\n\n {/* bottom: holding ratios + action */}\n <div className=\"relative flex items-center gap-1.5 flex-wrap\">\n <HoldingRatioChip\n icon={<UserWithStarBadgeIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.top10HoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.top10HoldingsRatio\")}\n warning={top10Warning}\n />\n <HoldingRatioChip\n icon={<CookIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.devHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.devHoldingsRatio\")}\n warning={devWarning}\n />\n <HoldingRatioChip\n icon={<RatIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.insiderHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.insiderHoldingsRatio\")}\n warning={insiderWarning}\n />\n <HoldingRatioChip\n icon={<SniperIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.sniperHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.sniperHoldingsRatio\")}\n warning={sniperWarning}\n />\n <HoldingRatioChip\n icon={<BundlesIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.bundleHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.bundleHoldingsRatio\")}\n warning={bundleWarning}\n />\n\n {renderAction?.(token)}\n </div>\n </div>\n\n {/* right: market data (absolute positioned) */}\n <div className=\"absolute top-0 right-0 flex flex-col gap-2 items-end\">\n <div className=\"flex items-end gap-1\">\n <span className=\"text-xs leading-none text-neutral\">\n {t(\"tokens.listHeader.marketCap\")}\n </span>\n <span\n className={cn(\n \"text-base font-medium leading-none\",\n marketCapColorClass,\n )}\n >\n {formatAmountUSDCompact(token.marketData?.marketCapInUsd)}\n </span>\n </div>\n\n <div className=\"flex items-end gap-1\">\n <span className=\"text-xs leading-none text-neutral\">\n {t(\"tokens.pulse.vol\")}\n </span>\n <span className=\"text-base font-medium leading-none text-foreground\">\n {formatAmountUSDCompact(token.stats?.[\"1h\"]?.volumesInUsd)}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs leading-none text-neutral\">\n {t(\"tokens.pulse.txs\")}\n </span>\n <span className=\"text-xs leading-none text-foreground\">\n {formatAmount(token.stats?.[\"1h\"]?.trades)}\n </span>\n </div>\n <div className=\"flex rounded-full overflow-hidden\">\n <div className=\"h-1 bg-bullish\" style={{ width: `${buyW}px` }} />\n <div className=\"h-1 bg-bearish\" style={{ width: `${sellW}px` }} />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction HoldingRatioChip({\n icon,\n value,\n tooltip,\n warning,\n}: {\n icon: ReactNode;\n value: string;\n tooltip: string;\n warning: boolean;\n}) {\n return (\n <StyledTooltip content={tooltip}>\n <div\n className={cn(\n \"px-2 py-0.5 flex items-center gap-1 bg-content2 rounded-full text-xs\",\n warning ? \"text-danger-500\" : \"text-primary\",\n )}\n >\n {icon}\n <span>{value}</span>\n </div>\n </StyledTooltip>\n );\n}\n","import { ReactElement, ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { PulseListHeader } from \"./pulse-list-header.ui\";\nimport { PulseListItemSkeleton } from \"./pulse-list-item-skeleton.ui\";\nimport { PulseListItem } from \"./pulse-list-item.ui\";\n\nconst DEFAULT_ITEM_HEIGHT = 124;\nconst SKELETON_COUNT = 10;\n\nexport interface PulseListProps {\n /** list title */\n title: string;\n /** tokens to display */\n tokens?: Token[];\n /** whether the list is loading */\n isLoading?: boolean;\n /** height of each item, default is 124 */\n itemHeight?: number;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** called when the list should pause/resume adding new items (e.g. mouse hover) */\n onPauseChange?: (isPaused: boolean) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\ninterface PulseListRowData {\n data: Token[] | undefined;\n skeletonCount: number;\n renderItemAction?: (token: Token) => ReactNode;\n onSelectToken?: (token: Token) => void;\n}\n\nfunction PulseListRow({\n index,\n style,\n data,\n skeletonCount,\n renderItemAction,\n onSelectToken,\n}: RowComponentProps<PulseListRowData>): ReactElement {\n if (!data) {\n return (\n <div style={style}>\n <PulseListItemSkeleton isLast={index === skeletonCount - 1} />\n </div>\n );\n }\n return (\n <div style={style}>\n <PulseListItem\n token={data[index]}\n isLast={index === data.length - 1}\n renderAction={renderItemAction}\n onSelectToken={onSelectToken}\n />\n </div>\n );\n}\n\nexport function PulseList({\n title,\n tokens,\n isLoading,\n itemHeight = DEFAULT_ITEM_HEIGHT,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n onPauseChange,\n className,\n hideHeader,\n}: PulseListProps) {\n const data = isLoading || !tokens ? undefined : tokens;\n const itemCount = data ? data.length : SKELETON_COUNT;\n\n const rowProps = useMemo<PulseListRowData>(\n () => ({\n data,\n skeletonCount: SKELETON_COUNT,\n renderItemAction,\n onSelectToken,\n }),\n [data, renderItemAction, onSelectToken],\n );\n\n const [isPaused, setIsPaused] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsPaused(true);\n onPauseChange?.(true);\n }, [onPauseChange]);\n\n const handleMouseLeave = useCallback(() => {\n setIsPaused(false);\n onPauseChange?.(false);\n }, [onPauseChange]);\n\n return (\n <div\n className={cn(\n \"w-full h-full bg-content1 overflow-hidden flex flex-col border border-border rounded-lg\",\n className,\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {!hideHeader && (\n <PulseListHeader\n title={title}\n isPaused={isPaused}\n extra={renderHeaderExtra}\n />\n )}\n <div className=\"flex-1 w-full overflow-hidden\">\n <List\n className=\"h-full w-full\"\n rowCount={itemCount}\n rowHeight={itemHeight}\n rowComponent={PulseListRow}\n rowProps={rowProps}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n","import type {\n API,\n Token,\n TokenLaunchedFrom,\n TokenMarketData,\n TokenMigratedTo,\n TokenSecurity,\n TokenSocialMedias,\n TokenStats,\n} from \"@liberfi.io/types\";\n\n/**\n * Shallow-merge only defined (non-undefined) fields from `incoming` into `existing`.\n */\nexport function assignDefined<T extends object>(\n existing: T,\n incoming: Partial<T>,\n): T {\n const result = { ...existing };\n for (const key of Object.keys(incoming) as Array<keyof T>) {\n if (incoming[key] !== undefined) {\n result[key] = incoming[key] as T[keyof T];\n }\n }\n return result;\n}\n\nconst STATS_TIMEFRAMES = [\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"4h\", \"24h\"] as const;\n\n/**\n * Deep-merge stats: for each timeframe, merge fields individually (skip undefined).\n */\nexport function mergeStats(\n existing: TokenStats | undefined,\n incoming: TokenStats | undefined,\n): TokenStats | undefined {\n if (!incoming) return existing;\n if (!existing) return incoming;\n\n const result: TokenStats = { ...existing };\n for (const tf of STATS_TIMEFRAMES) {\n if (incoming[tf]) {\n result[tf] = existing[tf]\n ? assignDefined(existing[tf], incoming[tf]!)\n : incoming[tf];\n }\n }\n return result;\n}\n\n/**\n * Merge market data fields individually (skip undefined).\n */\nexport function mergeMarketData(\n existing: TokenMarketData | undefined,\n incoming: TokenMarketData | undefined,\n): TokenMarketData | undefined {\n if (!incoming) return existing;\n if (!existing) return incoming;\n\n return assignDefined(existing, incoming);\n}\n\nfunction mergeOptional<T extends object>(\n existing: T | undefined,\n incoming: T | undefined,\n): T | undefined {\n if (!incoming) return existing;\n if (!existing) return incoming;\n return assignDefined(existing, incoming);\n}\n\n/**\n * Merge a `TokenSubscribed` (partial token update) into an existing `Token`.\n * - `stats` is deep-merged per timeframe\n * - `marketData` / `socialMedias` / `security` / `launchedFrom` / `migratedTo`\n * are shallow-merged (skip undefined)\n * - arrays and primitives are replaced wholesale\n */\nexport function mergeToken(\n existing: Token,\n incoming: API.TokenSubscribed,\n): Token {\n const {\n chain: _c,\n address: _a,\n stats,\n marketData,\n socialMedias,\n security,\n launchedFrom,\n migratedTo,\n ...rest\n } = incoming;\n\n const merged: Token = { ...existing };\n\n for (const key of Object.keys(rest) as Array<keyof typeof rest>) {\n if (rest[key] !== undefined) {\n (merged as unknown as Record<string, unknown>)[key] = rest[key];\n }\n }\n\n merged.stats = mergeStats(existing.stats, stats);\n merged.marketData = mergeMarketData(existing.marketData, marketData);\n merged.socialMedias = mergeOptional<TokenSocialMedias>(\n existing.socialMedias,\n socialMedias,\n );\n merged.security = mergeOptional<TokenSecurity>(existing.security, security);\n merged.launchedFrom = mergeOptional<TokenLaunchedFrom>(\n existing.launchedFrom,\n launchedFrom,\n );\n merged.migratedTo = mergeOptional<TokenMigratedTo>(\n existing.migratedTo,\n migratedTo,\n );\n\n return merged;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNewTokensQuery, useNewTokensSubscription } from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\n\nconst MAX_ITEMS = 80;\n\nexport type UsePulseNewListScriptParams = {\n /** chain id */\n chain: Chain;\n /** whether to pause adding new items (existing items still update) */\n isPaused?: boolean;\n /** refetch interval in milliseconds */\n refetchInterval?: number;\n};\n\nexport type UsePulseNewListScriptResult = {\n /** whether tokens are loading */\n isLoading: boolean;\n /** token list */\n tokens: Token[];\n};\n\nfunction tokenFromSubscribed(sub: API.TokenSubscribed): Token {\n return {\n chain: sub.chain,\n address: sub.address,\n name: sub.name ?? \"\",\n symbol: sub.symbol ?? \"\",\n decimals: sub.decimals ?? 0,\n image: sub.image,\n description: sub.description,\n socialMedias: sub.socialMedias,\n launchedFrom: sub.launchedFrom,\n migratedTo: sub.migratedTo,\n createdAt: sub.createdAt,\n };\n}\n\nfunction sortAndLimit(tokens: Token[]): Token[] {\n tokens.sort((a, b) => {\n const at = a.createdAt?.getTime() ?? 0;\n const bt = b.createdAt?.getTime() ?? 0;\n return bt - at;\n });\n return tokens.slice(0, MAX_ITEMS);\n}\n\nexport function usePulseNewListScript({\n chain,\n isPaused = false,\n refetchInterval = 10_000,\n}: UsePulseNewListScriptParams): UsePulseNewListScriptResult {\n const queryParams = useMemo(() => ({ chain }), [chain]);\n\n const pausedRef = useRef(isPaused);\n pausedRef.current = isPaused;\n\n const prevChainRef = useRef(chain);\n const [isChainChanged, setIsChainChanged] = useState(true);\n\n const [tokens, setTokens] = useState<Token[]>([]);\n\n useEffect(() => {\n if (chain !== prevChainRef.current) {\n setIsChainChanged(true);\n setTokens([]);\n prevChainRef.current = chain;\n }\n }, [chain]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useNewTokensQuery(queryParams, {\n refetchInterval,\n });\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const paused = pausedRef.current;\n // When list is empty and we have data, always fill (so hover popover is not empty when isPaused)\n const isFirstFill = prev.length === 0 && fetchedTokens.length > 0;\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else if (!paused || isFirstFill) {\n merged.push(token);\n }\n }\n return paused ? merged : sortAndLimit(merged);\n });\n setIsChainChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates (new tokens, metadata, stats, etc.) ---\n const handleUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const paused = pausedRef.current;\n const merged = [...prev];\n let changed = false;\n for (const sub of data) {\n const idx = merged.findIndex((t) => t.address === sub.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], sub);\n } else if (!paused) {\n changed = true;\n merged.push(tokenFromSubscribed(sub));\n }\n }\n if (!changed) return prev;\n return paused ? merged : sortAndLimit(merged);\n });\n }, []);\n\n useNewTokensSubscription({ chain }, handleUpdate);\n\n // --- loading state ---\n const isLoading = useMemo(\n () => isPending || isChainChanged,\n [isPending, isChainChanged],\n );\n\n return { tokens, isLoading };\n}\n","import { ReactNode, useCallback, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { PulseList } from \"./pulse-list.ui\";\nimport { usePulseNewListScript } from \"./pulse-new-list.script\";\n\nexport interface PulseNewListWidgetProps {\n /** chain id */\n chain: Chain;\n /** list title */\n title: string;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\nexport function PulseNewListWidget({\n chain,\n title,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n className,\n hideHeader,\n}: PulseNewListWidgetProps) {\n const [isPaused, setIsPaused] = useState(false);\n const { tokens, isLoading } = usePulseNewListScript({ chain, isPaused });\n\n const handlePauseChange = useCallback((paused: boolean) => {\n setIsPaused(paused);\n }, []);\n\n return (\n <PulseList\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n renderHeaderExtra={renderHeaderExtra}\n renderItemAction={renderItemAction}\n onSelectToken={onSelectToken}\n onPauseChange={handlePauseChange}\n className={className}\n hideHeader={hideHeader}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useMigratedTokensQuery,\n useMigratedTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\n\nexport type UsePulseMigratedListScriptParams = {\n /** chain id */\n chain: Chain;\n /** whether to pause adding new items (existing items still update) */\n isPaused?: boolean;\n /** refetch interval in milliseconds */\n refetchInterval?: number;\n};\n\nexport type UsePulseMigratedListScriptResult = {\n /** whether tokens are loading */\n isLoading: boolean;\n /** token list */\n tokens: Token[];\n};\n\nexport function usePulseMigratedListScript({\n chain,\n isPaused = false,\n refetchInterval = 30_000,\n}: UsePulseMigratedListScriptParams): UsePulseMigratedListScriptResult {\n const queryParams = useMemo(() => ({ chain }), [chain]);\n\n const pausedRef = useRef(isPaused);\n pausedRef.current = isPaused;\n\n const prevChainRef = useRef(chain);\n const [isChainChanged, setIsChainChanged] = useState(true);\n\n const [tokens, setTokens] = useState<Token[]>([]);\n\n useEffect(() => {\n if (chain !== prevChainRef.current) {\n setIsChainChanged(true);\n setTokens([]);\n prevChainRef.current = chain;\n }\n }, [chain]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useMigratedTokensQuery(\n queryParams,\n { refetchInterval },\n );\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const paused = pausedRef.current;\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else if (!paused) {\n merged.unshift(token);\n }\n }\n return merged;\n });\n setIsChainChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useMigratedTokensSubscription({ chain }, handleDataUpdate);\n\n // --- loading state ---\n const isLoading = useMemo(\n () => isPending || isChainChanged,\n [isPending, isChainChanged],\n );\n\n return { tokens, isLoading };\n}\n","import { ReactNode, useCallback, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { PulseList } from \"./pulse-list.ui\";\nimport { usePulseMigratedListScript } from \"./pulse-migrated-list.script\";\n\nexport interface PulseMigratedListWidgetProps {\n /** chain id */\n chain: Chain;\n /** list title */\n title: string;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\nexport function PulseMigratedListWidget({\n chain,\n title,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n className,\n hideHeader,\n}: PulseMigratedListWidgetProps) {\n const [isPaused, setIsPaused] = useState(false);\n const { tokens, isLoading } = usePulseMigratedListScript({\n chain,\n isPaused,\n });\n\n const handlePauseChange = useCallback((paused: boolean) => {\n setIsPaused(paused);\n }, []);\n\n return (\n <PulseList\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n renderHeaderExtra={renderHeaderExtra}\n renderItemAction={renderItemAction}\n onSelectToken={onSelectToken}\n onPauseChange={handlePauseChange}\n className={className}\n hideHeader={hideHeader}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useFinalStretchTokensQuery,\n useFinalStretchTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\n\nexport type UsePulseFinalStretchListScriptParams = {\n /** chain id */\n chain: Chain;\n /** whether to pause adding new items (existing items still update) */\n isPaused?: boolean;\n /** refetch interval in milliseconds */\n refetchInterval?: number;\n};\n\nexport type UsePulseFinalStretchListScriptResult = {\n /** whether tokens are loading */\n isLoading: boolean;\n /** token list */\n tokens: Token[];\n};\n\nfunction sortByMigrateProgress(tokens: Token[]): Token[] {\n return tokens.sort((a, b) => {\n const ar = Number(a.migrateProgress ?? 0);\n const br = Number(b.migrateProgress ?? 0);\n return br - ar;\n });\n}\n\nexport function usePulseFinalStretchListScript({\n chain,\n isPaused = false,\n refetchInterval = 15_000,\n}: UsePulseFinalStretchListScriptParams): UsePulseFinalStretchListScriptResult {\n const queryParams = useMemo(() => ({ chain }), [chain]);\n\n const pausedRef = useRef(isPaused);\n pausedRef.current = isPaused;\n\n const prevChainRef = useRef(chain);\n const [isChainChanged, setIsChainChanged] = useState(true);\n\n const [tokens, setTokens] = useState<Token[]>([]);\n\n useEffect(() => {\n if (chain !== prevChainRef.current) {\n setIsChainChanged(true);\n setTokens([]);\n prevChainRef.current = chain;\n }\n }, [chain]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useFinalStretchTokensQuery(\n queryParams,\n { refetchInterval },\n );\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const paused = pausedRef.current;\n // When list is empty and we have data, always fill (so hover popover is not empty when isPaused)\n const isFirstFill = prev.length === 0 && fetchedTokens.length > 0;\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else if (!paused || isFirstFill) {\n merged.push(token);\n }\n }\n return paused ? merged : sortByMigrateProgress(merged);\n });\n setIsChainChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useFinalStretchTokensSubscription({ chain }, handleDataUpdate);\n\n // --- loading state ---\n const isLoading = useMemo(\n () => isPending || isChainChanged,\n [isPending, isChainChanged],\n );\n\n return { tokens, isLoading };\n}\n","import { ReactNode, useCallback, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { usePulseFinalStretchListScript } from \"./pulse-final-stretch-list.script\";\nimport { PulseList } from \"./pulse-list.ui\";\n\nexport interface PulseFinalStretchListWidgetProps {\n /** chain id */\n chain: Chain;\n /** list title */\n title: string;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\nexport function PulseFinalStretchListWidget({\n chain,\n title,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n className,\n hideHeader,\n}: PulseFinalStretchListWidgetProps) {\n const [isPaused, setIsPaused] = useState(false);\n const { tokens, isLoading } = usePulseFinalStretchListScript({\n chain,\n isPaused,\n });\n\n const handlePauseChange = useCallback((paused: boolean) => {\n setIsPaused(paused);\n }, []);\n\n return (\n <PulseList\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n renderHeaderExtra={renderHeaderExtra}\n renderItemAction={renderItemAction}\n onSelectToken={onSelectToken}\n onPauseChange={handlePauseChange}\n className={className}\n hideHeader={hideHeader}\n />\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function useSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"tokens.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { useSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = useSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called with clipboard text when paste button is pressed */\n onPaste?: (text: string) => void;\n /** Called when Escape is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"bordered\"\n radius=\"full\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"tokens.search.placeholder\")}\n classNames={{\n inputWrapper: [\n \"!bg-[rgba(39,39,42,0.6)]\",\n \"!border-[rgba(63,63,70,0.5)]\",\n \"data-[hover=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!border-[rgba(63,63,70,0.8)]\",\n ].join(\" \"),\n }}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-[rgba(63,63,70,0.5)] rounded-full cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport { cn, TriangleDownIcon, TriangleUpIcon } from \"@liberfi.io/ui\";\nimport {\n formatAge,\n formatAmountUSD,\n formatPercent,\n formatPriceUSD,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { TokenAvatar } from \"../token-avatar\";\n\nexport type SearchResultItemUIProps = {\n token: Token;\n className?: string;\n};\n\nexport function SearchResultItemUI({\n token,\n className,\n}: SearchResultItemUIProps) {\n const { t } = useTranslation();\n const age = useTickAge(token.createdAt);\n\n const price = useMemo(() => token.marketData?.priceInUsd, [token]);\n const marketCap = useMemo(() => token.marketData?.marketCapInUsd, [token]);\n const tvl = useMemo(() => token.marketData?.tvlInUsd, [token]);\n\n const priceChange = useMemo(() => token.stats?.[\"24h\"]?.priceChange, [token]);\n const priceChangeAbs = useMemo(\n () =>\n priceChange ? new SafeBigNumber(priceChange).abs().toString() : undefined,\n [priceChange],\n );\n const bullish = useMemo(\n () => priceChange != null && new SafeBigNumber(priceChange).gte(0),\n [priceChange],\n );\n\n return (\n <div\n className={cn(\n \"w-full h-full px-3 flex items-center justify-between gap-2\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n className,\n )}\n >\n {/* Left: avatar + token info */}\n <div className=\"flex-1 min-w-0 flex items-center gap-2.5\">\n <TokenAvatar\n token={token}\n className=\"w-10 h-10 flex-none\"\n showProtocolFamily\n classNames={{\n searchIcon: \"w-5 h-5\",\n }}\n />\n <div className=\"flex-1 min-w-0 flex flex-col gap-0.5\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-sm truncate\">{token.symbol}</span>\n <span className=\"text-xs text-primary font-medium\">\n {formatAge(age)}\n </span>\n </div>\n <div className=\"flex items-center gap-1 text-xs text-neutral\">\n <span>\n {t(\"tokens.listHeader.mcShort\")} {formatAmountUSD(marketCap)}\n </span>\n <span>/</span>\n <span>\n {t(\"tokens.listHeader.liqShort\")} {formatAmountUSD(tvl)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Right: price + change */}\n <div className=\"flex-none w-20 flex flex-col items-end\">\n <span className=\"text-xs\">{formatPriceUSD(price)}</span>\n <span\n className={cn(\n \"inline-flex gap-0.5 items-center text-xs\",\n bullish ? \"text-bullish\" : \"text-bearish\",\n )}\n >\n {bullish ? (\n <TriangleUpIcon width={8} height={8} />\n ) : (\n <TriangleDownIcon width={8} height={8} />\n )}\n <span>{formatPercent(priceChangeAbs)}</span>\n </span>\n </div>\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface SearchResultListHeaderProps {\n className?: string;\n}\n\nexport function SearchResultListHeader({\n className,\n}: SearchResultListHeaderProps) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"h-9 px-3 flex items-center justify-between\",\n \"text-xs font-medium text-neutral\",\n \"sticky top-0 z-10\",\n className,\n )}\n >\n <div className=\"flex-1\">\n <span>\n {t(\"tokens.listHeader.token\")} / {t(\"tokens.listHeader.age\")} /{\" \"}\n {t(\"tokens.listHeader.marketCap\")} /{\" \"}\n {t(\"tokens.listHeader.liquidity\")}\n </span>\n </div>\n <div className=\"flex-none w-20 text-right\">\n <span>\n {t(\"tokens.listHeader.price\")} / {t(\"tokens.listHeader.24hChange\")}\n </span>\n </div>\n </div>\n );\n}\n","import { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface SearchResultListSkeletonProps {\n rows?: number;\n className?: string;\n}\n\nfunction SkeletonRow() {\n return (\n <div className=\"w-full h-14 px-3 flex items-center justify-between gap-2\">\n <div className=\"flex-1 min-w-0 flex items-center gap-2\">\n <Skeleton className=\"flex-none w-8 h-8 rounded-full\" />\n <div className=\"flex flex-col gap-1.5\">\n <Skeleton className=\"w-24 h-4 rounded-md\" />\n <Skeleton className=\"w-36 h-3 rounded-md\" />\n </div>\n </div>\n <div className=\"flex-none w-20 flex flex-col items-end gap-1.5\">\n <Skeleton className=\"w-14 h-4 rounded-md\" />\n <Skeleton className=\"w-10 h-3 rounded-md\" />\n </div>\n </div>\n );\n}\n\nexport function SearchResultListSkeleton({\n rows = 6,\n className,\n}: SearchResultListSkeletonProps) {\n return (\n <div className={cn(\"w-full\", className)}>\n {Array.from({ length: rows }).map((_, i) => (\n <SkeletonRow key={i} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n useSearchTokensInfiniteQuery,\n type UseSearchTokensInfiniteQueryParams,\n} from \"@liberfi.io/react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseSearchResultListScriptParams {\n keyword: string;\n chains?: Chain[];\n limit?: number;\n}\n\nexport function useSearchResultListScript({\n keyword,\n chains,\n limit = 50,\n}: UseSearchResultListScriptParams) {\n const params = useMemo<UseSearchTokensInfiniteQueryParams>(\n () => ({\n keyword,\n chains,\n limit,\n }),\n [keyword, chains, limit],\n );\n\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchTokensInfiniteQuery(params, {\n enabled: !!keyword,\n });\n\n const tokens = useMemo<Token[]>(\n () => data?.pages.flatMap((page) => page.data) ?? [],\n [data],\n );\n\n return {\n tokens,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport { SearchResultListHeader } from \"./search-result-list-header.ui\";\nimport { SearchResultListSkeleton } from \"./search-result-list-skeleton.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 56;\n\nexport type SearchResultListWidgetProps = {\n onSelectToken?: (token: Token) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelectToken,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { tokens, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < tokens.length,\n [tokens],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? tokens.length + 1 : tokens.length),\n [tokens, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return (\n <div className={cn(\"w-full\", className)}>\n <SearchResultListHeader />\n <SearchResultListSkeleton />\n </div>\n );\n }\n\n if (tokens.length === 0) {\n return (\n <div className={cn(\"w-full\", className)}>\n <SearchResultListHeader />\n <EmptyState />\n </div>\n );\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <SearchResultListHeader className=\"flex-none\" />\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ tokens, onSelectToken }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\ninterface SearchResultRowData {\n tokens: Token[];\n onSelectToken?: (token: Token) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n tokens,\n onSelectToken,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const token = tokens[index];\n\n if (!token) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style} onClick={() => onSelectToken?.(token)}>\n <SearchResultItemUI token={token} />\n </div>\n );\n}\n\nfunction EmptyState() {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-col items-center justify-center py-16\">\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"tokens.search.noResults\")}\n </p>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useTrendingTokensQuery,\n useTrendingTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\nimport { TokenListResolution } from \"./types\";\n\nexport type UseTrendingTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseTrendingTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nexport function useTrendingTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseTrendingTokensScriptParams): UseTrendingTokensScriptResult {\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n const prevParamsRef = useRef(queryParams);\n\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n setTokens([]);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useTrendingTokensQuery(\n queryParams,\n { refetchInterval },\n );\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const merged: Array<Token> = [];\n for (const token of fetchedTokens) {\n const existing = prev.find((t) => t.address === token.address);\n merged.push(existing ? mergeToken(existing, token) : token);\n }\n return merged;\n });\n setIsParamsChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useTrendingTokensSubscription({ chain }, handleDataUpdate);\n\n const isLoading = useMemo(() => {\n if (isPending) return true;\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","\"use client\";\n\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { useTrendingTokensScript } from \"../token-list/trending-token-list.script\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport { SearchResultListSkeleton } from \"./search-result-list-skeleton.ui\";\n\nconst DEFAULT_CHAIN = Chain.ETHEREUM;\nconst DEFAULT_RESOLUTION = \"24h\" as const;\nconst ROW_HEIGHT = 56;\n\nexport type SearchTrendingListWidgetProps = {\n chains?: Chain[];\n onSelectToken?: (token: Token) => void;\n className?: string;\n};\n\nexport function SearchTrendingListWidget({\n chains,\n onSelectToken,\n className,\n}: SearchTrendingListWidgetProps) {\n const chain =\n chains?.length === 1 ? chains[0] : (chains?.[0] ?? DEFAULT_CHAIN);\n\n const { tokens, isLoading } = useTrendingTokensScript({\n chain,\n resolution: DEFAULT_RESOLUTION,\n });\n\n return (\n <div className={cn(\"w-full flex flex-col overflow-hidden\", className)}>\n {isLoading ? (\n <SearchResultListSkeleton />\n ) : (\n <div className=\"overflow-y-auto\">\n {tokens.map((token) => (\n <div\n key={token.address}\n style={{ height: ROW_HEIGHT }}\n onClick={() => onSelectToken?.(token)}\n >\n <SearchResultItemUI token={token} className=\"h-full\" />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { useSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\"); // immediate input value (every keystroke)\n const [keyword, setKeyword] = useState(\"\"); // debounced value (drives API search)\n const { addHistory } = useSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { SearchTrendingListWidget } from \"./search-trending-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Chains to search within */\n chains?: Chain[];\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when a token is selected */\n onSelectToken?: (token: Token) => void;\n /** Callback when Escape is pressed (e.g. close modal) */\n onEscape?: () => void;\n};\n\nexport function SearchWidget({\n chains,\n onKeywordChange,\n onSelectToken,\n onEscape,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onPaste={setKeyword}\n onEscape={onEscape}\n />\n {keyword ? (\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n chains={chains}\n onSelectToken={onSelectToken}\n />\n ) : (\n <div className=\"flex-auto min-h-0 flex flex-col overflow-hidden\">\n <SearchHistoryWidget onSelect={setKeyword} />\n <SearchTrendingListWidget\n className=\"flex-auto min-h-0\"\n chains={chains}\n onSelectToken={onSelectToken}\n />\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type SearchModalParams = {\n chains?: Chain[];\n};\n\nexport type SearchModalResult = Token;\n\nexport const SEARCH_MODAL_ID = \"search\";\n\nexport function SearchModal({ id = SEARCH_MODAL_ID }: { id?: string }) {\n return (\n <AsyncModal<SearchModalParams, SearchModalResult> id={id}>\n {(modalProps) => <SearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction SearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<SearchModalParams, SearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectToken = useCallback(\n (token: Token) => {\n onResult(token);\n },\n [onResult],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent\n className=\"w-full h-full\"\n style={{\n borderRadius: isMobile ? undefined : 14,\n border: isMobile ? undefined : \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: isMobile ? undefined : \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n }}\n >\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"tokens.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n chains={params?.chains}\n onSelectToken={handleSelectToken}\n onEscape={() => onOpenChange(false)}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n SEARCH_MODAL_ID,\n type SearchModalParams,\n type SearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchTokensButtonProps = {\n /** Chains to filter the search */\n chains?: SearchModalParams[\"chains\"];\n /** Callback when a token is selected from the search modal */\n onSelectToken?: (token: Token) => void;\n className?: string;\n};\n\nexport function SearchTokensButton({\n chains,\n onSelectToken,\n className,\n}: SearchTokensButtonProps) {\n const { t } = useTranslation();\n\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n SearchModalParams,\n SearchModalResult\n >(SEARCH_MODAL_ID);\n\n const onSelectTokenStable = useCallbackRef(onSelectToken);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: { chains } });\n if (result) {\n onSelectTokenStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(isDesktop && \"pl-3 pr-1.5 text-neutral\", className)}\n >\n {isDesktop ? (\n t(\"tokens.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import type { TraderTag } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\n\n/**\n * Canonical color + label mapping for trader classification tags.\n * Consumer apps may re-theme by overriding `className` via `classNames`.\n */\nexport const TRADER_TAG_META: Record<\n string,\n { label: string; bgClass: string; textClass: string }\n> = {\n kol: {\n label: \"KOL\",\n bgClass: \"bg-yellow-500/15\",\n textClass: \"text-yellow-400\",\n },\n smart: {\n label: \"Smart\",\n bgClass: \"bg-sky-500/15\",\n textClass: \"text-sky-400\",\n },\n sniper: {\n label: \"Sniper\",\n bgClass: \"bg-red-500/15\",\n textClass: \"text-red-400\",\n },\n dev: {\n label: \"Dev\",\n bgClass: \"bg-orange-500/15\",\n textClass: \"text-orange-400\",\n },\n bundle: {\n label: \"Bundle\",\n bgClass: \"bg-purple-500/15\",\n textClass: \"text-purple-400\",\n },\n bluechip: {\n label: \"Bluechip\",\n bgClass: \"bg-emerald-500/15\",\n textClass: \"text-emerald-400\",\n },\n insider: {\n label: \"Insider\",\n bgClass: \"bg-fuchsia-500/15\",\n textClass: \"text-fuchsia-400\",\n },\n fresh: {\n label: \"Fresh\",\n bgClass: \"bg-teal-500/15\",\n textClass: \"text-teal-400\",\n },\n};\n\nexport interface TraderTagBadgeProps {\n tag: TraderTag;\n className?: string;\n}\n\n/**\n * Single trader-tag chip. Unknown tag values fall back to a neutral style.\n * See `TRADER_TAG_META` for the built-in vocabulary.\n */\nexport function TraderTagBadge({ tag, className }: TraderTagBadgeProps) {\n const meta = TRADER_TAG_META[tag] ?? {\n label: tag,\n bgClass: \"bg-default/20\",\n textClass: \"text-default-500\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium uppercase leading-none tracking-wide\",\n meta.bgClass,\n meta.textClass,\n className,\n )}\n >\n {meta.label}\n </span>\n );\n}\n\nexport interface TraderTagBadgeListProps {\n tags?: Array<TraderTag>;\n className?: string;\n max?: number;\n}\n\n/**\n * Horizontal list of trader-tag chips. When `max` is set and the tag count\n * exceeds it, a \"+N\" pill is rendered after the first `max` tags.\n */\nexport function TraderTagBadgeList({\n tags,\n className,\n max,\n}: TraderTagBadgeListProps) {\n if (!tags || tags.length === 0) return null;\n const visible = max != null && max > 0 ? tags.slice(0, max) : tags;\n const overflow = tags.length - visible.length;\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1\", className)}>\n {visible.map((tag) => (\n <TraderTagBadge key={tag} tag={tag} />\n ))}\n {overflow > 0 && (\n <span className=\"inline-flex items-center rounded bg-default/20 px-1.5 py-0.5 text-[10px] font-medium text-default-500\">\n +{overflow}\n </span>\n )}\n </div>\n );\n}\n","import type { HolderTag } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { TRADER_TAG_META } from \"../trader-tag-badge/trader-tag-badge.ui\";\n\n/**\n * Holder tags share the vocabulary of trader tags (kol/smart/sniper/dev/bundle\n * /bluechip). The UI is intentionally the same so the visual semantics stay\n * coherent across the app. Kept as a separate component to make consumer-side\n * code read clearly when rendering holder lists vs activity rows.\n */\nexport interface HolderTagBadgeProps {\n tag: HolderTag;\n className?: string;\n}\n\nexport function HolderTagBadge({ tag, className }: HolderTagBadgeProps) {\n const meta = TRADER_TAG_META[tag] ?? {\n label: tag,\n bgClass: \"bg-default/20\",\n textClass: \"text-default-500\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium uppercase leading-none tracking-wide\",\n meta.bgClass,\n meta.textClass,\n className,\n )}\n >\n {meta.label}\n </span>\n );\n}\n\nexport interface HolderTagBadgeListProps {\n tags?: Array<HolderTag>;\n className?: string;\n max?: number;\n}\n\nexport function HolderTagBadgeList({\n tags,\n className,\n max,\n}: HolderTagBadgeListProps) {\n if (!tags || tags.length === 0) return null;\n const visible = max != null && max > 0 ? tags.slice(0, max) : tags;\n const overflow = tags.length - visible.length;\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1\", className)}>\n {visible.map((tag) => (\n <HolderTagBadge key={tag} tag={tag} />\n ))}\n {overflow > 0 && (\n <span className=\"inline-flex items-center rounded bg-default/20 px-1.5 py-0.5 text-[10px] font-medium text-default-500\">\n +{overflow}\n </span>\n )}\n </div>\n );\n}\n","import { formatPercent as formatPercentUtil } from \"@liberfi.io/utils\";\n\n/**\n * Format a ratio expressed as 0–100 (e.g. holdings percentage from the server)\n * into a display string like \"12.34%\". Internally divides by 100 and forwards\n * to `@liberfi.io/utils#formatPercent` (which expects 0–1 ratios).\n */\nexport function formatRatioFrom100(value: string | number | undefined): string {\n if (value === undefined || value === null || value === \"\") return \"--\";\n return formatPercentUtil(Number(value) / 100);\n}\n\n/**\n * Truncate a blockchain address for display, e.g. \"0x1234…abcd\".\n */\nexport function truncateMiddle(\n input: string | undefined,\n head = 4,\n tail = 4,\n): string {\n if (!input) return \"--\";\n if (input.length <= head + tail + 1) return input;\n return `${input.slice(0, head)}…${input.slice(-tail)}`;\n}\n","/**\n * Format the elapsed time between `from` and `now` as a short age string\n * (e.g. \"5m\", \"2h\", \"3d\"). Returns \"--\" if `from` is unavailable.\n */\nexport function formatAgeShort(\n from: Date | string | number | undefined,\n now: Date | number = Date.now(),\n): string {\n if (from == null) return \"--\";\n const start =\n typeof from === \"string\" || typeof from === \"number\"\n ? new Date(from)\n : from;\n const end = typeof now === \"number\" ? new Date(now) : now;\n const diffSec = Math.max(\n 0,\n Math.floor((end.getTime() - start.getTime()) / 1000),\n );\n if (diffSec < 60) return `${diffSec}s`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m`;\n const diffHour = Math.floor(diffMin / 60);\n if (diffHour < 24) return `${diffHour}h`;\n const diffDay = Math.floor(diffHour / 24);\n if (diffDay < 30) return `${diffDay}d`;\n const diffMon = Math.floor(diffDay / 30);\n if (diffMon < 12) return `${diffMon}mo`;\n const diffYr = Math.floor(diffDay / 365);\n return `${diffYr}y`;\n}\n","import { useEffect, useState } from \"react\";\nimport { useTokenQuery, useTokenSubscription } from \"@liberfi.io/react\";\nimport type { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../../utils/merge\";\n\n/**\n * Fetches a token by chain + address and keeps it live-merged with\n * `useTokenSubscription` pushes. Every token-detail sub-widget should use this\n * hook so WebSocket updates propagate uniformly across the page.\n */\nexport function useLiveToken(\n chain: Chain,\n address: string,\n): { token: Token | undefined; isLoading: boolean } {\n const { data, isLoading } = useTokenQuery({ chain, address });\n const [token, setToken] = useState<Token | undefined>(data);\n\n useEffect(() => {\n if (data) setToken(data);\n }, [data]);\n\n useTokenSubscription({ chain, address }, (updates) => {\n if (!updates?.length) return;\n setToken((prev) => {\n if (!prev) return prev;\n let next = prev;\n for (const u of updates as Array<API.TokenSubscribed>) {\n next = mergeToken(next, u);\n }\n return next;\n });\n });\n\n return { token, isLoading };\n}\n","import { cn, Progress } from \"@liberfi.io/ui\";\nimport { SafeBigNumber } from \"@liberfi.io/utils\";\n\nexport interface BuySellOverviewProps {\n label: string;\n totalFormatted: string;\n buysFormatted: string;\n sellsFormatted: string;\n /** raw numeric values used to compute the progress bar */\n totalValue?: number | string;\n buysValue?: number | string;\n className?: string;\n}\n\n/**\n * Presentational card used by traders / transactions / volumes overviews.\n * Three data points + one progress bar showing buy share of total.\n */\nexport function BuySellOverview({\n label,\n totalFormatted,\n buysFormatted,\n sellsFormatted,\n totalValue = 0,\n buysValue = 0,\n className,\n}: BuySellOverviewProps) {\n const total = new SafeBigNumber(totalValue ?? 0);\n const buys = new SafeBigNumber(buysValue ?? 0);\n const buyPercentage = total.eq(0) ? 0 : buys.div(total).times(100).toNumber();\n\n return (\n <div className={cn(\"flex flex-col gap-1\", className)}>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-xs text-default-500\">{label}</span>\n <span className=\"text-xs text-foreground\">{totalFormatted}</span>\n </div>\n <Progress\n size=\"sm\"\n value={buyPercentage}\n classNames={{ track: \"bg-bearish/40\", indicator: \"bg-bullish\" }}\n aria-label={`${label} buy share`}\n />\n <div className=\"flex justify-between gap-4 text-[10px]\">\n <span className=\"text-bullish\">Buys: {buysFormatted}</span>\n <span className=\"text-bearish\">Sells: {sellsFormatted}</span>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Token } from \"@liberfi.io/types\";\nimport { cn, CopyIcon } from \"@liberfi.io/ui\";\nimport { TokenAvatar } from \"../../token-avatar\";\nimport { truncateMiddle } from \"../shared\";\n\nexport interface TokenDetailHeaderProps {\n token?: Token;\n /** slot for favorite toggle / share / back buttons */\n actions?: ReactNode;\n /** slot for the live-data strip (price / market cap / volume / holders) */\n dataStrip?: ReactNode;\n className?: string;\n onCopyAddress?: (address: string) => void;\n}\n\n/**\n * Presentational token-detail header. Shows the avatar, symbol, name, truncated\n * address + copy, and defers favorite/share buttons + price data to slots.\n */\nexport function TokenDetailHeader({\n token,\n actions,\n dataStrip,\n className,\n onCopyAddress,\n}: TokenDetailHeaderProps) {\n const address = token?.address;\n\n return (\n <div\n className={cn(\n \"flex w-full flex-wrap items-center gap-4 px-4 py-3\",\n className,\n )}\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n {token && (\n <TokenAvatar token={token} radius=\"lg\" className=\"h-10 w-10\" />\n )}\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-base font-semibold text-foreground\">\n {token?.symbol ?? \"--\"}\n </span>\n <span className=\"truncate text-xs text-default-400\">\n {token?.name}\n </span>\n </div>\n {address && (\n <button\n type=\"button\"\n onClick={() => onCopyAddress?.(address)}\n className=\"flex items-center gap-1 text-[11px] text-default-400 transition-colors hover:text-foreground\"\n title={address}\n >\n {truncateMiddle(address, 6, 6)}\n <CopyIcon width={12} height={12} />\n </button>\n )}\n </div>\n </div>\n\n {dataStrip && <div className=\"flex-1 min-w-0\">{dataStrip}</div>}\n\n {actions && (\n <div className=\"ml-auto flex items-center gap-2\">{actions}</div>\n )}\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\n/**\n * Script for {@link TokenDetailHeaderWidget}. Thin wrapper over\n * {@link useLiveToken} to expose the token record for the header shell.\n */\nexport function useTokenDetailHeaderScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface TokenBasicInfoProps {\n /** Rendered price block (expected: `<TokenPriceWidget />`) */\n price?: ReactNode;\n /** Rendered market-cap block (expected: `<TokenMarketCapWidget />`) */\n marketCap?: ReactNode;\n /** Rendered volume block (expected: `<TokenVolumeWidget />`) */\n volume?: ReactNode;\n /** Rendered holders-count block (expected: `<TokenHoldersCountWidget />`) */\n holdersCount?: ReactNode;\n /** Rendered social-media block (expected: `<TokenSocialMediaWidget />`) */\n socialMedia?: ReactNode;\n className?: string;\n}\n\n/**\n * Presentational shell that lays out the token basic info strip — price on the\n * left, market-cap / volume / holders in the middle, social media on the right.\n * Consumers pass the individual sub-widgets (or custom nodes) via props, which\n * keeps the layout composition pattern explicit and testable.\n */\nexport function TokenBasicInfo({\n price,\n marketCap,\n volume,\n holdersCount,\n socialMedia,\n className,\n}: TokenBasicInfoProps) {\n return (\n <div\n className={cn(\"flex flex-wrap items-center gap-x-6 gap-y-3\", className)}\n >\n {price}\n <div className=\"flex flex-wrap items-center gap-x-6 gap-y-3\">\n {marketCap}\n {volume}\n {holdersCount}\n </div>\n <div className=\"ml-auto\">{socialMedia}</div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\n/**\n * Aggregate script for {@link TokenBasicInfoWidget}. Exposes the same live\n * token reference each sub-widget would fetch on its own, so consumers can\n * avoid redundant queries if they render the widget multiple times in one\n * page. Kept as a thin wrapper on {@link useLiveToken} for uniformity.\n */\nexport function useTokenBasicInfoScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { formatRatioFrom100 } from \"../shared\";\n\nexport interface TokenHoldersCountProps {\n /** total holder count */\n holders?: number;\n /** top-10 holdings ratio, 0–100 */\n top10HoldingsRatio?: string;\n /** top-100 holdings ratio, 0–100 */\n top100HoldingsRatio?: string;\n className?: string;\n}\n\n/**\n * Compact summary of holder distribution — holder count + top10/top100 ratios.\n */\nexport function TokenHoldersCount({\n holders,\n top10HoldingsRatio,\n top100HoldingsRatio,\n className,\n}: TokenHoldersCountProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-start justify-center gap-0.5\",\n className,\n )}\n >\n <div className=\"text-xs font-medium text-default-500\">\n <span className=\"text-foreground\">\n {holders != null ? formatAmount(holders) : \"--\"}\n </span>\n <span className=\"px-1\">/</span>\n <span>{formatRatioFrom100(top10HoldingsRatio)}</span>\n <span className=\"px-1\">/</span>\n <span>{formatRatioFrom100(top100HoldingsRatio)}</span>\n </div>\n <div className=\"text-[10px] text-default-400\">\n Holders / Top10 / Top100\n </div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenHoldersCountScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenHoldersCountScript } from \"./token-holders-count.script\";\nimport { TokenHoldersCount } from \"./token-holders-count.ui\";\n\nexport interface TokenHoldersCountWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenHoldersCountWidget({\n chain,\n address,\n className,\n}: TokenHoldersCountWidgetProps) {\n const { token } = useTokenHoldersCountScript(chain, address);\n return (\n <TokenHoldersCount\n holders={token?.marketData?.holders}\n top10HoldingsRatio={token?.marketData?.top10HoldingsRatio}\n top100HoldingsRatio={token?.marketData?.top100HoldingsRatio}\n className={className}\n />\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { formatAgeShort } from \"../shared\";\n\nexport interface TokenMarketCapProps {\n /** market cap in usd */\n marketCapInUsd?: string;\n /** liquidity (tvl) in usd */\n tvlInUsd?: string;\n /** token creation time */\n createdAt?: Date;\n className?: string;\n}\n\n/**\n * Pure presentational widget showing market cap / liquidity / age in a single\n * compact inline block. Mirrors the `TradeTokenMCap` behaviour in\n * dex-nextjs-template but has no jotai / translation dependencies.\n */\nexport function TokenMarketCap({\n marketCapInUsd,\n tvlInUsd,\n createdAt,\n className,\n}: TokenMarketCapProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-start justify-center gap-0.5\",\n className,\n )}\n >\n <div className=\"text-xs font-medium text-default-500\">\n <span className=\"text-foreground\">\n {marketCapInUsd ? formatAmountUSDCompact(marketCapInUsd) : \"--\"}\n </span>\n <span className=\"px-1\">/</span>\n <span>{tvlInUsd ? formatAmountUSDCompact(tvlInUsd) : \"--\"}</span>\n <span className=\"px-1\">/</span>\n <span>{formatAgeShort(createdAt)}</span>\n </div>\n <div className=\"text-[10px] text-default-400\">MC / Liq / Age</div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\n/**\n * Script for {@link TokenMarketCapWidget} — thin wrapper over the shared\n * {@link useLiveToken} hook.\n */\nexport function useTokenMarketCapScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenMarketCapScript } from \"./token-market-cap.script\";\nimport { TokenMarketCap } from \"./token-market-cap.ui\";\n\nexport interface TokenMarketCapWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\n/**\n * Live-updating market-cap / liquidity / age block. Source of truth is the\n * `useTokenQuery` + `useTokenSubscription` pair exposed by `@liberfi.io/react`.\n */\nexport function TokenMarketCapWidget({\n chain,\n address,\n className,\n}: TokenMarketCapWidgetProps) {\n const { token } = useTokenMarketCapScript(chain, address);\n return (\n <TokenMarketCap\n marketCapInUsd={token?.marketData?.marketCapInUsd}\n tvlInUsd={token?.marketData?.tvlInUsd}\n createdAt={token?.createdAt}\n className={className}\n />\n );\n}\n","import { useMemo } from \"react\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatPercent,\n formatPriceUSD,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\n\nexport interface TokenPriceProps {\n /** latest price in usd (may update via WebSocket) */\n priceInUsd?: string;\n /** 24h-open price in usd (reference for bearish/bullish) */\n price24hAgoInUsd?: string;\n className?: string;\n}\n\n/**\n * Presentational price widget with 24h-change delta. Colors follow\n * bullish/bearish tokens from the HeroUI theme (`text-bullish` / `text-bearish`).\n */\nexport function TokenPrice({\n priceInUsd,\n price24hAgoInUsd,\n className,\n}: TokenPriceProps) {\n const { bearish, priceChange } = useMemo(() => {\n if (!priceInUsd || !price24hAgoInUsd) {\n return { bearish: false, priceChange: undefined as number | undefined };\n }\n const cur = new SafeBigNumber(priceInUsd);\n const prev = new SafeBigNumber(price24hAgoInUsd);\n if (prev.lte(0)) return { bearish: false, priceChange: undefined };\n return {\n bearish: cur.lt(prev),\n priceChange: cur.minus(prev).div(prev).abs().toNumber(),\n };\n }, [priceInUsd, price24hAgoInUsd]);\n\n return (\n <div\n className={cn(\"group flex flex-col gap-1\", className)}\n data-bearish={bearish}\n >\n <div className=\"text-base font-medium leading-none text-bullish group-data-[bearish=true]:text-bearish\">\n {priceInUsd ? formatPriceUSD(priceInUsd) : \"--\"}\n </div>\n <div className=\"flex items-center gap-2 text-[10px] leading-none\">\n <span className=\"text-default-400\">24h</span>\n <span className=\"text-bullish group-data-[bearish=true]:text-bearish\">\n {priceChange != null ? formatPercent(priceChange) : \"--\"}\n </span>\n </div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenPriceScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenPriceScript } from \"./token-price.script\";\nimport { TokenPrice } from \"./token-price.ui\";\n\nexport interface TokenPriceWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenPriceWidget({\n chain,\n address,\n className,\n}: TokenPriceWidgetProps) {\n const { token } = useTokenPriceScript(chain, address);\n return (\n <TokenPrice\n priceInUsd={token?.marketData?.priceInUsd}\n price24hAgoInUsd={token?.stats?.[\"24h\"]?.openPriceInUsd}\n className={className}\n />\n );\n}\n","import type { TokenSocialMedias } from \"@liberfi.io/types\";\nimport {\n cn,\n DiscordIcon,\n TelegramIcon,\n TwitterIcon,\n WebsiteIcon,\n} from \"@liberfi.io/ui\";\n\nexport interface TokenSocialMediaProps {\n socials?: TokenSocialMedias;\n className?: string;\n iconSize?: number;\n}\n\ntype SocialKey = keyof Pick<\n TokenSocialMedias,\n | \"website\"\n | \"twitter\"\n | \"telegram\"\n | \"discord\"\n | \"github\"\n | \"reddit\"\n | \"youtube\"\n | \"medium\"\n>;\n\nfunction renderIcon(key: SocialKey, size: number) {\n switch (key) {\n case \"website\":\n return <WebsiteIcon width={size} height={size} />;\n case \"twitter\":\n return <TwitterIcon width={size} height={size} />;\n case \"telegram\":\n return <TelegramIcon width={size} height={size} />;\n case \"discord\":\n return <DiscordIcon width={size} height={size} />;\n default:\n return (\n <span className=\"text-[9px] font-medium uppercase\">\n {key.slice(0, 2)}\n </span>\n );\n }\n}\n\n/**\n * Presentational row of social-media icon links. Links open in a new tab.\n * Renders nothing if no known social media is present.\n */\nexport function TokenSocialMedia({\n socials,\n className,\n iconSize = 16,\n}: TokenSocialMediaProps) {\n if (!socials) return null;\n const keys: Array<SocialKey> = [\n \"website\",\n \"twitter\",\n \"telegram\",\n \"discord\",\n \"github\",\n \"reddit\",\n \"youtube\",\n \"medium\",\n ];\n const available = keys.filter((k) => !!socials[k]);\n if (available.length === 0) return null;\n\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {available.map((k) => (\n <a\n key={k}\n href={socials[k]!}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"flex items-center justify-center text-default-400 transition-colors hover:text-foreground\"\n style={{ width: iconSize, height: iconSize }}\n >\n {renderIcon(k, iconSize)}\n </a>\n ))}\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenSocialMediaScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenSocialMediaScript } from \"./token-social-media.script\";\nimport { TokenSocialMedia } from \"./token-social-media.ui\";\n\nexport interface TokenSocialMediaWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n iconSize?: number;\n}\n\nexport function TokenSocialMediaWidget({\n chain,\n address,\n className,\n iconSize,\n}: TokenSocialMediaWidgetProps) {\n const { token } = useTokenSocialMediaScript(chain, address);\n return (\n <TokenSocialMedia\n socials={token?.socialMedias}\n className={className}\n iconSize={iconSize}\n />\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\n\nexport interface TokenVolumeProps {\n /** 24h volume in usd */\n volumesInUsd?: string;\n /** 24h total trades */\n trades?: number;\n /** 24h unique traders */\n traders?: number;\n className?: string;\n}\n\n/**\n * 24h volume / trades / traders summary — inline compact layout.\n */\nexport function TokenVolume({\n volumesInUsd,\n trades,\n traders,\n className,\n}: TokenVolumeProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-start justify-center gap-0.5\",\n className,\n )}\n >\n <div className=\"text-xs font-medium text-default-500\">\n <span className=\"text-foreground\">\n {volumesInUsd ? formatAmountUSDCompact(volumesInUsd) : \"--\"}\n </span>\n <span className=\"px-1\">/</span>\n <span>{trades != null ? formatAmount(trades) : \"--\"}</span>\n <span className=\"px-1\">/</span>\n <span>{traders != null ? formatAmount(traders) : \"--\"}</span>\n </div>\n <div className=\"text-[10px] text-default-400\">\n 24h Vol / Txs / Traders\n </div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenVolumeScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenVolumeScript } from \"./token-volume.script\";\nimport { TokenVolume } from \"./token-volume.ui\";\n\nexport interface TokenVolumeWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenVolumeWidget({\n chain,\n address,\n className,\n}: TokenVolumeWidgetProps) {\n const { token } = useTokenVolumeScript(chain, address);\n const stats = token?.stats?.[\"24h\"];\n return (\n <TokenVolume\n volumesInUsd={stats?.volumesInUsd}\n trades={stats?.trades}\n traders={stats?.traders}\n className={className}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { TokenHoldersCountWidget } from \"../token-holders-count\";\nimport { TokenMarketCapWidget } from \"../token-market-cap\";\nimport { TokenPriceWidget } from \"../token-price\";\nimport { TokenSocialMediaWidget } from \"../token-social-media\";\nimport { TokenVolumeWidget } from \"../token-volume\";\nimport { TokenBasicInfo } from \"./token-basic-info.ui\";\n\nexport interface TokenBasicInfoWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\n/**\n * Default composition that plugs the five live sub-widgets into the\n * {@link TokenBasicInfo} shell. Consumers who need a custom layout should\n * import and arrange the sub-widgets directly.\n */\nexport function TokenBasicInfoWidget({\n chain,\n address,\n className,\n}: TokenBasicInfoWidgetProps) {\n return (\n <TokenBasicInfo\n className={className}\n price={<TokenPriceWidget chain={chain} address={address} />}\n marketCap={<TokenMarketCapWidget chain={chain} address={address} />}\n volume={<TokenVolumeWidget chain={chain} address={address} />}\n holdersCount={<TokenHoldersCountWidget chain={chain} address={address} />}\n socialMedia={<TokenSocialMediaWidget chain={chain} address={address} />}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { TokenBasicInfoWidget } from \"../token-basic-info\";\nimport { useTokenDetailHeaderScript } from \"./token-detail-header.script\";\nimport { TokenDetailHeader } from \"./token-detail-header.ui\";\n\nexport interface TokenDetailHeaderWidgetProps {\n chain: Chain;\n address: string;\n /** slot for favorite toggle / share / back buttons */\n actions?: ReactNode;\n /**\n * Custom data-strip renderer. Defaults to the full basic-info strip (price,\n * market cap, volume, holders, social). Pass `null` to hide the strip.\n */\n dataStrip?: ReactNode | null;\n className?: string;\n onCopyAddress?: (address: string) => void;\n}\n\n/**\n * Live-updating token detail header. Copy-address behaviour and trailing\n * actions (favorite/share/back) are delegated to the caller via callbacks and\n * slot props so the widget stays agnostic of app-specific concerns.\n */\nexport function TokenDetailHeaderWidget({\n chain,\n address,\n actions,\n dataStrip,\n className,\n onCopyAddress,\n}: TokenDetailHeaderWidgetProps) {\n const { token } = useTokenDetailHeaderScript(chain, address);\n return (\n <TokenDetailHeader\n token={token}\n actions={actions}\n dataStrip={\n dataStrip === undefined ? (\n <TokenBasicInfoWidget chain={chain} address={address} />\n ) : (\n dataStrip\n )\n }\n className={className}\n onCopyAddress={onCopyAddress}\n />\n );\n}\n","import { useMemo } from \"react\";\nimport type { API, TokenHolder } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { HolderTagBadgeList } from \"../../shared\";\nimport { formatRatioFrom100, truncateMiddle, formatAgeShort } from \"../shared\";\n\nexport type TokenHoldersListSortBy = API.TokenHoldersSortBy;\n\nexport interface TokenHoldersListProps {\n holders: Array<TokenHolder>;\n isLoading?: boolean;\n /** Phase 3 sortBy */\n sortBy: TokenHoldersListSortBy;\n onSortByChange: (sortBy: TokenHoldersListSortBy) => void;\n /**\n * Axiom-style `Only Tracked` filter. Narrows the visible rows to holders\n * that carry at least one classification tag. Client-side; parent owns\n * state.\n */\n onlyTracked?: boolean;\n onOnlyTrackedChange?: (value: boolean) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n /** reference time for age display; defaults to `Date.now()` */\n now?: number;\n /**\n * Optional map of known wallet addresses → human-readable label (e.g.\n * `{ [poolAddress]: \"LIQUIDITY POOL\" }`). When the holder's address is\n * in this map, the Wallet cell renders the label instead of a truncated\n * address.\n */\n wellKnownAddresses?: Record<string, string>;\n className?: string;\n /** render a wallet cell — useful to wire app-level links / tooltips */\n renderAddress?: (address: string) => React.ReactNode;\n}\n\nconst SORT_OPTIONS: Array<{ value: TokenHoldersListSortBy; label: string }> = [\n { value: \"holdingUsd\", label: \"Value\" },\n { value: \"lastActiveAt\", label: \"Last active\" },\n];\n\n/**\n * Presentational token holders list. Renders Phase 3 columns: wallet address,\n * classification tags, USD value, % holding, first-held-at age, last-active-at\n * age. The caller owns the sort state to preserve cursor semantics (changing\n * `sortBy` invalidates cursors).\n */\nexport function TokenHoldersList({\n holders,\n isLoading,\n sortBy,\n onSortByChange,\n onlyTracked = false,\n onOnlyTrackedChange,\n onLoadMore,\n hasMore,\n now = Date.now(),\n wellKnownAddresses,\n className,\n renderAddress,\n}: TokenHoldersListProps) {\n const visibleHolders = onlyTracked\n ? holders.filter((h) => h.tags && h.tags.length > 0)\n : holders;\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-medium text-default-500\">Holders</span>\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={onlyTracked}\n onChange={(e) => onOnlyTrackedChange?.(e.target.checked)}\n />\n Only Tracked\n </label>\n </div>\n <div className=\"flex items-center gap-1\">\n {SORT_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onSortByChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n sortBy === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[640px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[30%] px-3 py-2 text-left font-normal\">\n Wallet\n </th>\n <th className=\"w-[20%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Value\n </th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">%</th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n First held\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Last active\n </th>\n </tr>\n </thead>\n <tbody>\n {visibleHolders.length === 0 && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No holders\n </td>\n </tr>\n )}\n {visibleHolders.map((h) => (\n <HolderRow\n key={h.address}\n holder={h}\n now={now}\n wellKnownAddresses={wellKnownAddresses}\n renderAddress={renderAddress}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction HolderRow({\n holder,\n now,\n wellKnownAddresses,\n renderAddress,\n}: {\n holder: TokenHolder;\n now: number;\n wellKnownAddresses?: Record<string, string>;\n renderAddress?: (address: string) => React.ReactNode;\n}) {\n const wellKnownLabel = wellKnownAddresses?.[holder.address];\n const addressCell = useMemo(() => {\n if (renderAddress) return renderAddress(holder.address);\n if (wellKnownLabel) {\n return (\n <span className=\"rounded bg-default-100 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-default-600\">\n {wellKnownLabel}\n </span>\n );\n }\n return (\n <span className=\"font-mono text-[11px] text-default-500\">\n {truncateMiddle(holder.address, 6, 6)}\n </span>\n );\n }, [holder.address, renderAddress, wellKnownLabel]);\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{addressCell}</td>\n <td className=\"px-3 py-2 align-middle\">\n <HolderTagBadgeList tags={holder.tags} max={3} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(holder.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatRatioFrom100(holder.ratio)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {holder.startHoldingAt\n ? formatAgeShort(holder.startHoldingAt, now)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {holder.lastActiveAt ? formatAgeShort(holder.lastActiveAt, now) : \"--\"}\n </td>\n </tr>\n );\n}\n\n// re-export for convenience\nexport { formatAmount };\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTokenHoldersQuery, useTokenSubscription } from \"@liberfi.io/react\";\nimport type { API, Chain, TokenHolder } from \"@liberfi.io/types\";\nimport type { TokenHoldersListSortBy } from \"./token-holders-list.ui\";\n\nexport interface UseTokenHoldersListScriptParams {\n chain: Chain;\n address: string;\n /** page size */\n limit?: number;\n /** initial sortBy; defaults to `holdingUsd` */\n initialSortBy?: TokenHoldersListSortBy;\n}\n\nexport interface UseTokenHoldersListScriptResult {\n holders: Array<TokenHolder>;\n isLoading: boolean;\n sortBy: TokenHoldersListSortBy;\n setSortBy: (s: TokenHoldersListSortBy) => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the token-holders list widget.\n *\n * Pagination model: accumulate pages in local state. Whenever `sortBy`\n * changes, the accumulator is reset (server docs state that cursors become\n * invalid after a sort change).\n *\n * Also subscribes to {@link useTokenSubscription} so the holder count-based\n * stats elsewhere update, but the holders list itself is refreshed on the next\n * explicit load since there is no per-holder WS channel.\n */\nexport function useTokenHoldersListScript({\n chain,\n address,\n limit = 50,\n initialSortBy = \"holdingUsd\",\n}: UseTokenHoldersListScriptParams): UseTokenHoldersListScriptResult {\n const [sortBy, setSortByState] =\n useState<TokenHoldersListSortBy>(initialSortBy);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<TokenHolder>>>([]);\n\n const resetOnSortChange = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n }, []);\n\n const setSortBy = useCallback(\n (s: TokenHoldersListSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n resetOnSortChange();\n },\n [sortBy, resetOnSortChange],\n );\n\n useEffect(() => {\n resetOnSortChange();\n }, [chain, address, resetOnSortChange]);\n\n const queryParams = useMemo(\n () => ({ chain, address, cursor, limit, sortBy }),\n [chain, address, cursor, limit, sortBy],\n );\n\n const { data, isPending, isFetching } = useTokenHoldersQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n // Re-fetch on token push (holders count / ratios change) — cheap because\n // react-query will return cached data unless invalidated by params change.\n useTokenSubscription({ chain, address }, () => {\n /* no-op: there is no per-holder WS channel; the list refreshes on paging */\n });\n\n const holders = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n holders,\n isLoading: isPending || isFetching,\n sortBy,\n setSortBy,\n hasMore,\n loadMore,\n };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { useTokenHoldersListScript } from \"./token-holders-list.script\";\nimport {\n TokenHoldersList,\n type TokenHoldersListSortBy,\n} from \"./token-holders-list.ui\";\n\nexport interface TokenHoldersListWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: TokenHoldersListSortBy;\n /** Initial `Only Tracked` toggle state. */\n initialOnlyTracked?: boolean;\n /** Map of known-wallet addresses → human-readable labels. */\n wellKnownAddresses?: Record<string, string>;\n className?: string;\n renderAddress?: (address: string) => React.ReactNode;\n}\n\n/**\n * Live-paginated, sortable token holders list consuming the Phase 3\n * `/v2/token/{chain}/{address}/holders` endpoint. Axiom-parity upgrades:\n * adds a client-side `Only Tracked` filter and supports a\n * `wellKnownAddresses` map that replaces known pool / named-wallet\n * addresses with a human-readable badge (e.g. `LIQUIDITY POOL`).\n */\nexport function TokenHoldersListWidget({\n chain,\n address,\n limit,\n initialSortBy,\n initialOnlyTracked = false,\n wellKnownAddresses,\n className,\n renderAddress,\n}: TokenHoldersListWidgetProps) {\n const [onlyTracked, setOnlyTracked] = useState(initialOnlyTracked);\n const { holders, isLoading, sortBy, setSortBy, hasMore, loadMore } =\n useTokenHoldersListScript({ chain, address, limit, initialSortBy });\n return (\n <TokenHoldersList\n holders={holders}\n isLoading={isLoading}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n onlyTracked={onlyTracked}\n onOnlyTrackedChange={setOnlyTracked}\n wellKnownAddresses={wellKnownAddresses}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n renderAddress={renderAddress}\n />\n );\n}\n","import type { Activity, API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPrice,\n} from \"@liberfi.io/utils\";\nimport { TraderTagBadgeList } from \"../../shared\";\nimport { formatAgeShort, truncateMiddle } from \"../shared\";\n\nexport type TokenActivitiesListSortBy = API.ActivitiesSortBy;\n\n/**\n * Axiom-style trader-tag filter applied client-side on top of the paged\n * result. `all` is the default; `dev` / `tracked` / `you` narrow the view.\n */\nexport type TokenActivitiesListTraderFilter = \"all\" | \"dev\" | \"tracked\" | \"you\";\n\n/** Amount column currency toggle (USD vs native). */\nexport type TokenActivitiesListCurrency = \"usd\" | \"native\";\n\nexport interface TokenActivitiesListProps {\n activities: Array<Activity>;\n isLoading?: boolean;\n sortBy: TokenActivitiesListSortBy;\n onSortByChange: (sortBy: TokenActivitiesListSortBy) => void;\n /** filter by activity type; \"all\" shows everything including liquidity / red packets */\n typeFilter?: \"all\" | \"buy\" | \"sell\";\n onTypeFilterChange?: (t: \"all\" | \"buy\" | \"sell\") => void;\n /**\n * Axiom-style DEV / TRACKED / YOU filter. Purely client-side; narrows\n * the visible rows without refetching.\n */\n traderFilter?: TokenActivitiesListTraderFilter;\n onTraderFilterChange?: (t: TokenActivitiesListTraderFilter) => void;\n /** Your wallet address — required for the `you` filter to work. */\n youWalletAddress?: string;\n /** USD / native currency toggle. Defaults to `usd`. */\n currency?: TokenActivitiesListCurrency;\n onCurrencyChange?: (c: TokenActivitiesListCurrency) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n /** reference time for age display; defaults to `Date.now()` */\n now?: number;\n /** native token decimals for gas-fee formatting, default 9 (lamports on SOL) */\n nativeDecimals?: number;\n /** native token symbol, default \"SOL\" */\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\nconst SORT_OPTIONS: Array<{ value: TokenActivitiesListSortBy; label: string }> =\n [\n { value: \"timestamp\", label: \"Latest\" },\n { value: \"totalUsd\", label: \"Top USD\" },\n ];\n\nconst TYPE_OPTIONS: Array<{ value: \"all\" | \"buy\" | \"sell\"; label: string }> = [\n { value: \"all\", label: \"All\" },\n { value: \"buy\", label: \"Buys\" },\n { value: \"sell\", label: \"Sells\" },\n];\n\n/**\n * Presentational token activities list (Phase 3). Shows per-activity:\n * - side (buy/sell/liquidity/red packet)\n * - trader address + trader tags\n * - amount (native + usd)\n * - price\n * - gas fee (native denominated)\n * - age\n */\nconst TRADER_OPTIONS: Array<{\n value: TokenActivitiesListTraderFilter;\n label: string;\n}> = [\n { value: \"all\", label: \"All\" },\n { value: \"dev\", label: \"DEV\" },\n { value: \"tracked\", label: \"TRACKED\" },\n { value: \"you\", label: \"YOU\" },\n];\n\nexport function TokenActivitiesList({\n activities,\n isLoading,\n sortBy,\n onSortByChange,\n typeFilter = \"all\",\n onTypeFilterChange,\n traderFilter = \"all\",\n onTraderFilterChange,\n youWalletAddress,\n currency = \"usd\",\n onCurrencyChange,\n onLoadMore,\n hasMore,\n now = Date.now(),\n nativeDecimals = 9,\n nativeSymbol = \"SOL\",\n className,\n onRowClick,\n}: TokenActivitiesListProps) {\n const filteredActivities = filterByTraderFilter(\n activities,\n traderFilter,\n youWalletAddress,\n );\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <div className=\"flex items-center gap-1\">\n {TYPE_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onTypeFilterChange?.(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n typeFilter === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n <span className=\"mx-1 h-3 w-px bg-default-200\" aria-hidden />\n {TRADER_OPTIONS.map((opt) => {\n const active = traderFilter === opt.value;\n const disabled = opt.value === \"you\" && !youWalletAddress;\n return (\n <button\n key={opt.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => onTraderFilterChange?.(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n active\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <CurrencyToggle\n value={currency}\n nativeSymbol={nativeSymbol}\n onChange={onCurrencyChange}\n />\n <div className=\"flex items-center gap-1\">\n {SORT_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onSortByChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n sortBy === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[780px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[10%] px-3 py-2 text-left font-normal\">Side</th>\n <th className=\"w-[25%] px-3 py-2 text-left font-normal\">\n Trader\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">USD</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Price\n </th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Gas</th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Age</th>\n </tr>\n </thead>\n <tbody>\n {filteredActivities.length === 0 && !isLoading && (\n <tr>\n <td colSpan={7} className=\"py-8 text-center text-default-400\">\n No activities\n </td>\n </tr>\n )}\n {filteredActivities.map((a) => (\n <ActivityRow\n key={a.txHash}\n activity={a}\n now={now}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n currency={currency}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={7} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Determine which side of the trade the \"primary\" token is on.\n * For buy: user is receiving `to`; for sell: user is spending `from`.\n */\nfunction pickPrimaryToken(a: Activity) {\n if (a.type === \"buy\") return a.to;\n if (a.type === \"sell\") return a.from;\n return a.to;\n}\n\n/**\n * Client-side filter applied on top of the paged activities feed.\n *\n * - `all` — pass-through\n * - `dev` — trader tags contain `dev`\n * - `tracked` — trader tags contain `kol | smart | bluechip` (our closest proxy\n * for \"tracked by someone\")\n * - `you` — wallet address equals `youWalletAddress`\n *\n * Returns the original array reference when `filter === \"all\"` so React's\n * identity-based memo bail-outs still work.\n */\nfunction filterByTraderFilter(\n activities: Array<Activity>,\n filter: TokenActivitiesListTraderFilter,\n youWalletAddress?: string,\n): Array<Activity> {\n if (filter === \"all\") return activities;\n if (filter === \"you\") {\n if (!youWalletAddress) return [];\n const normalised = youWalletAddress.toLowerCase();\n return activities.filter(\n (a) => a.walletAddress?.toLowerCase() === normalised,\n );\n }\n if (filter === \"dev\") {\n return activities.filter((a) => a.traderTags?.some((t) => t === \"dev\"));\n }\n // `tracked`\n const trackedTags = new Set([\"kol\", \"smart\", \"bluechip\"]);\n return activities.filter((a) =>\n a.traderTags?.some((t) => trackedTags.has(t as string)),\n );\n}\n\nfunction CurrencyToggle({\n value,\n nativeSymbol,\n onChange,\n}: {\n value: TokenActivitiesListCurrency;\n nativeSymbol: string;\n onChange?: (value: TokenActivitiesListCurrency) => void;\n}) {\n const options: Array<{ k: TokenActivitiesListCurrency; label: string }> = [\n { k: \"usd\", label: \"USD\" },\n { k: \"native\", label: nativeSymbol },\n ];\n return (\n <div className=\"flex h-[22px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {options.map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onChange?.(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n value === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction formatGasFee(\n gasFee: string | undefined,\n nativeDecimals: number,\n nativeSymbol: string,\n): string {\n if (!gasFee) return \"--\";\n const n = Number(gasFee) / Math.pow(10, nativeDecimals);\n if (!Number.isFinite(n)) return \"--\";\n return `${formatAmount(n)} ${nativeSymbol}`;\n}\n\nfunction ActivityRow({\n activity,\n now,\n nativeDecimals,\n nativeSymbol,\n currency,\n onRowClick,\n}: {\n activity: Activity;\n now: number;\n nativeDecimals: number;\n nativeSymbol: string;\n currency: TokenActivitiesListCurrency;\n onRowClick?: (activity: Activity) => void;\n}) {\n const primary = pickPrimaryToken(activity);\n const sideLabel =\n activity.type === \"buy\"\n ? \"Buy\"\n : activity.type === \"sell\"\n ? \"Sell\"\n : activity.type.replace(/_/g, \" \");\n const sideColor =\n activity.type === \"buy\"\n ? \"text-bullish\"\n : activity.type === \"sell\"\n ? \"text-bearish\"\n : \"text-default-500\";\n\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(activity) : undefined}\n >\n <td\n className={cn(\n \"px-3 py-2 align-middle font-medium capitalize\",\n sideColor,\n )}\n >\n {sideLabel}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"font-mono text-[11px] text-default-500\">\n {truncateMiddle(activity.walletAddress, 6, 6)}\n </span>\n <TraderTagBadgeList tags={activity.traderTags} max={2} />\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n {formatAmount(primary.amount)} {primary.symbol}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {/* USD / native total column. The native branch is a pass-through\n until the server exposes a native-denominated total — we keep\n USD as a graceful fallback so the cell is never blank. */}\n {currency === \"native\" &&\n (primary as { amountInNative?: string }).amountInNative\n ? `${formatAmount(\n (primary as { amountInNative?: string }).amountInNative!,\n )} ${primary.symbol}`\n : primary.amountInUsd\n ? formatAmountUSDCompact(primary.amountInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {primary.priceInUsd ? `$${formatPrice(primary.priceInUsd)}` : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatGasFee(activity.gasFee, nativeDecimals, nativeSymbol)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatAgeShort(activity.time, now)}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useTokenActivitiesQuery,\n useTokenActivitiesSubscription,\n} from \"@liberfi.io/react\";\nimport type { API, Activity, Chain } from \"@liberfi.io/types\";\nimport type { TokenActivitiesListSortBy } from \"./token-activities-list.ui\";\n\nexport interface UseTokenActivitiesListScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: TokenActivitiesListSortBy;\n initialTypeFilter?: \"all\" | \"buy\" | \"sell\";\n}\n\nexport interface UseTokenActivitiesListScriptResult {\n activities: Array<Activity>;\n isLoading: boolean;\n sortBy: TokenActivitiesListSortBy;\n setSortBy: (s: TokenActivitiesListSortBy) => void;\n typeFilter: \"all\" | \"buy\" | \"sell\";\n setTypeFilter: (t: \"all\" | \"buy\" | \"sell\") => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 token activities list.\n *\n * Pagination: cursor accumulation with reset on any of (sortBy, typeFilter,\n * chain, address) changing — cursors are invalidated by server sort changes,\n * and semantic filters change the result set.\n *\n * Realtime: {@link useTokenActivitiesSubscription} prepends new activities to\n * the first page while we're on the default `timestamp` sort + `all` filter\n * (and no cursor has been pushed). In other states, live pushes are ignored\n * to avoid confusing the sorted / filtered window.\n */\nexport function useTokenActivitiesListScript({\n chain,\n address,\n limit = 50,\n initialSortBy = \"timestamp\",\n initialTypeFilter = \"all\",\n}: UseTokenActivitiesListScriptParams): UseTokenActivitiesListScriptResult {\n const [sortBy, setSortByState] =\n useState<TokenActivitiesListSortBy>(initialSortBy);\n const [typeFilter, setTypeFilterState] = useState<\"all\" | \"buy\" | \"sell\">(\n initialTypeFilter,\n );\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<Activity>>>([]);\n const [liveFront, setLiveFront] = useState<Array<Activity>>([]);\n\n const reset = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n setLiveFront([]);\n }, []);\n\n const setSortBy = useCallback(\n (s: TokenActivitiesListSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n reset();\n },\n [sortBy, reset],\n );\n\n const setTypeFilter = useCallback(\n (t: \"all\" | \"buy\" | \"sell\") => {\n if (t === typeFilter) return;\n setTypeFilterState(t);\n reset();\n },\n [typeFilter, reset],\n );\n\n useEffect(() => {\n reset();\n }, [chain, address, reset]);\n\n const queryType = typeFilter === \"all\" ? undefined : typeFilter;\n\n const queryParams = useMemo(\n () => ({ chain, address, cursor, limit, sortBy, type: queryType }),\n [chain, address, cursor, limit, sortBy, queryType],\n );\n\n const { data, isPending, isFetching } = useTokenActivitiesQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const liveEligible =\n sortBy === \"timestamp\" && typeFilter === \"all\" && cursor == null;\n\n useTokenActivitiesSubscription({ chain, address }, (incoming) => {\n if (!liveEligible || !incoming?.length) return;\n setLiveFront((prev) => {\n const seen = new Set(prev.map((a) => a.txHash));\n const fresh = incoming.filter((a) => !seen.has(a.txHash));\n if (fresh.length === 0) return prev;\n return [...fresh, ...prev].slice(0, 100);\n });\n });\n\n const activities = useMemo(() => {\n const paged = pages.flatMap((p) => p.data);\n if (!liveEligible || liveFront.length === 0) return paged;\n const seen = new Set(paged.map((a) => a.txHash));\n const frontFiltered = liveFront.filter((a) => !seen.has(a.txHash));\n return [...frontFiltered, ...paged];\n }, [pages, liveFront, liveEligible]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n activities,\n isLoading: isPending || isFetching,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { Activity, Chain } from \"@liberfi.io/types\";\nimport { useTokenActivitiesListScript } from \"./token-activities-list.script\";\nimport {\n TokenActivitiesList,\n type TokenActivitiesListCurrency,\n type TokenActivitiesListSortBy,\n type TokenActivitiesListTraderFilter,\n} from \"./token-activities-list.ui\";\n\nexport interface TokenActivitiesListWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: TokenActivitiesListSortBy;\n initialTypeFilter?: \"all\" | \"buy\" | \"sell\";\n /** Axiom-style DEV / TRACKED / YOU filter. Defaults to `all`. */\n initialTraderFilter?: TokenActivitiesListTraderFilter;\n /** Initial USD / native toggle state. Defaults to `usd`. */\n initialCurrency?: TokenActivitiesListCurrency;\n /** Your wallet address — required for the `you` filter option to light up. */\n youWalletAddress?: string;\n /** native token decimals for gas-fee formatting, default 9 (lamports on SOL) */\n nativeDecimals?: number;\n /** native token symbol, default \"SOL\" */\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\n/**\n * Phase 3 token-activities list widget, upgraded to Axiom parity.\n *\n * Replaces the legacy `getTokenTrades` call with `getTokenActivities` and\n * renders `traderTags` + `gasFee`, plus the Axiom-style `DEV / TRACKED /\n * YOU` trader filter and a USD / native currency toggle. The trader\n * filter is applied client-side on top of the paged results.\n */\nexport function TokenActivitiesListWidget({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n initialTraderFilter = \"all\",\n initialCurrency = \"usd\",\n youWalletAddress,\n nativeDecimals,\n nativeSymbol,\n className,\n onRowClick,\n}: TokenActivitiesListWidgetProps) {\n const [traderFilter, setTraderFilter] =\n useState<TokenActivitiesListTraderFilter>(initialTraderFilter);\n const [currency, setCurrency] =\n useState<TokenActivitiesListCurrency>(initialCurrency);\n const {\n activities,\n isLoading,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n } = useTokenActivitiesListScript({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n });\n\n return (\n <TokenActivitiesList\n activities={activities}\n isLoading={isLoading}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n typeFilter={typeFilter}\n onTypeFilterChange={setTypeFilter}\n traderFilter={traderFilter}\n onTraderFilterChange={setTraderFilter}\n youWalletAddress={youWalletAddress}\n currency={currency}\n onCurrencyChange={setCurrency}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { TokenStats } from \"@liberfi.io/types\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { BuySellOverview } from \"../shared\";\n\nexport type OverviewResolution = keyof TokenStats;\n\nexport interface TokenTradersOverviewProps {\n stats?: TokenStats;\n resolution: OverviewResolution;\n className?: string;\n}\n\n/**\n * Traders overview — total unique traders for a timeframe, split by\n * buyers / sellers.\n */\nexport function TokenTradersOverview({\n stats,\n resolution,\n className,\n}: TokenTradersOverviewProps) {\n const r = stats?.[resolution];\n const total = r?.traders ?? 0;\n const buys = r?.buyers ?? 0;\n const sells = r?.sellers ?? 0;\n return (\n <BuySellOverview\n className={className}\n label={`Traders (${resolution})`}\n totalFormatted={formatAmount(total)}\n buysFormatted={formatAmount(buys)}\n sellsFormatted={formatAmount(sells)}\n totalValue={total}\n buysValue={buys}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenTradersOverviewScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenTradersOverviewScript } from \"./token-traders-overview.script\";\nimport {\n TokenTradersOverview,\n type OverviewResolution,\n} from \"./token-traders-overview.ui\";\n\nexport interface TokenTradersOverviewWidgetProps {\n chain: Chain;\n address: string;\n resolution?: OverviewResolution;\n className?: string;\n}\n\nexport function TokenTradersOverviewWidget({\n chain,\n address,\n resolution = \"24h\",\n className,\n}: TokenTradersOverviewWidgetProps) {\n const { token } = useTokenTradersOverviewScript(chain, address);\n return (\n <TokenTradersOverview\n stats={token?.stats}\n resolution={resolution}\n className={className}\n />\n );\n}\n","import type { TokenStats } from \"@liberfi.io/types\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { BuySellOverview } from \"../shared\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\n\nexport interface TokenTransactionsOverviewProps {\n stats?: TokenStats;\n resolution: OverviewResolution;\n className?: string;\n}\n\n/**\n * Transactions overview — total txs for a timeframe, split by buys / sells.\n */\nexport function TokenTransactionsOverview({\n stats,\n resolution,\n className,\n}: TokenTransactionsOverviewProps) {\n const r = stats?.[resolution];\n const total = r?.trades ?? 0;\n const buys = r?.buys ?? 0;\n const sells = r?.sells ?? 0;\n return (\n <BuySellOverview\n className={className}\n label={`Transactions (${resolution})`}\n totalFormatted={formatAmount(total)}\n buysFormatted={formatAmount(buys)}\n sellsFormatted={formatAmount(sells)}\n totalValue={total}\n buysValue={buys}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenTransactionsOverviewScript(\n chain: Chain,\n address: string,\n) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\nimport { useTokenTransactionsOverviewScript } from \"./token-transactions-overview.script\";\nimport { TokenTransactionsOverview } from \"./token-transactions-overview.ui\";\n\nexport interface TokenTransactionsOverviewWidgetProps {\n chain: Chain;\n address: string;\n resolution?: OverviewResolution;\n className?: string;\n}\n\nexport function TokenTransactionsOverviewWidget({\n chain,\n address,\n resolution = \"24h\",\n className,\n}: TokenTransactionsOverviewWidgetProps) {\n const { token } = useTokenTransactionsOverviewScript(chain, address);\n return (\n <TokenTransactionsOverview\n stats={token?.stats}\n resolution={resolution}\n className={className}\n />\n );\n}\n","import type { TokenStats } from \"@liberfi.io/types\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { BuySellOverview } from \"../shared\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\n\nexport interface TokenVolumesOverviewProps {\n stats?: TokenStats;\n resolution: OverviewResolution;\n className?: string;\n}\n\n/**\n * Volumes overview — total volume (in USD) for a timeframe, split by buy /\n * sell volume.\n */\nexport function TokenVolumesOverview({\n stats,\n resolution,\n className,\n}: TokenVolumesOverviewProps) {\n const r = stats?.[resolution];\n const total = r?.volumesInUsd ?? \"0\";\n const buys = r?.buyVolumesInUsd ?? \"0\";\n const sells = r?.sellVolumesInUsd ?? \"0\";\n return (\n <BuySellOverview\n className={className}\n label={`Volume (${resolution})`}\n totalFormatted={formatAmountUSDCompact(total)}\n buysFormatted={formatAmountUSDCompact(buys)}\n sellsFormatted={formatAmountUSDCompact(sells)}\n totalValue={total}\n buysValue={buys}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenVolumesOverviewScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\nimport { useTokenVolumesOverviewScript } from \"./token-volumes-overview.script\";\nimport { TokenVolumesOverview } from \"./token-volumes-overview.ui\";\n\nexport interface TokenVolumesOverviewWidgetProps {\n chain: Chain;\n address: string;\n resolution?: OverviewResolution;\n className?: string;\n}\n\nexport function TokenVolumesOverviewWidget({\n chain,\n address,\n resolution = \"24h\",\n className,\n}: TokenVolumesOverviewWidgetProps) {\n const { token } = useTokenVolumesOverviewScript(chain, address);\n return (\n <TokenVolumesOverview\n stats={token?.stats}\n resolution={resolution}\n className={className}\n />\n );\n}\n","import type { TokenSecurity as TokenSecurityData } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface TokenSecurityProps {\n security?: TokenSecurityData;\n /** link to the external auditor (e.g. GoPlus) */\n externalUrl?: string;\n /** text for the external link; omitted = no footer link */\n externalLabel?: string;\n className?: string;\n}\n\ninterface SecurityItemSpec {\n title: string;\n value: boolean | undefined;\n /** whether true means \"safe\" */\n safeWhen: boolean;\n description?: string;\n}\n\n/**\n * Presentational security summary built off `TokenSecurity` domain flags.\n * Each row shows a security attribute + a safe / unsafe tag.\n */\nexport function TokenSecurity({\n security,\n externalUrl,\n externalLabel,\n className,\n}: TokenSecurityProps) {\n const items: Array<SecurityItemSpec> = [\n {\n title: \"Transfer fee\",\n value: security?.hasTransferFee,\n safeWhen: false,\n description: \"Whether the token charges a fee on transfer.\",\n },\n {\n title: \"Fee not upgradable\",\n value: security?.isTransferFeeUpgradable,\n safeWhen: false,\n description: \"Whether the transfer fee can be raised by the token owner.\",\n },\n {\n title: \"Transferable\",\n value: security?.isTransferable,\n safeWhen: true,\n description: \"Whether token holders can freely transfer the token.\",\n },\n {\n title: \"Not freezable\",\n value: security?.isFreezable,\n safeWhen: false,\n description: \"Whether the token authority can freeze holder balances.\",\n },\n {\n title: \"Not closable\",\n value: security?.isClosable,\n safeWhen: false,\n description: \"Whether the token program can be closed by its owner.\",\n },\n ];\n\n const allSafe = items.every(\n (it) => it.value !== undefined && it.value === it.safeWhen,\n );\n\n return (\n <section className={cn(\"flex w-full flex-col gap-3\", className)}>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Security</span>\n <span\n className={cn(\n \"text-xs\",\n security === undefined\n ? \"text-default-400\"\n : allSafe\n ? \"text-success-500\"\n : \"text-danger-500\",\n )}\n >\n {security === undefined ? \"--\" : allSafe ? \"Safe\" : \"Review\"}\n </span>\n </div>\n <div className=\"flex flex-col\">\n {items.map((item) => (\n <SecurityItem key={item.title} {...item} />\n ))}\n </div>\n {externalUrl && externalLabel && (\n <div className=\"flex justify-center\">\n <a\n href={externalUrl}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {externalLabel}\n </a>\n </div>\n )}\n </section>\n );\n}\n\nfunction SecurityItem({\n title,\n value,\n safeWhen,\n description,\n}: SecurityItemSpec) {\n const safe = value !== undefined && value === safeWhen;\n const display = value === undefined ? \"--\" : safe ? \"OK\" : \"Risk\";\n return (\n <div className=\"flex h-8 items-center justify-between gap-2\">\n <span className=\"text-xs text-default-500\" title={description}>\n {title}\n </span>\n <span\n className={cn(\n \"text-xs\",\n value === undefined\n ? \"text-default-400\"\n : safe\n ? \"text-success-500\"\n : \"text-danger-500\",\n )}\n >\n {display}\n </span>\n </div>\n );\n}\n","import { useTokenSecurityQuery } from \"@liberfi.io/react\";\nimport type { Chain } from \"@liberfi.io/types\";\n\n/**\n * Script for {@link TokenSecurityWidget} — fetches the domain security flags\n * from `useTokenSecurityQuery`.\n */\nexport function useTokenSecurityScript(chain: Chain, address: string) {\n const { data, isLoading } = useTokenSecurityQuery({ chain, address });\n return { security: data, isLoading };\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenSecurityScript } from \"./token-security.script\";\nimport { TokenSecurity } from \"./token-security.ui\";\n\nexport interface TokenSecurityWidgetProps {\n chain: Chain;\n address: string;\n /** URL to the external auditor (e.g. GoPlus). */\n externalUrl?: string;\n /** Link label for the external auditor; omitted = no footer link. */\n externalLabel?: string;\n className?: string;\n}\n\n/**\n * Token security widget built on top of {@link useTokenSecurityQuery}. Caller\n * passes in the external auditor link (the widget is auditor-agnostic).\n */\nexport function TokenSecurityWidget({\n chain,\n address,\n externalUrl,\n externalLabel,\n className,\n}: TokenSecurityWidgetProps) {\n const { security } = useTokenSecurityScript(chain, address);\n return (\n <TokenSecurity\n security={security}\n externalUrl={externalUrl}\n externalLabel={externalLabel}\n className={className}\n />\n );\n}\n","import type { Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface TokenAboutProps {\n token?: Token;\n className?: string;\n}\n\n/**\n * Token description / \"About\" section. Shows the token name, symbol and\n * human-readable description when present. Hidden when `token` has no\n * description or metadata beyond its ticker.\n */\nexport function TokenAbout({ token, className }: TokenAboutProps) {\n if (!token) return null;\n return (\n <section className={cn(\"flex w-full flex-col gap-2\", className)}>\n <div className=\"text-sm font-medium text-foreground\">\n About {token.symbol}\n </div>\n {token.description ? (\n <p className=\"whitespace-pre-line text-xs text-default-500\">\n {token.description}\n </p>\n ) : (\n <p className=\"text-xs text-default-400\">No description provided.</p>\n )}\n </section>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenAboutScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenAboutScript } from \"./token-about.script\";\nimport { TokenAbout } from \"./token-about.ui\";\n\nexport interface TokenAboutWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenAboutWidget({\n chain,\n address,\n className,\n}: TokenAboutWidgetProps) {\n const { token } = useTokenAboutScript(chain, address);\n return <TokenAbout token={token} className={className} />;\n}\n","import { useState, useCallback } from \"react\";\nimport type { TokenLiquidity } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { truncateMiddle } from \"../shared\";\n\nexport interface TokenLiquiditiesProps {\n liquidities?: Array<TokenLiquidity>;\n /** aggregate TVL (usd) shown in the header */\n totalTvlInUsd?: string;\n /** number of pools shown before \"show more\" kicks in */\n collapseAt?: number;\n className?: string;\n /** optional click handler for a pool row (e.g. deep-link to the explorer) */\n onPoolClick?: (liquidity: TokenLiquidity) => void;\n}\n\n/**\n * Token DEX liquidity breakdown. Each row shows protocol family, pool address\n * (truncated), and the pool's TVL.\n */\nexport function TokenLiquidities({\n liquidities,\n totalTvlInUsd,\n collapseAt = 3,\n className,\n onPoolClick,\n}: TokenLiquiditiesProps) {\n const [expanded, setExpanded] = useState(\n !liquidities || liquidities.length <= collapseAt,\n );\n const toggle = useCallback(() => setExpanded((v) => !v), []);\n\n return (\n <section className={cn(\"flex w-full flex-col gap-3\", className)}>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Liquidity</span>\n {totalTvlInUsd && (\n <span className=\"text-xs text-foreground\">\n {formatAmountUSDCompact(totalTvlInUsd)}\n </span>\n )}\n </div>\n\n {(!liquidities || liquidities.length === 0) && (\n <div className=\"py-4 text-center text-xs text-default-400\">\n No pools\n </div>\n )}\n\n {liquidities && liquidities.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {liquidities.map((lq, i) => (\n <div\n key={lq.poolAddress ?? `${lq.protocolFamily}-${i}`}\n className={cn(\n \"flex h-10 w-full items-center justify-between overflow-hidden text-xs\",\n i >= collapseAt && !expanded && \"hidden\",\n onPoolClick && \"cursor-pointer hover:bg-default-50\",\n )}\n onClick={onPoolClick ? () => onPoolClick(lq) : undefined}\n >\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">\n {lq.protocolFamily ?? lq.protocolName ?? \"Unknown\"}\n </span>\n {lq.poolAddress && (\n <span className=\"font-mono text-[10px] text-default-400\">\n Pool: {truncateMiddle(lq.poolAddress, 6, 6)}\n </span>\n )}\n </div>\n <div className=\"text-default-500\">\n {formatAmountUSDCompact(lq.tvlInUsd ?? 0)}\n </div>\n </div>\n ))}\n {liquidities.length > collapseAt && (\n <div className=\"flex justify-center pt-1\">\n <button\n type=\"button\"\n onClick={toggle}\n className=\"rounded px-2 py-1 text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n </div>\n )}\n </div>\n )}\n </section>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenLiquiditiesScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain, TokenLiquidity } from \"@liberfi.io/types\";\nimport { useTokenLiquiditiesScript } from \"./token-liquidities.script\";\nimport { TokenLiquidities } from \"./token-liquidities.ui\";\n\nexport interface TokenLiquiditiesWidgetProps {\n chain: Chain;\n address: string;\n collapseAt?: number;\n className?: string;\n onPoolClick?: (liquidity: TokenLiquidity) => void;\n}\n\nexport function TokenLiquiditiesWidget({\n chain,\n address,\n collapseAt,\n className,\n onPoolClick,\n}: TokenLiquiditiesWidgetProps) {\n const { token } = useTokenLiquiditiesScript(chain, address);\n return (\n <TokenLiquidities\n liquidities={token?.liquidities}\n totalTvlInUsd={token?.marketData?.tvlInUsd}\n collapseAt={collapseAt}\n className={className}\n onPoolClick={onPoolClick}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { Chip, Image, cn } from \"@liberfi.io/ui\";\n\nexport interface CexListingEntry {\n id: string;\n name: string;\n logo?: string;\n url?: string;\n}\n\nexport interface TokenCexListingProps {\n cexes?: Array<CexListingEntry>;\n collapseAt?: number;\n className?: string;\n}\n\n/**\n * Displays centralized exchanges where the token is listed. Data is\n * app-supplied via props because the `@liberfi.io/types#Token` domain type\n * does not model CEX listings.\n */\nexport function TokenCexListing({\n cexes,\n collapseAt = 4,\n className,\n}: TokenCexListingProps) {\n const [expanded, setExpanded] = useState(\n !cexes || cexes.length <= collapseAt,\n );\n const toggle = useCallback(() => setExpanded((v) => !v), []);\n\n if (!cexes || cexes.length === 0) return null;\n\n return (\n <section className={cn(\"w-full\", className)}>\n <div className=\"text-sm font-medium text-foreground\">CEX listings</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {cexes.map((cex, i) => {\n const hidden = i >= collapseAt && !expanded;\n const chip = (\n <Chip\n key={cex.id}\n startContent={\n cex.logo ? (\n <Image src={cex.logo} width={20} height={20} alt={cex.name} />\n ) : undefined\n }\n className={cn(\"bg-default-100 text-xs\", hidden && \"hidden\")}\n >\n {cex.name}\n </Chip>\n );\n return cex.url ? (\n <a\n key={cex.id}\n href={cex.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={cn(hidden && \"hidden\")}\n >\n {chip}\n </a>\n ) : (\n chip\n );\n })}\n </div>\n {cexes.length > collapseAt && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={toggle}\n className=\"rounded px-2 py-1 text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n </div>\n )}\n </section>\n );\n}\n","import type { CexListingEntry } from \"./token-cex-listing.ui\";\n\n/**\n * Script for the CEX listing widget. Today the `@liberfi.io/types#Token`\n * domain type does not expose CEX listings, so the script is a pass-through\n * that the caller uses to keep the widget's state-shape centralized. The\n * caller is expected to source CEX data from its own application APIs.\n */\nexport function useTokenCexListingScript(cexes?: Array<CexListingEntry>) {\n return { cexes };\n}\n","import { useTokenCexListingScript } from \"./token-cex-listing.script\";\nimport { TokenCexListing, type CexListingEntry } from \"./token-cex-listing.ui\";\n\nexport interface TokenCexListingWidgetProps {\n /** caller-supplied CEX listings; domain type does not model this */\n cexes?: Array<CexListingEntry>;\n collapseAt?: number;\n className?: string;\n}\n\n/**\n * Caller-data CEX listings widget. The script layer is a pass-through because\n * the SDK's `Token` does not carry CEX listing data.\n */\nexport function TokenCexListingWidget({\n cexes: cexesProp,\n collapseAt,\n className,\n}: TokenCexListingWidgetProps) {\n const { cexes } = useTokenCexListingScript(cexesProp);\n return (\n <TokenCexListing\n cexes={cexes}\n collapseAt={collapseAt}\n className={className}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { Chip, cn } from \"@liberfi.io/ui\";\n\nexport interface TokenCategoriesProps {\n categories?: Array<string>;\n collapseAt?: number;\n className?: string;\n onCategoryClick?: (category: string) => void;\n}\n\n/**\n * Displays token classification tags (e.g. \"meme\", \"defi\", \"ai\"). Data is\n * sourced from `token.tags` by the widget layer.\n */\nexport function TokenCategories({\n categories,\n collapseAt = 4,\n className,\n onCategoryClick,\n}: TokenCategoriesProps) {\n const [expanded, setExpanded] = useState(\n !categories || categories.length <= collapseAt,\n );\n const toggle = useCallback(() => setExpanded((v) => !v), []);\n\n if (!categories || categories.length === 0) return null;\n\n return (\n <section className={cn(\"w-full\", className)}>\n <div className=\"text-sm font-medium text-foreground\">Categories</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {categories.map((tag, i) => {\n const hidden = i >= collapseAt && !expanded;\n return (\n <Chip\n key={tag}\n size=\"sm\"\n className={cn(\n \"bg-default-100\",\n hidden && \"hidden\",\n onCategoryClick && \"cursor-pointer\",\n )}\n onClick={onCategoryClick ? () => onCategoryClick(tag) : undefined}\n >\n {tag}\n </Chip>\n );\n })}\n </div>\n {categories.length > collapseAt && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={toggle}\n className=\"rounded px-2 py-1 text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n </div>\n )}\n </section>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenCategoriesScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenCategoriesScript } from \"./token-categories.script\";\nimport { TokenCategories } from \"./token-categories.ui\";\n\nexport interface TokenCategoriesWidgetProps {\n chain: Chain;\n address: string;\n collapseAt?: number;\n className?: string;\n onCategoryClick?: (category: string) => void;\n}\n\nexport function TokenCategoriesWidget({\n chain,\n address,\n collapseAt,\n className,\n onCategoryClick,\n}: TokenCategoriesWidgetProps) {\n const { token } = useTokenCategoriesScript(chain, address);\n return (\n <TokenCategories\n categories={token?.tags}\n collapseAt={collapseAt}\n className={className}\n onCategoryClick={onCategoryClick}\n />\n );\n}\n","\"use client\";\n\nimport type { TokenStats, TokenStatsByResolution } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\n\n/**\n * Resolution used by the base stat cells. Axiom uses the chart's active\n * resolution here (defaults to `5m`).\n */\nexport type TokenStatsFlipBaseResolution =\n | \"1m\"\n | \"5m\"\n | \"15m\"\n | \"30m\"\n | \"1h\"\n | \"4h\"\n | \"24h\";\n\n/**\n * Time windows displayed in the hover overlay (price change % per window).\n *\n * NOTE: Axiom shows `5m / 1h / 6h / 24h`. Our server schema exposes\n * `5m / 1h / 4h / 24h` (no native 6h window), so we default to that set\n * and document the delta. Consumers can override via\n * {@link TokenStatsFlipProps.hoverResolutions}.\n */\nexport type TokenStatsFlipHoverResolution = TokenStatsFlipBaseResolution;\n\nexport const DEFAULT_FLIP_HOVER_RESOLUTIONS: ReadonlyArray<TokenStatsFlipHoverResolution> =\n [\"5m\", \"1h\", \"4h\", \"24h\"];\n\nexport interface TokenStatsFlipBaseProps {\n stats: TokenStats | undefined;\n resolution: TokenStatsFlipBaseResolution;\n className?: string;\n}\n\n/**\n * Base layer — 4-cell grid showing `Volume / Buys / Sells / Net Volume` for\n * the active resolution, plus a 2px buy-share bar at the bottom.\n */\nexport function TokenStatsFlipBase({\n stats,\n resolution,\n className,\n}: TokenStatsFlipBaseProps) {\n const r = stats?.[resolution];\n const buyUsd = new SafeBigNumber(r?.buyVolumesInUsd ?? 0);\n const sellUsd = new SafeBigNumber(r?.sellVolumesInUsd ?? 0);\n const totalUsd = buyUsd.plus(sellUsd);\n const netUsd = buyUsd.minus(sellUsd);\n const buySharePct = totalUsd.eq(0)\n ? 50\n : Math.min(100, Math.max(0, buyUsd.div(totalUsd).times(100).toNumber()));\n\n const cells: Array<{\n label: string;\n value: string;\n className?: string;\n }> = [\n {\n label: `${resolution} Vol`,\n value: formatAmountUSDCompact(totalUsd.toString()),\n className: \"text-foreground\",\n },\n {\n label: \"Buys\",\n value: formatAmountUSDCompact(buyUsd.toString()),\n className: \"text-bullish\",\n },\n {\n label: \"Sells\",\n value: formatAmountUSDCompact(sellUsd.toString()),\n className: \"text-bearish\",\n },\n {\n label: \"Net Vol.\",\n value: formatAmountUSDCompact(netUsd.abs().toString()),\n className: netUsd.gte(0) ? \"text-bullish\" : \"text-bearish\",\n },\n ];\n\n return (\n <div className={cn(\"flex h-full w-full flex-col\", className)}>\n <div className=\"grid flex-1 grid-cols-4 items-center\">\n {cells.map((c) => (\n <div\n key={c.label}\n className=\"flex flex-col items-start justify-center gap-[2px] px-2\"\n >\n <span className=\"text-[10px] leading-none text-default-400\">\n {c.label}\n </span>\n <span\n className={cn(\n \"text-[13px] font-medium leading-none tabular-nums\",\n c.className,\n )}\n >\n {c.value}\n </span>\n </div>\n ))}\n </div>\n {/* 2px buy-share bar */}\n <div className=\"relative h-[2px] w-full overflow-hidden bg-bearish\">\n <div\n className=\"absolute inset-y-0 left-0 bg-bullish transition-[width] duration-200 ease-out\"\n style={{ width: `${buySharePct}%` }}\n />\n </div>\n </div>\n );\n}\n\nexport interface TokenStatsFlipHoverProps {\n stats: TokenStats | undefined;\n resolutions: ReadonlyArray<TokenStatsFlipHoverResolution>;\n className?: string;\n}\n\n/**\n * Hover overlay — 4-cell grid showing `priceChange %` per window with\n * bullish/bearish tint.\n */\nexport function TokenStatsFlipHover({\n stats,\n resolutions,\n className,\n}: TokenStatsFlipHoverProps) {\n return (\n <div\n className={cn(\"grid h-full w-full grid-cols-4 items-center\", className)}\n >\n {resolutions.map((res) => {\n const r: TokenStatsByResolution | undefined = stats?.[res];\n const raw = r?.priceChange;\n const bn = raw ? new SafeBigNumber(raw) : undefined;\n const isPositive = bn ? bn.gte(0) : undefined;\n const label = res;\n // `priceChange` is returned as a ratio (0.03 = 3%); format with leading\n // sign so positive values render as `+3.00%`.\n const display = bn\n ? formatPercent(bn, { showPlusGtThanZero: true })\n : \"—\";\n return (\n <div\n key={res}\n className=\"flex flex-col items-start justify-center gap-[2px] px-2\"\n >\n <span className=\"text-[10px] leading-none text-default-400\">\n {label}\n </span>\n <span\n className={cn(\n \"text-[13px] font-medium leading-none tabular-nums\",\n isPositive === undefined\n ? \"text-foreground\"\n : isPositive\n ? \"text-bullish\"\n : \"text-bearish\",\n )}\n >\n {display}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport interface TokenStatsFlipProps {\n stats: TokenStats | undefined;\n /** Resolution displayed in the base layer. Defaults to `5m`. */\n baseResolution?: TokenStatsFlipBaseResolution;\n /** Time windows displayed in the hover overlay. Defaults to `5m/1h/4h/24h`. */\n hoverResolutions?: ReadonlyArray<TokenStatsFlipHoverResolution>;\n /** Height override (panel height). Defaults to 64. */\n height?: number;\n className?: string;\n}\n","import { useTokenStatsQuery } from \"@liberfi.io/react\";\nimport type { Chain, TokenStats } from \"@liberfi.io/types\";\n\nexport interface UseTokenStatsFlipScriptParams {\n chain: Chain;\n address: string;\n}\n\n/**\n * Thin query wrapper for {@link TokenStatsFlipWidget}.\n *\n * Fetches the full `TokenStats` object — both base and hover layers read\n * different resolution slices off the same response, so a single query is\n * enough; no subscription wiring needed here (the hover resolutions are\n * refreshed with normal React Query stale/refetch semantics).\n */\nexport function useTokenStatsFlipScript({\n chain,\n address,\n}: UseTokenStatsFlipScriptParams): {\n stats: TokenStats | undefined;\n isLoading: boolean;\n} {\n const { data, isLoading } = useTokenStatsQuery({ chain, address });\n return { stats: data, isLoading };\n}\n","\"use client\";\n\nimport type { Chain } from \"@liberfi.io/types\";\nimport { StatsFlipPanel } from \"@liberfi.io/ui-scaffold\";\nimport { useTokenStatsFlipScript } from \"./token-stats-flip.script\";\nimport {\n DEFAULT_FLIP_HOVER_RESOLUTIONS,\n TokenStatsFlipBase,\n TokenStatsFlipHover,\n type TokenStatsFlipBaseResolution,\n type TokenStatsFlipHoverResolution,\n} from \"./token-stats-flip.ui\";\n\nexport interface TokenStatsFlipWidgetProps {\n chain: Chain;\n address: string;\n /** Resolution for the base layer. Defaults to `5m`. */\n baseResolution?: TokenStatsFlipBaseResolution;\n /** Hover overlay resolutions. Defaults to `5m / 1h / 4h / 24h`. */\n hoverResolutions?: ReadonlyArray<TokenStatsFlipHoverResolution>;\n /** Panel height. Defaults to 64. */\n height?: number;\n /** Extra className on the panel wrapper. */\n className?: string;\n}\n\n/**\n * TokenStatsFlipWidget — Axiom-style volume/price-change panel above the\n * Buy / Sell form.\n *\n * At rest shows `{res} Vol / Buys / Sells / Net Vol` for the active\n * resolution; on hover a blurred overlay cross-fades in with\n * `priceChange %` per window. A cursor-following radial glow adds the\n * signature Axiom interaction.\n */\nexport function TokenStatsFlipWidget({\n chain,\n address,\n baseResolution = \"5m\",\n hoverResolutions = DEFAULT_FLIP_HOVER_RESOLUTIONS,\n height = 64,\n className,\n}: TokenStatsFlipWidgetProps) {\n const { stats } = useTokenStatsFlipScript({ chain, address });\n return (\n <StatsFlipPanel\n className={className}\n height={height}\n base={<TokenStatsFlipBase stats={stats} resolution={baseResolution} />}\n hover={\n <TokenStatsFlipHover stats={stats} resolutions={hoverResolutions} />\n }\n />\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport type { PortfolioPnl } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\n\n/**\n * Amount display mode. Axiom offers a USD / SOL toggle; we generalise that\n * to `usd | native` so the same widget works on any chain. When unset, the\n * widget defaults to `usd`.\n */\nexport type TokenPositionsListCurrency = \"usd\" | \"native\";\n\nexport interface TokenPositionsListProps {\n positions: Array<PortfolioPnl>;\n isLoading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n /** Currency toggle. Defaults to `usd`. */\n currency?: TokenPositionsListCurrency;\n onCurrencyChange?: (currency: TokenPositionsListCurrency) => void;\n /** Show-hidden positions filter (UI hook only; parent owns state). */\n showHidden?: boolean;\n onShowHiddenChange?: (value: boolean) => void;\n /** Native token symbol shown in the toggle (e.g. `SOL`, `ETH`). Defaults to `Native`. */\n nativeSymbol?: string;\n /** Per-row action slot (buy / sell / hide). Parent owns which actions to render. */\n renderActions?: (position: PortfolioPnl) => ReactNode;\n className?: string;\n}\n\n/**\n * Presentational list of a wallet's open positions in a token context —\n * columns: `Token / Bought / Sold / Remaining / PnL / Actions`.\n *\n * The parent owns data and pagination; this component is purely visual.\n */\nexport function TokenPositionsList({\n positions,\n isLoading,\n hasMore,\n onLoadMore,\n currency = \"usd\",\n onCurrencyChange,\n showHidden = false,\n onShowHiddenChange,\n nativeSymbol = \"Native\",\n renderActions,\n className,\n}: TokenPositionsListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-medium text-default-500\">\n Positions\n </span>\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={showHidden}\n onChange={(e) => onShowHiddenChange?.(e.target.checked)}\n />\n Show Hidden\n </label>\n </div>\n <CurrencyToggle\n value={currency}\n nativeSymbol={nativeSymbol}\n onChange={onCurrencyChange}\n />\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[26%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Bought\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">Sold</th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n Remaining\n </th>\n <th className=\"w-[18%] px-3 py-2 text-right font-normal\">PnL</th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n Actions\n </th>\n </tr>\n </thead>\n <tbody>\n {positions.length === 0 && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No open positions\n </td>\n </tr>\n )}\n {positions.map((p) => (\n <PositionRow\n key={`${p.chain}:${p.address}`}\n position={p}\n currency={currency}\n renderActions={renderActions}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction CurrencyToggle({\n value,\n nativeSymbol,\n onChange,\n}: {\n value: TokenPositionsListCurrency;\n nativeSymbol: string;\n onChange?: (value: TokenPositionsListCurrency) => void;\n}) {\n const options: Array<{ k: TokenPositionsListCurrency; label: string }> = [\n { k: \"usd\", label: \"USD\" },\n { k: \"native\", label: nativeSymbol },\n ];\n return (\n <div className=\"flex h-[24px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {options.map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onChange?.(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n value === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction PositionRow({\n position,\n currency,\n renderActions,\n}: {\n position: PortfolioPnl;\n currency: TokenPositionsListCurrency;\n renderActions?: (position: PortfolioPnl) => ReactNode;\n}) {\n const { bought, sold, remaining, pnl } = useMemo(\n () => computePositionFields(position, currency),\n [position, currency],\n );\n\n const tokenCell = (\n <div className=\"flex items-center gap-2\">\n <Avatar\n src={position.image ?? undefined}\n name={(position.symbol ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-foreground\">{position.symbol}</span>\n <span className=\"truncate text-[10px] text-default-400\">\n {position.name}\n </span>\n </div>\n </div>\n );\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{tokenCell}</td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {bought}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {sold}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {remaining}\n </td>\n <td\n className={cn(\n \"px-3 py-2 text-right align-middle font-medium\",\n pnl.isPositive === undefined\n ? \"text-default-400\"\n : pnl.isPositive\n ? \"text-bullish\"\n : \"text-bearish\",\n )}\n >\n <div className=\"flex flex-col items-end leading-tight\">\n <span>{pnl.amount}</span>\n {pnl.ratio ? <span className=\"text-[10px]\">{pnl.ratio}</span> : null}\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n {renderActions ? (\n renderActions(position)\n ) : (\n <span className=\"text-default-400\">--</span>\n )}\n </td>\n </tr>\n );\n}\n\ninterface PositionRowFields {\n bought: string;\n sold: string;\n remaining: string;\n pnl: {\n amount: string;\n ratio?: string;\n isPositive?: boolean;\n };\n}\n\nfunction computePositionFields(\n p: PortfolioPnl,\n currency: TokenPositionsListCurrency,\n): PositionRowFields {\n const buyRaw = currency === \"usd\" ? p.buyVolumesInUsd : p.buyVolumes;\n const sellRaw = currency === \"usd\" ? p.sellVolumesInUsd : p.sellVolumes;\n const remainingRaw = currency === \"usd\" ? p.amountInUsd : p.amount;\n const pnlRaw = currency === \"usd\" ? p.totalProfitInUsd : p.totalProfitInUsd;\n\n const bought =\n currency === \"usd\"\n ? formatAmountUSDCompact(buyRaw ?? 0)\n : formatAmount(buyRaw ?? 0);\n const sold =\n currency === \"usd\"\n ? formatAmountUSDCompact(sellRaw ?? 0)\n : formatAmount(sellRaw ?? 0);\n const remaining =\n currency === \"usd\"\n ? formatAmountUSDCompact(remainingRaw ?? 0)\n : formatAmount(remainingRaw ?? 0);\n\n const pnlBn = pnlRaw ? new SafeBigNumber(pnlRaw) : undefined;\n const isPositive = pnlBn ? pnlBn.gte(0) : undefined;\n const pnlAmount = pnlBn\n ? (isPositive ? \"+\" : \"\") + formatAmountUSDCompact(pnlBn.toString())\n : \"--\";\n const pnlRatio = p.totalProfitRatio\n ? formatPercent(p.totalProfitRatio, { showPlusGtThanZero: true })\n : undefined;\n\n return {\n bought,\n sold,\n remaining,\n pnl: { amount: pnlAmount, ratio: pnlRatio, isPositive },\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletTokenPositionsQuery } from \"@liberfi.io/react\";\nimport type {\n Chain,\n PortfolioPnl,\n WalletPortfolioPnls,\n} from \"@liberfi.io/types\";\n\nexport interface UseTokenPositionsListScriptParams {\n chain: Chain;\n /** Wallet address. When empty, the hook remains disabled. */\n wallet?: string;\n /** Page size; defaults to 50. */\n limit?: number;\n /** Initial show-hidden toggle value. */\n initialShowHidden?: boolean;\n}\n\nexport interface UseTokenPositionsListScriptResult {\n positions: Array<PortfolioPnl>;\n isLoading: boolean;\n hasMore: boolean;\n loadMore: () => void;\n showHidden: boolean;\n setShowHidden: (value: boolean) => void;\n}\n\n/**\n * Script for the positions list widget.\n *\n * Uses {@link useWalletTokenPositionsQuery} (bridge over\n * `getWalletPortfolioPnls` with `positionState=open`) and accumulates pages\n * in local state. Hidden-filter is a purely client-side toggle; the server\n * does not expose a `hidden` flag on positions so the widget always keeps\n * the full list and the parent can filter / persist as desired.\n *\n * Query stays disabled when `wallet` is empty so the positions tab\n * renders gracefully for logged-out users.\n */\nexport function useTokenPositionsListScript({\n chain,\n wallet,\n limit = 50,\n initialShowHidden = false,\n}: UseTokenPositionsListScriptParams): UseTokenPositionsListScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<WalletPortfolioPnls>>([]);\n const [showHidden, setShowHidden] = useState(initialShowHidden);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, wallet]);\n\n const queryParams = useMemo(\n () => ({\n chain,\n address: wallet ?? \"\",\n cursor,\n limit,\n positionState: \"open\" as const,\n }),\n [chain, wallet, cursor, limit],\n );\n\n const { data, isPending, isFetching } = useWalletTokenPositionsQuery(\n queryParams,\n { enabled: !!wallet },\n );\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const positions = useMemo(() => pages.flatMap((p) => p.portfolios), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n positions,\n isLoading: !!wallet && (isPending || isFetching),\n hasMore,\n loadMore,\n showHidden,\n setShowHidden,\n };\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport type { Chain, PortfolioPnl } from \"@liberfi.io/types\";\nimport { useTokenPositionsListScript } from \"./token-positions-list.script\";\nimport {\n TokenPositionsList,\n type TokenPositionsListCurrency,\n} from \"./token-positions-list.ui\";\n\nexport interface TokenPositionsListWidgetProps {\n chain: Chain;\n /** Wallet address. When empty, the list is empty and the query is disabled. */\n wallet?: string;\n limit?: number;\n /** Initial currency. Defaults to `usd`. */\n initialCurrency?: TokenPositionsListCurrency;\n /** Native chain symbol used in the currency toggle (e.g. `SOL`). */\n nativeSymbol?: string;\n /** Optional per-row action slot. */\n renderActions?: (position: PortfolioPnl) => ReactNode;\n className?: string;\n}\n\n/**\n * Positions tab widget.\n *\n * Fetches the caller wallet's open positions via\n * `getWalletPortfolioPnls({ positionState: 'open' })` and renders the\n * Axiom-style columns. Currency (USD / native) and show-hidden toggles\n * are kept in local state; consumers wanting persistence should wrap\n * the widget and lift these up.\n */\nexport function TokenPositionsListWidget({\n chain,\n wallet,\n limit,\n initialCurrency = \"usd\",\n nativeSymbol,\n renderActions,\n className,\n}: TokenPositionsListWidgetProps) {\n const [currency, setCurrency] =\n useState<TokenPositionsListCurrency>(initialCurrency);\n const { positions, isLoading, hasMore, loadMore, showHidden, setShowHidden } =\n useTokenPositionsListScript({ chain, wallet, limit });\n\n return (\n <TokenPositionsList\n className={className}\n positions={positions}\n isLoading={isLoading}\n hasMore={hasMore}\n onLoadMore={loadMore}\n currency={currency}\n onCurrencyChange={setCurrency}\n showHidden={showHidden}\n onShowHiddenChange={setShowHidden}\n nativeSymbol={nativeSymbol}\n renderActions={renderActions}\n />\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport type { LimitOrder, LimitOrderState } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\n\nexport type TokenOrdersListState = Extract<\n LimitOrderState,\n \"active\" | \"filled\" | \"cancelled\" | \"expired\"\n>;\n\n/**\n * Segmented state filter. Axiom exposes `Active Orders / Order History`; we\n * mirror that with `active` vs `history` (any non-active).\n */\nexport type TokenOrdersListStateFilter = \"active\" | \"history\";\n\nexport type TokenOrdersListCurrency = \"usd\" | \"native\";\n\nexport interface TokenOrdersListProps {\n orders: Array<LimitOrder>;\n isLoading?: boolean;\n /** If true, render a \"coming soon\" empty state. Used when the backend endpoint is missing. */\n unavailable?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n stateFilter: TokenOrdersListStateFilter;\n onStateFilterChange: (filter: TokenOrdersListStateFilter) => void;\n /** Token-scope filter (\"Only {SYMBOL}\"). Parent owns state. */\n onlyThisToken?: boolean;\n onOnlyThisTokenChange?: (value: boolean) => void;\n tokenSymbol?: string;\n /** Currency toggle. */\n currency?: TokenOrdersListCurrency;\n onCurrencyChange?: (currency: TokenOrdersListCurrency) => void;\n nativeSymbol?: string;\n /** Cancel-all button click handler; hidden when unset. */\n onCancelAll?: () => void;\n /** Per-row action slot. */\n renderActions?: (order: LimitOrder) => ReactNode;\n className?: string;\n}\n\n/**\n * Presentational list of a wallet's limit orders — columns `Token / Type /\n * Amount / Current MC / Target MC / Settings / Action`.\n *\n * Gracefully renders a \"coming soon\" empty state when the server endpoint\n * is not yet implemented (pass `unavailable`).\n */\nexport function TokenOrdersList({\n orders,\n isLoading,\n unavailable,\n hasMore,\n onLoadMore,\n stateFilter,\n onStateFilterChange,\n onlyThisToken = false,\n onOnlyThisTokenChange,\n tokenSymbol,\n currency = \"usd\",\n onCurrencyChange,\n nativeSymbol = \"Native\",\n onCancelAll,\n renderActions,\n className,\n}: TokenOrdersListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-[24px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {(\n [\n { k: \"active\" as const, label: \"Active Orders\" },\n { k: \"history\" as const, label: \"Order History\" },\n ] satisfies Array<{\n k: TokenOrdersListStateFilter;\n label: string;\n }>\n ).map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onStateFilterChange(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n stateFilter === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n {tokenSymbol ? (\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={onlyThisToken}\n onChange={(e) => onOnlyThisTokenChange?.(e.target.checked)}\n />\n Only {tokenSymbol}\n </label>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {onCancelAll ? (\n <button\n type=\"button\"\n onClick={onCancelAll}\n className=\"rounded px-2 py-1 text-[11px] text-bearish transition-colors hover:bg-default-100\"\n >\n Cancel All\n </button>\n ) : null}\n <CurrencyToggle\n value={currency}\n nativeSymbol={nativeSymbol}\n onChange={onCurrencyChange}\n />\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[22%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[10%] px-3 py-2 text-left font-normal\">Type</th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Current MC\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Target MC\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Settings\n </th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n Action\n </th>\n </tr>\n </thead>\n <tbody>\n {unavailable ? (\n <tr>\n <td colSpan={7} className=\"py-10 text-center text-default-400\">\n Limit orders are coming soon.\n </td>\n </tr>\n ) : orders.length === 0 && !isLoading ? (\n <tr>\n <td colSpan={7} className=\"py-10 text-center text-default-400\">\n No {stateFilter === \"active\" ? \"active\" : \"historical\"} orders\n </td>\n </tr>\n ) : (\n orders.map((o) => (\n <OrderRow\n key={o.id}\n order={o}\n currency={currency}\n renderActions={renderActions}\n />\n ))\n )}\n {isLoading && !unavailable && (\n <tr>\n <td colSpan={7} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {!unavailable && hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction CurrencyToggle({\n value,\n nativeSymbol,\n onChange,\n}: {\n value: TokenOrdersListCurrency;\n nativeSymbol: string;\n onChange?: (value: TokenOrdersListCurrency) => void;\n}) {\n const options: Array<{ k: TokenOrdersListCurrency; label: string }> = [\n { k: \"usd\", label: \"USD\" },\n { k: \"native\", label: nativeSymbol },\n ];\n return (\n <div className=\"flex h-[24px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {options.map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onChange?.(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n value === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction OrderRow({\n order,\n currency,\n renderActions,\n}: {\n order: LimitOrder;\n currency: TokenOrdersListCurrency;\n renderActions?: (order: LimitOrder) => ReactNode;\n}) {\n const amountDisplay = useMemo(() => {\n if (currency === \"usd\" && order.amountInUsd) {\n return formatAmountUSDCompact(order.amountInUsd);\n }\n return formatAmount(order.amount);\n }, [currency, order.amount, order.amountInUsd]);\n\n const side = order.side === \"buy\" ? \"Buy\" : \"Sell\";\n const sideClass = order.side === \"buy\" ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex items-center gap-2\">\n <Avatar\n src={order.tokenImage ?? undefined}\n name={(order.tokenSymbol ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <span className=\"truncate text-foreground\">\n {order.tokenSymbol ?? \"--\"}\n </span>\n </div>\n </td>\n <td className={cn(\"px-3 py-2 align-middle font-medium\", sideClass)}>\n {side}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {amountDisplay}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {order.currentMarketCapInUsd\n ? formatAmountUSDCompact(order.currentMarketCapInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {order.targetMarketCapInUsd\n ? formatAmountUSDCompact(order.targetMarketCapInUsd)\n : order.targetPriceInUsd\n ? formatAmountUSDCompact(order.targetPriceInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {order.slippage != null ? `Slip ${order.slippage}%` : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n {renderActions ? (\n renderActions(order)\n ) : (\n <span className=\"text-default-400\">--</span>\n )}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletLimitOrdersQuery } from \"@liberfi.io/react\";\nimport type {\n API,\n Chain,\n LimitOrder,\n LimitOrderState,\n} from \"@liberfi.io/types\";\nimport type { TokenOrdersListStateFilter } from \"./token-orders-list.ui\";\n\n/**\n * Cross-package duplicate of `@liberfi.io/client#isNotImplementedError`.\n * We avoid a runtime dep on `@liberfi.io/client` from `ui-tokens`; the\n * stable `code === \"NotImplemented\"` discriminant makes the check safe\n * across realms.\n */\nfunction isNotImplementedError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error as { code?: string }).code === \"NotImplemented\"\n );\n}\n\nexport interface UseTokenOrdersListScriptParams {\n chain: Chain;\n wallet?: string;\n /** Token address to use when `onlyThisToken` is true. */\n tokenAddress: string;\n limit?: number;\n initialStateFilter?: TokenOrdersListStateFilter;\n initialOnlyThisToken?: boolean;\n}\n\nexport interface UseTokenOrdersListScriptResult {\n orders: Array<LimitOrder>;\n isLoading: boolean;\n /** true when the backend endpoint is not implemented yet. */\n unavailable: boolean;\n hasMore: boolean;\n loadMore: () => void;\n stateFilter: TokenOrdersListStateFilter;\n setStateFilter: (filter: TokenOrdersListStateFilter) => void;\n onlyThisToken: boolean;\n setOnlyThisToken: (value: boolean) => void;\n}\n\n/**\n * Map the UI state filter to a concrete `LimitOrderState`.\n * `active` → a single state; `history` → the server would typically accept\n * any of `filled | cancelled | expired`. Since the backend is not yet\n * implemented we simply forward `active` / `filled` as a best-effort.\n */\nfunction mapStateFilter(\n filter: TokenOrdersListStateFilter,\n): LimitOrderState | undefined {\n return filter === \"active\" ? \"active\" : \"filled\";\n}\n\n/**\n * Script for the orders list widget.\n *\n * Because `getWalletLimitOrders` throws `NotImplementedError`, this script\n * catches that specific error and reports `unavailable: true` so the UI can\n * render a \"coming soon\" state instead of a generic error.\n */\nexport function useTokenOrdersListScript({\n chain,\n wallet,\n tokenAddress,\n limit = 50,\n initialStateFilter = \"active\",\n initialOnlyThisToken = false,\n}: UseTokenOrdersListScriptParams): UseTokenOrdersListScriptResult {\n const [stateFilter, setStateFilterState] =\n useState<TokenOrdersListStateFilter>(initialStateFilter);\n const [onlyThisToken, setOnlyThisToken] = useState(initialOnlyThisToken);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<LimitOrder>>>([]);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, wallet, stateFilter, onlyThisToken, tokenAddress]);\n\n const setStateFilter = useCallback(\n (next: TokenOrdersListStateFilter) => {\n if (next === stateFilter) return;\n setStateFilterState(next);\n },\n [stateFilter],\n );\n\n const queryParams = useMemo(\n () => ({\n chain,\n address: wallet ?? \"\",\n cursor,\n limit,\n state: mapStateFilter(stateFilter),\n tokenAddress: onlyThisToken ? tokenAddress : undefined,\n }),\n [chain, wallet, cursor, limit, stateFilter, onlyThisToken, tokenAddress],\n );\n\n const { data, isPending, isFetching, error } = useWalletLimitOrdersQuery(\n queryParams,\n { enabled: !!wallet },\n );\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const unavailable = !!error && isNotImplementedError(error);\n const orders = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n orders,\n isLoading: !!wallet && !unavailable && (isPending || isFetching),\n unavailable,\n hasMore,\n loadMore,\n stateFilter,\n setStateFilter,\n onlyThisToken,\n setOnlyThisToken,\n };\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport type { Chain, LimitOrder } from \"@liberfi.io/types\";\nimport { useTokenOrdersListScript } from \"./token-orders-list.script\";\nimport {\n TokenOrdersList,\n type TokenOrdersListCurrency,\n type TokenOrdersListStateFilter,\n} from \"./token-orders-list.ui\";\n\nexport interface TokenOrdersListWidgetProps {\n chain: Chain;\n /** Wallet address. Empty → widget is rendered with a disabled data query. */\n wallet?: string;\n /** Token address used by the `Only <symbol>` filter when enabled. */\n tokenAddress: string;\n /** Optional token symbol used in the `Only <symbol>` checkbox label. */\n tokenSymbol?: string;\n limit?: number;\n initialStateFilter?: TokenOrdersListStateFilter;\n initialCurrency?: TokenOrdersListCurrency;\n nativeSymbol?: string;\n onCancelAll?: () => void;\n renderActions?: (order: LimitOrder) => ReactNode;\n className?: string;\n}\n\n/**\n * Orders tab widget.\n *\n * The backend limit-orders endpoint is not shipped yet, so the underlying\n * client method throws `NotImplementedError`. The script catches that\n * specific error and reports `unavailable` so the widget renders a\n * friendly \"coming soon\" state instead of a generic error.\n */\nexport function TokenOrdersListWidget({\n chain,\n wallet,\n tokenAddress,\n tokenSymbol,\n limit,\n initialStateFilter = \"active\",\n initialCurrency = \"usd\",\n nativeSymbol,\n onCancelAll,\n renderActions,\n className,\n}: TokenOrdersListWidgetProps) {\n const [currency, setCurrency] =\n useState<TokenOrdersListCurrency>(initialCurrency);\n const {\n orders,\n isLoading,\n unavailable,\n hasMore,\n loadMore,\n stateFilter,\n setStateFilter,\n onlyThisToken,\n setOnlyThisToken,\n } = useTokenOrdersListScript({\n chain,\n wallet,\n tokenAddress,\n limit,\n initialStateFilter,\n });\n\n return (\n <TokenOrdersList\n className={className}\n orders={orders}\n isLoading={isLoading}\n unavailable={unavailable}\n hasMore={hasMore}\n onLoadMore={loadMore}\n stateFilter={stateFilter}\n onStateFilterChange={setStateFilter}\n onlyThisToken={onlyThisToken}\n onOnlyThisTokenChange={setOnlyThisToken}\n tokenSymbol={tokenSymbol}\n currency={currency}\n onCurrencyChange={setCurrency}\n nativeSymbol={nativeSymbol}\n onCancelAll={unavailable ? undefined : onCancelAll}\n renderActions={renderActions}\n />\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { TokenHolder } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { HolderTagBadgeList } from \"../../shared\";\nimport { formatAgeShort, formatRatioFrom100, truncateMiddle } from \"../shared\";\n\nexport interface TokenTopTradersListProps {\n traders: Array<TokenHolder>;\n isLoading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n /** Only Tracked filter (client-side flag; parent owns state). */\n onlyTracked?: boolean;\n onOnlyTrackedChange?: (value: boolean) => void;\n now?: number;\n renderAddress?: (address: string) => React.ReactNode;\n className?: string;\n}\n\n/**\n * Presentational Top Traders list — visually parallel to\n * {@link TokenHoldersList} but with its own header + filters.\n *\n * The server currently returns the same row shape as holders, ranked by\n * realised PnL; the Realized PnL column stays blank (`—`) until the API\n * adds per-holder PnL fields. When that lands, extend\n * `TokenHolder` with the new fields and wire them into the cells here.\n */\nexport function TokenTopTradersList({\n traders,\n isLoading,\n hasMore,\n onLoadMore,\n onlyTracked = false,\n onOnlyTrackedChange,\n now = Date.now(),\n renderAddress,\n className,\n}: TokenTopTradersListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <span className=\"text-xs font-medium text-default-500\">\n Top Traders\n </span>\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={onlyTracked}\n onChange={(e) => onOnlyTrackedChange?.(e.target.checked)}\n />\n Only Tracked\n </label>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[680px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[28%] px-3 py-2 text-left font-normal\">\n Wallet\n </th>\n <th className=\"w-[20%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Value\n </th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">%</th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Realized PnL\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Last active\n </th>\n </tr>\n </thead>\n <tbody>\n {traders.length === 0 && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No top traders yet\n </td>\n </tr>\n )}\n {traders.map((t) => (\n <TraderRow\n key={t.address}\n trader={t}\n now={now}\n renderAddress={renderAddress}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction TraderRow({\n trader,\n now,\n renderAddress,\n}: {\n trader: TokenHolder;\n now: number;\n renderAddress?: (address: string) => React.ReactNode;\n}) {\n const addressCell = useMemo(\n () =>\n renderAddress ? (\n renderAddress(trader.address)\n ) : (\n <span className=\"font-mono text-[11px] text-default-500\">\n {truncateMiddle(trader.address, 6, 6)}\n </span>\n ),\n [trader.address, renderAddress],\n );\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{addressCell}</td>\n <td className=\"px-3 py-2 align-middle\">\n <HolderTagBadgeList tags={trader.tags} max={3} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(trader.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatRatioFrom100(trader.ratio)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {/*\n Realized PnL is not yet part of the TokenHolder DTO; render an\n em-dash placeholder until the server adds the field. Extending\n `TokenHolder` with `realizedPnlUsd` (and similar) will automatically\n light this cell up — no UI changes required beyond swapping the\n placeholder for a formatted value here.\n */}\n —\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {trader.lastActiveAt ? formatAgeShort(trader.lastActiveAt, now) : \"--\"}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTokenTopTradersQuery } from \"@liberfi.io/react\";\nimport type { API, Chain, TokenHolder } from \"@liberfi.io/types\";\n\nexport interface UseTokenTopTradersListScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialOnlyTracked?: boolean;\n}\n\nexport interface UseTokenTopTradersListScriptResult {\n traders: Array<TokenHolder>;\n isLoading: boolean;\n hasMore: boolean;\n loadMore: () => void;\n onlyTracked: boolean;\n setOnlyTracked: (value: boolean) => void;\n}\n\n/**\n * Script for the top-traders list widget.\n *\n * Builds on {@link useTokenTopTradersQuery} (bridge over the holders\n * endpoint with `sortBy=realizedPnl`). `onlyTracked` is a client-side\n * filter retained for UI parity with Axiom — until the server flags\n * tracked wallets, the toggle narrows visible rows to those whose `tags`\n * list is non-empty (a reasonable proxy for \"tracked by someone\").\n */\nexport function useTokenTopTradersListScript({\n chain,\n address,\n limit = 50,\n initialOnlyTracked = false,\n}: UseTokenTopTradersListScriptParams): UseTokenTopTradersListScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<TokenHolder>>>([]);\n const [onlyTracked, setOnlyTracked] = useState(initialOnlyTracked);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, address]);\n\n const queryParams = useMemo(\n () => ({\n chain,\n address,\n cursor,\n limit,\n sortBy: \"realizedPnl\" as const,\n }),\n [chain, address, cursor, limit],\n );\n\n const { data, isPending, isFetching } = useTokenTopTradersQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const rawTraders = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const traders = useMemo(\n () =>\n onlyTracked\n ? rawTraders.filter((t) => t.tags && t.tags.length > 0)\n : rawTraders,\n [rawTraders, onlyTracked],\n );\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n traders,\n isLoading: isPending || isFetching,\n hasMore,\n loadMore,\n onlyTracked,\n setOnlyTracked,\n };\n}\n","\"use client\";\n\nimport type { Chain } from \"@liberfi.io/types\";\nimport { useTokenTopTradersListScript } from \"./token-top-traders-list.script\";\nimport { TokenTopTradersList } from \"./token-top-traders-list.ui\";\n\nexport interface TokenTopTradersListWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n className?: string;\n renderAddress?: (address: string) => React.ReactNode;\n}\n\n/**\n * Top Traders list widget.\n *\n * Bridges the holders endpoint (ranked by realized PnL) into the Axiom-style\n * Top Traders view; client-side `Only Tracked` toggle narrows to wallets\n * that carry at least one classification tag.\n */\nexport function TokenTopTradersListWidget({\n chain,\n address,\n limit,\n className,\n renderAddress,\n}: TokenTopTradersListWidgetProps) {\n const { traders, isLoading, hasMore, loadMore, onlyTracked, setOnlyTracked } =\n useTokenTopTradersListScript({ chain, address, limit });\n return (\n <TokenTopTradersList\n className={className}\n traders={traders}\n isLoading={isLoading}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onlyTracked={onlyTracked}\n onOnlyTrackedChange={setOnlyTracked}\n renderAddress={renderAddress}\n />\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact, SafeBigNumber } from \"@liberfi.io/utils\";\n\nexport interface TokenDevTokensListProps {\n tokens: Array<Token>;\n isLoading?: boolean;\n /** Server endpoint not yet shipped — renders a coming-soon state. */\n unavailable?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n /** Optional per-row link — pass to render token as a clickable element. */\n renderTokenLink?: (token: Token) => React.ReactNode;\n className?: string;\n}\n\n/**\n * Dev Tokens list — columns `Token / Migrated / Market Cap / ATH /\n * Liquidity / 1h Volume`. The \"Migrated\" column surfaces whether the\n * token has exited a bonding curve launchpad (renders `✓` when\n * `launchpad.migrated` is true).\n */\nexport function TokenDevTokensList({\n tokens,\n isLoading,\n unavailable,\n hasMore,\n onLoadMore,\n renderTokenLink,\n className,\n}: TokenDevTokensListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <span className=\"text-xs font-medium text-default-500\">Dev Tokens</span>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[700px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[28%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[10%] px-3 py-2 text-center font-normal\">\n Migrated\n </th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n Market Cap\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">ATH</th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n Liquidity\n </th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n 1h Volume\n </th>\n </tr>\n </thead>\n <tbody>\n {unavailable ? (\n <tr>\n <td colSpan={6} className=\"py-10 text-center text-default-400\">\n Dev tokens index is coming soon.\n </td>\n </tr>\n ) : tokens.length === 0 && !isLoading ? (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No dev tokens\n </td>\n </tr>\n ) : (\n tokens.map((t) => (\n <DevTokenRow\n key={`${t.chain}:${t.address}`}\n token={t}\n renderTokenLink={renderTokenLink}\n />\n ))\n )}\n {!unavailable && isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {!unavailable && hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction DevTokenRow({\n token,\n renderTokenLink,\n}: {\n token: Token;\n renderTokenLink?: (token: Token) => React.ReactNode;\n}) {\n const marketCap =\n token.marketData?.marketCapInUsd ?? token.marketData?.marketCap;\n const liquidity = token.marketData?.tvlInUsd;\n // `ath` is not yet exposed by the server schema; render a placeholder\n // until the field lands (we preserve the Axiom column layout so the\n // switch is a one-line edit once available).\n const ath: string | undefined = undefined;\n const vol1h = token.stats?.[\"1h\"]?.volumesInUsd;\n\n const migrated = !!token.migratedTo;\n const tokenCell = renderTokenLink ? (\n renderTokenLink(token)\n ) : (\n <div className=\"flex items-center gap-2\">\n <Avatar\n src={token.image ?? undefined}\n name={(token.symbol ?? token.name ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-foreground\">{token.symbol}</span>\n <span className=\"truncate text-[10px] text-default-400\">\n {token.name}\n </span>\n </div>\n </div>\n );\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{tokenCell}</td>\n <td className=\"px-3 py-2 text-center align-middle\">\n {migrated ? (\n <span className=\"text-bullish\">✓</span>\n ) : (\n <span className=\"text-default-400\">—</span>\n )}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {marketCap ? formatAmountUSDCompact(marketCap) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {ath ? formatAmountUSDCompact(ath) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {liquidity ? formatAmountUSDCompact(liquidity) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {vol1h ? formatAmountUSDCompact(vol1h) : \"--\"}\n </td>\n </tr>\n );\n}\n\n/** Summary block rendered next to the Dev Tokens list on desktop. */\nexport interface TokenDevTokensSummaryProps {\n tokens: Array<Token>;\n className?: string;\n}\n\n/**\n * Aggregated dev summary — total tokens, migrated count (with % donut-like\n * progress), total 1h volume. Pure presentational; caller supplies data.\n */\nexport function TokenDevTokensSummary({\n tokens,\n className,\n}: TokenDevTokensSummaryProps) {\n const total = tokens.length;\n const migratedCount = tokens.filter((t) => !!t.migratedTo).length;\n const migratedPct =\n total === 0 ? 0 : Math.round((migratedCount / total) * 100);\n const totalVol1h = tokens\n .map((t) => t.stats?.[\"1h\"]?.volumesInUsd ?? \"0\")\n .reduce((acc, v) => acc.plus(new SafeBigNumber(v)), new SafeBigNumber(0));\n const totalMarketCap = tokens\n .map((t) => t.marketData?.marketCapInUsd ?? t.marketData?.marketCap ?? \"0\")\n .reduce((acc, v) => acc.plus(new SafeBigNumber(v)), new SafeBigNumber(0));\n\n return (\n <div className={cn(\"flex flex-col gap-2 p-3\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-default-500\">\n Token Stats\n </span>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <SummaryCell label=\"Total\" value={String(total)} />\n <SummaryCell\n label=\"Migrated\"\n value={`${migratedCount} (${migratedPct}%)`}\n />\n <SummaryCell\n label=\"Total Market Cap\"\n value={formatAmountUSDCompact(totalMarketCap.toString())}\n />\n <SummaryCell\n label=\"Total 1h Volume\"\n value={formatAmountUSDCompact(totalVol1h.toString())}\n />\n </div>\n </div>\n );\n}\n\nfunction SummaryCell({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex flex-col gap-[2px]\">\n <span className=\"text-[10px] text-default-400\">{label}</span>\n <span className=\"text-[13px] font-medium text-foreground\">{value}</span>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTokensByCreatorQuery } from \"@liberfi.io/react\";\nimport type { API, Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseTokenDevTokensListScriptParams {\n chain: Chain;\n /** Creator wallet address. Empty → query disabled. */\n creator?: string;\n limit?: number;\n}\n\nexport interface UseTokenDevTokensListScriptResult {\n tokens: Array<Token>;\n isLoading: boolean;\n unavailable: boolean;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Cross-package duplicate of `@liberfi.io/client#isNotImplementedError`\n * (see token-orders-list.script.ts).\n */\nfunction isNotImplementedError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error as { code?: string }).code === \"NotImplemented\"\n );\n}\n\n/**\n * Script for the dev-tokens list widget.\n *\n * The backend endpoint for \"tokens created by wallet\" has not shipped; the\n * client method throws `NotImplementedError`. This script detects the\n * unavailable state so the UI can render a coming-soon message while the\n * endpoint is being built.\n */\nexport function useTokenDevTokensListScript({\n chain,\n creator,\n limit = 20,\n}: UseTokenDevTokensListScriptParams): UseTokenDevTokensListScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<Token>>>([]);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, creator]);\n\n const queryParams = useMemo(\n () => ({ chain, creator: creator ?? \"\", cursor, limit }),\n [chain, creator, cursor, limit],\n );\n\n const { data, isPending, isFetching, error } = useTokensByCreatorQuery(\n queryParams,\n { enabled: !!creator },\n );\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const unavailable = !!error && isNotImplementedError(error);\n const tokens = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n tokens,\n isLoading: !!creator && !unavailable && (isPending || isFetching),\n unavailable,\n hasMore,\n loadMore,\n };\n}\n","\"use client\";\n\nimport type { Chain, Token } from \"@liberfi.io/types\";\nimport { useTokenDevTokensListScript } from \"./token-dev-tokens-list.script\";\nimport {\n TokenDevTokensList,\n TokenDevTokensSummary,\n} from \"./token-dev-tokens-list.ui\";\n\nexport interface TokenDevTokensListWidgetProps {\n chain: Chain;\n /** Creator wallet address (token's launch wallet). Empty → query disabled. */\n creator?: string;\n limit?: number;\n /** When true, also render the summary sub-widget beside the list. */\n showSummary?: boolean;\n renderTokenLink?: (token: Token) => React.ReactNode;\n className?: string;\n}\n\n/**\n * Dev Tokens tab widget.\n *\n * Backend endpoint not yet shipped → surfaces a friendly \"coming soon\"\n * empty state courtesy of `NotImplementedError` detection. When the\n * endpoint lands, no widget changes are required.\n */\nexport function TokenDevTokensListWidget({\n chain,\n creator,\n limit,\n showSummary = false,\n renderTokenLink,\n className,\n}: TokenDevTokensListWidgetProps) {\n const { tokens, isLoading, unavailable, hasMore, loadMore } =\n useTokenDevTokensListScript({ chain, creator, limit });\n\n return (\n <div className={className}>\n <TokenDevTokensList\n tokens={tokens}\n isLoading={isLoading}\n unavailable={unavailable}\n hasMore={hasMore}\n onLoadMore={loadMore}\n renderTokenLink={renderTokenLink}\n />\n {showSummary && !unavailable ? (\n <TokenDevTokensSummary tokens={tokens} />\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPriceUSD,\n} from \"@liberfi.io/utils\";\n\nexport interface TokenChartBannerProps {\n token?: Token;\n /**\n * Optional `ATH` market cap (USD). Not part of the current `TokenMarketData`\n * schema; consumers can plumb it from a separate source when available.\n */\n athInUsd?: string;\n /** Optional all-time-high timestamp for the ATH tooltip. */\n athAt?: Date;\n /** Optional global-fees-paid (USD) — renders when provided, skipped otherwise. */\n globalFeesPaidInUsd?: string;\n /** Optional rank within the chain (e.g. `42`). */\n rank?: number;\n /** Handler for the pin button. Passing nothing hides the button. */\n onTogglePin?: () => void;\n /** Whether the token is currently pinned (controls the icon state). */\n pinned?: boolean;\n className?: string;\n}\n\n/**\n * Compact horizontal banner mirroring Axiom's chart-top stats strip.\n * Presentational only — consumers (or `TokenChartBannerWidget`) provide\n * the data and wrap in a `CollapsibleSection` if they want Axiom's\n * expand/collapse affordance.\n */\nexport function TokenChartBanner({\n token,\n athInUsd,\n athAt,\n globalFeesPaidInUsd,\n rank,\n onTogglePin,\n pinned,\n className,\n}: TokenChartBannerProps) {\n const price = token?.marketData?.priceInUsd;\n const liquidity = token?.marketData?.tvlInUsd;\n const supply = token?.marketData?.totalSupply;\n\n return (\n <div\n className={cn(\n \"flex h-[48px] w-full flex-row items-center gap-4 overflow-x-auto px-3 text-[12px]\",\n className,\n )}\n >\n <Cell label=\"Price\" value={price ? formatPriceUSD(price) : \"--\"} />\n <Cell\n label=\"Liquidity\"\n value={liquidity ? formatAmountUSDCompact(liquidity) : \"--\"}\n />\n <Cell label=\"Supply\" value={supply ? formatAmount(supply) : \"--\"} />\n {globalFeesPaidInUsd ? (\n <Cell\n label=\"Fees Paid\"\n value={formatAmountUSDCompact(globalFeesPaidInUsd)}\n />\n ) : null}\n {athInUsd ? (\n <Cell\n label=\"ATH\"\n value={formatAmountUSDCompact(athInUsd)}\n title={\n athAt ? `All-time high at ${athAt.toLocaleDateString()}` : undefined\n }\n />\n ) : null}\n {rank !== undefined ? <Cell label=\"Rank\" value={`#${rank}`} /> : null}\n\n <div className=\"flex-1\" />\n\n {onTogglePin ? (\n <button\n type=\"button\"\n onClick={onTogglePin}\n aria-pressed={pinned}\n className={cn(\n \"flex size-[26px] items-center justify-center rounded text-default-400 transition-colors hover:bg-default-100 hover:text-foreground\",\n pinned && \"text-foreground\",\n )}\n title={pinned ? \"Unpin token\" : \"Pin token\"}\n >\n {pinned ? \"★\" : \"☆\"}\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction Cell({\n label,\n value,\n title,\n}: {\n label: string;\n value: string;\n title?: string;\n}) {\n return (\n <div\n className=\"flex flex-col items-start justify-center gap-[2px] whitespace-nowrap\"\n title={title}\n >\n <span className=\"text-[10px] leading-none text-default-400\">{label}</span>\n <span className=\"text-[13px] font-medium leading-none tabular-nums text-foreground\">\n {value}\n </span>\n </div>\n );\n}\n","import type { Chain, Token } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport interface UseTokenChartBannerScriptParams {\n chain: Chain;\n address: string;\n}\n\nexport interface UseTokenChartBannerScriptResult {\n token: Token | undefined;\n isLoading: boolean;\n}\n\n/**\n * Script for {@link TokenChartBannerWidget}. Reuses the shared\n * {@link useLiveToken} hook so the banner picks up WebSocket deltas\n * without an extra subscription registration.\n */\nexport function useTokenChartBannerScript({\n chain,\n address,\n}: UseTokenChartBannerScriptParams): UseTokenChartBannerScriptResult {\n return useLiveToken(chain, address);\n}\n","\"use client\";\n\nimport type { Chain } from \"@liberfi.io/types\";\nimport { useTokenChartBannerScript } from \"./token-chart-banner.script\";\nimport { TokenChartBanner } from \"./token-chart-banner.ui\";\n\nexport interface TokenChartBannerWidgetProps {\n chain: Chain;\n address: string;\n /** Optional ATH market cap; see the UI props for details. */\n athInUsd?: string;\n athAt?: Date;\n globalFeesPaidInUsd?: string;\n rank?: number;\n pinned?: boolean;\n onTogglePin?: () => void;\n className?: string;\n}\n\n/**\n * Live, presentational banner mirroring Axiom's chart-top stats strip.\n * Wraps {@link TokenChartBanner} with {@link useTokenChartBannerScript}\n * so the banner stays in sync with WebSocket pushes.\n */\nexport function TokenChartBannerWidget({\n chain,\n address,\n athInUsd,\n athAt,\n globalFeesPaidInUsd,\n rank,\n pinned,\n onTogglePin,\n className,\n}: TokenChartBannerWidgetProps) {\n const { token } = useTokenChartBannerScript({ chain, address });\n return (\n <TokenChartBanner\n className={className}\n token={token}\n athInUsd={athInUsd}\n athAt={athAt}\n globalFeesPaidInUsd={globalFeesPaidInUsd}\n rank={rank}\n pinned={pinned}\n onTogglePin={onTogglePin}\n />\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\n\nexport interface TokenSimilarTokensProps {\n tokens: Array<Token>;\n isLoading?: boolean;\n /** When the backend doesn't yet expose similarity, renders an empty-state hint. */\n unavailable?: boolean;\n /** Optional per-row click handler (open detail page, etc.). */\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Similar Tokens list — a lightweight preview list (image / symbol /\n * market-cap). Consumers compose this inside a `CollapsibleSection` on\n * the right column of the desktop token-detail page.\n */\nexport function TokenSimilarTokens({\n tokens,\n isLoading,\n unavailable,\n onTokenClick,\n className,\n}: TokenSimilarTokensProps) {\n if (unavailable) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n Similar tokens coming soon.\n </div>\n );\n }\n if (!isLoading && tokens.length === 0) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n No similar tokens found.\n </div>\n );\n }\n return (\n <ul className={cn(\"flex flex-col\", className)}>\n {tokens.map((t) => (\n <li\n key={`${t.chain}:${t.address}`}\n className={cn(\n \"flex cursor-pointer items-center gap-2 border-b border-default-50 px-3 py-2 last:border-0 hover:bg-default-50/60\",\n !onTokenClick && \"cursor-default\",\n )}\n onClick={onTokenClick ? () => onTokenClick(t) : undefined}\n >\n <Avatar\n src={t.image ?? undefined}\n name={(t.symbol ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-[12px] text-foreground\">\n {t.symbol}\n </span>\n <span className=\"truncate text-[10px] text-default-400\">\n {t.name}\n </span>\n </div>\n <span className=\"text-[11px] tabular-nums text-default-500\">\n {t.marketData?.marketCapInUsd\n ? formatAmountUSDCompact(t.marketData.marketCapInUsd)\n : \"--\"}\n </span>\n </li>\n ))}\n {isLoading && (\n <li className=\"py-2 text-center text-[11px] text-default-400\">\n Loading…\n </li>\n )}\n </ul>\n );\n}\n","import { useMemo } from \"react\";\nimport { useSearchTokensQuery } from \"@liberfi.io/react\";\nimport type { Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseTokenSimilarTokensScriptParams {\n chain: Chain;\n address: string;\n /** Search keyword used to surface similar tokens. Usually the token symbol or a category. */\n keyword?: string;\n limit?: number;\n}\n\nexport interface UseTokenSimilarTokensScriptResult {\n tokens: Array<Token>;\n isLoading: boolean;\n unavailable: boolean;\n}\n\n/**\n * Script for {@link TokenSimilarTokensWidget}.\n *\n * There is no dedicated \"similar tokens\" endpoint yet, so we fall back to\n * a keyword search on the token's symbol, filter out the current token,\n * and cap the result count. When no keyword is given the script reports\n * `unavailable: true` so the UI surfaces a coming-soon state.\n */\nexport function useTokenSimilarTokensScript({\n chain,\n address,\n keyword,\n limit = 10,\n}: UseTokenSimilarTokensScriptParams): UseTokenSimilarTokensScriptResult {\n const enabled = !!keyword && keyword.length > 0;\n const { data, isPending, isFetching } = useSearchTokensQuery(\n { chains: [chain], keyword, limit: limit + 1 },\n { enabled },\n );\n const tokens = useMemo(() => {\n if (!data) return [];\n const normalised = address.toLowerCase();\n return (data.data ?? [])\n .filter((t) => t.address.toLowerCase() !== normalised)\n .slice(0, limit);\n }, [data, address, limit]);\n\n return {\n tokens,\n isLoading: enabled && (isPending || isFetching),\n unavailable: !enabled,\n };\n}\n","\"use client\";\n\nimport type { Chain, Token } from \"@liberfi.io/types\";\nimport { useTokenSimilarTokensScript } from \"./token-similar-tokens.script\";\nimport { TokenSimilarTokens } from \"./token-similar-tokens.ui\";\n\nexport interface TokenSimilarTokensWidgetProps {\n chain: Chain;\n address: string;\n /** Keyword used by the fallback similarity search (typically the token symbol). */\n keyword?: string;\n limit?: number;\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Similar Tokens widget. Uses a keyword-search fallback until a dedicated\n * similarity endpoint is exposed; renders a coming-soon state otherwise.\n */\nexport function TokenSimilarTokensWidget({\n chain,\n address,\n keyword,\n limit,\n onTokenClick,\n className,\n}: TokenSimilarTokensWidgetProps) {\n const { tokens, isLoading, unavailable } = useTokenSimilarTokensScript({\n chain,\n address,\n keyword,\n limit,\n });\n return (\n <TokenSimilarTokens\n className={className}\n tokens={tokens}\n isLoading={isLoading}\n unavailable={unavailable}\n onTokenClick={onTokenClick}\n />\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\n\nexport interface TokenReusedImageListProps {\n /**\n * List of tokens sharing the same image as the subject token. When\n * empty and {@link unavailable} is true, the component renders a\n * coming-soon empty state.\n */\n tokens?: Array<Token>;\n /** Whether the backend endpoint is unavailable. Defaults to true for now. */\n unavailable?: boolean;\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Reused Image Tokens — Axiom shows other tokens that reuse the same\n * image as this token. The backend endpoint has not shipped; the widget\n * exposes the surface shape so consumers can drop it into layouts\n * immediately and the implementation can fill in later.\n */\nexport function TokenReusedImageList({\n tokens = [],\n unavailable = true,\n onTokenClick,\n className,\n}: TokenReusedImageListProps) {\n if (unavailable) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n Image-similarity search is coming soon.\n </div>\n );\n }\n if (tokens.length === 0) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n No reused-image tokens found.\n </div>\n );\n }\n return (\n <div className={cn(\"flex flex-row flex-wrap gap-2 p-3\", className)}>\n {tokens.map((t) => (\n <button\n key={`${t.chain}:${t.address}`}\n type=\"button\"\n onClick={onTokenClick ? () => onTokenClick(t) : undefined}\n className=\"flex size-10 items-center justify-center overflow-hidden rounded-full border border-default-100 transition-opacity hover:opacity-80\"\n title={t.symbol}\n >\n <Avatar\n src={t.image ?? undefined}\n name={(t.symbol ?? \"?\").slice(0, 1)}\n className=\"size-full bg-default-100 text-[10px] text-default-400\"\n showFallback\n />\n </button>\n ))}\n </div>\n );\n}\n","import type { Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseTokenReusedImageListScriptParams {\n chain: Chain;\n address: string;\n}\n\nexport interface UseTokenReusedImageListScriptResult {\n tokens: Array<Token>;\n isLoading: boolean;\n unavailable: boolean;\n}\n\n/**\n * Script for {@link TokenReusedImageListWidget}.\n *\n * The backend has no image-similarity endpoint yet, so this script\n * returns `unavailable: true` to surface a friendly coming-soon state.\n * Wire in the real implementation here once the API lands; no widget\n * changes will be required.\n */\nexport function useTokenReusedImageListScript(\n _params: UseTokenReusedImageListScriptParams,\n): UseTokenReusedImageListScriptResult {\n return { tokens: [], isLoading: false, unavailable: true };\n}\n","\"use client\";\n\nimport type { Chain, Token } from \"@liberfi.io/types\";\nimport { useTokenReusedImageListScript } from \"./token-reused-image-list.script\";\nimport { TokenReusedImageList } from \"./token-reused-image-list.ui\";\n\nexport interface TokenReusedImageListWidgetProps {\n chain: Chain;\n address: string;\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Reused Image Tokens widget. Currently renders a coming-soon state; the\n * surface is in place so the consuming shell can compose it unchanged\n * once the backend endpoint ships.\n */\nexport function TokenReusedImageListWidget({\n chain,\n address,\n onTokenClick,\n className,\n}: TokenReusedImageListWidgetProps) {\n const { tokens, unavailable } = useTokenReusedImageListScript({\n chain,\n address,\n });\n return (\n <TokenReusedImageList\n className={className}\n tokens={tokens}\n unavailable={unavailable}\n onTokenClick={onTokenClick}\n />\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, StyledInput } from \"@liberfi.io/ui\";\n\nexport interface TokenListKeywordsFilterProps {\n /** default keywords */\n keywords?: Array<string>;\n /** default exclude keywords */\n excludeKeywords?: Array<string>;\n /** callback when keywords change */\n onKeywordsChange?: (keywords?: Array<string>) => void;\n /** callback when exclude keywords change */\n onExcludeKeywordsChange?: (excludeKeywords?: Array<string>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListKeywordsFilter({\n keywords,\n excludeKeywords,\n onKeywordsChange,\n onExcludeKeywordsChange,\n className,\n}: TokenListKeywordsFilterProps) {\n const { t } = useTranslation();\n\n const [keywordsText, setKeywordsText] = useState(keywords?.join(\", \") ?? \"\");\n\n const [excludeKeywordsText, setExcludeKeywordsText] = useState(\n excludeKeywords?.join(\", \") ?? \"\",\n );\n\n useEffect(() => {\n setKeywordsText((prev) => {\n const prevKeywords = parseKeywords(prev);\n if (prevKeywords === undefined && keywords === undefined) {\n return prev;\n } else if (prevKeywords === undefined) {\n return keywords?.join(\", \") ?? \"\";\n } else if (keywords === undefined) {\n return \"\";\n } else if (prevKeywords.join(\"\") === keywords.join(\"\")) {\n return prev;\n } else {\n return keywords.join(\", \");\n }\n });\n }, [keywords]);\n\n useEffect(() => {\n setExcludeKeywordsText((prev) => {\n const prevExcludeKeywords = parseKeywords(prev);\n if (prevExcludeKeywords === undefined && excludeKeywords === undefined) {\n return prev;\n } else if (prevExcludeKeywords === undefined) {\n return excludeKeywords?.join(\", \") ?? \"\";\n } else if (excludeKeywords === undefined) {\n return \"\";\n } else if (prevExcludeKeywords.join(\"\") === excludeKeywords.join(\"\")) {\n return prev;\n } else {\n return excludeKeywords.join(\", \");\n }\n });\n }, [excludeKeywords]);\n\n const handleKeywordsValueChange = useCallback(\n (value: string) => {\n setKeywordsText(value);\n onKeywordsChange?.(parseKeywords(value));\n },\n [onKeywordsChange],\n );\n\n const handleExcludeKeywordsValueChange = useCallback(\n (value: string) => {\n setExcludeKeywordsText(value);\n onExcludeKeywordsChange?.(parseKeywords(value));\n },\n [onExcludeKeywordsChange],\n );\n\n return (\n <div className={cn(\"grid grid-cols-2 gap-3 px-4\", className)}>\n <div className=\"flex flex-col gap-3\">\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.keywords.title\")}\n </h3>\n <StyledInput\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.keywords.placeholder\")}\n value={keywordsText}\n onValueChange={handleKeywordsValueChange}\n />\n </div>\n <div className=\"flex flex-col gap-3\">\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.keywords.exclude.title\")}\n </h3>\n <StyledInput\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.keywords.placeholder\")}\n value={excludeKeywordsText}\n onValueChange={handleExcludeKeywordsValueChange}\n />\n </div>\n </div>\n );\n}\n\nfunction parseKeywords(keywords: string): Array<string> | undefined {\n const parsedKeywords = keywords\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean);\n return parsedKeywords.length > 0 ? parsedKeywords : undefined;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { TokenProtocol } from \"@liberfi.io/types\";\nimport { Button, cn, Image } from \"@liberfi.io/ui\";\nimport { formatTokenProtocolName } from \"@liberfi.io/utils\";\nimport { protocolClasses } from \"../../../utils/protocol-styles\";\n\nexport interface TokenListProtocolFilterProps {\n /** protocol filter options */\n protocols: Array<TokenProtocol>;\n /** selected protocols */\n selectedProtocols?: Array<TokenProtocol>;\n /** callback when selected protocols change */\n onSelectedProtocolsChange?: (protocols: Array<TokenProtocol>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListProtocolFilter({\n protocols,\n selectedProtocols = [],\n onSelectedProtocolsChange,\n className,\n}: TokenListProtocolFilterProps) {\n const { t } = useTranslation();\n\n // current selections\n const [selected, setSelected] =\n useState<Array<TokenProtocol>>(selectedProtocols);\n\n useEffect(() => {\n setSelected(selectedProtocols);\n }, [selectedProtocols]);\n\n const isAllSelected = useMemo(\n () => protocols.every((protocol) => selected.includes(protocol)),\n [protocols, selected],\n );\n\n const handleSelectAll = useCallback(() => {\n if (isAllSelected) {\n const selected = [] as Array<TokenProtocol>;\n setSelected(selected);\n onSelectedProtocolsChange?.(selected);\n } else {\n const selected = [...protocols];\n setSelected(selected);\n onSelectedProtocolsChange?.(selected);\n }\n }, [protocols, onSelectedProtocolsChange, isAllSelected]);\n\n const handleSelect = useCallback(\n (protocol: TokenProtocol) => () => {\n if (selected.includes(protocol)) {\n const newSelected = selected.filter((p) => p !== protocol);\n setSelected(newSelected);\n onSelectedProtocolsChange?.(newSelected);\n } else {\n const newSelected = [...selected, protocol];\n setSelected(newSelected);\n onSelectedProtocolsChange?.(newSelected);\n }\n },\n [selected, onSelectedProtocolsChange],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-3 px-4\", className)}>\n {/* header */}\n <div className=\"flex justify-between items-center\">\n {/* title */}\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.protocols.title\")}\n </h3>\n {/* select all */}\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleSelectAll}\n >\n {isAllSelected\n ? t(\"tokens.filters.protocols.unselectAll\")\n : t(\"tokens.filters.protocols.selectAll\")}\n </Button>\n </div>\n\n {/* options */}\n <div className=\"grid grid-cols-3 gap-3\">\n {protocols.map((protocol) => {\n const pc = protocolClasses(protocol);\n return (\n <Button\n key={protocol}\n variant=\"bordered\"\n size=\"sm\"\n radius=\"full\"\n className={cn(\n \"w-fit h-6 px-2.5\",\n pc.text,\n pc.bg5,\n \"border\",\n pc.border,\n {\n \"opacity-40 data-[hover=true]:!opacity-30\":\n !selected.includes(protocol),\n },\n )}\n startContent={\n <Image\n width={14}\n height={14}\n src={`/images/protocols/${protocol}.svg`}\n alt={formatTokenProtocolName(protocol)}\n />\n }\n onPress={handleSelect(protocol)}\n >\n {formatTokenProtocolName(protocol)}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { StyledNumberInput } from \"@liberfi.io/ui\";\n\nexport interface TokenListMinMaxFilterProps {\n field: API.TokenFieldOption;\n value?: API.TokenFilterOption;\n onChange?: (value?: API.TokenFilterOption) => void;\n title?: string;\n}\n\nexport function TokenListMinMaxFilter({\n title,\n field,\n value,\n onChange,\n}: TokenListMinMaxFilterProps) {\n const { t } = useTranslation();\n\n const [min, setMin] = useState<number>(value ? parseValue(value).min : NaN);\n\n const [max, setMax] = useState<number>(value ? parseValue(value).max : NaN);\n\n useEffect(() => {\n if (value === undefined) {\n setMin(NaN);\n setMax(NaN);\n } else {\n const { min, max } = parseValue(value);\n setMin(min);\n setMax(max);\n }\n }, [value]);\n\n const handleMinChange = useCallback(\n (value: number) => {\n setMin(value);\n onChange?.(formatValue(field, value, max));\n },\n [field, onChange, max],\n );\n\n const handleMaxChange = useCallback(\n (value: number) => {\n setMax(value);\n onChange?.(formatValue(field, min, value));\n },\n [field, onChange, min],\n );\n\n return (\n <div className=\"flex flex-col gap-1\">\n {title && <h3 className=\"text-xs text-neutral\">{title}</h3>}\n <div className=\"grid grid-cols-2 gap-3\">\n <StyledNumberInput\n value={min}\n onValueChange={handleMinChange}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.stats.min\")}\n aria-label={`${title} min`}\n />\n <StyledNumberInput\n value={max}\n onValueChange={handleMaxChange}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.stats.max\")}\n aria-label={`${title} max`}\n />\n </div>\n </div>\n );\n}\n\nfunction parseValue(value: API.TokenFilterOption) {\n if (value.operator === \"between\") {\n const [min, max] = value.value as [number, number];\n return { min, max };\n }\n if (value.operator === \"gte\") {\n const min = value.value as number;\n return { min, max: NaN };\n }\n if (value.operator === \"lte\") {\n const max = value.value as number;\n return { min: NaN, max };\n }\n return { min: NaN, max: NaN };\n}\n\nfunction formatValue(\n field: API.TokenFieldOption,\n min: number,\n max: number,\n): API.TokenFilterOption | undefined {\n if (isNaN(min) && isNaN(max)) {\n return undefined;\n }\n if (isNaN(min)) {\n return { field, operator: \"lte\", value: max };\n }\n if (isNaN(max)) {\n return { field, operator: \"gte\", value: min };\n }\n return { field, operator: \"between\", value: [min, max] };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { TokenListMinMaxFilter } from \"./token-list-minmax-filter.ui\";\n\nexport interface TokenListAuditsFilterProps {\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListAuditsFilter({\n values,\n onValuesChange,\n className,\n}: TokenListAuditsFilterProps) {\n const { t } = useTranslation();\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValueChange = useCallback(\n (field: API.TokenFieldOption) => (value?: API.TokenFilterOption) => {\n if (value === undefined) {\n // remove filter\n let newValues: Array<API.TokenFilterOption> | undefined = (\n currentValues ?? []\n ).filter((v) => v.field !== field);\n newValues = newValues.length > 0 ? newValues : undefined;\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n } else {\n // add or replace filter\n const newValues = [\n ...(currentValues ?? []).filter((v) => v.field !== field),\n value,\n ];\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n }\n },\n [currentValues, onValuesChange],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n <TokenListMinMaxFilter\n field=\"holders\"\n title={t(\"tokens.filters.stats.audits.holders\")}\n value={currentValues?.find((v) => v.field === \"holders\")}\n onChange={handleValueChange(\"holders\")}\n />\n <TokenListMinMaxFilter\n field=\"top10Ratio\"\n title={t(\"tokens.filters.stats.audits.top10HoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"top10Ratio\")}\n onChange={handleValueChange(\"top10Ratio\")}\n />\n <TokenListMinMaxFilter\n field=\"top100Ratio\"\n title={t(\"tokens.filters.stats.audits.top100HoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"top100Ratio\")}\n onChange={handleValueChange(\"top100Ratio\")}\n />\n <TokenListMinMaxFilter\n field=\"creatorsRatio\"\n title={t(\"tokens.filters.stats.audits.devHoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"creatorsRatio\")}\n onChange={handleValueChange(\"creatorsRatio\")}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { TokenListResolution } from \"../types\";\nimport { TokenListMinMaxFilter } from \"./token-list-minmax-filter.ui\";\n\nexport interface TokenListMetricsFilterProps {\n /** current resolution */\n resolution: TokenListResolution;\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListMetricsFilter({\n resolution,\n values,\n onValuesChange,\n className,\n}: TokenListMetricsFilterProps) {\n const { t } = useTranslation();\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValueChange = useCallback(\n (field: API.TokenFieldOption) => (value?: API.TokenFilterOption) => {\n if (value === undefined) {\n // remove filter\n let newValues: Array<API.TokenFilterOption> | undefined = (\n currentValues ?? []\n ).filter((v) => v.field !== field);\n newValues = newValues.length > 0 ? newValues : undefined;\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n } else {\n // add or replace filter\n const newValues = [\n ...(currentValues ?? []).filter((v) => v.field !== field),\n value,\n ];\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n }\n },\n [currentValues, onValuesChange],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n <TokenListMinMaxFilter\n field=\"marketCap\"\n title={t(\"tokens.filters.stats.metrics.marketCap\")}\n value={currentValues?.find((v) => v.field === \"marketCap\")}\n onChange={handleValueChange(\"marketCap\")}\n />\n <TokenListMinMaxFilter\n field=\"tvl\"\n title={t(\"tokens.filters.stats.metrics.liquidity\")}\n value={currentValues?.find((v) => v.field === \"tvl\")}\n onChange={handleValueChange(\"tvl\")}\n />\n <TokenListMinMaxFilter\n field={`volumes${resolution}`}\n title={t(\"tokens.filters.stats.metrics.volumes\", {\n resolution: t(`common.resolution.${resolution}`),\n })}\n value={currentValues?.find((v) => v.field === `volumes${resolution}`)}\n onChange={handleValueChange(`volumes${resolution}`)}\n />\n <TokenListMinMaxFilter\n field={`trades${resolution}`}\n title={t(\"tokens.filters.stats.metrics.txns\", {\n resolution: t(`common.resolution.${resolution}`),\n })}\n value={currentValues?.find((v) => v.field === `trades${resolution}`)}\n onChange={handleValueChange(`trades${resolution}`)}\n />\n </div>\n );\n}\n","import { Key, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { cn, StyledBadge, StyledLightTabs, Tab } from \"@liberfi.io/ui\";\nimport { TokenListResolution } from \"../types\";\nimport { TokenListAuditsFilter } from \"./token-list-audits-filter.ui\";\nimport { TokenListMetricsFilter } from \"./token-list-metrics-filter.ui\";\n\nexport interface TokenListStatsFilterProps {\n /** current resolution */\n resolution: TokenListResolution;\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListStatsFilter({\n resolution,\n values,\n onValuesChange,\n className,\n}: TokenListStatsFilterProps) {\n const { t } = useTranslation();\n\n const [curTab, setCurTab] = useState<\"audits\" | \"metrics\">(\"audits\");\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValuesChange = useCallback(\n (values?: Array<API.TokenFilterOption>) => {\n setCurrentValues(values);\n onValuesChange?.(values);\n },\n [onValuesChange],\n );\n\n const auditsFiltersCount = useMemo(() => {\n const fields = [\"holders\", \"top10Ratio\", \"top100Ratio\", \"creatorsRatio\"];\n return currentValues?.filter((v) => fields.includes(v.field))?.length ?? 0;\n }, [currentValues]);\n\n const metricsFiltersCount = useMemo(() => {\n const fields = [\n \"marketCap\",\n \"tvl\",\n `volumes${resolution}`,\n `trades${resolution}`,\n ];\n return currentValues?.filter((v) => fields.includes(v.field)).length ?? 0;\n }, [currentValues, resolution]);\n\n return (\n <div className={cn(\"flex flex-col gap-3 px-4\", className)}>\n <StyledLightTabs\n color=\"default\"\n radius=\"full\"\n size=\"sm\"\n selectedKey={curTab}\n onSelectionChange={setCurTab as (key: Key) => void}\n >\n <Tab\n key=\"audits\"\n title={\n auditsFiltersCount === 0 ? (\n t(\"tokens.filters.stats.audits\")\n ) : (\n <StyledBadge\n color=\"primary\"\n size=\"sm\"\n content={auditsFiltersCount}\n shape=\"circle\"\n >\n {t(\"tokens.filters.stats.audits\")}\n </StyledBadge>\n )\n }\n />\n <Tab\n key=\"metrics\"\n title={\n metricsFiltersCount === 0 ? (\n t(\"tokens.filters.stats.metrics\")\n ) : (\n <StyledBadge\n color=\"primary\"\n size=\"sm\"\n content={metricsFiltersCount}\n shape=\"circle\"\n >\n {t(\"tokens.filters.stats.metrics\")}\n </StyledBadge>\n )\n }\n />\n </StyledLightTabs>\n\n <TokenListAuditsFilter\n values={currentValues}\n onValuesChange={handleValuesChange}\n className={cn({ hidden: curTab !== \"audits\" })}\n />\n <TokenListMetricsFilter\n values={currentValues}\n onValuesChange={handleValuesChange}\n resolution={resolution}\n className={cn({ hidden: curTab !== \"metrics\" })}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { API, TokenProtocol } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n TokenListKeywordsFilter,\n TokenListProtocolFilter,\n TokenListStatsFilter,\n} from \"./filters\";\nimport { TokenListResolution } from \"./types\";\n\nexport type TokenListFiltersType = Pick<\n API.GetTokenListOptions,\n \"filters\" | \"keywords\" | \"excludeKeywords\"\n>;\n\nexport interface TokenListFilterProps {\n /** protocol filter options */\n protocols?: Array<TokenProtocol>;\n /** current resolution */\n resolution: TokenListResolution;\n /** filters */\n filters?: TokenListFiltersType;\n /** callback when filters change */\n onFiltersChange?: (filters?: TokenListFiltersType) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListFilter({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n className,\n}: TokenListFilterProps) {\n const [selectedProtocols, setSelectedProtocols] = useState<\n Array<TokenProtocol>\n >(parseSelectedProtocols(filters?.filters, protocols));\n\n useEffect(() => {\n setSelectedProtocols(parseSelectedProtocols(filters?.filters, protocols));\n }, [filters?.filters, protocols]);\n\n const [searchKeywords, setSearchKeywords] = useState<\n Array<string> | undefined\n >(filters?.keywords);\n\n useEffect(() => {\n setSearchKeywords(filters?.keywords);\n }, [filters?.keywords]);\n\n const [excludeSearchKeywords, setExcludeSearchKeywords] = useState<\n Array<string> | undefined\n >(filters?.excludeKeywords);\n\n useEffect(() => {\n setExcludeSearchKeywords(filters?.excludeKeywords);\n }, [filters?.excludeKeywords]);\n\n const [filterValues, setFilterValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(filters?.filters);\n\n useEffect(() => {\n setFilterValues(filters?.filters);\n }, [filters?.filters]);\n\n const handleProtocolsChange = useCallback(\n (values: Array<TokenProtocol>) => {\n setSelectedProtocols(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n values,\n searchKeywords,\n excludeSearchKeywords,\n filterValues,\n ),\n );\n },\n [\n protocols,\n searchKeywords,\n excludeSearchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleKeywordsChange = useCallback(\n (values?: Array<string>) => {\n setSearchKeywords(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n values,\n excludeSearchKeywords,\n filterValues,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n excludeSearchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleExcludeKeywordsChange = useCallback(\n (values?: Array<string>) => {\n setExcludeSearchKeywords(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n searchKeywords,\n values,\n filterValues,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n searchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleFilterValuesChange = useCallback(\n (values?: Array<API.TokenFilterOption>) => {\n setFilterValues(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n searchKeywords,\n excludeSearchKeywords,\n values,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n searchKeywords,\n excludeSearchKeywords,\n onFiltersChange,\n ],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {/* filter by protocols */}\n {protocols && protocols.length > 0 && (\n <>\n <TokenListProtocolFilter\n protocols={protocols}\n selectedProtocols={selectedProtocols}\n onSelectedProtocolsChange={handleProtocolsChange}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,1)\" }} />\n </>\n )}\n\n {/* search keywords */}\n <TokenListKeywordsFilter\n keywords={searchKeywords}\n excludeKeywords={excludeSearchKeywords}\n onKeywordsChange={handleKeywordsChange}\n onExcludeKeywordsChange={handleExcludeKeywordsChange}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,1)\" }} />\n\n {/* filter by values */}\n <TokenListStatsFilter\n resolution={resolution}\n values={filterValues}\n onValuesChange={handleFilterValuesChange}\n />\n </div>\n );\n}\n\nfunction parseSelectedProtocols(\n filters?: Array<API.TokenFilterOption>,\n protocols?: Array<TokenProtocol>,\n): Array<TokenProtocol> {\n const filter = filters?.find(\n (it) => it.field === \"launchedFromProtocolFamily\",\n );\n if (!filter) {\n // select all protocols default\n return [...(protocols || [])];\n }\n if (filter.operator === \"in\") {\n return filter.value as Array<TokenProtocol>;\n }\n console.warn(\"invalid token protocols filter\", filter);\n return [...(protocols || [])];\n}\n\nfunction toFilters(\n protocols: Array<TokenProtocol> | undefined,\n selectedProtocols: Array<TokenProtocol>,\n keywords: Array<string> | undefined,\n excludeKeywords: Array<string> | undefined,\n filterValues: Array<API.TokenFilterOption> | undefined,\n): TokenListFiltersType | undefined {\n const filters = filterValues\n ? [\n ...filterValues.filter(\n (it) => it.field !== \"launchedFromProtocolFamily\",\n ),\n ]\n : [];\n\n if (protocols && protocols.length > 0) {\n const allProtocolsSelected = protocols.every((protocol) =>\n selectedProtocols.includes(protocol),\n );\n if (!allProtocolsSelected) {\n filters.push({\n field: \"launchedFromProtocolFamily\",\n operator: \"in\",\n value: selectedProtocols,\n });\n }\n }\n\n return keywords === undefined &&\n excludeKeywords === undefined &&\n filters.length === 0\n ? undefined\n : {\n keywords,\n excludeKeywords,\n filters: filters.length > 0 ? filters : undefined,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n FilterIcon,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n RefreshIcon,\n ScrollShadow,\n StyledModal,\n useDisclosure,\n} from \"@liberfi.io/ui\";\nimport {\n TokenListFilter,\n TokenListFilterProps,\n TokenListFiltersType,\n} from \"./token-list-filter.ui\";\n\nexport type TokenListFilterModalProps = Pick<\n TokenListFilterProps,\n \"protocols\" | \"resolution\" | \"filters\" | \"onFiltersChange\"\n>;\n\nexport function TokenListFilterModal({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n}: TokenListFilterModalProps) {\n const { t } = useTranslation();\n\n const { isOpen, onOpen, onClose, onOpenChange } = useDisclosure();\n\n const [editingFilters, setEditingFilters] = useState<\n TokenListFiltersType | undefined\n >(filters);\n\n const handleReset = useCallback(() => {\n setEditingFilters(undefined);\n }, []);\n\n const handleApply = useCallback(() => {\n onFiltersChange?.(editingFilters);\n onClose();\n }, [editingFilters, onFiltersChange, onClose]);\n\n useEffect(() => {\n setEditingFilters(filters);\n }, [isOpen, filters]);\n\n const isEmptyFilters = useMemo(() => {\n return Object.values(filters || {}).every((value) => value === undefined);\n }, [filters]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={onOpen}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 32,\n height: 32,\n minHeight: 32,\n cursor: \"pointer\",\n position: \"relative\",\n }}\n >\n <FilterIcon width={16} height={16} className=\"text-zinc-400\" />\n {!isEmptyFilters && (\n <span\n style={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 8,\n height: 8,\n borderRadius: 4,\n background: \"#c7ff2e\",\n }}\n />\n )}\n </button>\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size=\"md\"\n scrollBehavior=\"inside\"\n >\n <ModalContent className=\"w-full h-full\">\n <ModalHeader className=\"px-4 py-2\">\n <span className=\"text-base font-semibold\">\n {t(\"tokens.filters.modal.title\")}\n </span>\n </ModalHeader>\n <ModalBody className=\"px-0 pt-0 pb-4\">\n <ScrollShadow>\n <TokenListFilter\n protocols={protocols}\n resolution={resolution}\n filters={editingFilters}\n onFiltersChange={setEditingFilters}\n className=\"pb-4\"\n />\n </ScrollShadow>\n </ModalBody>\n <ModalFooter className=\"px-4\">\n <div className=\"w-full flex justify-between items-center\">\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"common.reset\")}\n </Button>\n <Button\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"common.apply\")}\n </Button>\n </div>\n </ModalFooter>\n </ModalContent>\n </StyledModal>\n </>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PopoverProps } from \"@liberfi.io/ui\";\nimport { Button, FilterIcon, RefreshIcon, ScrollShadow } from \"@liberfi.io/ui\";\nimport {\n TokenListFilter,\n TokenListFilterProps,\n TokenListFiltersType,\n} from \"./token-list-filter.ui\";\n\nexport type TokenListFilterPopoverProps = Pick<PopoverProps, \"placement\"> &\n Pick<\n TokenListFilterProps,\n \"protocols\" | \"resolution\" | \"filters\" | \"onFiltersChange\"\n >;\n\nconst triggerStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n fontSize: 14,\n fontWeight: 700,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n height: 32,\n};\n\nconst dropdownStyle: React.CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\nconst dividerStyle: React.CSSProperties = {\n height: 1,\n background: \"rgba(39,39,42,1)\",\n margin: 0,\n};\n\nexport function TokenListFilterPopover({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n}: TokenListFilterPopoverProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [editingFilters, setEditingFilters] = useState<\n TokenListFiltersType | undefined\n >(filters);\n\n const handleReset = useCallback(() => {\n setEditingFilters(undefined);\n }, []);\n\n const handleApply = useCallback(() => {\n onFiltersChange?.(editingFilters);\n setIsOpen(false);\n }, [editingFilters, onFiltersChange]);\n\n useEffect(() => {\n setEditingFilters(filters);\n }, [isOpen, filters]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", onEscape);\n return () => document.removeEventListener(\"keydown\", onEscape);\n }, [isOpen]);\n\n const isEmptyFilters = useMemo(() => {\n return Object.values(filters || {}).every((value) => value === undefined);\n }, [filters]);\n\n return (\n <div ref={containerRef} style={{ position: \"relative\" }}>\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n style={triggerStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => setIsOpen((v) => !v)}\n >\n <FilterIcon width={16} height={16} className=\"flex-none\" />\n <span className=\"hidden sm:block\">\n {t(\"tokens.listHeader.filter\")}\n </span>\n <ChevronDown open={isOpen} />\n </button>\n\n {!isEmptyFilters && (\n <span\n style={{\n position: \"absolute\",\n top: -4,\n right: -4,\n minWidth: 8,\n height: 8,\n borderRadius: 4,\n background: \"#c7ff2e\",\n }}\n />\n )}\n </div>\n\n {isOpen && (\n <div style={{ ...dropdownStyle, width: 420 }}>\n <div style={{ padding: \"16px 0\" }}>\n <ScrollShadow className=\"w-full max-h-120 px-4\">\n <TokenListFilter\n protocols={protocols}\n resolution={resolution}\n filters={editingFilters}\n onFiltersChange={setEditingFilters}\n />\n </ScrollShadow>\n </div>\n <div style={dividerStyle} />\n <div\n style={{\n padding: \"12px 16px\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <Button\n variant=\"light\"\n size=\"sm\"\n color=\"default\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"common.reset\")}\n </Button>\n <Button\n variant=\"solid\"\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"common.apply\")}\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","import { PopoverProps, useScreen } from \"@liberfi.io/ui\";\nimport {\n TokenListFilterModal,\n TokenListFilterModalProps,\n} from \"./token-list-filter-modal.ui\";\nimport { TokenListFilterPopover } from \"./token-list-filter-popover.ui\";\n\nexport type TokenListFilterWidgetProps = TokenListFilterModalProps & {\n /** Popover placement used on non-mobile screens. @default \"bottom-end\" */\n popoverPlacement?: PopoverProps[\"placement\"];\n};\n\nexport function TokenListFilterWidget({\n popoverPlacement = \"bottom-end\",\n ...filterProps\n}: TokenListFilterWidgetProps) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return <TokenListFilterModal {...filterProps} />;\n }\n\n return (\n <TokenListFilterPopover placement={popoverPlacement} {...filterProps} />\n );\n}\n","import { Key, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledPlainTabs, Tab } from \"@liberfi.io/ui\";\nimport { TokenListResolution, TokenListResolutionSelectorProps } from \"./types\";\n\nexport function TokenListResolutionSelectorDesktop({\n resolution,\n onResolutionChange,\n resolutionOptions = [\"1m\", \"5m\", \"1h\", \"4h\", \"24h\"],\n}: TokenListResolutionSelectorProps) {\n const { t } = useTranslation();\n\n const handleResolutionChange = useCallback(\n (key: Key) => {\n onResolutionChange?.(key as TokenListResolution);\n },\n [onResolutionChange],\n );\n\n return (\n <StyledPlainTabs\n color=\"primary\"\n radius=\"lg\"\n selectedKey={resolution}\n onSelectionChange={handleResolutionChange}\n aria-label=\"Select Resolution\"\n classNames={{\n tabList: \"gap-0\",\n tab: \"px-2\",\n tabContent:\n \"!text-zinc-500 group-data-[hover=true]:!text-foreground group-data-[selected=true]:!text-primary\",\n }}\n >\n {resolutionOptions.map((option) => (\n <Tab key={option} title={t(`common.resolution.${option}`)} />\n ))}\n </StyledPlainTabs>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChevronDownIcon, cn } from \"@liberfi.io/ui\";\nimport { TokenListResolution, TokenListResolutionSelectorProps } from \"./types\";\n\nconst triggerStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"0 10px\",\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n height: 32,\n minHeight: 32,\n};\n\nconst dropdownStyle: React.CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 6,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n padding: \"6px\",\n minWidth: \"100%\",\n};\n\nexport function TokenListResolutionSelectorMobile({\n resolution,\n onResolutionChange,\n resolutionOptions = [\"1m\", \"5m\", \"1h\", \"4h\", \"24h\"],\n}: TokenListResolutionSelectorProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleSelect = useCallback(\n (option: TokenListResolution) => {\n onResolutionChange?.(option);\n setIsOpen(false);\n },\n [onResolutionChange],\n );\n\n useEffect(() => {\n if (!isOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen]);\n\n return (\n <div ref={containerRef} style={{ position: \"relative\", zIndex: 50 }}>\n <button\n type=\"button\"\n style={triggerStyle}\n onClick={() => setIsOpen((v) => !v)}\n >\n <span>{resolution ? t(`common.resolution.${resolution}`) : \"—\"}</span>\n <ChevronDownIcon\n width={14}\n height={14}\n className=\"text-zinc-500\"\n style={{\n transition: \"transform 0.15s\",\n transform: isOpen ? \"rotate(180deg)\" : undefined,\n }}\n />\n </button>\n\n {isOpen && (\n <div style={dropdownStyle}>\n {resolutionOptions.map((option) => (\n <button\n key={option}\n type=\"button\"\n onClick={() => handleSelect(option)}\n className={cn(\n \"w-full text-left px-3 py-1.5 rounded-lg text-xs font-medium transition-colors cursor-pointer\",\n option === resolution\n ? \"text-primary bg-primary/10\"\n : \"text-zinc-400 hover:text-foreground hover:bg-zinc-800\",\n )}\n >\n {t(`common.resolution.${option}`)}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useScreen } from \"@liberfi.io/ui\";\nimport { TokenListResolutionSelectorDesktop } from \"./token-list-resolution-selector-desktop.ui\";\nimport { TokenListResolutionSelectorMobile } from \"./token-list-resolution-selector-mobile.ui\";\nimport { TokenListResolutionSelectorProps } from \"./types\";\n\nexport function TokenListResolutionSelectorWidget(\n props: TokenListResolutionSelectorProps,\n) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return <TokenListResolutionSelectorMobile {...props} />;\n }\n\n return <TokenListResolutionSelectorDesktop {...props} />;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n cn,\n HorsePowerHighIcon,\n HorsePowerIcon,\n HorsePowerLowIcon,\n StyledTooltip,\n} from \"@liberfi.io/ui\";\nimport { formatPercent } from \"@liberfi.io/utils\";\nimport { SafeBigNumber } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenBlueChipCell({ token }: TokenCellProps) {\n const { t } = useTranslation();\n\n const bluechipHoldingsRatio = useMemo(\n () => token.marketData?.bluechipHoldingsRatio,\n [token.marketData?.bluechipHoldingsRatio],\n );\n\n const ratioHigh = useMemo(\n () =>\n bluechipHoldingsRatio !== undefined &&\n new SafeBigNumber(bluechipHoldingsRatio).gte(0.1),\n [bluechipHoldingsRatio],\n );\n\n const ratioLow = useMemo(\n () =>\n bluechipHoldingsRatio === undefined ||\n new SafeBigNumber(bluechipHoldingsRatio).lt(0.05),\n [bluechipHoldingsRatio],\n );\n\n return (\n <StyledTooltip content={t(\"tokens.bluechip.explained\")}>\n <div className=\"flex items-center gap-2.5\">\n {ratioHigh && <HorsePowerHighIcon />}\n {ratioLow && <HorsePowerLowIcon />}\n {!ratioHigh && !ratioLow && <HorsePowerIcon />}\n\n <span\n className={cn(\n ratioHigh && \"text-bullish\",\n !ratioHigh && !ratioLow && \"text-bearish\",\n bluechipHoldingsRatio === undefined && \"text-neutral\",\n )}\n >\n {formatPercent(bluechipHoldingsRatio)}\n </span>\n </div>\n </StyledTooltip>\n );\n}\n","import { MouseEvent, useCallback } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n CopyIcon,\n DiscordIcon,\n Link,\n SearchIcon,\n TelegramIcon,\n TwitterIcon,\n WebsiteIcon,\n StyledTooltip,\n toast,\n useCopyToClipboard,\n} from \"@liberfi.io/ui\";\nimport { formatAge, searchTwitterUrl } from \"@liberfi.io/utils\";\nimport { TokenAvatar } from \"../../token-avatar\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenCell({ token }: TokenCellProps) {\n const copyToClipboard = useCopyToClipboard();\n\n const { t } = useTranslation();\n\n const handleCopyToClipboard = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n copyToClipboard(token.address, () =>\n toast.success(t(\"tokens.copied.address\")),\n );\n },\n [copyToClipboard, token.address, t],\n );\n\n const age = useTickAge(token.createdAt);\n\n return (\n <div className=\"w-full flex justify-start items-center gap-3\">\n {/* avatar */}\n <TokenAvatar\n token={token}\n className=\"w-10 h-10 sm:w-16 sm:h-16 flex-none\"\n />\n\n {/* symbol & name & social media ...etc */}\n <div className=\"flex-auto flex flex-col gap-1 min-w-0\">\n {/* symbol & name */}\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-none font-medium tracking-[-0.02em]\">\n {token.symbol}\n </span>\n <StyledTooltip content={token.name}>\n <div\n className=\"flex-initial flex items-center gap-1 min-w-0 text-neutral hover:text-primary-200 cursor-pointer\"\n onClick={handleCopyToClipboard}\n >\n <div className=\"flex-initial whitespace-nowrap truncate\">\n {token.name}\n </div>\n <CopyIcon className=\"flex-none w-3 h-3 sm:w-3.5 sm:h-3.5\" />\n </div>\n </StyledTooltip>\n </div>\n\n {/* social medias */}\n <div className=\"flex items-center gap-2\">\n {/* age */}\n <span className=\"text-primary text-xs sm:text-sm font-medium\">\n {formatAge(age)}\n </span>\n {/* website */}\n {token.socialMedias?.website && (\n <Link\n href={token.socialMedias.website}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <WebsiteIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* twitter */}\n {token.socialMedias?.twitter && (\n <Link\n href={token.socialMedias.twitter}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <TwitterIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* telegram */}\n {token.socialMedias?.telegram && (\n <Link\n href={token.socialMedias.telegram}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <TelegramIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* discord */}\n {token.socialMedias?.discord && (\n <Link\n href={token.socialMedias.discord}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <DiscordIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* search on twitter */}\n <Link\n href={searchTwitterUrl(`${token.symbol} OR ${token.address}`)}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <SearchIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n </div>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n BundlesIcon,\n cn,\n CookIcon,\n KlineCandlesIcon,\n PeopleIcon,\n RatIcon,\n SniperIcon,\n StarIcon,\n StyledTooltip,\n UserWithStarBadgeIcon,\n} from \"@liberfi.io/ui\";\nimport { formatAmount, formatPercent, SafeBigNumber } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\ntype InfoColor = \"neutral\" | \"bullish\" | \"bearish\";\n\nconst COLOR_CLASS: Record<InfoColor, string> = {\n neutral: \"text-zinc-400\",\n bullish: \"text-bullish\",\n bearish: \"text-bearish\",\n};\n\nfunction InfoItem({\n icon,\n value,\n tooltip,\n color = \"neutral\",\n}: {\n icon: React.ReactNode;\n value: string;\n tooltip: string;\n color?: InfoColor;\n}) {\n return (\n <StyledTooltip content={tooltip}>\n <span\n className=\"inline-flex items-center text-xs tabular-nums\"\n style={{ gap: 5 }}\n >\n <span className=\"flex-none\" style={{ color: \"#52525b\" }}>\n {icon}\n </span>\n <span className={cn(COLOR_CLASS[color])}>{value}</span>\n </span>\n </StyledTooltip>\n );\n}\n\nexport function TokenInfoCell({ token }: TokenCellProps) {\n const { t } = useTranslation();\n\n const md = token.marketData;\n\n const top10Warn = useMemo(\n () => new SafeBigNumber(md?.top10HoldingsRatio).gte(0.1),\n [md?.top10HoldingsRatio],\n );\n const devWarn = useMemo(\n () => new SafeBigNumber(md?.devHoldingsRatio).gte(0.1),\n [md?.devHoldingsRatio],\n );\n const sniperWarn = useMemo(\n () => new SafeBigNumber(md?.sniperHoldingsRatio).gte(0.1),\n [md?.sniperHoldingsRatio],\n );\n const insiderWarn = useMemo(\n () => new SafeBigNumber(md?.insiderHoldingsRatio).gte(0.1),\n [md?.insiderHoldingsRatio],\n );\n const bundleWarn = useMemo(\n () => new SafeBigNumber(md?.bundleHoldingsRatio).gte(0.1),\n [md?.bundleHoldingsRatio],\n );\n\n const ratioColor = (warn: boolean, raw: number | undefined): InfoColor => {\n if (raw === undefined) return \"neutral\";\n return warn ? \"bearish\" : \"bullish\";\n };\n\n return (\n <div className=\"w-full h-full flex gap-5 justify-start items-center\">\n <div className=\"flex flex-col gap-1\">\n <InfoItem\n icon={<PeopleIcon width={14} height={14} />}\n value={formatAmount(md?.holders)}\n tooltip={t(\"tokens.tokenInfo.holders\")}\n />\n <InfoItem\n icon={<KlineCandlesIcon width={14} height={14} />}\n value={formatAmount(md?.proHolders)}\n tooltip={t(\"tokens.tokenInfo.proHolders\")}\n />\n <InfoItem\n icon={<StarIcon width={14} height={14} />}\n value={formatAmount(md?.kolHolders)}\n tooltip={t(\"tokens.tokenInfo.kolHolders\")}\n />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <InfoItem\n icon={<UserWithStarBadgeIcon width={14} height={14} />}\n value={formatPercent(md?.top10HoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.top10HoldingsRatio\")}\n color={ratioColor(top10Warn, md?.top10HoldingsRatio)}\n />\n <InfoItem\n icon={<CookIcon width={14} height={14} />}\n value={formatPercent(md?.devHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.devHoldingsRatio\")}\n color={ratioColor(devWarn, md?.devHoldingsRatio)}\n />\n <InfoItem\n icon={<SniperIcon width={14} height={14} />}\n value={formatPercent(md?.sniperHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.sniperHoldingsRatio\")}\n color={ratioColor(sniperWarn, md?.sniperHoldingsRatio)}\n />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <InfoItem\n icon={<RatIcon width={14} height={14} />}\n value={formatPercent(md?.insiderHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.insiderHoldingsRatio\")}\n color={ratioColor(insiderWarn, md?.insiderHoldingsRatio)}\n />\n <InfoItem\n icon={<BundlesIcon width={14} height={14} />}\n value={formatPercent(md?.bundleHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.bundleHoldingsRatio\")}\n color={ratioColor(bundleWarn, md?.bundleHoldingsRatio)}\n />\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenLiquidityCell({ token }: TokenCellProps) {\n const liquidity = useMemo(\n () => token.marketData?.tvlInUsd,\n [token.marketData?.tvlInUsd],\n );\n return <>{formatAmountUSD(liquidity)}</>;\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenMarketCapCell({ token }: TokenCellProps) {\n const marketCap = useMemo(\n () => token.marketData?.marketCapInUsd,\n [token.marketData?.marketCapInUsd],\n );\n return <>{formatAmountUSD(marketCap)}</>;\n}\n","import { useMemo } from \"react\";\nimport { cn, TriangleDownIcon, TriangleUpIcon } from \"@liberfi.io/ui\";\nimport {\n formatPercent,\n formatPriceUSD,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenPriceCell({ token, resolution }: TokenCellProps) {\n const price = useMemo(() => token.marketData?.priceInUsd, [token]);\n\n const priceChange = useMemo(\n () => token.stats?.[resolution]?.priceChange,\n [token, resolution],\n );\n\n const priceChangeAbs = useMemo(\n () =>\n priceChange ? new SafeBigNumber(priceChange).abs().toString() : undefined,\n [priceChange],\n );\n\n const bullish = useMemo(\n () => priceChange && new SafeBigNumber(priceChange).gte(0),\n [priceChange],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatPriceUSD(price)}</span>\n <span\n className={cn(\n \"inline-flex gap-1 items-center text-xs\",\n bullish ? \"text-bullish\" : \"text-bearish\",\n )}\n >\n {bullish ? (\n <TriangleUpIcon width={10} height={10} />\n ) : (\n <TriangleDownIcon width={10} height={10} />\n )}\n <span>{formatPercent(priceChangeAbs)}</span>\n </span>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenTradersCell({ token, resolution }: TokenCellProps) {\n const traders = useMemo(\n () => token.stats?.[resolution]?.traders,\n [token.stats?.[resolution]?.traders],\n );\n\n const buyers = useMemo(\n () => token.stats?.[resolution]?.buyers,\n [token.stats?.[resolution]?.buyers],\n );\n\n const sellers = useMemo(\n () => token.stats?.[resolution]?.sellers,\n [token.stats?.[resolution]?.sellers],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmount(traders)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmount(buyers)}</span>/\n <span className=\"text-bearish\">{formatAmount(sellers)}</span>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenTradesCell({ token, resolution }: TokenCellProps) {\n const txs = useMemo(\n () => token.stats?.[resolution]?.trades,\n [token.stats?.[resolution]?.trades],\n );\n\n const buys = useMemo(\n () => token.stats?.[resolution]?.buys,\n [token.stats?.[resolution]?.buys],\n );\n\n const sells = useMemo(\n () => token.stats?.[resolution]?.sells,\n [token.stats?.[resolution]?.sells],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmount(txs)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmount(buys)}</span>/\n <span className=\"text-bearish\">{formatAmount(sells)}</span>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenVolumesCell({ token, resolution }: TokenCellProps) {\n const volumes = useMemo(\n () => token.stats?.[resolution]?.volumesInUsd,\n [token.stats?.[resolution]?.volumesInUsd],\n );\n\n const buyVolumes = useMemo(\n () => token.stats?.[resolution]?.buyVolumesInUsd,\n [token.stats?.[resolution]?.buyVolumesInUsd],\n );\n\n const sellVolumes = useMemo(\n () => token.stats?.[resolution]?.sellVolumesInUsd,\n [token.stats?.[resolution]?.sellVolumesInUsd],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmountUSD(volumes)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmountUSD(buyVolumes)}</span>/\n <span className=\"text-bearish\">{formatAmountUSD(sellVolumes)}</span>\n </div>\n </div>\n );\n}\n","export interface TokenListSkeletonProps {\n rowHeight: number;\n hasActions: boolean;\n}\n\nconst SHIMMER_CSS = `\n@keyframes tklShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}\n`;\n\nconst shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"tklShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n};\n\nfunction bar(\n delay: number,\n w: number | string,\n h: number,\n extra?: React.CSSProperties,\n): React.CSSProperties {\n return {\n ...shimmer,\n animationDelay: `${delay}ms`,\n width: w,\n height: h,\n ...extra,\n };\n}\n\nconst ROW_COUNT = 10;\n\nexport function TokenListSkeleton({\n rowHeight,\n hasActions,\n}: TokenListSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n {Array.from({ length: ROW_COUNT }).map((_, i) => (\n <SkeletonRow\n key={i}\n index={i}\n rowHeight={rowHeight}\n hasActions={hasActions}\n isLast={i === ROW_COUNT - 1}\n />\n ))}\n </>\n );\n}\n\nfunction SkeletonRow({\n index,\n rowHeight,\n hasActions,\n isLast,\n}: {\n index: number;\n rowHeight: number;\n hasActions: boolean;\n isLast: boolean;\n}) {\n const d = index * 80;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: rowHeight,\n borderBottom: isLast ? undefined : \"1px solid rgba(39,39,42,0.3)\",\n }}\n >\n {/* Token — 320px: avatar 64x64 + name/subtitle */}\n <div\n style={{\n width: 320,\n padding: \"0 12px 0 24px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n flexShrink: 0,\n }}\n >\n <div style={bar(d, 64, 64, { borderRadius: 8, flexShrink: 0 })} />\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n flex: 1,\n }}\n >\n <div style={bar(d + 30, \"60%\", 20)} />\n <div style={bar(d + 60, \"80%\", 16)} />\n </div>\n </div>\n\n {/* Price/Change — 128px: price 20px + change 16px */}\n <div\n style={{\n width: 128,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 20, 72, 20)} />\n <div style={bar(d + 40, 52, 16)} />\n </div>\n\n {/* Market cap — 106px: single value 20px */}\n <div\n style={{\n width: 106,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div style={bar(d + 30, 64, 20)} />\n </div>\n\n {/* Liquidity — 106px: single value 20px */}\n <div\n style={{\n width: 106,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div style={bar(d + 40, 60, 20)} />\n </div>\n\n {/* Volumes — 138px: total 20px + buy/sell 16px */}\n <div\n style={{\n width: 138,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 50, 72, 20)} />\n <div style={bar(d + 70, 100, 16)} />\n </div>\n\n {/* Trades — 126px: total 20px + buy/sell 16px */}\n <div\n style={{\n width: 126,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 60, 48, 20)} />\n <div style={bar(d + 80, 80, 16)} />\n </div>\n\n {/* Traders — 126px: total 20px + buy/sell 16px */}\n <div\n style={{\n width: 126,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 70, 40, 20)} />\n <div style={bar(d + 90, 72, 16)} />\n </div>\n\n {/* Bluechip — 128px: icon 20x20 + text 20px */}\n <div\n style={{\n width: 128,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n }}\n >\n <div style={bar(d + 80, 20, 20, { borderRadius: 4 })} />\n <div style={bar(d + 90, 52, 20)} />\n </div>\n\n {/* Token Info — 308px: 3 columns of icon+value pairs, each 16px tall */}\n <div\n style={{\n width: 308,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 20,\n }}\n >\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={bar(d + 80, 52, 16)} />\n <div style={bar(d + 100, 40, 16)} />\n <div style={bar(d + 120, 36, 16)} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={bar(d + 90, 48, 16)} />\n <div style={bar(d + 110, 40, 16)} />\n <div style={bar(d + 130, 40, 16)} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={bar(d + 100, 40, 16)} />\n <div style={bar(d + 120, 36, 16)} />\n </div>\n </div>\n\n {/* Actions — 124px: button 97x32 */}\n {hasActions && (\n <div\n style={{\n width: 124,\n padding: \"0 24px 0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div style={bar(d + 100, 97, 32, { borderRadius: 8 })} />\n </div>\n )}\n </div>\n );\n}\n","import {\n ComponentType,\n MouseEvent,\n ReactElement,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API, Token } from \"@liberfi.io/types\";\nimport {\n cn,\n EmptyIcon,\n Sortable,\n StyledTable,\n TableBody,\n TableCell,\n TableCellProps,\n TableColumn,\n TableColumnProps,\n TableHeader,\n TableRow,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport {\n TokenBlueChipCell,\n TokenCell,\n TokenInfoCell,\n TokenLiquidityCell,\n TokenMarketCapCell,\n TokenPriceCell,\n TokenTradersCell,\n TokenTradesCell,\n TokenVolumesCell,\n} from \"./cells\";\nimport { TokenListSkeleton } from \"./token-list-skeleton.ui\";\nimport { TokenListResolution } from \"./types\";\n\ntype SortDirection = \"asc\" | \"desc\" | undefined;\n\nexport type TokenListSortDirections = {\n [key in API.TokenFieldOption]?: SortDirection;\n};\n\nexport interface TokenListActionsProps {\n token: Token;\n resolution: TokenListResolution;\n}\n\nexport type TokenListActionsComponent = ComponentType<TokenListActionsProps>;\n\nexport interface TokenListProps {\n /** tokens to display */\n tokens: Array<Token>;\n /** resolution of the token prices */\n resolution?: TokenListResolution;\n /** whether the list is loading */\n isLoading?: boolean;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /** current sort directions */\n sortDirections?: TokenListSortDirections;\n /** callback function when sort direction changes */\n onSortChange?: (\n sortDirections: TokenListSortDirections,\n ) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n}\n\n/**\n * Token List UI Component\n */\nexport function TokenList({\n tokens,\n resolution = \"24h\",\n isLoading,\n ActionsComponent,\n onSelectToken,\n sortDirections,\n onSortChange,\n height = 600,\n itemHeight = 88,\n itemHeightMobile = 72,\n className,\n}: TokenListProps) {\n const { isMobile } = useScreen();\n\n const { t } = useTranslation();\n\n const handleRowClick = useCallback(\n (token: Token) => (e: MouseEvent<HTMLTableRowElement>) => {\n e.preventDefault();\n e.stopPropagation();\n onSelectToken?.(token);\n },\n [onSelectToken],\n );\n\n // latest sort directions\n const [sorts, setSorts] = useState<TokenListSortDirections>(\n sortDirections ?? {},\n );\n\n // update sort directions when they change\n useEffect(() => {\n setSorts(sortDirections ?? {});\n }, [sortDirections]);\n\n // only one field can be sorted at a time\n const handleSortChange = useCallback(\n (field: API.TokenFieldOption) => (sort: \"asc\" | \"desc\" | undefined) => {\n const sorts = { [field]: sort };\n setSorts(sorts);\n onSortChange?.(sorts);\n },\n [onSortChange],\n );\n\n return (\n <StyledTable\n isHeaderSticky\n isVirtualized\n radius=\"lg\"\n className={cn(\n \"h-full mx-auto\",\n className ??\n (ActionsComponent\n ? \"max-w-379 sm:max-w-403\"\n : \"max-w-348 sm:max-w-372\"),\n )}\n classNames={{\n loadingWrapper: \"flex-col justify-start items-start\",\n emptyWrapper: \"pt-30\",\n }}\n style={{\n background: \"rgba(24,24,27,0.4)\",\n borderColor: \"rgba(39,39,42,0.6)\",\n }}\n maxTableHeight={height}\n rowHeight={isMobile ? itemHeightMobile : itemHeight}\n aria-label=\"Tokens\"\n >\n <TableHeader>\n {\n [\n <TableColumn\n key=\"token\"\n textValue={t(\"tokens.listHeader.token\")}\n width={isMobile ? 224 : 320}\n >\n {t(\"tokens.listHeader.token\")}\n </TableColumn>,\n <TableColumn\n key=\"price\"\n textValue={t(\"tokens.listHeader.price\")}\n width={128}\n >\n <div className=\"flex items-center gap-1\">\n <Sortable\n sort={sorts.price}\n onSortChange={handleSortChange(\"price\")}\n >\n {t(\"tokens.listHeader.price\")}\n </Sortable>\n <span>/</span>\n <Sortable\n sort={sorts[`priceChange${resolution}`]}\n onSortChange={handleSortChange(`priceChange${resolution}`)}\n >\n {t(\"tokens.listHeader.priceChange\", { resolution })}\n </Sortable>\n </div>\n </TableColumn>,\n <TableColumn\n key=\"marketCap\"\n textValue={t(\"tokens.listHeader.marketCap\")}\n width={106}\n >\n <Sortable\n sort={sorts.marketCap}\n onSortChange={handleSortChange(\"marketCap\")}\n >\n {t(\"tokens.listHeader.marketCap\")}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"liquidity\"\n textValue={t(\"tokens.listHeader.liquidity\")}\n width={106}\n >\n <Sortable sort={sorts.tvl} onSortChange={handleSortChange(\"tvl\")}>\n {t(\"tokens.listHeader.liquidity\")}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"volumes\"\n textValue={t(\"tokens.listHeader.volumes\", { resolution })}\n width={138}\n >\n <Sortable\n sort={sorts[`volumes${resolution}`]}\n onSortChange={handleSortChange(`volumes${resolution}`)}\n >\n {t(\"tokens.listHeader.volumes\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"txs\"\n textValue={t(\"tokens.listHeader.txs\", { resolution })}\n width={126}\n >\n <Sortable\n sort={sorts[`trades${resolution}`]}\n onSortChange={handleSortChange(`trades${resolution}`)}\n >\n {t(\"tokens.listHeader.txs\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"traders\"\n textValue={t(\"tokens.listHeader.traders\", { resolution })}\n width={126}\n >\n <Sortable\n sort={sorts[`traders${resolution}`]}\n onSortChange={handleSortChange(`traders${resolution}`)}\n >\n {t(\"tokens.listHeader.traders\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"bluechip\"\n textValue={t(\"tokens.listHeader.bluechip\")}\n width={128}\n >\n {t(\"tokens.listHeader.bluechip\")}\n </TableColumn>,\n <TableColumn\n key=\"tokenInfo\"\n textValue={t(\"tokens.listHeader.tokenInfo\")}\n width={308}\n >\n {t(\"tokens.listHeader.tokenInfo\")}\n </TableColumn>,\n ActionsComponent ? (\n <TableColumn\n key=\"actions\"\n textValue={t(\"tokens.listHeader.actions\")}\n width={124}\n align=\"end\"\n >\n {t(\"tokens.listHeader.actions\")}\n </TableColumn>\n ) : undefined,\n ].filter(Boolean) as ReactElement<TableColumnProps<unknown>>[]\n }\n </TableHeader>\n\n <TableBody\n // don't show the loaded content when loading\n items={isLoading ? [] : tokens}\n isLoading={isLoading}\n loadingContent={\n <TokenListSkeleton\n rowHeight={isMobile ? itemHeightMobile : itemHeight}\n hasActions={!!ActionsComponent}\n />\n }\n emptyContent={\n <div>\n <EmptyIcon className=\"w-10 h-10 mx-auto text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral text-center\">\n {t(\"common.empty\")}\n </p>\n </div>\n }\n >\n {(token) => (\n <TableRow\n key={token.address}\n onClick={onSelectToken ? handleRowClick(token) : undefined}\n >\n {\n [\n <TableCell key=\"token\">\n <TokenCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"price\">\n <TokenPriceCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"marketCap\">\n <TokenMarketCapCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"liquidity\">\n <TokenLiquidityCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"volumes\">\n <TokenVolumesCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"trades\">\n <TokenTradesCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"traders\">\n <TokenTradersCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"bluechip\">\n <TokenBlueChipCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"tokenInfo\">\n <TokenInfoCell token={token} resolution={resolution} />\n </TableCell>,\n ActionsComponent ? (\n <TableCell key=\"actions\">\n <ActionsComponent token={token} resolution={resolution} />\n </TableCell>\n ) : undefined,\n ].filter(Boolean) as ReactElement<TableCellProps>[]\n }\n </TableRow>\n )}\n </TableBody>\n </StyledTable>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNewTokensQuery, useNewTokensSubscription } from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\nimport { TokenListResolution } from \"./types\";\n\nconst MAX_ITEMS = 80;\n\nexport type UseNewTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseNewTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nfunction tokenFromSubscribed(sub: API.TokenSubscribed): Token {\n return {\n chain: sub.chain,\n address: sub.address,\n name: sub.name ?? \"\",\n symbol: sub.symbol ?? \"\",\n decimals: sub.decimals ?? 0,\n image: sub.image,\n description: sub.description,\n socialMedias: sub.socialMedias,\n launchedFrom: sub.launchedFrom,\n migratedTo: sub.migratedTo,\n createdAt: sub.createdAt,\n };\n}\n\nfunction sortAndLimit(tokens: Token[]): Token[] {\n tokens.sort((a, b) => {\n const at = a.createdAt?.getTime() ?? 0;\n const bt = b.createdAt?.getTime() ?? 0;\n return bt - at;\n });\n return tokens.slice(0, MAX_ITEMS);\n}\n\nexport function useNewTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseNewTokensScriptParams): UseNewTokensScriptResult {\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n const prevParamsRef = useRef(queryParams);\n\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n setTokens([]);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useNewTokensQuery(queryParams, {\n refetchInterval,\n });\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else {\n merged.push(token);\n }\n }\n return sortAndLimit(merged);\n });\n setIsParamsChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates (new tokens, metadata, stats, etc.) ---\n const handleUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const sub of data) {\n const idx = merged.findIndex((t) => t.address === sub.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], sub);\n } else {\n changed = true;\n merged.push(tokenFromSubscribed(sub));\n }\n }\n return changed ? sortAndLimit(merged) : prev;\n });\n }, []);\n\n useNewTokensSubscription({ chain }, handleUpdate);\n\n const isLoading = useMemo(() => {\n if (isPending) return true;\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { useNewTokensScript } from \"./new-token-list.script\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { TokenListResolution } from \"./types\";\n\nexport type NewTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function NewTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: NewTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n useEffect(() => {\n setSortDirections(undefined);\n }, [chain]);\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useNewTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useStockTokensQuery,\n useStockTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\nimport { TokenListResolution } from \"./types\";\n\nexport type UseStockTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseStockTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nexport function useStockTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseStockTokensScriptParams): UseStockTokensScriptResult {\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n const prevParamsRef = useRef(queryParams);\n\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n setTokens([]);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useStockTokensQuery(queryParams, {\n refetchInterval,\n });\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const merged: Array<Token> = [];\n for (const token of fetchedTokens) {\n const existing = prev.find((t) => t.address === token.address);\n merged.push(existing ? mergeToken(existing, token) : token);\n }\n return merged;\n });\n setIsParamsChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useStockTokensSubscription({ chain }, handleDataUpdate);\n\n const isLoading = useMemo(() => {\n if (isPending) return true;\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { useStockTokensScript } from \"./stock-token-list.script\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { TokenListResolution } from \"./types\";\n\nexport type StockTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function StockTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: StockTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n useEffect(() => {\n setSortDirections(undefined);\n }, [chain]);\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useStockTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { useTrendingTokensScript } from \"./trending-token-list.script\";\nimport { TokenListResolution } from \"./types\";\n\nexport type TrendingTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function TrendingTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: TrendingTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n useEffect(() => {\n setSortDirections(undefined);\n }, [chain]);\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useTrendingTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useDexClient, useTokensQuery } from \"@liberfi.io/react\";\nimport type { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../utils/merge\";\n\nconst DEFAULT_POLL_MS = 15_000;\n\nexport interface UseTokensParams {\n chain: Chain;\n /** Token addresses to track */\n addresses: string[];\n /** Polling interval in ms (default 15 000) */\n pollMs?: number;\n}\n\nexport function useTokens({\n chain,\n addresses,\n pollMs = DEFAULT_POLL_MS,\n}: UseTokensParams) {\n const active = addresses.length > 0;\n\n const [tokens, setTokens] = useState<Record<string, Token>>({});\n\n // ── Query (polling) ──────────────────────────────────────────────────────\n\n const query = useTokensQuery(\n { chain, addresses },\n { enabled: active, refetchInterval: pollMs },\n );\n\n // ── Sync query data → local state ──────────────────────────────────────\n\n useEffect(() => {\n if (!query.data) return;\n setTokens((prev) => {\n const next: Record<string, Token> = {};\n for (const token of query.data!) {\n const existing = prev[token.address];\n next[token.address] = existing ? mergeToken(existing, token) : token;\n }\n return next;\n });\n }, [query.data]);\n\n // ── Subscriptions (real-time) ──────────────────────────────────────────\n\n const { subscribeClient } = useDexClient();\n\n const addrKeyRef = useRef(\"\");\n const addrKey = addresses.slice().sort().join(\",\");\n if (addrKey !== addrKeyRef.current) {\n addrKeyRef.current = addrKey;\n }\n\n useEffect(() => {\n if (!active) return;\n\n const subs: Array<API.ISubscription> = [];\n\n for (const address of addresses) {\n subs.push(\n subscribeClient.subscribeToken(\n chain,\n address,\n (data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n let updated = prev;\n for (const incoming of data) {\n const existing = updated[incoming.address];\n if (!existing) continue;\n\n const merged = mergeToken(existing, incoming);\n if (merged === existing) continue;\n\n updated = updated === prev ? { ...prev } : updated;\n updated[incoming.address] = merged;\n }\n return updated;\n });\n },\n ),\n );\n }\n\n return () => {\n for (const sub of subs) {\n sub.unsubscribe();\n }\n };\n }, [subscribeClient, chain, addrKey, active]);\n\n // ── Refetch ────────────────────────────────────────────────────────────\n\n const refetch = useCallback(async () => {\n await query.refetch();\n }, [query.refetch]);\n\n // ── Return ─────────────────────────────────────────────────────────────\n\n return {\n tokens,\n\n isPending: query.isPending,\n isFetching: query.isFetching,\n isError: query.isError,\n isSuccess: query.isSuccess,\n error: query.error,\n\n refetch,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/components/pulse/pulse-list-header.ui.tsx","../src/components/pulse/pulse-list-item-skeleton.ui.tsx","../src/utils/protocol-styles.ts","../src/components/token-avatar/token-avatar.ui.tsx","../src/components/pulse/pulse-list-item.ui.tsx","../src/components/pulse/pulse-list.ui.tsx","../src/utils/merge.ts","../src/components/pulse/pulse-new-list.script.ts","../src/components/pulse/pulse-new-list.widget.tsx","../src/components/pulse/pulse-migrated-list.script.ts","../src/components/pulse/pulse-migrated-list.widget.tsx","../src/components/pulse/pulse-final-stretch-list.script.ts","../src/components/pulse/pulse-final-stretch-list.widget.tsx","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list-header.ui.tsx","../src/components/search/search-result-list-skeleton.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/token-list/trending-token-list.script.ts","../src/components/search/search-trending-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-tokens-button.tsx","../src/components/shared/trader-tag-badge/trader-tag-badge.ui.tsx","../src/components/shared/holder-tag-badge/holder-tag-badge.ui.tsx","../src/components/token-detail/shared/format.ts","../src/components/token-detail/shared/age.ts","../src/components/token-detail/shared/use-live-token.ts","../src/components/token-detail/shared/buy-sell-overview.ui.tsx","../src/components/token-detail/token-detail-header/token-detail-header.ui.tsx","../src/components/token-detail/token-detail-header/token-detail-header.script.ts","../src/components/token-detail/token-basic-info/token-basic-info.ui.tsx","../src/components/token-detail/token-basic-info/token-basic-info.script.ts","../src/components/token-detail/token-holders-count/token-holders-count.ui.tsx","../src/components/token-detail/token-holders-count/token-holders-count.script.ts","../src/components/token-detail/token-holders-count/token-holders-count.widget.tsx","../src/components/token-detail/token-market-cap/token-market-cap.ui.tsx","../src/components/token-detail/token-market-cap/token-market-cap.script.ts","../src/components/token-detail/token-market-cap/token-market-cap.widget.tsx","../src/components/token-detail/token-price/token-price.ui.tsx","../src/components/token-detail/token-price/token-price.script.ts","../src/components/token-detail/token-price/token-price.widget.tsx","../src/components/token-detail/token-social-media/token-social-media.ui.tsx","../src/components/token-detail/token-social-media/token-social-media.script.ts","../src/components/token-detail/token-social-media/token-social-media.widget.tsx","../src/components/token-detail/token-volume/token-volume.ui.tsx","../src/components/token-detail/token-volume/token-volume.script.ts","../src/components/token-detail/token-volume/token-volume.widget.tsx","../src/components/token-detail/token-basic-info/token-basic-info.widget.tsx","../src/components/token-detail/token-detail-header/token-detail-header.widget.tsx","../src/components/token-detail/token-holders-list/token-holders-list.ui.tsx","../src/components/token-detail/token-holders-list/token-holders-list.script.ts","../src/components/token-detail/token-holders-list/token-holders-list.widget.tsx","../src/components/token-detail/token-activities-list/token-activities-list.ui.tsx","../src/components/token-detail/token-activities-list/token-activities-list.script.ts","../src/components/token-detail/token-activities-list/token-activities-list.widget.tsx","../src/components/token-detail/token-traders-overview/token-traders-overview.ui.tsx","../src/components/token-detail/token-traders-overview/token-traders-overview.script.ts","../src/components/token-detail/token-traders-overview/token-traders-overview.widget.tsx","../src/components/token-detail/token-transactions-overview/token-transactions-overview.ui.tsx","../src/components/token-detail/token-transactions-overview/token-transactions-overview.script.ts","../src/components/token-detail/token-transactions-overview/token-transactions-overview.widget.tsx","../src/components/token-detail/token-volumes-overview/token-volumes-overview.ui.tsx","../src/components/token-detail/token-volumes-overview/token-volumes-overview.script.ts","../src/components/token-detail/token-volumes-overview/token-volumes-overview.widget.tsx","../src/components/token-detail/token-security/token-security.ui.tsx","../src/components/token-detail/token-security/token-security.script.ts","../src/components/token-detail/token-security/token-security.widget.tsx","../src/components/token-detail/token-about/token-about.ui.tsx","../src/components/token-detail/token-about/token-about.script.ts","../src/components/token-detail/token-about/token-about.widget.tsx","../src/components/token-detail/token-liquidities/token-liquidities.ui.tsx","../src/components/token-detail/token-liquidities/token-liquidities.script.ts","../src/components/token-detail/token-liquidities/token-liquidities.widget.tsx","../src/components/token-detail/token-cex-listing/token-cex-listing.ui.tsx","../src/components/token-detail/token-cex-listing/token-cex-listing.script.ts","../src/components/token-detail/token-cex-listing/token-cex-listing.widget.tsx","../src/components/token-detail/token-categories/token-categories.ui.tsx","../src/components/token-detail/token-categories/token-categories.script.ts","../src/components/token-detail/token-categories/token-categories.widget.tsx","../src/components/token-detail/token-stats-flip/token-stats-flip.ui.tsx","../src/components/token-detail/token-stats-flip/token-stats-flip.script.ts","../src/components/token-detail/token-stats-flip/token-stats-flip.widget.tsx","../src/components/token-detail/token-positions-list/token-positions-list.ui.tsx","../src/components/token-detail/token-positions-list/token-positions-list.script.ts","../src/components/token-detail/token-positions-list/token-positions-list.widget.tsx","../src/components/token-detail/token-orders-list/token-orders-list.ui.tsx","../src/components/token-detail/token-orders-list/token-orders-list.script.ts","../src/components/token-detail/token-orders-list/token-orders-list.widget.tsx","../src/components/token-detail/token-top-traders-list/token-top-traders-list.ui.tsx","../src/components/token-detail/token-top-traders-list/token-top-traders-list.script.ts","../src/components/token-detail/token-top-traders-list/token-top-traders-list.widget.tsx","../src/components/token-detail/token-dev-tokens-list/token-dev-tokens-list.ui.tsx","../src/components/token-detail/token-dev-tokens-list/token-dev-tokens-list.script.ts","../src/components/token-detail/token-dev-tokens-list/token-dev-tokens-list.widget.tsx","../src/components/token-detail/token-chart-banner/token-chart-banner.ui.tsx","../src/components/token-detail/token-chart-banner/token-chart-banner.script.ts","../src/components/token-detail/token-chart-banner/token-chart-banner.widget.tsx","../src/components/token-detail/token-similar-tokens/token-similar-tokens.ui.tsx","../src/components/token-detail/token-similar-tokens/token-similar-tokens.script.ts","../src/components/token-detail/token-similar-tokens/token-similar-tokens.widget.tsx","../src/components/token-detail/token-reused-image-list/token-reused-image-list.ui.tsx","../src/components/token-detail/token-reused-image-list/token-reused-image-list.script.ts","../src/components/token-detail/token-reused-image-list/token-reused-image-list.widget.tsx","../src/components/token-list/filters/token-list-keywords-filter.ui.tsx","../src/components/token-list/filters/token-list-protocol-filter.ui.tsx","../src/components/token-list/filters/token-list-minmax-filter.ui.tsx","../src/components/token-list/filters/token-list-audits-filter.ui.tsx","../src/components/token-list/filters/token-list-metrics-filter.ui.tsx","../src/components/token-list/filters/token-list-stats-filter.ui.tsx","../src/components/token-list/token-list-filter.ui.tsx","../src/components/token-list/token-list-filter-modal.ui.tsx","../src/components/token-list/token-list-filter-popover.ui.tsx","../src/components/token-list/token-list-filter.widget.tsx","../src/components/token-list/token-list-resolution-selector-desktop.ui.tsx","../src/components/token-list/token-list-resolution-selector-mobile.ui.tsx","../src/components/token-list/token-list-resolution-selector.widget.tsx","../src/components/token-list/cells/token-bluechip-cell.ui.tsx","../src/components/token-list/cells/token-cell.ui.tsx","../src/components/token-list/cells/token-info-cell.ui.tsx","../src/components/token-list/cells/token-liquidity-cell.ui.tsx","../src/components/token-list/cells/token-market-cap-cell.ui.tsx","../src/components/token-list/cells/token-price-cell.ui.tsx","../src/components/token-list/cells/token-traders-cell.ui.tsx","../src/components/token-list/cells/token-trades-cell.ui.tsx","../src/components/token-list/cells/token-volumes-cell.ui.tsx","../src/components/token-list/token-list-skeleton.ui.tsx","../src/components/token-list/token-list.ui.tsx","../src/components/token-list/new-token-list.script.ts","../src/components/token-list/new-token-list.widget.tsx","../src/components/token-list/stock-token-list.script.ts","../src/components/token-list/stock-token-list.widget.tsx","../src/components/token-list/trending-token-list.widget.tsx","../src/hooks/useTokens.ts"],"names":["version_default","PulseListHeader","title","isPaused","extra","className","t","useTranslation","jsxs","cn","jsx","PauseIcon","PulseListItemSkeleton","isLast","Skeleton","CLASSES","SolanaTokenProtocol","FALLBACK","protocolClasses","protocol","TokenAvatar","token","enablePreview","enableSearch","showProgress","showProtocolFamily","radius","classNames","formattedProtocolFamily","useMemo","parseTokenProtocolFamily","displayProtocolFamily","displayProgress","SafeBigNumber","displaySearch","fallbackName","isHovered","setIsHovered","useState","handleMouseEnter","useCallback","handleMouseLeave","handleSearch","e","url","searchImageUrl","ProgressTrack","PreviewWrapper","Avatar","CameraIcon","StyledTooltip","Image","children","Preview","progress","strokeDashoffset","PulseListItem","renderAction","onSelectToken","copyToClipboard","useCopyToClipboard","age","useTickAge","handleClick","handleCopyAddress","toast","top10Warning","devWarning","insiderWarning","sniperWarning","bundleWarning","buyW","sellW","buys","sells","total","buyWidth","marketCapColorClass","cap","truncateAddress","CopyIcon","formatAge","Link","TwitterIcon","TelegramIcon","WebsiteIcon","searchTwitterUrl","SearchIcon","PeopleIcon","formatAmount","KlineCandlesIcon","StarIcon","HoldingRatioChip","UserWithStarBadgeIcon","formatPercent","CookIcon","RatIcon","SniperIcon","BundlesIcon","formatAmountUSDCompact","icon","value","tooltip","warning","DEFAULT_ITEM_HEIGHT","SKELETON_COUNT","PulseListRow","index","style","data","skeletonCount","renderItemAction","PulseList","tokens","isLoading","itemHeight","renderHeaderExtra","onPauseChange","hideHeader","itemCount","rowProps","setIsPaused","List","assignDefined","existing","incoming","result","key","STATS_TIMEFRAMES","mergeStats","tf","mergeMarketData","mergeOptional","mergeToken","_c","_a","stats","marketData","socialMedias","security","launchedFrom","migratedTo","rest","merged","MAX_ITEMS","tokenFromSubscribed","sub","sortAndLimit","a","b","at","usePulseNewListScript","chain","refetchInterval","queryParams","pausedRef","useRef","prevChainRef","isChainChanged","setIsChainChanged","setTokens","useEffect","fetchedTokens","isPending","useNewTokensQuery","prev","paused","isFirstFill","idx","handleUpdate","changed","useNewTokensSubscription","PulseNewListWidget","handlePauseChange","usePulseMigratedListScript","useMigratedTokensQuery","handleDataUpdate","item","useMigratedTokensSubscription","PulseMigratedListWidget","sortByMigrateProgress","ar","usePulseFinalStretchListScript","useFinalStretchTokensQuery","useFinalStretchTokensSubscription","PulseFinalStretchListWidget","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","useSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","filtered","h","clearHistories","SearchHistoryUI","onSelect","onClear","Button","TrashIcon","Chip","SearchHistoryWidget","SearchInputUI","onValueChange","onEscape","StyledInput","XCloseIcon","Kbd","SearchResultItemUI","price","marketCap","tvl","priceChange","priceChangeAbs","bullish","formatAmountUSD","formatPriceUSD","TriangleUpIcon","TriangleDownIcon","SearchResultListHeader","SkeletonRow","SearchResultListSkeleton","rows","_","i","useSearchResultListScript","chains","limit","params","isFetchingNextPage","hasNextPage","fetchNextPage","useSearchTokensInfiniteQuery","page","ROW_HEIGHT","SearchResultListWidget","scriptParams","ref","height","useResizeObserver","isItemLoaded","loadMoreItems","onRowsLoaded","useInfiniteLoader","EmptyState","SearchResultRow","Spinner","EmptyIcon","useTrendingTokensScript","resolution","options","prevParamsRef","isParamsChanged","setIsParamsChanged","useTrendingTokensQuery","useTrendingTokensSubscription","DEFAULT_CHAIN","Chain","DEFAULT_RESOLUTION","SearchTrendingListWidget","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","v","setText_","setKeyword_","clearKeyword","SearchWidget","SEARCH_MODAL_ID","SearchModal","id","AsyncModal","modalProps","SearchModalContent","isOpen","onOpenChange","onResult","isMobile","useScreen","handleSelectToken","StyledModal","ModalContent","ModalHeader","ModalBody","SearchTokensButton","isDesktop","onOpen","onClose","useAsyncModal","onSelectTokenStable","handleOpen","handleClose","handleKeyDown","event","activeElement","isInEditableElement","TRADER_TAG_META","TraderTagBadge","tag","meta","TraderTagBadgeList","tags","max","visible","overflow","HolderTagBadge","HolderTagBadgeList","formatRatioFrom100","formatPercentUtil","truncateMiddle","input","head","tail","formatAgeShort","from","now","start","end","diffSec","diffMin","diffHour","diffDay","diffMon","useLiveToken","address","useTokenQuery","setToken","useTokenSubscription","updates","next","u","BuySellOverview","label","totalFormatted","buysFormatted","sellsFormatted","totalValue","buysValue","buyPercentage","Progress","TokenDetailHeader","actions","dataStrip","onCopyAddress","useTokenDetailHeaderScript","TokenBasicInfo","volume","holdersCount","socialMedia","useTokenBasicInfoScript","TokenHoldersCount","holders","top10HoldingsRatio","top100HoldingsRatio","useTokenHoldersCountScript","TokenHoldersCountWidget","TokenMarketCap","marketCapInUsd","tvlInUsd","createdAt","useTokenMarketCapScript","TokenMarketCapWidget","TokenPrice","priceInUsd","price24hAgoInUsd","bearish","cur","useTokenPriceScript","TokenPriceWidget","renderIcon","size","DiscordIcon","TokenSocialMedia","socials","iconSize","available","k","useTokenSocialMediaScript","TokenSocialMediaWidget","TokenVolume","volumesInUsd","trades","traders","useTokenVolumeScript","TokenVolumeWidget","TokenBasicInfoWidget","TokenDetailHeaderWidget","SORT_OPTIONS","TokenHoldersList","sortBy","onSortByChange","onlyTracked","onOnlyTrackedChange","onLoadMore","hasMore","wellKnownAddresses","renderAddress","visibleHolders","opt","HolderRow","holder","wellKnownLabel","addressCell","useTokenHoldersListScript","initialSortBy","setSortByState","cursor","setCursor","pages","setPages","resetOnSortChange","setSortBy","s","isFetching","useTokenHoldersQuery","p","lastPage","loadMore","TokenHoldersListWidget","initialOnlyTracked","setOnlyTracked","TYPE_OPTIONS","TRADER_OPTIONS","TokenActivitiesList","activities","typeFilter","onTypeFilterChange","traderFilter","onTraderFilterChange","youWalletAddress","currency","onCurrencyChange","nativeDecimals","nativeSymbol","onRowClick","filteredActivities","filterByTraderFilter","active","disabled","CurrencyToggle","ActivityRow","pickPrimaryToken","filter","normalised","trackedTags","onChange","o","formatGasFee","gasFee","n","activity","primary","sideLabel","sideColor","formatPrice","useTokenActivitiesListScript","initialTypeFilter","setTypeFilterState","liveFront","setLiveFront","reset","setTypeFilter","queryType","useTokenActivitiesQuery","liveEligible","useTokenActivitiesSubscription","seen","fresh","paged","TokenActivitiesListWidget","initialTraderFilter","initialCurrency","setTraderFilter","setCurrency","TokenTradersOverview","r","useTokenTradersOverviewScript","TokenTradersOverviewWidget","TokenTransactionsOverview","useTokenTransactionsOverviewScript","TokenTransactionsOverviewWidget","TokenVolumesOverview","useTokenVolumesOverviewScript","TokenVolumesOverviewWidget","TokenSecurity","externalUrl","externalLabel","items","allSafe","it","SecurityItem","safeWhen","description","safe","display","useTokenSecurityScript","useTokenSecurityQuery","TokenSecurityWidget","TokenAbout","useTokenAboutScript","TokenAboutWidget","TokenLiquidities","liquidities","totalTvlInUsd","collapseAt","onPoolClick","expanded","setExpanded","toggle","lq","useTokenLiquiditiesScript","TokenLiquiditiesWidget","TokenCexListing","cexes","cex","hidden","chip","useTokenCexListingScript","TokenCexListingWidget","cexesProp","TokenCategories","categories","onCategoryClick","useTokenCategoriesScript","TokenCategoriesWidget","DEFAULT_FLIP_HOVER_RESOLUTIONS","TokenStatsFlipBase","buyUsd","sellUsd","totalUsd","netUsd","buySharePct","cells","TokenStatsFlipHover","resolutions","res","raw","bn","isPositive","useTokenStatsFlipScript","useTokenStatsQuery","TokenStatsFlipWidget","baseResolution","hoverResolutions","StatsFlipPanel","TokenPositionsList","positions","showHidden","onShowHiddenChange","renderActions","PositionRow","position","bought","sold","remaining","pnl","computePositionFields","tokenCell","buyRaw","sellRaw","remainingRaw","pnlRaw","pnlBn","pnlAmount","pnlRatio","useTokenPositionsListScript","wallet","initialShowHidden","setShowHidden","useWalletTokenPositionsQuery","TokenPositionsListWidget","TokenOrdersList","orders","unavailable","stateFilter","onStateFilterChange","onlyThisToken","onOnlyThisTokenChange","tokenSymbol","onCancelAll","OrderRow","order","amountDisplay","side","sideClass","isNotImplementedError","error","mapStateFilter","useTokenOrdersListScript","tokenAddress","initialStateFilter","initialOnlyThisToken","setStateFilterState","setOnlyThisToken","setStateFilter","useWalletLimitOrdersQuery","TokenOrdersListWidget","TokenTopTradersList","TraderRow","trader","useTokenTopTradersListScript","useTokenTopTradersQuery","rawTraders","TokenTopTradersListWidget","TokenDevTokensList","renderTokenLink","DevTokenRow","liquidity","vol1h","migrated","TokenDevTokensSummary","migratedCount","migratedPct","totalVol1h","acc","totalMarketCap","SummaryCell","useTokenDevTokensListScript","creator","useTokensByCreatorQuery","TokenDevTokensListWidget","showSummary","TokenChartBanner","athInUsd","athAt","globalFeesPaidInUsd","rank","onTogglePin","pinned","supply","Cell","useTokenChartBannerScript","TokenChartBannerWidget","TokenSimilarTokens","onTokenClick","useTokenSimilarTokensScript","enabled","useSearchTokensQuery","TokenSimilarTokensWidget","TokenReusedImageList","useTokenReusedImageListScript","_params","TokenReusedImageListWidget","TokenListKeywordsFilter","keywords","excludeKeywords","onKeywordsChange","onExcludeKeywordsChange","keywordsText","setKeywordsText","excludeKeywordsText","setExcludeKeywordsText","prevKeywords","parseKeywords","prevExcludeKeywords","handleKeywordsValueChange","handleExcludeKeywordsValueChange","parsedKeywords","TokenListProtocolFilter","protocols","selectedProtocols","onSelectedProtocolsChange","selected","setSelected","isAllSelected","handleSelectAll","handleSelect","newSelected","pc","formatTokenProtocolName","TokenListMinMaxFilter","field","min","setMin","parseValue","setMax","handleMinChange","formatValue","handleMaxChange","StyledNumberInput","TokenListAuditsFilter","values","onValuesChange","currentValues","setCurrentValues","handleValueChange","newValues","TokenListMetricsFilter","TokenListStatsFilter","curTab","setCurTab","handleValuesChange","auditsFiltersCount","fields","metricsFiltersCount","StyledLightTabs","Tab","StyledBadge","TokenListFilter","filters","onFiltersChange","setSelectedProtocols","parseSelectedProtocols","searchKeywords","setSearchKeywords","excludeSearchKeywords","setExcludeSearchKeywords","filterValues","setFilterValues","handleProtocolsChange","toFilters","handleKeywordsChange","handleExcludeKeywordsChange","handleFilterValuesChange","Fragment","TokenListFilterModal","useDisclosure","editingFilters","setEditingFilters","handleReset","handleApply","isEmptyFilters","FilterIcon","ScrollShadow","ModalFooter","RefreshIcon","triggerStyle","dropdownStyle","dividerStyle","TokenListFilterPopover","setIsOpen","containerRef","handleClickOutside","ChevronDown","open","TokenListFilterWidget","popoverPlacement","filterProps","TokenListResolutionSelectorDesktop","onResolutionChange","resolutionOptions","handleResolutionChange","StyledPlainTabs","option","TokenListResolutionSelectorMobile","handleEscape","ChevronDownIcon","TokenListResolutionSelectorWidget","props","TokenBlueChipCell","bluechipHoldingsRatio","ratioHigh","ratioLow","HorsePowerHighIcon","HorsePowerLowIcon","HorsePowerIcon","TokenCell","handleCopyToClipboard","COLOR_CLASS","InfoItem","color","TokenInfoCell","md","top10Warn","devWarn","sniperWarn","insiderWarn","bundleWarn","ratioColor","warn","TokenLiquidityCell","TokenMarketCapCell","TokenPriceCell","TokenTradersCell","buyers","sellers","TokenTradesCell","txs","TokenVolumesCell","volumes","buyVolumes","sellVolumes","SHIMMER_CSS","shimmer","bar","delay","w","ROW_COUNT","TokenListSkeleton","rowHeight","hasActions","d","TokenList","ActionsComponent","sortDirections","onSortChange","itemHeightMobile","handleRowClick","sorts","setSorts","handleSortChange","sort","StyledTable","TableHeader","TableColumn","Sortable","TableBody","TableRow","TableCell","useNewTokensScript","NewTokenListWidget","setSortDirections","sortDirection","useStockTokensScript","useStockTokensQuery","useStockTokensSubscription","StockTokenListWidget","TrendingTokenListWidget","DEFAULT_POLL_MS","useTokens","addresses","pollMs","query","useTokensQuery","subscribeClient","useDexClient","addrKeyRef","addrKey","subs","updated","refetch"],"mappings":"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","file":"index.mjs","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-tokens\"] = \"2.0.3\";\n}\n\nexport default \"2.0.3\";\n","import { ReactNode } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, PauseIcon } from \"@liberfi.io/ui\";\n\nexport interface PulseListHeaderProps {\n title: string;\n isPaused?: boolean;\n extra?: ReactNode;\n className?: string;\n}\n\nexport function PulseListHeader({\n title,\n isPaused,\n extra,\n className,\n}: PulseListHeaderProps) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"w-full h-12 px-3 flex-none bg-content1 flex items-center justify-between gap-4 border-b border-border\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <h2 className=\"font-semibold\">{title}</h2>\n {isPaused && (\n <div className=\"flex items-center gap-1 text-primary\">\n <PauseIcon className=\"w-4 h-4\" />\n <span className=\"text-xs hidden sm:inline\">\n {t(\"tokens.pulse.paused\")}\n </span>\n </div>\n )}\n </div>\n {extra && <div className=\"flex items-center gap-3\">{extra}</div>}\n </div>\n );\n}\n","import { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface PulseListItemSkeletonProps {\n isLast?: boolean;\n className?: string;\n}\n\nexport function PulseListItemSkeleton({\n isLast = false,\n className,\n}: PulseListItemSkeletonProps) {\n return (\n <div\n className={cn(\n \"w-full h-full px-3 py-3 overflow-hidden flex gap-3 items-center\",\n !isLast && \"border-b border-border\",\n className,\n )}\n >\n <Skeleton className=\"flex-none w-15 h-15 rounded-sm\" />\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"w-32 h-5 rounded-md\" />\n <Skeleton className=\"w-48 h-4 rounded-md\" />\n </div>\n </div>\n );\n}\n","import { SolanaTokenProtocol, type TokenProtocol } from \"@liberfi.io/types\";\n\n/**\n * Static class-name lookup for protocol brand colors.\n *\n * Tailwind uses static analysis — dynamically constructed class names like\n * `text-${protocol}` are invisible to the scanner. This map ensures every\n * class appears as a complete string literal so Tailwind generates the CSS.\n */\n\ninterface ProtocolClasses {\n text: string;\n bg: string;\n /** bg at 5 % opacity */\n bg5: string;\n /** bg at 20 % opacity */\n bg20: string;\n border: string;\n}\n\nconst CLASSES: Record<SolanaTokenProtocol, ProtocolClasses> = {\n [SolanaTokenProtocol.BAGS]: {\n text: \"text-bags\",\n bg: \"bg-bags\",\n bg5: \"bg-bags/5\",\n bg20: \"bg-bags/20\",\n border: \"border-bags\",\n },\n [SolanaTokenProtocol.BELIEVE]: {\n text: \"text-believe\",\n bg: \"bg-believe\",\n bg5: \"bg-believe/5\",\n bg20: \"bg-believe/20\",\n border: \"border-believe\",\n },\n [SolanaTokenProtocol.BONK]: {\n text: \"text-bonk\",\n bg: \"bg-bonk\",\n bg5: \"bg-bonk/5\",\n bg20: \"bg-bonk/20\",\n border: \"border-bonk\",\n },\n [SolanaTokenProtocol.BOOP]: {\n text: \"text-boop\",\n bg: \"bg-boop\",\n bg5: \"bg-boop/5\",\n bg20: \"bg-boop/20\",\n border: \"border-boop\",\n },\n [SolanaTokenProtocol.HEAVEN]: {\n text: \"text-heaven\",\n bg: \"bg-heaven\",\n bg5: \"bg-heaven/5\",\n bg20: \"bg-heaven/20\",\n border: \"border-heaven\",\n },\n [SolanaTokenProtocol.JUPSTUDIO]: {\n text: \"text-jupstudio\",\n bg: \"bg-jupstudio\",\n bg5: \"bg-jupstudio/5\",\n bg20: \"bg-jupstudio/20\",\n border: \"border-jupstudio\",\n },\n [SolanaTokenProtocol.LAUNCHLAB]: {\n text: \"text-launchlab\",\n bg: \"bg-launchlab\",\n bg5: \"bg-launchlab/5\",\n bg20: \"bg-launchlab/20\",\n border: \"border-launchlab\",\n },\n [SolanaTokenProtocol.METEORA]: {\n text: \"text-meteora\",\n bg: \"bg-meteora\",\n bg5: \"bg-meteora/5\",\n bg20: \"bg-meteora/20\",\n border: \"border-meteora\",\n },\n [SolanaTokenProtocol.MOONIT]: {\n text: \"text-moonit\",\n bg: \"bg-moonit\",\n bg5: \"bg-moonit/5\",\n bg20: \"bg-moonit/20\",\n border: \"border-moonit\",\n },\n [SolanaTokenProtocol.MOONSHOT]: {\n text: \"text-moonshot\",\n bg: \"bg-moonshot\",\n bg5: \"bg-moonshot/5\",\n bg20: \"bg-moonshot/20\",\n border: \"border-moonshot\",\n },\n [SolanaTokenProtocol.ORCA]: {\n text: \"text-orca\",\n bg: \"bg-orca\",\n bg5: \"bg-orca/5\",\n bg20: \"bg-orca/20\",\n border: \"border-orca\",\n },\n [SolanaTokenProtocol.PUMP]: {\n text: \"text-pump\",\n bg: \"bg-pump\",\n bg5: \"bg-pump/5\",\n bg20: \"bg-pump/20\",\n border: \"border-pump\",\n },\n [SolanaTokenProtocol.RAYDIUM]: {\n text: \"text-raydium\",\n bg: \"bg-raydium\",\n bg5: \"bg-raydium/5\",\n bg20: \"bg-raydium/20\",\n border: \"border-raydium\",\n },\n [SolanaTokenProtocol.SUGAR]: {\n text: \"text-sugar\",\n bg: \"bg-sugar\",\n bg5: \"bg-sugar/5\",\n bg20: \"bg-sugar/20\",\n border: \"border-sugar\",\n },\n [SolanaTokenProtocol.VIRTUAL_CURVE]: {\n text: \"text-virtual-curve\",\n bg: \"bg-virtual-curve\",\n bg5: \"bg-virtual-curve/5\",\n bg20: \"bg-virtual-curve/20\",\n border: \"border-virtual-curve\",\n },\n [SolanaTokenProtocol.PUMP_AMM]: {\n text: \"text-pump-amm\",\n bg: \"bg-pump-amm\",\n bg5: \"bg-pump-amm/5\",\n bg20: \"bg-pump-amm/20\",\n border: \"border-pump-amm\",\n },\n};\n\nconst FALLBACK: ProtocolClasses = {\n text: \"text-neutral\",\n bg: \"bg-neutral\",\n bg5: \"bg-neutral/5\",\n bg20: \"bg-neutral/20\",\n border: \"border-neutral\",\n};\n\nexport function protocolClasses(protocol: TokenProtocol): ProtocolClasses {\n return CLASSES[protocol as SolanaTokenProtocol] ?? FALLBACK;\n}\n","import {\n MouseEvent,\n PropsWithChildren,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { Token } from \"@liberfi.io/types\";\nimport { Avatar, CameraIcon, Image, StyledTooltip, cn } from \"@liberfi.io/ui\";\nimport {\n parseTokenProtocolFamily,\n searchImageUrl,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { protocolClasses } from \"../../utils/protocol-styles\";\n\nexport type TokenAvatarProps = {\n /** token data to display */\n token: Token;\n /** whether hover to preview the avatar */\n enablePreview?: boolean;\n /** whether click to search the avatar */\n enableSearch?: boolean;\n /** whether show the bonding curve progress */\n showProgress?: boolean;\n /** whether show the launch protocol family icon */\n showProtocolFamily?: boolean;\n /** radius of the avatar */\n radius?: \"none\" | \"sm\" | \"md\" | \"lg\";\n /** use this class to adjust the size of the avatar */\n className?: string;\n /** customize the styles */\n classNames?: {\n /** use this class to adjust the color of the avatar background, background is displayed when progress is not displayed */\n background?: string;\n /** use this class to adjust the color of the progress track */\n progress?: string;\n /** use this class to adjust the color of the avatar wrapper */\n avatarWrapper?: string;\n /** use this class to adjust the size of the avatar */\n avatar?: string;\n /** use this class to adjust the size of the protocol family icon's wrapper */\n protocolFamilyIconWrapper?: string;\n /** use this class to adjust the size of the protocol family icon */\n protocolFamilyIcon?: string;\n /** use this class to adjust the size & background color of the search wrapper */\n searchWrapper?: string;\n /** use this class to adjust the size & color of the search icon */\n searchIcon?: string;\n /** use this class to adjust the size of the preview wrapper */\n previewWrapper?: string;\n /** use this class to adjust the size of the avatar in the preview */\n previewAvatar?: string;\n /** use this class to adjust the size & background color of the search wrapper in the preview */\n previewSearchWrapper?: string;\n /** use this class to adjust the size & color of the search icon in the preview */\n previewSearchIcon?: string;\n };\n};\n\nexport function TokenAvatar({\n token,\n enablePreview = true,\n enableSearch = true,\n showProgress = true,\n showProtocolFamily = true,\n radius = \"sm\",\n className,\n classNames,\n}: TokenAvatarProps) {\n const formattedProtocolFamily = useMemo(\n () =>\n token.launchedFrom?.protocolFamily\n ? parseTokenProtocolFamily(\n token.chain,\n token.launchedFrom.protocolFamily,\n )\n : undefined,\n [token.chain, token.launchedFrom?.protocolFamily],\n );\n\n const displayProtocolFamily = useMemo(\n () => showProtocolFamily && formattedProtocolFamily,\n [showProtocolFamily, formattedProtocolFamily],\n );\n\n const displayProgress = useMemo(\n () =>\n showProgress &&\n token.migrateProgress &&\n new SafeBigNumber(token.migrateProgress).lt(100),\n [showProgress, token.migrateProgress],\n );\n\n const displaySearch = useMemo(\n () => enableSearch && token.image,\n [enableSearch, token.image],\n );\n\n const fallbackName = useMemo(\n () =>\n (token.symbol ?? token.name ?? token.address ?? \"L\")\n .slice(0, 1)\n .toUpperCase(),\n [token.symbol, token.name, token.address],\n );\n\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n // TODO use router adapter\n const handleSearch = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (!token.image) return;\n const url = searchImageUrl(token.image);\n window.open(url, \"_blank\");\n },\n [token.image],\n );\n\n return (\n <div\n className={cn(\n \"relative justify-center items-center\",\n className ?? \"w-15 h-15\",\n )}\n >\n {/* if progress is not displayed, fill the background with the protocol family color */}\n {!displayProgress && (\n <div\n className={cn(\n \"absolute inset-0\",\n `rounded-${radius}`,\n formattedProtocolFamily\n ? protocolClasses(formattedProtocolFamily).bg\n : \"bg-bullish\",\n classNames?.background,\n )}\n />\n )}\n\n {/* if progress is displayed, display the progress track with the protocol family color */}\n {displayProgress && (\n <div className={cn(\"absolute -inset-0.5\", `rounded-${radius}`)}>\n <ProgressTrack\n className={cn(\n formattedProtocolFamily\n ? protocolClasses(formattedProtocolFamily).text\n : \"text-bullish\",\n classNames?.progress,\n )}\n progress={token.migrateProgress ?? \"0\"}\n />\n </div>\n )}\n\n {/* avatar fallback border */}\n <div\n className={cn(\n \"absolute inset-0 p-px flex items-center justify-center\",\n `rounded-${radius}`,\n formattedProtocolFamily\n ? protocolClasses(formattedProtocolFamily).bg20\n : \"bg-bullish/20\",\n classNames?.avatarWrapper,\n )}\n >\n {/* preview the avatar */}\n <PreviewWrapper\n token={token}\n radius={radius}\n enableSearch={enableSearch}\n enablePreview={enablePreview}\n classNames={classNames}\n >\n {/* this is the gap between border & avatar, should fill with the gray background color */}\n <div\n className={cn(\n \"relative w-full h-full bg-content1 flex items-center justify-center p-0.5\",\n `rounded-${radius}`,\n // click to search\n isHovered && displaySearch && \"cursor-pointer\",\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* avatar */}\n <Avatar\n showFallback\n src={token.image}\n name={fallbackName}\n className={cn(\n \"w-full h-full bg-content1 text-neutral text-2xl\",\n `rounded-${radius}`,\n classNames?.avatar,\n )}\n />\n\n {/* hover to search mask */}\n {isHovered && displaySearch && (\n <div\n className={cn(\n \"absolute inset-0 bg-content1/80 flex items-center justify-center\",\n `rounded-${radius}`,\n classNames?.searchWrapper,\n )}\n onClick={handleSearch}\n >\n <CameraIcon className={cn(\"w-6 h-6\", classNames?.searchIcon)} />\n </div>\n )}\n </div>\n </PreviewWrapper>\n </div>\n\n {/* protocol family icon */}\n {displayProtocolFamily && (\n <div className=\"contents\">\n <StyledTooltip\n content={\n token.launchedFrom?.protocolFamily ?? formattedProtocolFamily\n }\n placement=\"bottom\"\n >\n <div\n className={cn(\n \"absolute -bottom-1 -right-1 rounded-full p-px w-4 h-4\",\n formattedProtocolFamily &&\n protocolClasses(formattedProtocolFamily).bg,\n classNames?.protocolFamilyIconWrapper,\n )}\n >\n <Image\n removeWrapper\n src={`/images/protocols/${formattedProtocolFamily}.svg`}\n className={cn(\n \"w-full h-full rounded-full bg-content1\",\n classNames?.protocolFamilyIcon,\n )}\n />\n </div>\n </StyledTooltip>\n </div>\n )}\n </div>\n );\n}\n\nfunction PreviewWrapper({\n token,\n radius,\n enableSearch,\n enablePreview,\n classNames,\n children,\n}: PropsWithChildren<\n Pick<\n TokenAvatarProps,\n \"token\" | \"radius\" | \"enableSearch\" | \"enablePreview\" | \"classNames\"\n >\n>) {\n const displayPreview = useMemo(\n () => enablePreview && token.image,\n [enablePreview, token.image],\n );\n\n return displayPreview ? (\n <StyledTooltip\n content={\n <Preview\n token={token}\n radius={radius}\n enableSearch={enableSearch}\n classNames={classNames}\n />\n }\n closeDelay={100}\n placement=\"bottom-start\"\n classNames={{ content: \"p-1\" }}\n >\n {children}\n </StyledTooltip>\n ) : (\n children\n );\n}\n\nfunction Preview({\n token,\n enableSearch,\n radius,\n classNames,\n}: Pick<TokenAvatarProps, \"token\" | \"radius\" | \"enableSearch\" | \"classNames\">) {\n const displaySearch = useMemo(\n () => enableSearch && token.image,\n [enableSearch, token.image],\n );\n\n const fallbackName = useMemo(\n () =>\n (token.symbol ?? token.name ?? token.address ?? \"L\")\n .slice(0, 1)\n .toUpperCase(),\n [token.symbol, token.name, token.address],\n );\n\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n // TODO use router adapter\n const handleSearch = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (!token.image) return;\n const url = searchImageUrl(token.image);\n window.open(url, \"_blank\");\n },\n [token.image],\n );\n\n return (\n <div\n className={cn(\n \"relative flex items-center justify-center w-60 h-60\",\n `rounded-${radius}`,\n isHovered && displaySearch && \"cursor-pointer\",\n classNames?.previewWrapper,\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <Avatar\n showFallback\n src={token.image}\n name={fallbackName}\n className={cn(\n \"w-full h-full bg-content1 text-neutral text-3xl\",\n `rounded-${radius}`,\n classNames?.previewAvatar,\n )}\n />\n\n {/* hover to search mask */}\n {isHovered && displaySearch && (\n <div\n className={cn(\n \"absolute inset-0 bg-content1/80 flex items-center justify-center\",\n `rounded-${radius}`,\n classNames?.previewSearchWrapper,\n )}\n onClick={handleSearch}\n >\n <CameraIcon\n className={cn(\"w-10 h-10\", classNames?.previewSearchIcon)}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction ProgressTrack({\n progress,\n className,\n}: {\n progress: string | number;\n className?: string;\n}) {\n const strokeDashoffset = useMemo(\n () => 296 - (Number(progress) * 296) / 100,\n [progress],\n );\n return (\n <svg viewBox=\"0 0 78 78\" className=\"w-full h-full\">\n <path\n className={`${className} opacity-40`}\n stroke=\"currentColor\"\n fill=\"transparent\"\n strokeWidth=\"1\"\n d=\"\n M 76 76\n L 6 76\n Q 2 76 2 72\n L 2 6\n Q 2 2 6 2\n L 72 2\n Q 76 2 76 6\n L 76 72\n Q 76 76 76 76\n \"\n ></path>\n <path\n className={`${className} transition-all duration-300 ease-in-out`}\n stroke=\"currentColor\"\n fill=\"transparent\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeDasharray=\"296\"\n strokeDashoffset={strokeDashoffset}\n d=\"\n M 76 76\n L 6 76\n Q 2 76 2 72\n L 2 6\n Q 2 2 6 2\n L 72 2\n Q 76 2 76 6\n L 76 72\n Q 76 76 76 76\n \"\n ></path>\n </svg>\n );\n}\n","import { MouseEvent, ReactNode, useCallback, useMemo } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport {\n BundlesIcon,\n cn,\n CookIcon,\n CopyIcon,\n KlineCandlesIcon,\n Link,\n PeopleIcon,\n RatIcon,\n SearchIcon,\n SniperIcon,\n StarIcon,\n StyledTooltip,\n TelegramIcon,\n TwitterIcon,\n toast,\n useCopyToClipboard,\n UserWithStarBadgeIcon,\n WebsiteIcon,\n} from \"@liberfi.io/ui\";\nimport {\n formatAge,\n formatAmount,\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n searchTwitterUrl,\n truncateAddress,\n} from \"@liberfi.io/utils\";\nimport { TokenAvatar } from \"../token-avatar\";\n\nexport interface PulseListItemProps {\n /** token data */\n token: Token;\n /** custom render for item action (e.g. instant buy button) */\n renderAction?: (token: Token) => ReactNode;\n /** whether this is the last item */\n isLast?: boolean;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function PulseListItem({\n token,\n renderAction,\n isLast = false,\n onSelectToken,\n className,\n}: PulseListItemProps) {\n const { t } = useTranslation();\n const copyToClipboard = useCopyToClipboard();\n const age = useTickAge(token.createdAt);\n\n const handleClick = useCallback(() => {\n onSelectToken?.(token);\n }, [onSelectToken, token]);\n\n const handleCopyAddress = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation();\n copyToClipboard(token.address, () =>\n toast.success(t(\"tokens.copied.address\")),\n );\n },\n [copyToClipboard, token.address, t],\n );\n\n const top10Warning = useMemo(\n () => new SafeBigNumber(token.marketData?.top10HoldingsRatio).gte(0.1),\n [token.marketData?.top10HoldingsRatio],\n );\n\n const devWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.devHoldingsRatio).gte(0.1),\n [token.marketData?.devHoldingsRatio],\n );\n\n const insiderWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.insiderHoldingsRatio).gte(0.1),\n [token.marketData?.insiderHoldingsRatio],\n );\n\n const sniperWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.sniperHoldingsRatio).gte(0.1),\n [token.marketData?.sniperHoldingsRatio],\n );\n\n const bundleWarning = useMemo(\n () => new SafeBigNumber(token.marketData?.bundleHoldingsRatio).gte(0.1),\n [token.marketData?.bundleHoldingsRatio],\n );\n\n const [buyW, sellW] = useMemo(() => {\n const buys = Number(token.stats?.[\"1h\"]?.buys ?? 0);\n const sells = Number(token.stats?.[\"1h\"]?.sells ?? 0);\n const total = buys + sells;\n if (total === 0) return [12, 12];\n const buyWidth = Math.round((buys / total) * 24);\n return [buyWidth, 24 - buyWidth];\n }, [token.stats]);\n\n const marketCapColorClass = useMemo(() => {\n const cap = new SafeBigNumber(token.marketData?.marketCapInUsd);\n if (cap.lt(1000)) return \"text-foreground\";\n if (cap.lt(1_000_000)) return \"text-secondary\";\n return \"text-primary\";\n }, [token.marketData?.marketCapInUsd]);\n\n return (\n <div\n className={cn(\n \"w-full h-full px-3 pt-3 pb-1 hover:bg-content2/40 cursor-pointer\",\n !isLast && \"border-b border-border\",\n className,\n )}\n onClick={onSelectToken ? handleClick : undefined}\n >\n <div className=\"relative flex justify-between gap-3\">\n {/* left: avatar + address */}\n <div className=\"flex-none flex flex-col items-center gap-1\">\n <TokenAvatar\n token={token}\n enableSearch\n enablePreview={!!token.image}\n showProgress\n className=\"w-15 h-15\"\n />\n <StyledTooltip content={token.address}>\n <div\n className=\"text-xs text-neutral hover:text-primary/50 max-w-18 truncate cursor-pointer\"\n onClick={handleCopyAddress}\n >\n {truncateAddress(token.address, 4, 4)}\n </div>\n </StyledTooltip>\n </div>\n\n {/* center: token infos */}\n <div className=\"flex-1 flex flex-col justify-between gap-3 min-w-0\">\n {/* top: symbol + name + age + links + holders */}\n <div className=\"flex flex-col gap-1.5\">\n {/* symbol + name + copy */}\n <div className=\"flex items-center gap-1 pr-24\">\n <span className=\"flex-none text-base font-semibold whitespace-nowrap overflow-hidden text-ellipsis max-w-20\">\n {token.symbol}\n </span>\n <StyledTooltip content={token.name}>\n <div\n className=\"flex items-center gap-1 min-w-0 text-neutral hover:text-primary/50 cursor-pointer\"\n onClick={handleCopyAddress}\n >\n <span className=\"text-base whitespace-nowrap overflow-hidden text-ellipsis\">\n {token.name}\n </span>\n <CopyIcon className=\"flex-none w-3.5 h-3.5\" />\n </div>\n </StyledTooltip>\n </div>\n\n {/* age + social links + holders */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm text-primary font-medium\">\n {formatAge(age)}\n </span>\n\n {token.socialMedias?.twitter && (\n <Link\n href={token.socialMedias.twitter}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <TwitterIcon className=\"w-4 h-4\" />\n </Link>\n )}\n {token.socialMedias?.telegram && (\n <Link\n href={token.socialMedias.telegram}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <TelegramIcon className=\"w-4 h-4\" />\n </Link>\n )}\n {token.socialMedias?.website && (\n <Link\n href={token.socialMedias.website}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <WebsiteIcon className=\"w-4 h-4\" />\n </Link>\n )}\n <Link\n href={searchTwitterUrl(`${token.symbol} OR ${token.address}`)}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n onClick={(e: MouseEvent) => e.stopPropagation()}\n >\n <SearchIcon className=\"w-4 h-4\" />\n </Link>\n\n <StyledTooltip content={t(\"tokens.tokenInfo.holders\")}>\n <div className=\"flex items-center gap-0.5 text-neutral\">\n <PeopleIcon width={14} height={14} />\n <span className=\"text-foreground text-xs\">\n {formatAmount(token.marketData?.holders)}\n </span>\n </div>\n </StyledTooltip>\n\n <StyledTooltip content={t(\"tokens.tokenInfo.proHolders\")}>\n <div className=\"flex items-center gap-0.5 text-neutral\">\n <KlineCandlesIcon width={16} height={16} />\n <span className=\"text-foreground text-xs\">\n {formatAmount(token.marketData?.proHolders)}\n </span>\n </div>\n </StyledTooltip>\n\n <StyledTooltip content={t(\"tokens.tokenInfo.kolHolders\")}>\n <div className=\"flex items-center gap-0.5 text-neutral\">\n <StarIcon width={14} height={14} />\n <span className=\"text-foreground text-xs\">\n {formatAmount(token.marketData?.kolHolders)}\n </span>\n </div>\n </StyledTooltip>\n </div>\n </div>\n\n {/* bottom: holding ratios + action */}\n <div className=\"relative flex items-center gap-1.5 flex-wrap\">\n <HoldingRatioChip\n icon={<UserWithStarBadgeIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.top10HoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.top10HoldingsRatio\")}\n warning={top10Warning}\n />\n <HoldingRatioChip\n icon={<CookIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.devHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.devHoldingsRatio\")}\n warning={devWarning}\n />\n <HoldingRatioChip\n icon={<RatIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.insiderHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.insiderHoldingsRatio\")}\n warning={insiderWarning}\n />\n <HoldingRatioChip\n icon={<SniperIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.sniperHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.sniperHoldingsRatio\")}\n warning={sniperWarning}\n />\n <HoldingRatioChip\n icon={<BundlesIcon width={12} height={12} />}\n value={formatPercent(token.marketData?.bundleHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.bundleHoldingsRatio\")}\n warning={bundleWarning}\n />\n\n {renderAction?.(token)}\n </div>\n </div>\n\n {/* right: market data (absolute positioned) */}\n <div className=\"absolute top-0 right-0 flex flex-col gap-2 items-end\">\n <div className=\"flex items-end gap-1\">\n <span className=\"text-xs leading-none text-neutral\">\n {t(\"tokens.listHeader.marketCap\")}\n </span>\n <span\n className={cn(\n \"text-base font-medium leading-none\",\n marketCapColorClass,\n )}\n >\n {formatAmountUSDCompact(token.marketData?.marketCapInUsd)}\n </span>\n </div>\n\n <div className=\"flex items-end gap-1\">\n <span className=\"text-xs leading-none text-neutral\">\n {t(\"tokens.pulse.vol\")}\n </span>\n <span className=\"text-base font-medium leading-none text-foreground\">\n {formatAmountUSDCompact(token.stats?.[\"1h\"]?.volumesInUsd)}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs leading-none text-neutral\">\n {t(\"tokens.pulse.txs\")}\n </span>\n <span className=\"text-xs leading-none text-foreground\">\n {formatAmount(token.stats?.[\"1h\"]?.trades)}\n </span>\n </div>\n <div className=\"flex rounded-full overflow-hidden\">\n <div className=\"h-1 bg-bullish\" style={{ width: `${buyW}px` }} />\n <div className=\"h-1 bg-bearish\" style={{ width: `${sellW}px` }} />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction HoldingRatioChip({\n icon,\n value,\n tooltip,\n warning,\n}: {\n icon: ReactNode;\n value: string;\n tooltip: string;\n warning: boolean;\n}) {\n return (\n <StyledTooltip content={tooltip}>\n <div\n className={cn(\n \"px-2 py-0.5 flex items-center gap-1 bg-content2 rounded-full text-xs\",\n warning ? \"text-danger-500\" : \"text-primary\",\n )}\n >\n {icon}\n <span>{value}</span>\n </div>\n </StyledTooltip>\n );\n}\n","import { ReactElement, ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { PulseListHeader } from \"./pulse-list-header.ui\";\nimport { PulseListItemSkeleton } from \"./pulse-list-item-skeleton.ui\";\nimport { PulseListItem } from \"./pulse-list-item.ui\";\n\nconst DEFAULT_ITEM_HEIGHT = 124;\nconst SKELETON_COUNT = 10;\n\nexport interface PulseListProps {\n /** list title */\n title: string;\n /** tokens to display */\n tokens?: Token[];\n /** whether the list is loading */\n isLoading?: boolean;\n /** height of each item, default is 124 */\n itemHeight?: number;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** called when the list should pause/resume adding new items (e.g. mouse hover) */\n onPauseChange?: (isPaused: boolean) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\ninterface PulseListRowData {\n data: Token[] | undefined;\n skeletonCount: number;\n renderItemAction?: (token: Token) => ReactNode;\n onSelectToken?: (token: Token) => void;\n}\n\nfunction PulseListRow({\n index,\n style,\n data,\n skeletonCount,\n renderItemAction,\n onSelectToken,\n}: RowComponentProps<PulseListRowData>): ReactElement {\n if (!data) {\n return (\n <div style={style}>\n <PulseListItemSkeleton isLast={index === skeletonCount - 1} />\n </div>\n );\n }\n return (\n <div style={style}>\n <PulseListItem\n token={data[index]}\n isLast={index === data.length - 1}\n renderAction={renderItemAction}\n onSelectToken={onSelectToken}\n />\n </div>\n );\n}\n\nexport function PulseList({\n title,\n tokens,\n isLoading,\n itemHeight = DEFAULT_ITEM_HEIGHT,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n onPauseChange,\n className,\n hideHeader,\n}: PulseListProps) {\n const data = isLoading || !tokens ? undefined : tokens;\n const itemCount = data ? data.length : SKELETON_COUNT;\n\n const rowProps = useMemo<PulseListRowData>(\n () => ({\n data,\n skeletonCount: SKELETON_COUNT,\n renderItemAction,\n onSelectToken,\n }),\n [data, renderItemAction, onSelectToken],\n );\n\n const [isPaused, setIsPaused] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsPaused(true);\n onPauseChange?.(true);\n }, [onPauseChange]);\n\n const handleMouseLeave = useCallback(() => {\n setIsPaused(false);\n onPauseChange?.(false);\n }, [onPauseChange]);\n\n return (\n <div\n className={cn(\n \"w-full h-full bg-content1 overflow-hidden flex flex-col border border-border rounded-lg\",\n className,\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {!hideHeader && (\n <PulseListHeader\n title={title}\n isPaused={isPaused}\n extra={renderHeaderExtra}\n />\n )}\n <div className=\"flex-1 w-full overflow-hidden\">\n <List\n className=\"h-full w-full\"\n rowCount={itemCount}\n rowHeight={itemHeight}\n rowComponent={PulseListRow}\n rowProps={rowProps}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n","import type {\n API,\n Token,\n TokenLaunchedFrom,\n TokenMarketData,\n TokenMigratedTo,\n TokenSecurity,\n TokenSocialMedias,\n TokenStats,\n} from \"@liberfi.io/types\";\n\n/**\n * Shallow-merge only defined (non-undefined) fields from `incoming` into `existing`.\n */\nexport function assignDefined<T extends object>(\n existing: T,\n incoming: Partial<T>,\n): T {\n const result = { ...existing };\n for (const key of Object.keys(incoming) as Array<keyof T>) {\n if (incoming[key] !== undefined) {\n result[key] = incoming[key] as T[keyof T];\n }\n }\n return result;\n}\n\nconst STATS_TIMEFRAMES = [\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"4h\", \"24h\"] as const;\n\n/**\n * Deep-merge stats: for each timeframe, merge fields individually (skip undefined).\n */\nexport function mergeStats(\n existing: TokenStats | undefined,\n incoming: TokenStats | undefined,\n): TokenStats | undefined {\n if (!incoming) return existing;\n if (!existing) return incoming;\n\n const result: TokenStats = { ...existing };\n for (const tf of STATS_TIMEFRAMES) {\n if (incoming[tf]) {\n result[tf] = existing[tf]\n ? assignDefined(existing[tf], incoming[tf]!)\n : incoming[tf];\n }\n }\n return result;\n}\n\n/**\n * Merge market data fields individually (skip undefined).\n */\nexport function mergeMarketData(\n existing: TokenMarketData | undefined,\n incoming: TokenMarketData | undefined,\n): TokenMarketData | undefined {\n if (!incoming) return existing;\n if (!existing) return incoming;\n\n return assignDefined(existing, incoming);\n}\n\nfunction mergeOptional<T extends object>(\n existing: T | undefined,\n incoming: T | undefined,\n): T | undefined {\n if (!incoming) return existing;\n if (!existing) return incoming;\n return assignDefined(existing, incoming);\n}\n\n/**\n * Merge a `TokenSubscribed` (partial token update) into an existing `Token`.\n * - `stats` is deep-merged per timeframe\n * - `marketData` / `socialMedias` / `security` / `launchedFrom` / `migratedTo`\n * are shallow-merged (skip undefined)\n * - arrays and primitives are replaced wholesale\n */\nexport function mergeToken(\n existing: Token,\n incoming: API.TokenSubscribed,\n): Token {\n const {\n chain: _c,\n address: _a,\n stats,\n marketData,\n socialMedias,\n security,\n launchedFrom,\n migratedTo,\n ...rest\n } = incoming;\n\n const merged: Token = { ...existing };\n\n for (const key of Object.keys(rest) as Array<keyof typeof rest>) {\n if (rest[key] !== undefined) {\n (merged as unknown as Record<string, unknown>)[key] = rest[key];\n }\n }\n\n merged.stats = mergeStats(existing.stats, stats);\n merged.marketData = mergeMarketData(existing.marketData, marketData);\n merged.socialMedias = mergeOptional<TokenSocialMedias>(\n existing.socialMedias,\n socialMedias,\n );\n merged.security = mergeOptional<TokenSecurity>(existing.security, security);\n merged.launchedFrom = mergeOptional<TokenLaunchedFrom>(\n existing.launchedFrom,\n launchedFrom,\n );\n merged.migratedTo = mergeOptional<TokenMigratedTo>(\n existing.migratedTo,\n migratedTo,\n );\n\n return merged;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNewTokensQuery, useNewTokensSubscription } from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\n\nconst MAX_ITEMS = 80;\n\nexport type UsePulseNewListScriptParams = {\n /** chain id */\n chain: Chain;\n /** whether to pause adding new items (existing items still update) */\n isPaused?: boolean;\n /** refetch interval in milliseconds */\n refetchInterval?: number;\n};\n\nexport type UsePulseNewListScriptResult = {\n /** whether tokens are loading */\n isLoading: boolean;\n /** token list */\n tokens: Token[];\n};\n\nfunction tokenFromSubscribed(sub: API.TokenSubscribed): Token {\n return {\n chain: sub.chain,\n address: sub.address,\n name: sub.name ?? \"\",\n symbol: sub.symbol ?? \"\",\n decimals: sub.decimals ?? 0,\n image: sub.image,\n description: sub.description,\n socialMedias: sub.socialMedias,\n launchedFrom: sub.launchedFrom,\n migratedTo: sub.migratedTo,\n createdAt: sub.createdAt,\n };\n}\n\nfunction sortAndLimit(tokens: Token[]): Token[] {\n tokens.sort((a, b) => {\n const at = a.createdAt?.getTime() ?? 0;\n const bt = b.createdAt?.getTime() ?? 0;\n return bt - at;\n });\n return tokens.slice(0, MAX_ITEMS);\n}\n\nexport function usePulseNewListScript({\n chain,\n isPaused = false,\n refetchInterval = 10_000,\n}: UsePulseNewListScriptParams): UsePulseNewListScriptResult {\n const queryParams = useMemo(() => ({ chain }), [chain]);\n\n const pausedRef = useRef(isPaused);\n pausedRef.current = isPaused;\n\n const prevChainRef = useRef(chain);\n const [isChainChanged, setIsChainChanged] = useState(true);\n\n const [tokens, setTokens] = useState<Token[]>([]);\n\n useEffect(() => {\n if (chain !== prevChainRef.current) {\n setIsChainChanged(true);\n setTokens([]);\n prevChainRef.current = chain;\n }\n }, [chain]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useNewTokensQuery(queryParams, {\n refetchInterval,\n });\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const paused = pausedRef.current;\n // When list is empty and we have data, always fill (so hover popover is not empty when isPaused)\n const isFirstFill = prev.length === 0 && fetchedTokens.length > 0;\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else if (!paused || isFirstFill) {\n merged.push(token);\n }\n }\n return paused ? merged : sortAndLimit(merged);\n });\n setIsChainChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates (new tokens, metadata, stats, etc.) ---\n const handleUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const paused = pausedRef.current;\n const merged = [...prev];\n let changed = false;\n for (const sub of data) {\n const idx = merged.findIndex((t) => t.address === sub.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], sub);\n } else if (!paused) {\n changed = true;\n merged.push(tokenFromSubscribed(sub));\n }\n }\n if (!changed) return prev;\n return paused ? merged : sortAndLimit(merged);\n });\n }, []);\n\n useNewTokensSubscription({ chain }, handleUpdate);\n\n // --- loading state ---\n const isLoading = useMemo(\n () => isPending || isChainChanged,\n [isPending, isChainChanged],\n );\n\n return { tokens, isLoading };\n}\n","import { ReactNode, useCallback, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { PulseList } from \"./pulse-list.ui\";\nimport { usePulseNewListScript } from \"./pulse-new-list.script\";\n\nexport interface PulseNewListWidgetProps {\n /** chain id */\n chain: Chain;\n /** list title */\n title: string;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\nexport function PulseNewListWidget({\n chain,\n title,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n className,\n hideHeader,\n}: PulseNewListWidgetProps) {\n const [isPaused, setIsPaused] = useState(false);\n const { tokens, isLoading } = usePulseNewListScript({ chain, isPaused });\n\n const handlePauseChange = useCallback((paused: boolean) => {\n setIsPaused(paused);\n }, []);\n\n return (\n <PulseList\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n renderHeaderExtra={renderHeaderExtra}\n renderItemAction={renderItemAction}\n onSelectToken={onSelectToken}\n onPauseChange={handlePauseChange}\n className={className}\n hideHeader={hideHeader}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useMigratedTokensQuery,\n useMigratedTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\n\nexport type UsePulseMigratedListScriptParams = {\n /** chain id */\n chain: Chain;\n /** whether to pause adding new items (existing items still update) */\n isPaused?: boolean;\n /** refetch interval in milliseconds */\n refetchInterval?: number;\n};\n\nexport type UsePulseMigratedListScriptResult = {\n /** whether tokens are loading */\n isLoading: boolean;\n /** token list */\n tokens: Token[];\n};\n\nexport function usePulseMigratedListScript({\n chain,\n isPaused = false,\n refetchInterval = 30_000,\n}: UsePulseMigratedListScriptParams): UsePulseMigratedListScriptResult {\n const queryParams = useMemo(() => ({ chain }), [chain]);\n\n const pausedRef = useRef(isPaused);\n pausedRef.current = isPaused;\n\n const prevChainRef = useRef(chain);\n const [isChainChanged, setIsChainChanged] = useState(true);\n\n const [tokens, setTokens] = useState<Token[]>([]);\n\n useEffect(() => {\n if (chain !== prevChainRef.current) {\n setIsChainChanged(true);\n setTokens([]);\n prevChainRef.current = chain;\n }\n }, [chain]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useMigratedTokensQuery(\n queryParams,\n { refetchInterval },\n );\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const paused = pausedRef.current;\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else if (!paused) {\n merged.unshift(token);\n }\n }\n return merged;\n });\n setIsChainChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useMigratedTokensSubscription({ chain }, handleDataUpdate);\n\n // --- loading state ---\n const isLoading = useMemo(\n () => isPending || isChainChanged,\n [isPending, isChainChanged],\n );\n\n return { tokens, isLoading };\n}\n","import { ReactNode, useCallback, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { PulseList } from \"./pulse-list.ui\";\nimport { usePulseMigratedListScript } from \"./pulse-migrated-list.script\";\n\nexport interface PulseMigratedListWidgetProps {\n /** chain id */\n chain: Chain;\n /** list title */\n title: string;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\nexport function PulseMigratedListWidget({\n chain,\n title,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n className,\n hideHeader,\n}: PulseMigratedListWidgetProps) {\n const [isPaused, setIsPaused] = useState(false);\n const { tokens, isLoading } = usePulseMigratedListScript({\n chain,\n isPaused,\n });\n\n const handlePauseChange = useCallback((paused: boolean) => {\n setIsPaused(paused);\n }, []);\n\n return (\n <PulseList\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n renderHeaderExtra={renderHeaderExtra}\n renderItemAction={renderItemAction}\n onSelectToken={onSelectToken}\n onPauseChange={handlePauseChange}\n className={className}\n hideHeader={hideHeader}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useFinalStretchTokensQuery,\n useFinalStretchTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\n\nexport type UsePulseFinalStretchListScriptParams = {\n /** chain id */\n chain: Chain;\n /** whether to pause adding new items (existing items still update) */\n isPaused?: boolean;\n /** refetch interval in milliseconds */\n refetchInterval?: number;\n};\n\nexport type UsePulseFinalStretchListScriptResult = {\n /** whether tokens are loading */\n isLoading: boolean;\n /** token list */\n tokens: Token[];\n};\n\nfunction sortByMigrateProgress(tokens: Token[]): Token[] {\n return tokens.sort((a, b) => {\n const ar = Number(a.migrateProgress ?? 0);\n const br = Number(b.migrateProgress ?? 0);\n return br - ar;\n });\n}\n\nexport function usePulseFinalStretchListScript({\n chain,\n isPaused = false,\n refetchInterval = 15_000,\n}: UsePulseFinalStretchListScriptParams): UsePulseFinalStretchListScriptResult {\n const queryParams = useMemo(() => ({ chain }), [chain]);\n\n const pausedRef = useRef(isPaused);\n pausedRef.current = isPaused;\n\n const prevChainRef = useRef(chain);\n const [isChainChanged, setIsChainChanged] = useState(true);\n\n const [tokens, setTokens] = useState<Token[]>([]);\n\n useEffect(() => {\n if (chain !== prevChainRef.current) {\n setIsChainChanged(true);\n setTokens([]);\n prevChainRef.current = chain;\n }\n }, [chain]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useFinalStretchTokensQuery(\n queryParams,\n { refetchInterval },\n );\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const paused = pausedRef.current;\n // When list is empty and we have data, always fill (so hover popover is not empty when isPaused)\n const isFirstFill = prev.length === 0 && fetchedTokens.length > 0;\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else if (!paused || isFirstFill) {\n merged.push(token);\n }\n }\n return paused ? merged : sortByMigrateProgress(merged);\n });\n setIsChainChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useFinalStretchTokensSubscription({ chain }, handleDataUpdate);\n\n // --- loading state ---\n const isLoading = useMemo(\n () => isPending || isChainChanged,\n [isPending, isChainChanged],\n );\n\n return { tokens, isLoading };\n}\n","import { ReactNode, useCallback, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { usePulseFinalStretchListScript } from \"./pulse-final-stretch-list.script\";\nimport { PulseList } from \"./pulse-list.ui\";\n\nexport interface PulseFinalStretchListWidgetProps {\n /** chain id */\n chain: Chain;\n /** list title */\n title: string;\n /** custom render for header extra content (e.g. instant buy amount input) */\n renderHeaderExtra?: ReactNode;\n /** custom render for item action (e.g. instant buy button) */\n renderItemAction?: (token: Token) => ReactNode;\n /** callback when selecting a token */\n onSelectToken?: (token: Token) => void;\n /** custom styles */\n className?: string;\n /** whether to hide the header */\n hideHeader?: boolean;\n}\n\nexport function PulseFinalStretchListWidget({\n chain,\n title,\n renderHeaderExtra,\n renderItemAction,\n onSelectToken,\n className,\n hideHeader,\n}: PulseFinalStretchListWidgetProps) {\n const [isPaused, setIsPaused] = useState(false);\n const { tokens, isLoading } = usePulseFinalStretchListScript({\n chain,\n isPaused,\n });\n\n const handlePauseChange = useCallback((paused: boolean) => {\n setIsPaused(paused);\n }, []);\n\n return (\n <PulseList\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n renderHeaderExtra={renderHeaderExtra}\n renderItemAction={renderItemAction}\n onSelectToken={onSelectToken}\n onPauseChange={handlePauseChange}\n className={className}\n hideHeader={hideHeader}\n />\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function useSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"tokens.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { useSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = useSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called with clipboard text when paste button is pressed */\n onPaste?: (text: string) => void;\n /** Called when Escape is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"bordered\"\n radius=\"full\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"tokens.search.placeholder\")}\n classNames={{\n inputWrapper: [\n \"!bg-[rgba(39,39,42,0.6)]\",\n \"!border-[rgba(63,63,70,0.5)]\",\n \"data-[hover=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!border-[rgba(63,63,70,0.8)]\",\n ].join(\" \"),\n }}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-[rgba(63,63,70,0.5)] rounded-full cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport { cn, TriangleDownIcon, TriangleUpIcon } from \"@liberfi.io/ui\";\nimport {\n formatAge,\n formatAmountUSD,\n formatPercent,\n formatPriceUSD,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { TokenAvatar } from \"../token-avatar\";\n\nexport type SearchResultItemUIProps = {\n token: Token;\n className?: string;\n};\n\nexport function SearchResultItemUI({\n token,\n className,\n}: SearchResultItemUIProps) {\n const { t } = useTranslation();\n const age = useTickAge(token.createdAt);\n\n const price = useMemo(() => token.marketData?.priceInUsd, [token]);\n const marketCap = useMemo(() => token.marketData?.marketCapInUsd, [token]);\n const tvl = useMemo(() => token.marketData?.tvlInUsd, [token]);\n\n const priceChange = useMemo(() => token.stats?.[\"24h\"]?.priceChange, [token]);\n const priceChangeAbs = useMemo(\n () =>\n priceChange ? new SafeBigNumber(priceChange).abs().toString() : undefined,\n [priceChange],\n );\n const bullish = useMemo(\n () => priceChange != null && new SafeBigNumber(priceChange).gte(0),\n [priceChange],\n );\n\n return (\n <div\n className={cn(\n \"w-full h-full px-3 flex items-center justify-between gap-2\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n className,\n )}\n >\n {/* Left: avatar + token info */}\n <div className=\"flex-1 min-w-0 flex items-center gap-2.5\">\n <TokenAvatar\n token={token}\n className=\"w-10 h-10 flex-none\"\n showProtocolFamily\n classNames={{\n searchIcon: \"w-5 h-5\",\n }}\n />\n <div className=\"flex-1 min-w-0 flex flex-col gap-0.5\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-sm truncate\">{token.symbol}</span>\n <span className=\"text-xs text-primary font-medium\">\n {formatAge(age)}\n </span>\n </div>\n <div className=\"flex items-center gap-1 text-xs text-neutral\">\n <span>\n {t(\"tokens.listHeader.mcShort\")} {formatAmountUSD(marketCap)}\n </span>\n <span>/</span>\n <span>\n {t(\"tokens.listHeader.liqShort\")} {formatAmountUSD(tvl)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Right: price + change */}\n <div className=\"flex-none w-20 flex flex-col items-end\">\n <span className=\"text-xs\">{formatPriceUSD(price)}</span>\n <span\n className={cn(\n \"inline-flex gap-0.5 items-center text-xs\",\n bullish ? \"text-bullish\" : \"text-bearish\",\n )}\n >\n {bullish ? (\n <TriangleUpIcon width={8} height={8} />\n ) : (\n <TriangleDownIcon width={8} height={8} />\n )}\n <span>{formatPercent(priceChangeAbs)}</span>\n </span>\n </div>\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface SearchResultListHeaderProps {\n className?: string;\n}\n\nexport function SearchResultListHeader({\n className,\n}: SearchResultListHeaderProps) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"h-9 px-3 flex items-center justify-between\",\n \"text-xs font-medium text-neutral\",\n \"sticky top-0 z-10\",\n className,\n )}\n >\n <div className=\"flex-1\">\n <span>\n {t(\"tokens.listHeader.token\")} / {t(\"tokens.listHeader.age\")} /{\" \"}\n {t(\"tokens.listHeader.marketCap\")} /{\" \"}\n {t(\"tokens.listHeader.liquidity\")}\n </span>\n </div>\n <div className=\"flex-none w-20 text-right\">\n <span>\n {t(\"tokens.listHeader.price\")} / {t(\"tokens.listHeader.24hChange\")}\n </span>\n </div>\n </div>\n );\n}\n","import { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface SearchResultListSkeletonProps {\n rows?: number;\n className?: string;\n}\n\nfunction SkeletonRow() {\n return (\n <div className=\"w-full h-14 px-3 flex items-center justify-between gap-2\">\n <div className=\"flex-1 min-w-0 flex items-center gap-2\">\n <Skeleton className=\"flex-none w-8 h-8 rounded-full\" />\n <div className=\"flex flex-col gap-1.5\">\n <Skeleton className=\"w-24 h-4 rounded-md\" />\n <Skeleton className=\"w-36 h-3 rounded-md\" />\n </div>\n </div>\n <div className=\"flex-none w-20 flex flex-col items-end gap-1.5\">\n <Skeleton className=\"w-14 h-4 rounded-md\" />\n <Skeleton className=\"w-10 h-3 rounded-md\" />\n </div>\n </div>\n );\n}\n\nexport function SearchResultListSkeleton({\n rows = 6,\n className,\n}: SearchResultListSkeletonProps) {\n return (\n <div className={cn(\"w-full\", className)}>\n {Array.from({ length: rows }).map((_, i) => (\n <SkeletonRow key={i} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n useSearchTokensInfiniteQuery,\n type UseSearchTokensInfiniteQueryParams,\n} from \"@liberfi.io/react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseSearchResultListScriptParams {\n keyword: string;\n chains?: Chain[];\n limit?: number;\n}\n\nexport function useSearchResultListScript({\n keyword,\n chains,\n limit = 50,\n}: UseSearchResultListScriptParams) {\n const params = useMemo<UseSearchTokensInfiniteQueryParams>(\n () => ({\n keyword,\n chains,\n limit,\n }),\n [keyword, chains, limit],\n );\n\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchTokensInfiniteQuery(params, {\n enabled: !!keyword,\n });\n\n const tokens = useMemo<Token[]>(\n () => data?.pages.flatMap((page) => page.data) ?? [],\n [data],\n );\n\n return {\n tokens,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport { SearchResultListHeader } from \"./search-result-list-header.ui\";\nimport { SearchResultListSkeleton } from \"./search-result-list-skeleton.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 56;\n\nexport type SearchResultListWidgetProps = {\n onSelectToken?: (token: Token) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelectToken,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { tokens, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < tokens.length,\n [tokens],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? tokens.length + 1 : tokens.length),\n [tokens, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return (\n <div className={cn(\"w-full\", className)}>\n <SearchResultListHeader />\n <SearchResultListSkeleton />\n </div>\n );\n }\n\n if (tokens.length === 0) {\n return (\n <div className={cn(\"w-full\", className)}>\n <SearchResultListHeader />\n <EmptyState />\n </div>\n );\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <SearchResultListHeader className=\"flex-none\" />\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ tokens, onSelectToken }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\ninterface SearchResultRowData {\n tokens: Token[];\n onSelectToken?: (token: Token) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n tokens,\n onSelectToken,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const token = tokens[index];\n\n if (!token) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style} onClick={() => onSelectToken?.(token)}>\n <SearchResultItemUI token={token} />\n </div>\n );\n}\n\nfunction EmptyState() {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-col items-center justify-center py-16\">\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"tokens.search.noResults\")}\n </p>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useTrendingTokensQuery,\n useTrendingTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\nimport { TokenListResolution } from \"./types\";\n\nexport type UseTrendingTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseTrendingTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nexport function useTrendingTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseTrendingTokensScriptParams): UseTrendingTokensScriptResult {\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n const prevParamsRef = useRef(queryParams);\n\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n setTokens([]);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useTrendingTokensQuery(\n queryParams,\n { refetchInterval },\n );\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const merged: Array<Token> = [];\n for (const token of fetchedTokens) {\n const existing = prev.find((t) => t.address === token.address);\n merged.push(existing ? mergeToken(existing, token) : token);\n }\n return merged;\n });\n setIsParamsChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useTrendingTokensSubscription({ chain }, handleDataUpdate);\n\n const isLoading = useMemo(() => {\n if (isPending) return true;\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","\"use client\";\n\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { useTrendingTokensScript } from \"../token-list/trending-token-list.script\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport { SearchResultListSkeleton } from \"./search-result-list-skeleton.ui\";\n\nconst DEFAULT_CHAIN = Chain.ETHEREUM;\nconst DEFAULT_RESOLUTION = \"24h\" as const;\nconst ROW_HEIGHT = 56;\n\nexport type SearchTrendingListWidgetProps = {\n chains?: Chain[];\n onSelectToken?: (token: Token) => void;\n className?: string;\n};\n\nexport function SearchTrendingListWidget({\n chains,\n onSelectToken,\n className,\n}: SearchTrendingListWidgetProps) {\n const chain =\n chains?.length === 1 ? chains[0] : (chains?.[0] ?? DEFAULT_CHAIN);\n\n const { tokens, isLoading } = useTrendingTokensScript({\n chain,\n resolution: DEFAULT_RESOLUTION,\n });\n\n return (\n <div className={cn(\"w-full flex flex-col overflow-hidden\", className)}>\n {isLoading ? (\n <SearchResultListSkeleton />\n ) : (\n <div className=\"overflow-y-auto\">\n {tokens.map((token) => (\n <div\n key={token.address}\n style={{ height: ROW_HEIGHT }}\n onClick={() => onSelectToken?.(token)}\n >\n <SearchResultItemUI token={token} className=\"h-full\" />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { useSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\"); // immediate input value (every keystroke)\n const [keyword, setKeyword] = useState(\"\"); // debounced value (drives API search)\n const { addHistory } = useSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { SearchTrendingListWidget } from \"./search-trending-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Chains to search within */\n chains?: Chain[];\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when a token is selected */\n onSelectToken?: (token: Token) => void;\n /** Callback when Escape is pressed (e.g. close modal) */\n onEscape?: () => void;\n};\n\nexport function SearchWidget({\n chains,\n onKeywordChange,\n onSelectToken,\n onEscape,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onPaste={setKeyword}\n onEscape={onEscape}\n />\n {keyword ? (\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n chains={chains}\n onSelectToken={onSelectToken}\n />\n ) : (\n <div className=\"flex-auto min-h-0 flex flex-col overflow-hidden\">\n <SearchHistoryWidget onSelect={setKeyword} />\n <SearchTrendingListWidget\n className=\"flex-auto min-h-0\"\n chains={chains}\n onSelectToken={onSelectToken}\n />\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type SearchModalParams = {\n chains?: Chain[];\n};\n\nexport type SearchModalResult = Token;\n\nexport const SEARCH_MODAL_ID = \"search\";\n\nexport function SearchModal({ id = SEARCH_MODAL_ID }: { id?: string }) {\n return (\n <AsyncModal<SearchModalParams, SearchModalResult> id={id}>\n {(modalProps) => <SearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction SearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<SearchModalParams, SearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectToken = useCallback(\n (token: Token) => {\n onResult(token);\n },\n [onResult],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent\n className=\"w-full h-full\"\n style={{\n borderRadius: isMobile ? undefined : 14,\n border: isMobile ? undefined : \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: isMobile ? undefined : \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n }}\n >\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"tokens.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n chains={params?.chains}\n onSelectToken={handleSelectToken}\n onEscape={() => onOpenChange(false)}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Token } from \"@liberfi.io/types\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n SEARCH_MODAL_ID,\n type SearchModalParams,\n type SearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchTokensButtonProps = {\n /** Chains to filter the search */\n chains?: SearchModalParams[\"chains\"];\n /** Callback when a token is selected from the search modal */\n onSelectToken?: (token: Token) => void;\n className?: string;\n};\n\nexport function SearchTokensButton({\n chains,\n onSelectToken,\n className,\n}: SearchTokensButtonProps) {\n const { t } = useTranslation();\n\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n SearchModalParams,\n SearchModalResult\n >(SEARCH_MODAL_ID);\n\n const onSelectTokenStable = useCallbackRef(onSelectToken);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: { chains } });\n if (result) {\n onSelectTokenStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(isDesktop && \"pl-3 pr-1.5 text-neutral\", className)}\n >\n {isDesktop ? (\n t(\"tokens.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import type { TraderTag } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\n\n/**\n * Canonical color + label mapping for trader classification tags.\n * Consumer apps may re-theme by overriding `className` via `classNames`.\n */\nexport const TRADER_TAG_META: Record<\n string,\n { label: string; bgClass: string; textClass: string }\n> = {\n kol: {\n label: \"KOL\",\n bgClass: \"bg-yellow-500/15\",\n textClass: \"text-yellow-400\",\n },\n smart: {\n label: \"Smart\",\n bgClass: \"bg-sky-500/15\",\n textClass: \"text-sky-400\",\n },\n sniper: {\n label: \"Sniper\",\n bgClass: \"bg-red-500/15\",\n textClass: \"text-red-400\",\n },\n dev: {\n label: \"Dev\",\n bgClass: \"bg-orange-500/15\",\n textClass: \"text-orange-400\",\n },\n bundle: {\n label: \"Bundle\",\n bgClass: \"bg-purple-500/15\",\n textClass: \"text-purple-400\",\n },\n bluechip: {\n label: \"Bluechip\",\n bgClass: \"bg-emerald-500/15\",\n textClass: \"text-emerald-400\",\n },\n insider: {\n label: \"Insider\",\n bgClass: \"bg-fuchsia-500/15\",\n textClass: \"text-fuchsia-400\",\n },\n fresh: {\n label: \"Fresh\",\n bgClass: \"bg-teal-500/15\",\n textClass: \"text-teal-400\",\n },\n};\n\nexport interface TraderTagBadgeProps {\n tag: TraderTag;\n className?: string;\n}\n\n/**\n * Single trader-tag chip. Unknown tag values fall back to a neutral style.\n * See `TRADER_TAG_META` for the built-in vocabulary.\n */\nexport function TraderTagBadge({ tag, className }: TraderTagBadgeProps) {\n const meta = TRADER_TAG_META[tag] ?? {\n label: tag,\n bgClass: \"bg-default/20\",\n textClass: \"text-default-500\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium uppercase leading-none tracking-wide\",\n meta.bgClass,\n meta.textClass,\n className,\n )}\n >\n {meta.label}\n </span>\n );\n}\n\nexport interface TraderTagBadgeListProps {\n tags?: Array<TraderTag>;\n className?: string;\n max?: number;\n}\n\n/**\n * Horizontal list of trader-tag chips. When `max` is set and the tag count\n * exceeds it, a \"+N\" pill is rendered after the first `max` tags.\n */\nexport function TraderTagBadgeList({\n tags,\n className,\n max,\n}: TraderTagBadgeListProps) {\n if (!tags || tags.length === 0) return null;\n const visible = max != null && max > 0 ? tags.slice(0, max) : tags;\n const overflow = tags.length - visible.length;\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1\", className)}>\n {visible.map((tag) => (\n <TraderTagBadge key={tag} tag={tag} />\n ))}\n {overflow > 0 && (\n <span className=\"inline-flex items-center rounded bg-default/20 px-1.5 py-0.5 text-[10px] font-medium text-default-500\">\n +{overflow}\n </span>\n )}\n </div>\n );\n}\n","import type { HolderTag } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { TRADER_TAG_META } from \"../trader-tag-badge/trader-tag-badge.ui\";\n\n/**\n * Holder tags share the vocabulary of trader tags (kol/smart/sniper/dev/bundle\n * /bluechip). The UI is intentionally the same so the visual semantics stay\n * coherent across the app. Kept as a separate component to make consumer-side\n * code read clearly when rendering holder lists vs activity rows.\n */\nexport interface HolderTagBadgeProps {\n tag: HolderTag;\n className?: string;\n}\n\nexport function HolderTagBadge({ tag, className }: HolderTagBadgeProps) {\n const meta = TRADER_TAG_META[tag] ?? {\n label: tag,\n bgClass: \"bg-default/20\",\n textClass: \"text-default-500\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium uppercase leading-none tracking-wide\",\n meta.bgClass,\n meta.textClass,\n className,\n )}\n >\n {meta.label}\n </span>\n );\n}\n\nexport interface HolderTagBadgeListProps {\n tags?: Array<HolderTag>;\n className?: string;\n max?: number;\n}\n\nexport function HolderTagBadgeList({\n tags,\n className,\n max,\n}: HolderTagBadgeListProps) {\n if (!tags || tags.length === 0) return null;\n const visible = max != null && max > 0 ? tags.slice(0, max) : tags;\n const overflow = tags.length - visible.length;\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1\", className)}>\n {visible.map((tag) => (\n <HolderTagBadge key={tag} tag={tag} />\n ))}\n {overflow > 0 && (\n <span className=\"inline-flex items-center rounded bg-default/20 px-1.5 py-0.5 text-[10px] font-medium text-default-500\">\n +{overflow}\n </span>\n )}\n </div>\n );\n}\n","import { formatPercent as formatPercentUtil } from \"@liberfi.io/utils\";\n\n/**\n * Format a ratio expressed as 0–100 (e.g. holdings percentage from the server)\n * into a display string like \"12.34%\". Internally divides by 100 and forwards\n * to `@liberfi.io/utils#formatPercent` (which expects 0–1 ratios).\n */\nexport function formatRatioFrom100(value: string | number | undefined): string {\n if (value === undefined || value === null || value === \"\") return \"--\";\n return formatPercentUtil(Number(value) / 100);\n}\n\n/**\n * Truncate a blockchain address for display, e.g. \"0x1234…abcd\".\n */\nexport function truncateMiddle(\n input: string | undefined,\n head = 4,\n tail = 4,\n): string {\n if (!input) return \"--\";\n if (input.length <= head + tail + 1) return input;\n return `${input.slice(0, head)}…${input.slice(-tail)}`;\n}\n","/**\n * Format the elapsed time between `from` and `now` as a short age string\n * (e.g. \"5m\", \"2h\", \"3d\"). Returns \"--\" if `from` is unavailable.\n */\nexport function formatAgeShort(\n from: Date | string | number | undefined,\n now: Date | number = Date.now(),\n): string {\n if (from == null) return \"--\";\n const start =\n typeof from === \"string\" || typeof from === \"number\"\n ? new Date(from)\n : from;\n const end = typeof now === \"number\" ? new Date(now) : now;\n const diffSec = Math.max(\n 0,\n Math.floor((end.getTime() - start.getTime()) / 1000),\n );\n if (diffSec < 60) return `${diffSec}s`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m`;\n const diffHour = Math.floor(diffMin / 60);\n if (diffHour < 24) return `${diffHour}h`;\n const diffDay = Math.floor(diffHour / 24);\n if (diffDay < 30) return `${diffDay}d`;\n const diffMon = Math.floor(diffDay / 30);\n if (diffMon < 12) return `${diffMon}mo`;\n const diffYr = Math.floor(diffDay / 365);\n return `${diffYr}y`;\n}\n","import { useEffect, useState } from \"react\";\nimport { useTokenQuery, useTokenSubscription } from \"@liberfi.io/react\";\nimport type { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../../utils/merge\";\n\n/**\n * Fetches a token by chain + address and keeps it live-merged with\n * `useTokenSubscription` pushes. Every token-detail sub-widget should use this\n * hook so WebSocket updates propagate uniformly across the page.\n */\nexport function useLiveToken(\n chain: Chain,\n address: string,\n): { token: Token | undefined; isLoading: boolean } {\n const { data, isLoading } = useTokenQuery({ chain, address });\n const [token, setToken] = useState<Token | undefined>(data);\n\n useEffect(() => {\n if (data) setToken(data);\n }, [data]);\n\n useTokenSubscription({ chain, address }, (updates) => {\n if (!updates?.length) return;\n setToken((prev) => {\n if (!prev) return prev;\n let next = prev;\n for (const u of updates as Array<API.TokenSubscribed>) {\n next = mergeToken(next, u);\n }\n return next;\n });\n });\n\n return { token, isLoading };\n}\n","import { cn, Progress } from \"@liberfi.io/ui\";\nimport { SafeBigNumber } from \"@liberfi.io/utils\";\n\nexport interface BuySellOverviewProps {\n label: string;\n totalFormatted: string;\n buysFormatted: string;\n sellsFormatted: string;\n /** raw numeric values used to compute the progress bar */\n totalValue?: number | string;\n buysValue?: number | string;\n className?: string;\n}\n\n/**\n * Presentational card used by traders / transactions / volumes overviews.\n * Three data points + one progress bar showing buy share of total.\n */\nexport function BuySellOverview({\n label,\n totalFormatted,\n buysFormatted,\n sellsFormatted,\n totalValue = 0,\n buysValue = 0,\n className,\n}: BuySellOverviewProps) {\n const total = new SafeBigNumber(totalValue ?? 0);\n const buys = new SafeBigNumber(buysValue ?? 0);\n const buyPercentage = total.eq(0) ? 0 : buys.div(total).times(100).toNumber();\n\n return (\n <div className={cn(\"flex flex-col gap-1\", className)}>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-xs text-default-500\">{label}</span>\n <span className=\"text-xs text-foreground\">{totalFormatted}</span>\n </div>\n <Progress\n size=\"sm\"\n value={buyPercentage}\n classNames={{ track: \"bg-bearish/40\", indicator: \"bg-bullish\" }}\n aria-label={`${label} buy share`}\n />\n <div className=\"flex justify-between gap-4 text-[10px]\">\n <span className=\"text-bullish\">Buys: {buysFormatted}</span>\n <span className=\"text-bearish\">Sells: {sellsFormatted}</span>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Token } from \"@liberfi.io/types\";\nimport { cn, CopyIcon } from \"@liberfi.io/ui\";\nimport { TokenAvatar } from \"../../token-avatar\";\nimport { truncateMiddle } from \"../shared\";\n\nexport interface TokenDetailHeaderProps {\n token?: Token;\n /** slot for favorite toggle / share / back buttons */\n actions?: ReactNode;\n /** slot for the live-data strip (price / market cap / volume / holders) */\n dataStrip?: ReactNode;\n className?: string;\n onCopyAddress?: (address: string) => void;\n}\n\n/**\n * Presentational token-detail header. Shows the avatar, symbol, name, truncated\n * address + copy, and defers favorite/share buttons + price data to slots.\n */\nexport function TokenDetailHeader({\n token,\n actions,\n dataStrip,\n className,\n onCopyAddress,\n}: TokenDetailHeaderProps) {\n const address = token?.address;\n\n return (\n <div\n className={cn(\n \"flex w-full flex-wrap items-center gap-4 px-4 py-3\",\n className,\n )}\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n {token && (\n <TokenAvatar token={token} radius=\"lg\" className=\"h-10 w-10\" />\n )}\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-base font-semibold text-foreground\">\n {token?.symbol ?? \"--\"}\n </span>\n <span className=\"truncate text-xs text-default-400\">\n {token?.name}\n </span>\n </div>\n {address && (\n <button\n type=\"button\"\n onClick={() => onCopyAddress?.(address)}\n className=\"flex items-center gap-1 text-[11px] text-default-400 transition-colors hover:text-foreground\"\n title={address}\n >\n {truncateMiddle(address, 6, 6)}\n <CopyIcon width={12} height={12} />\n </button>\n )}\n </div>\n </div>\n\n {dataStrip && <div className=\"flex-1 min-w-0\">{dataStrip}</div>}\n\n {actions && (\n <div className=\"ml-auto flex items-center gap-2\">{actions}</div>\n )}\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\n/**\n * Script for {@link TokenDetailHeaderWidget}. Thin wrapper over\n * {@link useLiveToken} to expose the token record for the header shell.\n */\nexport function useTokenDetailHeaderScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface TokenBasicInfoProps {\n /** Rendered price block (expected: `<TokenPriceWidget />`) */\n price?: ReactNode;\n /** Rendered market-cap block (expected: `<TokenMarketCapWidget />`) */\n marketCap?: ReactNode;\n /** Rendered volume block (expected: `<TokenVolumeWidget />`) */\n volume?: ReactNode;\n /** Rendered holders-count block (expected: `<TokenHoldersCountWidget />`) */\n holdersCount?: ReactNode;\n /** Rendered social-media block (expected: `<TokenSocialMediaWidget />`) */\n socialMedia?: ReactNode;\n className?: string;\n}\n\n/**\n * Presentational shell that lays out the token basic info strip — price on the\n * left, market-cap / volume / holders in the middle, social media on the right.\n * Consumers pass the individual sub-widgets (or custom nodes) via props, which\n * keeps the layout composition pattern explicit and testable.\n */\nexport function TokenBasicInfo({\n price,\n marketCap,\n volume,\n holdersCount,\n socialMedia,\n className,\n}: TokenBasicInfoProps) {\n return (\n <div\n className={cn(\"flex flex-wrap items-center gap-x-6 gap-y-3\", className)}\n >\n {price}\n <div className=\"flex flex-wrap items-center gap-x-6 gap-y-3\">\n {marketCap}\n {volume}\n {holdersCount}\n </div>\n <div className=\"ml-auto\">{socialMedia}</div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\n/**\n * Aggregate script for {@link TokenBasicInfoWidget}. Exposes the same live\n * token reference each sub-widget would fetch on its own, so consumers can\n * avoid redundant queries if they render the widget multiple times in one\n * page. Kept as a thin wrapper on {@link useLiveToken} for uniformity.\n */\nexport function useTokenBasicInfoScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { formatRatioFrom100 } from \"../shared\";\n\nexport interface TokenHoldersCountProps {\n /** total holder count */\n holders?: number;\n /** top-10 holdings ratio, 0–100 */\n top10HoldingsRatio?: string;\n /** top-100 holdings ratio, 0–100 */\n top100HoldingsRatio?: string;\n className?: string;\n}\n\n/**\n * Compact summary of holder distribution — holder count + top10/top100 ratios.\n */\nexport function TokenHoldersCount({\n holders,\n top10HoldingsRatio,\n top100HoldingsRatio,\n className,\n}: TokenHoldersCountProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-start justify-center gap-0.5\",\n className,\n )}\n >\n <div className=\"text-xs font-medium text-default-500\">\n <span className=\"text-foreground\">\n {holders != null ? formatAmount(holders) : \"--\"}\n </span>\n <span className=\"px-1\">/</span>\n <span>{formatRatioFrom100(top10HoldingsRatio)}</span>\n <span className=\"px-1\">/</span>\n <span>{formatRatioFrom100(top100HoldingsRatio)}</span>\n </div>\n <div className=\"text-[10px] text-default-400\">\n Holders / Top10 / Top100\n </div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenHoldersCountScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenHoldersCountScript } from \"./token-holders-count.script\";\nimport { TokenHoldersCount } from \"./token-holders-count.ui\";\n\nexport interface TokenHoldersCountWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenHoldersCountWidget({\n chain,\n address,\n className,\n}: TokenHoldersCountWidgetProps) {\n const { token } = useTokenHoldersCountScript(chain, address);\n return (\n <TokenHoldersCount\n holders={token?.marketData?.holders}\n top10HoldingsRatio={token?.marketData?.top10HoldingsRatio}\n top100HoldingsRatio={token?.marketData?.top100HoldingsRatio}\n className={className}\n />\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { formatAgeShort } from \"../shared\";\n\nexport interface TokenMarketCapProps {\n /** market cap in usd */\n marketCapInUsd?: string;\n /** liquidity (tvl) in usd */\n tvlInUsd?: string;\n /** token creation time */\n createdAt?: Date;\n className?: string;\n}\n\n/**\n * Pure presentational widget showing market cap / liquidity / age in a single\n * compact inline block. Mirrors the `TradeTokenMCap` behaviour in\n * dex-nextjs-template but has no jotai / translation dependencies.\n */\nexport function TokenMarketCap({\n marketCapInUsd,\n tvlInUsd,\n createdAt,\n className,\n}: TokenMarketCapProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-start justify-center gap-0.5\",\n className,\n )}\n >\n <div className=\"text-xs font-medium text-default-500\">\n <span className=\"text-foreground\">\n {marketCapInUsd ? formatAmountUSDCompact(marketCapInUsd) : \"--\"}\n </span>\n <span className=\"px-1\">/</span>\n <span>{tvlInUsd ? formatAmountUSDCompact(tvlInUsd) : \"--\"}</span>\n <span className=\"px-1\">/</span>\n <span>{formatAgeShort(createdAt)}</span>\n </div>\n <div className=\"text-[10px] text-default-400\">MC / Liq / Age</div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\n/**\n * Script for {@link TokenMarketCapWidget} — thin wrapper over the shared\n * {@link useLiveToken} hook.\n */\nexport function useTokenMarketCapScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenMarketCapScript } from \"./token-market-cap.script\";\nimport { TokenMarketCap } from \"./token-market-cap.ui\";\n\nexport interface TokenMarketCapWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\n/**\n * Live-updating market-cap / liquidity / age block. Source of truth is the\n * `useTokenQuery` + `useTokenSubscription` pair exposed by `@liberfi.io/react`.\n */\nexport function TokenMarketCapWidget({\n chain,\n address,\n className,\n}: TokenMarketCapWidgetProps) {\n const { token } = useTokenMarketCapScript(chain, address);\n return (\n <TokenMarketCap\n marketCapInUsd={token?.marketData?.marketCapInUsd}\n tvlInUsd={token?.marketData?.tvlInUsd}\n createdAt={token?.createdAt}\n className={className}\n />\n );\n}\n","import { useMemo } from \"react\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatPercent,\n formatPriceUSD,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\n\nexport interface TokenPriceProps {\n /** latest price in usd (may update via WebSocket) */\n priceInUsd?: string;\n /** 24h-open price in usd (reference for bearish/bullish) */\n price24hAgoInUsd?: string;\n className?: string;\n}\n\n/**\n * Presentational price widget with 24h-change delta. Colors follow\n * bullish/bearish tokens from the HeroUI theme (`text-bullish` / `text-bearish`).\n */\nexport function TokenPrice({\n priceInUsd,\n price24hAgoInUsd,\n className,\n}: TokenPriceProps) {\n const { bearish, priceChange } = useMemo(() => {\n if (!priceInUsd || !price24hAgoInUsd) {\n return { bearish: false, priceChange: undefined as number | undefined };\n }\n const cur = new SafeBigNumber(priceInUsd);\n const prev = new SafeBigNumber(price24hAgoInUsd);\n if (prev.lte(0)) return { bearish: false, priceChange: undefined };\n return {\n bearish: cur.lt(prev),\n priceChange: cur.minus(prev).div(prev).abs().toNumber(),\n };\n }, [priceInUsd, price24hAgoInUsd]);\n\n return (\n <div\n className={cn(\"group flex flex-col gap-1\", className)}\n data-bearish={bearish}\n >\n <div className=\"text-base font-medium leading-none text-bullish group-data-[bearish=true]:text-bearish\">\n {priceInUsd ? formatPriceUSD(priceInUsd) : \"--\"}\n </div>\n <div className=\"flex items-center gap-2 text-[10px] leading-none\">\n <span className=\"text-default-400\">24h</span>\n <span className=\"text-bullish group-data-[bearish=true]:text-bearish\">\n {priceChange != null ? formatPercent(priceChange) : \"--\"}\n </span>\n </div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenPriceScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenPriceScript } from \"./token-price.script\";\nimport { TokenPrice } from \"./token-price.ui\";\n\nexport interface TokenPriceWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenPriceWidget({\n chain,\n address,\n className,\n}: TokenPriceWidgetProps) {\n const { token } = useTokenPriceScript(chain, address);\n return (\n <TokenPrice\n priceInUsd={token?.marketData?.priceInUsd}\n price24hAgoInUsd={token?.stats?.[\"24h\"]?.openPriceInUsd}\n className={className}\n />\n );\n}\n","import type { TokenSocialMedias } from \"@liberfi.io/types\";\nimport {\n cn,\n DiscordIcon,\n TelegramIcon,\n TwitterIcon,\n WebsiteIcon,\n} from \"@liberfi.io/ui\";\n\nexport interface TokenSocialMediaProps {\n socials?: TokenSocialMedias;\n className?: string;\n iconSize?: number;\n}\n\ntype SocialKey = keyof Pick<\n TokenSocialMedias,\n | \"website\"\n | \"twitter\"\n | \"telegram\"\n | \"discord\"\n | \"github\"\n | \"reddit\"\n | \"youtube\"\n | \"medium\"\n>;\n\nfunction renderIcon(key: SocialKey, size: number) {\n switch (key) {\n case \"website\":\n return <WebsiteIcon width={size} height={size} />;\n case \"twitter\":\n return <TwitterIcon width={size} height={size} />;\n case \"telegram\":\n return <TelegramIcon width={size} height={size} />;\n case \"discord\":\n return <DiscordIcon width={size} height={size} />;\n default:\n return (\n <span className=\"text-[9px] font-medium uppercase\">\n {key.slice(0, 2)}\n </span>\n );\n }\n}\n\n/**\n * Presentational row of social-media icon links. Links open in a new tab.\n * Renders nothing if no known social media is present.\n */\nexport function TokenSocialMedia({\n socials,\n className,\n iconSize = 16,\n}: TokenSocialMediaProps) {\n if (!socials) return null;\n const keys: Array<SocialKey> = [\n \"website\",\n \"twitter\",\n \"telegram\",\n \"discord\",\n \"github\",\n \"reddit\",\n \"youtube\",\n \"medium\",\n ];\n const available = keys.filter((k) => !!socials[k]);\n if (available.length === 0) return null;\n\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {available.map((k) => (\n <a\n key={k}\n href={socials[k]!}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"flex items-center justify-center text-default-400 transition-colors hover:text-foreground\"\n style={{ width: iconSize, height: iconSize }}\n >\n {renderIcon(k, iconSize)}\n </a>\n ))}\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenSocialMediaScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenSocialMediaScript } from \"./token-social-media.script\";\nimport { TokenSocialMedia } from \"./token-social-media.ui\";\n\nexport interface TokenSocialMediaWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n iconSize?: number;\n}\n\nexport function TokenSocialMediaWidget({\n chain,\n address,\n className,\n iconSize,\n}: TokenSocialMediaWidgetProps) {\n const { token } = useTokenSocialMediaScript(chain, address);\n return (\n <TokenSocialMedia\n socials={token?.socialMedias}\n className={className}\n iconSize={iconSize}\n />\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\n\nexport interface TokenVolumeProps {\n /** 24h volume in usd */\n volumesInUsd?: string;\n /** 24h total trades */\n trades?: number;\n /** 24h unique traders */\n traders?: number;\n className?: string;\n}\n\n/**\n * 24h volume / trades / traders summary — inline compact layout.\n */\nexport function TokenVolume({\n volumesInUsd,\n trades,\n traders,\n className,\n}: TokenVolumeProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-start justify-center gap-0.5\",\n className,\n )}\n >\n <div className=\"text-xs font-medium text-default-500\">\n <span className=\"text-foreground\">\n {volumesInUsd ? formatAmountUSDCompact(volumesInUsd) : \"--\"}\n </span>\n <span className=\"px-1\">/</span>\n <span>{trades != null ? formatAmount(trades) : \"--\"}</span>\n <span className=\"px-1\">/</span>\n <span>{traders != null ? formatAmount(traders) : \"--\"}</span>\n </div>\n <div className=\"text-[10px] text-default-400\">\n 24h Vol / Txs / Traders\n </div>\n </div>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenVolumeScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenVolumeScript } from \"./token-volume.script\";\nimport { TokenVolume } from \"./token-volume.ui\";\n\nexport interface TokenVolumeWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenVolumeWidget({\n chain,\n address,\n className,\n}: TokenVolumeWidgetProps) {\n const { token } = useTokenVolumeScript(chain, address);\n const stats = token?.stats?.[\"24h\"];\n return (\n <TokenVolume\n volumesInUsd={stats?.volumesInUsd}\n trades={stats?.trades}\n traders={stats?.traders}\n className={className}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { TokenHoldersCountWidget } from \"../token-holders-count\";\nimport { TokenMarketCapWidget } from \"../token-market-cap\";\nimport { TokenPriceWidget } from \"../token-price\";\nimport { TokenSocialMediaWidget } from \"../token-social-media\";\nimport { TokenVolumeWidget } from \"../token-volume\";\nimport { TokenBasicInfo } from \"./token-basic-info.ui\";\n\nexport interface TokenBasicInfoWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\n/**\n * Default composition that plugs the five live sub-widgets into the\n * {@link TokenBasicInfo} shell. Consumers who need a custom layout should\n * import and arrange the sub-widgets directly.\n */\nexport function TokenBasicInfoWidget({\n chain,\n address,\n className,\n}: TokenBasicInfoWidgetProps) {\n return (\n <TokenBasicInfo\n className={className}\n price={<TokenPriceWidget chain={chain} address={address} />}\n marketCap={<TokenMarketCapWidget chain={chain} address={address} />}\n volume={<TokenVolumeWidget chain={chain} address={address} />}\n holdersCount={<TokenHoldersCountWidget chain={chain} address={address} />}\n socialMedia={<TokenSocialMediaWidget chain={chain} address={address} />}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { TokenBasicInfoWidget } from \"../token-basic-info\";\nimport { useTokenDetailHeaderScript } from \"./token-detail-header.script\";\nimport { TokenDetailHeader } from \"./token-detail-header.ui\";\n\nexport interface TokenDetailHeaderWidgetProps {\n chain: Chain;\n address: string;\n /** slot for favorite toggle / share / back buttons */\n actions?: ReactNode;\n /**\n * Custom data-strip renderer. Defaults to the full basic-info strip (price,\n * market cap, volume, holders, social). Pass `null` to hide the strip.\n */\n dataStrip?: ReactNode | null;\n className?: string;\n onCopyAddress?: (address: string) => void;\n}\n\n/**\n * Live-updating token detail header. Copy-address behaviour and trailing\n * actions (favorite/share/back) are delegated to the caller via callbacks and\n * slot props so the widget stays agnostic of app-specific concerns.\n */\nexport function TokenDetailHeaderWidget({\n chain,\n address,\n actions,\n dataStrip,\n className,\n onCopyAddress,\n}: TokenDetailHeaderWidgetProps) {\n const { token } = useTokenDetailHeaderScript(chain, address);\n return (\n <TokenDetailHeader\n token={token}\n actions={actions}\n dataStrip={\n dataStrip === undefined ? (\n <TokenBasicInfoWidget chain={chain} address={address} />\n ) : (\n dataStrip\n )\n }\n className={className}\n onCopyAddress={onCopyAddress}\n />\n );\n}\n","import { useMemo } from \"react\";\nimport type { API, TokenHolder } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { HolderTagBadgeList } from \"../../shared\";\nimport { formatRatioFrom100, truncateMiddle, formatAgeShort } from \"../shared\";\n\nexport type TokenHoldersListSortBy = API.TokenHoldersSortBy;\n\nexport interface TokenHoldersListProps {\n holders: Array<TokenHolder>;\n isLoading?: boolean;\n /** Phase 3 sortBy */\n sortBy: TokenHoldersListSortBy;\n onSortByChange: (sortBy: TokenHoldersListSortBy) => void;\n /**\n * Axiom-style `Only Tracked` filter. Narrows the visible rows to holders\n * that carry at least one classification tag. Client-side; parent owns\n * state.\n */\n onlyTracked?: boolean;\n onOnlyTrackedChange?: (value: boolean) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n /** reference time for age display; defaults to `Date.now()` */\n now?: number;\n /**\n * Optional map of known wallet addresses → human-readable label (e.g.\n * `{ [poolAddress]: \"LIQUIDITY POOL\" }`). When the holder's address is\n * in this map, the Wallet cell renders the label instead of a truncated\n * address.\n */\n wellKnownAddresses?: Record<string, string>;\n className?: string;\n /** render a wallet cell — useful to wire app-level links / tooltips */\n renderAddress?: (address: string) => React.ReactNode;\n}\n\nconst SORT_OPTIONS: Array<{ value: TokenHoldersListSortBy; label: string }> = [\n { value: \"holdingUsd\", label: \"Value\" },\n { value: \"lastActiveAt\", label: \"Last active\" },\n];\n\n/**\n * Presentational token holders list. Renders Phase 3 columns: wallet address,\n * classification tags, USD value, % holding, first-held-at age, last-active-at\n * age. The caller owns the sort state to preserve cursor semantics (changing\n * `sortBy` invalidates cursors).\n */\nexport function TokenHoldersList({\n holders,\n isLoading,\n sortBy,\n onSortByChange,\n onlyTracked = false,\n onOnlyTrackedChange,\n onLoadMore,\n hasMore,\n now = Date.now(),\n wellKnownAddresses,\n className,\n renderAddress,\n}: TokenHoldersListProps) {\n const visibleHolders = onlyTracked\n ? holders.filter((h) => h.tags && h.tags.length > 0)\n : holders;\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-medium text-default-500\">Holders</span>\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={onlyTracked}\n onChange={(e) => onOnlyTrackedChange?.(e.target.checked)}\n />\n Only Tracked\n </label>\n </div>\n <div className=\"flex items-center gap-1\">\n {SORT_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onSortByChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n sortBy === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[640px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[30%] px-3 py-2 text-left font-normal\">\n Wallet\n </th>\n <th className=\"w-[20%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Value\n </th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">%</th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n First held\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Last active\n </th>\n </tr>\n </thead>\n <tbody>\n {visibleHolders.length === 0 && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No holders\n </td>\n </tr>\n )}\n {visibleHolders.map((h) => (\n <HolderRow\n key={h.address}\n holder={h}\n now={now}\n wellKnownAddresses={wellKnownAddresses}\n renderAddress={renderAddress}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction HolderRow({\n holder,\n now,\n wellKnownAddresses,\n renderAddress,\n}: {\n holder: TokenHolder;\n now: number;\n wellKnownAddresses?: Record<string, string>;\n renderAddress?: (address: string) => React.ReactNode;\n}) {\n const wellKnownLabel = wellKnownAddresses?.[holder.address];\n const addressCell = useMemo(() => {\n if (renderAddress) return renderAddress(holder.address);\n if (wellKnownLabel) {\n return (\n <span className=\"rounded bg-default-100 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-default-600\">\n {wellKnownLabel}\n </span>\n );\n }\n return (\n <span className=\"font-mono text-[11px] text-default-500\">\n {truncateMiddle(holder.address, 6, 6)}\n </span>\n );\n }, [holder.address, renderAddress, wellKnownLabel]);\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{addressCell}</td>\n <td className=\"px-3 py-2 align-middle\">\n <HolderTagBadgeList tags={holder.tags} max={3} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(holder.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatRatioFrom100(holder.ratio)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {holder.startHoldingAt\n ? formatAgeShort(holder.startHoldingAt, now)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {holder.lastActiveAt ? formatAgeShort(holder.lastActiveAt, now) : \"--\"}\n </td>\n </tr>\n );\n}\n\n// re-export for convenience\nexport { formatAmount };\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTokenHoldersQuery, useTokenSubscription } from \"@liberfi.io/react\";\nimport type { API, Chain, TokenHolder } from \"@liberfi.io/types\";\nimport type { TokenHoldersListSortBy } from \"./token-holders-list.ui\";\n\nexport interface UseTokenHoldersListScriptParams {\n chain: Chain;\n address: string;\n /** page size */\n limit?: number;\n /** initial sortBy; defaults to `holdingUsd` */\n initialSortBy?: TokenHoldersListSortBy;\n}\n\nexport interface UseTokenHoldersListScriptResult {\n holders: Array<TokenHolder>;\n isLoading: boolean;\n sortBy: TokenHoldersListSortBy;\n setSortBy: (s: TokenHoldersListSortBy) => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the token-holders list widget.\n *\n * Pagination model: accumulate pages in local state. Whenever `sortBy`\n * changes, the accumulator is reset (server docs state that cursors become\n * invalid after a sort change).\n *\n * Also subscribes to {@link useTokenSubscription} so the holder count-based\n * stats elsewhere update, but the holders list itself is refreshed on the next\n * explicit load since there is no per-holder WS channel.\n */\nexport function useTokenHoldersListScript({\n chain,\n address,\n limit = 50,\n initialSortBy = \"holdingUsd\",\n}: UseTokenHoldersListScriptParams): UseTokenHoldersListScriptResult {\n const [sortBy, setSortByState] =\n useState<TokenHoldersListSortBy>(initialSortBy);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<TokenHolder>>>([]);\n\n const resetOnSortChange = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n }, []);\n\n const setSortBy = useCallback(\n (s: TokenHoldersListSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n resetOnSortChange();\n },\n [sortBy, resetOnSortChange],\n );\n\n useEffect(() => {\n resetOnSortChange();\n }, [chain, address, resetOnSortChange]);\n\n const queryParams = useMemo(\n () => ({ chain, address, cursor, limit, sortBy }),\n [chain, address, cursor, limit, sortBy],\n );\n\n const { data, isPending, isFetching } = useTokenHoldersQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n // Re-fetch on token push (holders count / ratios change) — cheap because\n // react-query will return cached data unless invalidated by params change.\n useTokenSubscription({ chain, address }, () => {\n /* no-op: there is no per-holder WS channel; the list refreshes on paging */\n });\n\n const holders = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n holders,\n isLoading: isPending || isFetching,\n sortBy,\n setSortBy,\n hasMore,\n loadMore,\n };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { useTokenHoldersListScript } from \"./token-holders-list.script\";\nimport {\n TokenHoldersList,\n type TokenHoldersListSortBy,\n} from \"./token-holders-list.ui\";\n\nexport interface TokenHoldersListWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: TokenHoldersListSortBy;\n /** Initial `Only Tracked` toggle state. */\n initialOnlyTracked?: boolean;\n /** Map of known-wallet addresses → human-readable labels. */\n wellKnownAddresses?: Record<string, string>;\n className?: string;\n renderAddress?: (address: string) => React.ReactNode;\n}\n\n/**\n * Live-paginated, sortable token holders list consuming the Phase 3\n * `/v2/token/{chain}/{address}/holders` endpoint. Axiom-parity upgrades:\n * adds a client-side `Only Tracked` filter and supports a\n * `wellKnownAddresses` map that replaces known pool / named-wallet\n * addresses with a human-readable badge (e.g. `LIQUIDITY POOL`).\n */\nexport function TokenHoldersListWidget({\n chain,\n address,\n limit,\n initialSortBy,\n initialOnlyTracked = false,\n wellKnownAddresses,\n className,\n renderAddress,\n}: TokenHoldersListWidgetProps) {\n const [onlyTracked, setOnlyTracked] = useState(initialOnlyTracked);\n const { holders, isLoading, sortBy, setSortBy, hasMore, loadMore } =\n useTokenHoldersListScript({ chain, address, limit, initialSortBy });\n return (\n <TokenHoldersList\n holders={holders}\n isLoading={isLoading}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n onlyTracked={onlyTracked}\n onOnlyTrackedChange={setOnlyTracked}\n wellKnownAddresses={wellKnownAddresses}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n renderAddress={renderAddress}\n />\n );\n}\n","import type { Activity, API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPrice,\n} from \"@liberfi.io/utils\";\nimport { TraderTagBadgeList } from \"../../shared\";\nimport { formatAgeShort, truncateMiddle } from \"../shared\";\n\nexport type TokenActivitiesListSortBy = API.ActivitiesSortBy;\n\n/**\n * Axiom-style trader-tag filter applied client-side on top of the paged\n * result. `all` is the default; `dev` / `tracked` / `you` narrow the view.\n */\nexport type TokenActivitiesListTraderFilter = \"all\" | \"dev\" | \"tracked\" | \"you\";\n\n/** Amount column currency toggle (USD vs native). */\nexport type TokenActivitiesListCurrency = \"usd\" | \"native\";\n\nexport interface TokenActivitiesListProps {\n activities: Array<Activity>;\n isLoading?: boolean;\n sortBy: TokenActivitiesListSortBy;\n onSortByChange: (sortBy: TokenActivitiesListSortBy) => void;\n /** filter by activity type; \"all\" shows everything including liquidity / red packets */\n typeFilter?: \"all\" | \"buy\" | \"sell\";\n onTypeFilterChange?: (t: \"all\" | \"buy\" | \"sell\") => void;\n /**\n * Axiom-style DEV / TRACKED / YOU filter. Purely client-side; narrows\n * the visible rows without refetching.\n */\n traderFilter?: TokenActivitiesListTraderFilter;\n onTraderFilterChange?: (t: TokenActivitiesListTraderFilter) => void;\n /** Your wallet address — required for the `you` filter to work. */\n youWalletAddress?: string;\n /** USD / native currency toggle. Defaults to `usd`. */\n currency?: TokenActivitiesListCurrency;\n onCurrencyChange?: (c: TokenActivitiesListCurrency) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n /** reference time for age display; defaults to `Date.now()` */\n now?: number;\n /** native token decimals for gas-fee formatting, default 9 (lamports on SOL) */\n nativeDecimals?: number;\n /** native token symbol, default \"SOL\" */\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\nconst SORT_OPTIONS: Array<{ value: TokenActivitiesListSortBy; label: string }> =\n [\n { value: \"timestamp\", label: \"Latest\" },\n { value: \"totalUsd\", label: \"Top USD\" },\n ];\n\nconst TYPE_OPTIONS: Array<{ value: \"all\" | \"buy\" | \"sell\"; label: string }> = [\n { value: \"all\", label: \"All\" },\n { value: \"buy\", label: \"Buys\" },\n { value: \"sell\", label: \"Sells\" },\n];\n\n/**\n * Presentational token activities list (Phase 3). Shows per-activity:\n * - side (buy/sell/liquidity/red packet)\n * - trader address + trader tags\n * - amount (native + usd)\n * - price\n * - gas fee (native denominated)\n * - age\n */\nconst TRADER_OPTIONS: Array<{\n value: TokenActivitiesListTraderFilter;\n label: string;\n}> = [\n { value: \"all\", label: \"All\" },\n { value: \"dev\", label: \"DEV\" },\n { value: \"tracked\", label: \"TRACKED\" },\n { value: \"you\", label: \"YOU\" },\n];\n\nexport function TokenActivitiesList({\n activities,\n isLoading,\n sortBy,\n onSortByChange,\n typeFilter = \"all\",\n onTypeFilterChange,\n traderFilter = \"all\",\n onTraderFilterChange,\n youWalletAddress,\n currency = \"usd\",\n onCurrencyChange,\n onLoadMore,\n hasMore,\n now = Date.now(),\n nativeDecimals = 9,\n nativeSymbol = \"SOL\",\n className,\n onRowClick,\n}: TokenActivitiesListProps) {\n const filteredActivities = filterByTraderFilter(\n activities,\n traderFilter,\n youWalletAddress,\n );\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <div className=\"flex items-center gap-1\">\n {TYPE_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onTypeFilterChange?.(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n typeFilter === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n <span className=\"mx-1 h-3 w-px bg-default-200\" aria-hidden />\n {TRADER_OPTIONS.map((opt) => {\n const active = traderFilter === opt.value;\n const disabled = opt.value === \"you\" && !youWalletAddress;\n return (\n <button\n key={opt.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => onTraderFilterChange?.(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n active\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <CurrencyToggle\n value={currency}\n nativeSymbol={nativeSymbol}\n onChange={onCurrencyChange}\n />\n <div className=\"flex items-center gap-1\">\n {SORT_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onSortByChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n sortBy === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[780px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[10%] px-3 py-2 text-left font-normal\">Side</th>\n <th className=\"w-[25%] px-3 py-2 text-left font-normal\">\n Trader\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">USD</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Price\n </th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Gas</th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Age</th>\n </tr>\n </thead>\n <tbody>\n {filteredActivities.length === 0 && !isLoading && (\n <tr>\n <td colSpan={7} className=\"py-8 text-center text-default-400\">\n No activities\n </td>\n </tr>\n )}\n {filteredActivities.map((a) => (\n <ActivityRow\n key={a.txHash}\n activity={a}\n now={now}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n currency={currency}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={7} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Determine which side of the trade the \"primary\" token is on.\n * For buy: user is receiving `to`; for sell: user is spending `from`.\n */\nfunction pickPrimaryToken(a: Activity) {\n if (a.type === \"buy\") return a.to;\n if (a.type === \"sell\") return a.from;\n return a.to;\n}\n\n/**\n * Client-side filter applied on top of the paged activities feed.\n *\n * - `all` — pass-through\n * - `dev` — trader tags contain `dev`\n * - `tracked` — trader tags contain `kol | smart | bluechip` (our closest proxy\n * for \"tracked by someone\")\n * - `you` — wallet address equals `youWalletAddress`\n *\n * Returns the original array reference when `filter === \"all\"` so React's\n * identity-based memo bail-outs still work.\n */\nfunction filterByTraderFilter(\n activities: Array<Activity>,\n filter: TokenActivitiesListTraderFilter,\n youWalletAddress?: string,\n): Array<Activity> {\n if (filter === \"all\") return activities;\n if (filter === \"you\") {\n if (!youWalletAddress) return [];\n const normalised = youWalletAddress.toLowerCase();\n return activities.filter(\n (a) => a.walletAddress?.toLowerCase() === normalised,\n );\n }\n if (filter === \"dev\") {\n return activities.filter((a) => a.traderTags?.some((t) => t === \"dev\"));\n }\n // `tracked`\n const trackedTags = new Set([\"kol\", \"smart\", \"bluechip\"]);\n return activities.filter((a) =>\n a.traderTags?.some((t) => trackedTags.has(t as string)),\n );\n}\n\nfunction CurrencyToggle({\n value,\n nativeSymbol,\n onChange,\n}: {\n value: TokenActivitiesListCurrency;\n nativeSymbol: string;\n onChange?: (value: TokenActivitiesListCurrency) => void;\n}) {\n const options: Array<{ k: TokenActivitiesListCurrency; label: string }> = [\n { k: \"usd\", label: \"USD\" },\n { k: \"native\", label: nativeSymbol },\n ];\n return (\n <div className=\"flex h-[22px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {options.map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onChange?.(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n value === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction formatGasFee(\n gasFee: string | undefined,\n nativeDecimals: number,\n nativeSymbol: string,\n): string {\n if (!gasFee) return \"--\";\n const n = Number(gasFee) / Math.pow(10, nativeDecimals);\n if (!Number.isFinite(n)) return \"--\";\n return `${formatAmount(n)} ${nativeSymbol}`;\n}\n\nfunction ActivityRow({\n activity,\n now,\n nativeDecimals,\n nativeSymbol,\n currency,\n onRowClick,\n}: {\n activity: Activity;\n now: number;\n nativeDecimals: number;\n nativeSymbol: string;\n currency: TokenActivitiesListCurrency;\n onRowClick?: (activity: Activity) => void;\n}) {\n const primary = pickPrimaryToken(activity);\n const sideLabel =\n activity.type === \"buy\"\n ? \"Buy\"\n : activity.type === \"sell\"\n ? \"Sell\"\n : activity.type.replace(/_/g, \" \");\n const sideColor =\n activity.type === \"buy\"\n ? \"text-bullish\"\n : activity.type === \"sell\"\n ? \"text-bearish\"\n : \"text-default-500\";\n\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(activity) : undefined}\n >\n <td\n className={cn(\n \"px-3 py-2 align-middle font-medium capitalize\",\n sideColor,\n )}\n >\n {sideLabel}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"font-mono text-[11px] text-default-500\">\n {truncateMiddle(activity.walletAddress, 6, 6)}\n </span>\n <TraderTagBadgeList tags={activity.traderTags} max={2} />\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n {formatAmount(primary.amount)} {primary.symbol}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {/* USD / native total column. The native branch is a pass-through\n until the server exposes a native-denominated total — we keep\n USD as a graceful fallback so the cell is never blank. */}\n {currency === \"native\" &&\n (primary as { amountInNative?: string }).amountInNative\n ? `${formatAmount(\n (primary as { amountInNative?: string }).amountInNative!,\n )} ${primary.symbol}`\n : primary.amountInUsd\n ? formatAmountUSDCompact(primary.amountInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {primary.priceInUsd ? `$${formatPrice(primary.priceInUsd)}` : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatGasFee(activity.gasFee, nativeDecimals, nativeSymbol)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatAgeShort(activity.time, now)}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useTokenActivitiesQuery,\n useTokenActivitiesSubscription,\n} from \"@liberfi.io/react\";\nimport type { API, Activity, Chain } from \"@liberfi.io/types\";\nimport type { TokenActivitiesListSortBy } from \"./token-activities-list.ui\";\n\nexport interface UseTokenActivitiesListScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: TokenActivitiesListSortBy;\n initialTypeFilter?: \"all\" | \"buy\" | \"sell\";\n}\n\nexport interface UseTokenActivitiesListScriptResult {\n activities: Array<Activity>;\n isLoading: boolean;\n sortBy: TokenActivitiesListSortBy;\n setSortBy: (s: TokenActivitiesListSortBy) => void;\n typeFilter: \"all\" | \"buy\" | \"sell\";\n setTypeFilter: (t: \"all\" | \"buy\" | \"sell\") => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 token activities list.\n *\n * Pagination: cursor accumulation with reset on any of (sortBy, typeFilter,\n * chain, address) changing — cursors are invalidated by server sort changes,\n * and semantic filters change the result set.\n *\n * Realtime: {@link useTokenActivitiesSubscription} prepends new activities to\n * the first page while we're on the default `timestamp` sort + `all` filter\n * (and no cursor has been pushed). In other states, live pushes are ignored\n * to avoid confusing the sorted / filtered window.\n */\nexport function useTokenActivitiesListScript({\n chain,\n address,\n limit = 50,\n initialSortBy = \"timestamp\",\n initialTypeFilter = \"all\",\n}: UseTokenActivitiesListScriptParams): UseTokenActivitiesListScriptResult {\n const [sortBy, setSortByState] =\n useState<TokenActivitiesListSortBy>(initialSortBy);\n const [typeFilter, setTypeFilterState] = useState<\"all\" | \"buy\" | \"sell\">(\n initialTypeFilter,\n );\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<Activity>>>([]);\n const [liveFront, setLiveFront] = useState<Array<Activity>>([]);\n\n const reset = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n setLiveFront([]);\n }, []);\n\n const setSortBy = useCallback(\n (s: TokenActivitiesListSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n reset();\n },\n [sortBy, reset],\n );\n\n const setTypeFilter = useCallback(\n (t: \"all\" | \"buy\" | \"sell\") => {\n if (t === typeFilter) return;\n setTypeFilterState(t);\n reset();\n },\n [typeFilter, reset],\n );\n\n useEffect(() => {\n reset();\n }, [chain, address, reset]);\n\n const queryType = typeFilter === \"all\" ? undefined : typeFilter;\n\n const queryParams = useMemo(\n () => ({ chain, address, cursor, limit, sortBy, type: queryType }),\n [chain, address, cursor, limit, sortBy, queryType],\n );\n\n const { data, isPending, isFetching } = useTokenActivitiesQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const liveEligible =\n sortBy === \"timestamp\" && typeFilter === \"all\" && cursor == null;\n\n useTokenActivitiesSubscription({ chain, address }, (incoming) => {\n if (!liveEligible || !incoming?.length) return;\n setLiveFront((prev) => {\n const seen = new Set(prev.map((a) => a.txHash));\n const fresh = incoming.filter((a) => !seen.has(a.txHash));\n if (fresh.length === 0) return prev;\n return [...fresh, ...prev].slice(0, 100);\n });\n });\n\n const activities = useMemo(() => {\n const paged = pages.flatMap((p) => p.data);\n if (!liveEligible || liveFront.length === 0) return paged;\n const seen = new Set(paged.map((a) => a.txHash));\n const frontFiltered = liveFront.filter((a) => !seen.has(a.txHash));\n return [...frontFiltered, ...paged];\n }, [pages, liveFront, liveEligible]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n activities,\n isLoading: isPending || isFetching,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { Activity, Chain } from \"@liberfi.io/types\";\nimport { useTokenActivitiesListScript } from \"./token-activities-list.script\";\nimport {\n TokenActivitiesList,\n type TokenActivitiesListCurrency,\n type TokenActivitiesListSortBy,\n type TokenActivitiesListTraderFilter,\n} from \"./token-activities-list.ui\";\n\nexport interface TokenActivitiesListWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: TokenActivitiesListSortBy;\n initialTypeFilter?: \"all\" | \"buy\" | \"sell\";\n /** Axiom-style DEV / TRACKED / YOU filter. Defaults to `all`. */\n initialTraderFilter?: TokenActivitiesListTraderFilter;\n /** Initial USD / native toggle state. Defaults to `usd`. */\n initialCurrency?: TokenActivitiesListCurrency;\n /** Your wallet address — required for the `you` filter option to light up. */\n youWalletAddress?: string;\n /** native token decimals for gas-fee formatting, default 9 (lamports on SOL) */\n nativeDecimals?: number;\n /** native token symbol, default \"SOL\" */\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\n/**\n * Phase 3 token-activities list widget, upgraded to Axiom parity.\n *\n * Replaces the legacy `getTokenTrades` call with `getTokenActivities` and\n * renders `traderTags` + `gasFee`, plus the Axiom-style `DEV / TRACKED /\n * YOU` trader filter and a USD / native currency toggle. The trader\n * filter is applied client-side on top of the paged results.\n */\nexport function TokenActivitiesListWidget({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n initialTraderFilter = \"all\",\n initialCurrency = \"usd\",\n youWalletAddress,\n nativeDecimals,\n nativeSymbol,\n className,\n onRowClick,\n}: TokenActivitiesListWidgetProps) {\n const [traderFilter, setTraderFilter] =\n useState<TokenActivitiesListTraderFilter>(initialTraderFilter);\n const [currency, setCurrency] =\n useState<TokenActivitiesListCurrency>(initialCurrency);\n const {\n activities,\n isLoading,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n } = useTokenActivitiesListScript({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n });\n\n return (\n <TokenActivitiesList\n activities={activities}\n isLoading={isLoading}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n typeFilter={typeFilter}\n onTypeFilterChange={setTypeFilter}\n traderFilter={traderFilter}\n onTraderFilterChange={setTraderFilter}\n youWalletAddress={youWalletAddress}\n currency={currency}\n onCurrencyChange={setCurrency}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { TokenStats } from \"@liberfi.io/types\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { BuySellOverview } from \"../shared\";\n\nexport type OverviewResolution = keyof TokenStats;\n\nexport interface TokenTradersOverviewProps {\n stats?: TokenStats;\n resolution: OverviewResolution;\n className?: string;\n}\n\n/**\n * Traders overview — total unique traders for a timeframe, split by\n * buyers / sellers.\n */\nexport function TokenTradersOverview({\n stats,\n resolution,\n className,\n}: TokenTradersOverviewProps) {\n const r = stats?.[resolution];\n const total = r?.traders ?? 0;\n const buys = r?.buyers ?? 0;\n const sells = r?.sellers ?? 0;\n return (\n <BuySellOverview\n className={className}\n label={`Traders (${resolution})`}\n totalFormatted={formatAmount(total)}\n buysFormatted={formatAmount(buys)}\n sellsFormatted={formatAmount(sells)}\n totalValue={total}\n buysValue={buys}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenTradersOverviewScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenTradersOverviewScript } from \"./token-traders-overview.script\";\nimport {\n TokenTradersOverview,\n type OverviewResolution,\n} from \"./token-traders-overview.ui\";\n\nexport interface TokenTradersOverviewWidgetProps {\n chain: Chain;\n address: string;\n resolution?: OverviewResolution;\n className?: string;\n}\n\nexport function TokenTradersOverviewWidget({\n chain,\n address,\n resolution = \"24h\",\n className,\n}: TokenTradersOverviewWidgetProps) {\n const { token } = useTokenTradersOverviewScript(chain, address);\n return (\n <TokenTradersOverview\n stats={token?.stats}\n resolution={resolution}\n className={className}\n />\n );\n}\n","import type { TokenStats } from \"@liberfi.io/types\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { BuySellOverview } from \"../shared\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\n\nexport interface TokenTransactionsOverviewProps {\n stats?: TokenStats;\n resolution: OverviewResolution;\n className?: string;\n}\n\n/**\n * Transactions overview — total txs for a timeframe, split by buys / sells.\n */\nexport function TokenTransactionsOverview({\n stats,\n resolution,\n className,\n}: TokenTransactionsOverviewProps) {\n const r = stats?.[resolution];\n const total = r?.trades ?? 0;\n const buys = r?.buys ?? 0;\n const sells = r?.sells ?? 0;\n return (\n <BuySellOverview\n className={className}\n label={`Transactions (${resolution})`}\n totalFormatted={formatAmount(total)}\n buysFormatted={formatAmount(buys)}\n sellsFormatted={formatAmount(sells)}\n totalValue={total}\n buysValue={buys}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenTransactionsOverviewScript(\n chain: Chain,\n address: string,\n) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\nimport { useTokenTransactionsOverviewScript } from \"./token-transactions-overview.script\";\nimport { TokenTransactionsOverview } from \"./token-transactions-overview.ui\";\n\nexport interface TokenTransactionsOverviewWidgetProps {\n chain: Chain;\n address: string;\n resolution?: OverviewResolution;\n className?: string;\n}\n\nexport function TokenTransactionsOverviewWidget({\n chain,\n address,\n resolution = \"24h\",\n className,\n}: TokenTransactionsOverviewWidgetProps) {\n const { token } = useTokenTransactionsOverviewScript(chain, address);\n return (\n <TokenTransactionsOverview\n stats={token?.stats}\n resolution={resolution}\n className={className}\n />\n );\n}\n","import type { TokenStats } from \"@liberfi.io/types\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { BuySellOverview } from \"../shared\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\n\nexport interface TokenVolumesOverviewProps {\n stats?: TokenStats;\n resolution: OverviewResolution;\n className?: string;\n}\n\n/**\n * Volumes overview — total volume (in USD) for a timeframe, split by buy /\n * sell volume.\n */\nexport function TokenVolumesOverview({\n stats,\n resolution,\n className,\n}: TokenVolumesOverviewProps) {\n const r = stats?.[resolution];\n const total = r?.volumesInUsd ?? \"0\";\n const buys = r?.buyVolumesInUsd ?? \"0\";\n const sells = r?.sellVolumesInUsd ?? \"0\";\n return (\n <BuySellOverview\n className={className}\n label={`Volume (${resolution})`}\n totalFormatted={formatAmountUSDCompact(total)}\n buysFormatted={formatAmountUSDCompact(buys)}\n sellsFormatted={formatAmountUSDCompact(sells)}\n totalValue={total}\n buysValue={buys}\n />\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenVolumesOverviewScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport type { OverviewResolution } from \"../token-traders-overview/token-traders-overview.ui\";\nimport { useTokenVolumesOverviewScript } from \"./token-volumes-overview.script\";\nimport { TokenVolumesOverview } from \"./token-volumes-overview.ui\";\n\nexport interface TokenVolumesOverviewWidgetProps {\n chain: Chain;\n address: string;\n resolution?: OverviewResolution;\n className?: string;\n}\n\nexport function TokenVolumesOverviewWidget({\n chain,\n address,\n resolution = \"24h\",\n className,\n}: TokenVolumesOverviewWidgetProps) {\n const { token } = useTokenVolumesOverviewScript(chain, address);\n return (\n <TokenVolumesOverview\n stats={token?.stats}\n resolution={resolution}\n className={className}\n />\n );\n}\n","import type { TokenSecurity as TokenSecurityData } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface TokenSecurityProps {\n security?: TokenSecurityData;\n /** link to the external auditor (e.g. GoPlus) */\n externalUrl?: string;\n /** text for the external link; omitted = no footer link */\n externalLabel?: string;\n className?: string;\n}\n\ninterface SecurityItemSpec {\n title: string;\n value: boolean | undefined;\n /** whether true means \"safe\" */\n safeWhen: boolean;\n description?: string;\n}\n\n/**\n * Presentational security summary built off `TokenSecurity` domain flags.\n * Each row shows a security attribute + a safe / unsafe tag.\n */\nexport function TokenSecurity({\n security,\n externalUrl,\n externalLabel,\n className,\n}: TokenSecurityProps) {\n const items: Array<SecurityItemSpec> = [\n {\n title: \"Transfer fee\",\n value: security?.hasTransferFee,\n safeWhen: false,\n description: \"Whether the token charges a fee on transfer.\",\n },\n {\n title: \"Fee not upgradable\",\n value: security?.isTransferFeeUpgradable,\n safeWhen: false,\n description: \"Whether the transfer fee can be raised by the token owner.\",\n },\n {\n title: \"Transferable\",\n value: security?.isTransferable,\n safeWhen: true,\n description: \"Whether token holders can freely transfer the token.\",\n },\n {\n title: \"Not freezable\",\n value: security?.isFreezable,\n safeWhen: false,\n description: \"Whether the token authority can freeze holder balances.\",\n },\n {\n title: \"Not closable\",\n value: security?.isClosable,\n safeWhen: false,\n description: \"Whether the token program can be closed by its owner.\",\n },\n ];\n\n const allSafe = items.every(\n (it) => it.value !== undefined && it.value === it.safeWhen,\n );\n\n return (\n <section className={cn(\"flex w-full flex-col gap-3\", className)}>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Security</span>\n <span\n className={cn(\n \"text-xs\",\n security === undefined\n ? \"text-default-400\"\n : allSafe\n ? \"text-success-500\"\n : \"text-danger-500\",\n )}\n >\n {security === undefined ? \"--\" : allSafe ? \"Safe\" : \"Review\"}\n </span>\n </div>\n <div className=\"flex flex-col\">\n {items.map((item) => (\n <SecurityItem key={item.title} {...item} />\n ))}\n </div>\n {externalUrl && externalLabel && (\n <div className=\"flex justify-center\">\n <a\n href={externalUrl}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {externalLabel}\n </a>\n </div>\n )}\n </section>\n );\n}\n\nfunction SecurityItem({\n title,\n value,\n safeWhen,\n description,\n}: SecurityItemSpec) {\n const safe = value !== undefined && value === safeWhen;\n const display = value === undefined ? \"--\" : safe ? \"OK\" : \"Risk\";\n return (\n <div className=\"flex h-8 items-center justify-between gap-2\">\n <span className=\"text-xs text-default-500\" title={description}>\n {title}\n </span>\n <span\n className={cn(\n \"text-xs\",\n value === undefined\n ? \"text-default-400\"\n : safe\n ? \"text-success-500\"\n : \"text-danger-500\",\n )}\n >\n {display}\n </span>\n </div>\n );\n}\n","import { useTokenSecurityQuery } from \"@liberfi.io/react\";\nimport type { Chain } from \"@liberfi.io/types\";\n\n/**\n * Script for {@link TokenSecurityWidget} — fetches the domain security flags\n * from `useTokenSecurityQuery`.\n */\nexport function useTokenSecurityScript(chain: Chain, address: string) {\n const { data, isLoading } = useTokenSecurityQuery({ chain, address });\n return { security: data, isLoading };\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenSecurityScript } from \"./token-security.script\";\nimport { TokenSecurity } from \"./token-security.ui\";\n\nexport interface TokenSecurityWidgetProps {\n chain: Chain;\n address: string;\n /** URL to the external auditor (e.g. GoPlus). */\n externalUrl?: string;\n /** Link label for the external auditor; omitted = no footer link. */\n externalLabel?: string;\n className?: string;\n}\n\n/**\n * Token security widget built on top of {@link useTokenSecurityQuery}. Caller\n * passes in the external auditor link (the widget is auditor-agnostic).\n */\nexport function TokenSecurityWidget({\n chain,\n address,\n externalUrl,\n externalLabel,\n className,\n}: TokenSecurityWidgetProps) {\n const { security } = useTokenSecurityScript(chain, address);\n return (\n <TokenSecurity\n security={security}\n externalUrl={externalUrl}\n externalLabel={externalLabel}\n className={className}\n />\n );\n}\n","import type { Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\n\nexport interface TokenAboutProps {\n token?: Token;\n className?: string;\n}\n\n/**\n * Token description / \"About\" section. Shows the token name, symbol and\n * human-readable description when present. Hidden when `token` has no\n * description or metadata beyond its ticker.\n */\nexport function TokenAbout({ token, className }: TokenAboutProps) {\n if (!token) return null;\n return (\n <section className={cn(\"flex w-full flex-col gap-2\", className)}>\n <div className=\"text-sm font-medium text-foreground\">\n About {token.symbol}\n </div>\n {token.description ? (\n <p className=\"whitespace-pre-line text-xs text-default-500\">\n {token.description}\n </p>\n ) : (\n <p className=\"text-xs text-default-400\">No description provided.</p>\n )}\n </section>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenAboutScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenAboutScript } from \"./token-about.script\";\nimport { TokenAbout } from \"./token-about.ui\";\n\nexport interface TokenAboutWidgetProps {\n chain: Chain;\n address: string;\n className?: string;\n}\n\nexport function TokenAboutWidget({\n chain,\n address,\n className,\n}: TokenAboutWidgetProps) {\n const { token } = useTokenAboutScript(chain, address);\n return <TokenAbout token={token} className={className} />;\n}\n","import { useState, useCallback } from \"react\";\nimport type { TokenLiquidity } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { truncateMiddle } from \"../shared\";\n\nexport interface TokenLiquiditiesProps {\n liquidities?: Array<TokenLiquidity>;\n /** aggregate TVL (usd) shown in the header */\n totalTvlInUsd?: string;\n /** number of pools shown before \"show more\" kicks in */\n collapseAt?: number;\n className?: string;\n /** optional click handler for a pool row (e.g. deep-link to the explorer) */\n onPoolClick?: (liquidity: TokenLiquidity) => void;\n}\n\n/**\n * Token DEX liquidity breakdown. Each row shows protocol family, pool address\n * (truncated), and the pool's TVL.\n */\nexport function TokenLiquidities({\n liquidities,\n totalTvlInUsd,\n collapseAt = 3,\n className,\n onPoolClick,\n}: TokenLiquiditiesProps) {\n const [expanded, setExpanded] = useState(\n !liquidities || liquidities.length <= collapseAt,\n );\n const toggle = useCallback(() => setExpanded((v) => !v), []);\n\n return (\n <section className={cn(\"flex w-full flex-col gap-3\", className)}>\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Liquidity</span>\n {totalTvlInUsd && (\n <span className=\"text-xs text-foreground\">\n {formatAmountUSDCompact(totalTvlInUsd)}\n </span>\n )}\n </div>\n\n {(!liquidities || liquidities.length === 0) && (\n <div className=\"py-4 text-center text-xs text-default-400\">\n No pools\n </div>\n )}\n\n {liquidities && liquidities.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {liquidities.map((lq, i) => (\n <div\n key={lq.poolAddress ?? `${lq.protocolFamily}-${i}`}\n className={cn(\n \"flex h-10 w-full items-center justify-between overflow-hidden text-xs\",\n i >= collapseAt && !expanded && \"hidden\",\n onPoolClick && \"cursor-pointer hover:bg-default-50\",\n )}\n onClick={onPoolClick ? () => onPoolClick(lq) : undefined}\n >\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">\n {lq.protocolFamily ?? lq.protocolName ?? \"Unknown\"}\n </span>\n {lq.poolAddress && (\n <span className=\"font-mono text-[10px] text-default-400\">\n Pool: {truncateMiddle(lq.poolAddress, 6, 6)}\n </span>\n )}\n </div>\n <div className=\"text-default-500\">\n {formatAmountUSDCompact(lq.tvlInUsd ?? 0)}\n </div>\n </div>\n ))}\n {liquidities.length > collapseAt && (\n <div className=\"flex justify-center pt-1\">\n <button\n type=\"button\"\n onClick={toggle}\n className=\"rounded px-2 py-1 text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n </div>\n )}\n </div>\n )}\n </section>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenLiquiditiesScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain, TokenLiquidity } from \"@liberfi.io/types\";\nimport { useTokenLiquiditiesScript } from \"./token-liquidities.script\";\nimport { TokenLiquidities } from \"./token-liquidities.ui\";\n\nexport interface TokenLiquiditiesWidgetProps {\n chain: Chain;\n address: string;\n collapseAt?: number;\n className?: string;\n onPoolClick?: (liquidity: TokenLiquidity) => void;\n}\n\nexport function TokenLiquiditiesWidget({\n chain,\n address,\n collapseAt,\n className,\n onPoolClick,\n}: TokenLiquiditiesWidgetProps) {\n const { token } = useTokenLiquiditiesScript(chain, address);\n return (\n <TokenLiquidities\n liquidities={token?.liquidities}\n totalTvlInUsd={token?.marketData?.tvlInUsd}\n collapseAt={collapseAt}\n className={className}\n onPoolClick={onPoolClick}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { Chip, Image, cn } from \"@liberfi.io/ui\";\n\nexport interface CexListingEntry {\n id: string;\n name: string;\n logo?: string;\n url?: string;\n}\n\nexport interface TokenCexListingProps {\n cexes?: Array<CexListingEntry>;\n collapseAt?: number;\n className?: string;\n}\n\n/**\n * Displays centralized exchanges where the token is listed. Data is\n * app-supplied via props because the `@liberfi.io/types#Token` domain type\n * does not model CEX listings.\n */\nexport function TokenCexListing({\n cexes,\n collapseAt = 4,\n className,\n}: TokenCexListingProps) {\n const [expanded, setExpanded] = useState(\n !cexes || cexes.length <= collapseAt,\n );\n const toggle = useCallback(() => setExpanded((v) => !v), []);\n\n if (!cexes || cexes.length === 0) return null;\n\n return (\n <section className={cn(\"w-full\", className)}>\n <div className=\"text-sm font-medium text-foreground\">CEX listings</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {cexes.map((cex, i) => {\n const hidden = i >= collapseAt && !expanded;\n const chip = (\n <Chip\n key={cex.id}\n startContent={\n cex.logo ? (\n <Image src={cex.logo} width={20} height={20} alt={cex.name} />\n ) : undefined\n }\n className={cn(\"bg-default-100 text-xs\", hidden && \"hidden\")}\n >\n {cex.name}\n </Chip>\n );\n return cex.url ? (\n <a\n key={cex.id}\n href={cex.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={cn(hidden && \"hidden\")}\n >\n {chip}\n </a>\n ) : (\n chip\n );\n })}\n </div>\n {cexes.length > collapseAt && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={toggle}\n className=\"rounded px-2 py-1 text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n </div>\n )}\n </section>\n );\n}\n","import type { CexListingEntry } from \"./token-cex-listing.ui\";\n\n/**\n * Script for the CEX listing widget. Today the `@liberfi.io/types#Token`\n * domain type does not expose CEX listings, so the script is a pass-through\n * that the caller uses to keep the widget's state-shape centralized. The\n * caller is expected to source CEX data from its own application APIs.\n */\nexport function useTokenCexListingScript(cexes?: Array<CexListingEntry>) {\n return { cexes };\n}\n","import { useTokenCexListingScript } from \"./token-cex-listing.script\";\nimport { TokenCexListing, type CexListingEntry } from \"./token-cex-listing.ui\";\n\nexport interface TokenCexListingWidgetProps {\n /** caller-supplied CEX listings; domain type does not model this */\n cexes?: Array<CexListingEntry>;\n collapseAt?: number;\n className?: string;\n}\n\n/**\n * Caller-data CEX listings widget. The script layer is a pass-through because\n * the SDK's `Token` does not carry CEX listing data.\n */\nexport function TokenCexListingWidget({\n cexes: cexesProp,\n collapseAt,\n className,\n}: TokenCexListingWidgetProps) {\n const { cexes } = useTokenCexListingScript(cexesProp);\n return (\n <TokenCexListing\n cexes={cexes}\n collapseAt={collapseAt}\n className={className}\n />\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { Chip, cn } from \"@liberfi.io/ui\";\n\nexport interface TokenCategoriesProps {\n categories?: Array<string>;\n collapseAt?: number;\n className?: string;\n onCategoryClick?: (category: string) => void;\n}\n\n/**\n * Displays token classification tags (e.g. \"meme\", \"defi\", \"ai\"). Data is\n * sourced from `token.tags` by the widget layer.\n */\nexport function TokenCategories({\n categories,\n collapseAt = 4,\n className,\n onCategoryClick,\n}: TokenCategoriesProps) {\n const [expanded, setExpanded] = useState(\n !categories || categories.length <= collapseAt,\n );\n const toggle = useCallback(() => setExpanded((v) => !v), []);\n\n if (!categories || categories.length === 0) return null;\n\n return (\n <section className={cn(\"w-full\", className)}>\n <div className=\"text-sm font-medium text-foreground\">Categories</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {categories.map((tag, i) => {\n const hidden = i >= collapseAt && !expanded;\n return (\n <Chip\n key={tag}\n size=\"sm\"\n className={cn(\n \"bg-default-100\",\n hidden && \"hidden\",\n onCategoryClick && \"cursor-pointer\",\n )}\n onClick={onCategoryClick ? () => onCategoryClick(tag) : undefined}\n >\n {tag}\n </Chip>\n );\n })}\n </div>\n {categories.length > collapseAt && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={toggle}\n className=\"rounded px-2 py-1 text-xs text-default-400 transition-colors hover:text-foreground\"\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n </div>\n )}\n </section>\n );\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport function useTokenCategoriesScript(chain: Chain, address: string) {\n return useLiveToken(chain, address);\n}\n","import type { Chain } from \"@liberfi.io/types\";\nimport { useTokenCategoriesScript } from \"./token-categories.script\";\nimport { TokenCategories } from \"./token-categories.ui\";\n\nexport interface TokenCategoriesWidgetProps {\n chain: Chain;\n address: string;\n collapseAt?: number;\n className?: string;\n onCategoryClick?: (category: string) => void;\n}\n\nexport function TokenCategoriesWidget({\n chain,\n address,\n collapseAt,\n className,\n onCategoryClick,\n}: TokenCategoriesWidgetProps) {\n const { token } = useTokenCategoriesScript(chain, address);\n return (\n <TokenCategories\n categories={token?.tags}\n collapseAt={collapseAt}\n className={className}\n onCategoryClick={onCategoryClick}\n />\n );\n}\n","\"use client\";\n\nimport type { TokenStats, TokenStatsByResolution } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\n\n/**\n * Resolution used by the base stat cells. Axiom uses the chart's active\n * resolution here (defaults to `5m`).\n */\nexport type TokenStatsFlipBaseResolution =\n | \"1m\"\n | \"5m\"\n | \"15m\"\n | \"30m\"\n | \"1h\"\n | \"4h\"\n | \"24h\";\n\n/**\n * Time windows displayed in the hover overlay (price change % per window).\n *\n * NOTE: Axiom shows `5m / 1h / 6h / 24h`. Our server schema exposes\n * `5m / 1h / 4h / 24h` (no native 6h window), so we default to that set\n * and document the delta. Consumers can override via\n * {@link TokenStatsFlipProps.hoverResolutions}.\n */\nexport type TokenStatsFlipHoverResolution = TokenStatsFlipBaseResolution;\n\nexport const DEFAULT_FLIP_HOVER_RESOLUTIONS: ReadonlyArray<TokenStatsFlipHoverResolution> =\n [\"5m\", \"1h\", \"4h\", \"24h\"];\n\nexport interface TokenStatsFlipBaseProps {\n stats: TokenStats | undefined;\n resolution: TokenStatsFlipBaseResolution;\n className?: string;\n}\n\n/**\n * Base layer — 4-cell grid showing `Volume / Buys / Sells / Net Volume` for\n * the active resolution, plus a 2px buy-share bar at the bottom.\n */\nexport function TokenStatsFlipBase({\n stats,\n resolution,\n className,\n}: TokenStatsFlipBaseProps) {\n const r = stats?.[resolution];\n const buyUsd = new SafeBigNumber(r?.buyVolumesInUsd ?? 0);\n const sellUsd = new SafeBigNumber(r?.sellVolumesInUsd ?? 0);\n const totalUsd = buyUsd.plus(sellUsd);\n const netUsd = buyUsd.minus(sellUsd);\n const buySharePct = totalUsd.eq(0)\n ? 50\n : Math.min(100, Math.max(0, buyUsd.div(totalUsd).times(100).toNumber()));\n\n const cells: Array<{\n label: string;\n value: string;\n className?: string;\n }> = [\n {\n label: `${resolution} Vol`,\n value: formatAmountUSDCompact(totalUsd.toString()),\n className: \"text-foreground\",\n },\n {\n label: \"Buys\",\n value: formatAmountUSDCompact(buyUsd.toString()),\n className: \"text-bullish\",\n },\n {\n label: \"Sells\",\n value: formatAmountUSDCompact(sellUsd.toString()),\n className: \"text-bearish\",\n },\n {\n label: \"Net Vol.\",\n value: formatAmountUSDCompact(netUsd.abs().toString()),\n className: netUsd.gte(0) ? \"text-bullish\" : \"text-bearish\",\n },\n ];\n\n return (\n <div className={cn(\"flex h-full w-full flex-col\", className)}>\n <div className=\"grid flex-1 grid-cols-4 items-center\">\n {cells.map((c) => (\n <div\n key={c.label}\n className=\"flex flex-col items-start justify-center gap-[2px] px-2\"\n >\n <span className=\"text-[10px] leading-none text-default-400\">\n {c.label}\n </span>\n <span\n className={cn(\n \"text-[13px] font-medium leading-none tabular-nums\",\n c.className,\n )}\n >\n {c.value}\n </span>\n </div>\n ))}\n </div>\n {/* 2px buy-share bar */}\n <div className=\"relative h-[2px] w-full overflow-hidden bg-bearish\">\n <div\n className=\"absolute inset-y-0 left-0 bg-bullish transition-[width] duration-200 ease-out\"\n style={{ width: `${buySharePct}%` }}\n />\n </div>\n </div>\n );\n}\n\nexport interface TokenStatsFlipHoverProps {\n stats: TokenStats | undefined;\n resolutions: ReadonlyArray<TokenStatsFlipHoverResolution>;\n className?: string;\n}\n\n/**\n * Hover overlay — 4-cell grid showing `priceChange %` per window with\n * bullish/bearish tint.\n */\nexport function TokenStatsFlipHover({\n stats,\n resolutions,\n className,\n}: TokenStatsFlipHoverProps) {\n return (\n <div\n className={cn(\"grid h-full w-full grid-cols-4 items-center\", className)}\n >\n {resolutions.map((res) => {\n const r: TokenStatsByResolution | undefined = stats?.[res];\n const raw = r?.priceChange;\n const bn = raw ? new SafeBigNumber(raw) : undefined;\n const isPositive = bn ? bn.gte(0) : undefined;\n const label = res;\n // `priceChange` is returned as a ratio (0.03 = 3%); format with leading\n // sign so positive values render as `+3.00%`.\n const display = bn\n ? formatPercent(bn, { showPlusGtThanZero: true })\n : \"—\";\n return (\n <div\n key={res}\n className=\"flex flex-col items-start justify-center gap-[2px] px-2\"\n >\n <span className=\"text-[10px] leading-none text-default-400\">\n {label}\n </span>\n <span\n className={cn(\n \"text-[13px] font-medium leading-none tabular-nums\",\n isPositive === undefined\n ? \"text-foreground\"\n : isPositive\n ? \"text-bullish\"\n : \"text-bearish\",\n )}\n >\n {display}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport interface TokenStatsFlipProps {\n stats: TokenStats | undefined;\n /** Resolution displayed in the base layer. Defaults to `5m`. */\n baseResolution?: TokenStatsFlipBaseResolution;\n /** Time windows displayed in the hover overlay. Defaults to `5m/1h/4h/24h`. */\n hoverResolutions?: ReadonlyArray<TokenStatsFlipHoverResolution>;\n /** Height override (panel height). Defaults to 64. */\n height?: number;\n className?: string;\n}\n","import { useTokenStatsQuery } from \"@liberfi.io/react\";\nimport type { Chain, TokenStats } from \"@liberfi.io/types\";\n\nexport interface UseTokenStatsFlipScriptParams {\n chain: Chain;\n address: string;\n}\n\n/**\n * Thin query wrapper for {@link TokenStatsFlipWidget}.\n *\n * Fetches the full `TokenStats` object — both base and hover layers read\n * different resolution slices off the same response, so a single query is\n * enough; no subscription wiring needed here (the hover resolutions are\n * refreshed with normal React Query stale/refetch semantics).\n */\nexport function useTokenStatsFlipScript({\n chain,\n address,\n}: UseTokenStatsFlipScriptParams): {\n stats: TokenStats | undefined;\n isLoading: boolean;\n} {\n const { data, isLoading } = useTokenStatsQuery({ chain, address });\n return { stats: data, isLoading };\n}\n","\"use client\";\n\nimport type { Chain } from \"@liberfi.io/types\";\nimport { StatsFlipPanel } from \"@liberfi.io/ui-scaffold\";\nimport { useTokenStatsFlipScript } from \"./token-stats-flip.script\";\nimport {\n DEFAULT_FLIP_HOVER_RESOLUTIONS,\n TokenStatsFlipBase,\n TokenStatsFlipHover,\n type TokenStatsFlipBaseResolution,\n type TokenStatsFlipHoverResolution,\n} from \"./token-stats-flip.ui\";\n\nexport interface TokenStatsFlipWidgetProps {\n chain: Chain;\n address: string;\n /** Resolution for the base layer. Defaults to `5m`. */\n baseResolution?: TokenStatsFlipBaseResolution;\n /** Hover overlay resolutions. Defaults to `5m / 1h / 4h / 24h`. */\n hoverResolutions?: ReadonlyArray<TokenStatsFlipHoverResolution>;\n /** Panel height. Defaults to 64. */\n height?: number;\n /** Extra className on the panel wrapper. */\n className?: string;\n}\n\n/**\n * TokenStatsFlipWidget — Axiom-style volume/price-change panel above the\n * Buy / Sell form.\n *\n * At rest shows `{res} Vol / Buys / Sells / Net Vol` for the active\n * resolution; on hover a blurred overlay cross-fades in with\n * `priceChange %` per window. A cursor-following radial glow adds the\n * signature Axiom interaction.\n */\nexport function TokenStatsFlipWidget({\n chain,\n address,\n baseResolution = \"5m\",\n hoverResolutions = DEFAULT_FLIP_HOVER_RESOLUTIONS,\n height = 64,\n className,\n}: TokenStatsFlipWidgetProps) {\n const { stats } = useTokenStatsFlipScript({ chain, address });\n return (\n <StatsFlipPanel\n className={className}\n height={height}\n base={<TokenStatsFlipBase stats={stats} resolution={baseResolution} />}\n hover={\n <TokenStatsFlipHover stats={stats} resolutions={hoverResolutions} />\n }\n />\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport type { PortfolioPnl } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\n\n/**\n * Amount display mode. Axiom offers a USD / SOL toggle; we generalise that\n * to `usd | native` so the same widget works on any chain. When unset, the\n * widget defaults to `usd`.\n */\nexport type TokenPositionsListCurrency = \"usd\" | \"native\";\n\nexport interface TokenPositionsListProps {\n positions: Array<PortfolioPnl>;\n isLoading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n /** Currency toggle. Defaults to `usd`. */\n currency?: TokenPositionsListCurrency;\n onCurrencyChange?: (currency: TokenPositionsListCurrency) => void;\n /** Show-hidden positions filter (UI hook only; parent owns state). */\n showHidden?: boolean;\n onShowHiddenChange?: (value: boolean) => void;\n /** Native token symbol shown in the toggle (e.g. `SOL`, `ETH`). Defaults to `Native`. */\n nativeSymbol?: string;\n /** Per-row action slot (buy / sell / hide). Parent owns which actions to render. */\n renderActions?: (position: PortfolioPnl) => ReactNode;\n className?: string;\n}\n\n/**\n * Presentational list of a wallet's open positions in a token context —\n * columns: `Token / Bought / Sold / Remaining / PnL / Actions`.\n *\n * The parent owns data and pagination; this component is purely visual.\n */\nexport function TokenPositionsList({\n positions,\n isLoading,\n hasMore,\n onLoadMore,\n currency = \"usd\",\n onCurrencyChange,\n showHidden = false,\n onShowHiddenChange,\n nativeSymbol = \"Native\",\n renderActions,\n className,\n}: TokenPositionsListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs font-medium text-default-500\">\n Positions\n </span>\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={showHidden}\n onChange={(e) => onShowHiddenChange?.(e.target.checked)}\n />\n Show Hidden\n </label>\n </div>\n <CurrencyToggle\n value={currency}\n nativeSymbol={nativeSymbol}\n onChange={onCurrencyChange}\n />\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[26%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Bought\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">Sold</th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n Remaining\n </th>\n <th className=\"w-[18%] px-3 py-2 text-right font-normal\">PnL</th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n Actions\n </th>\n </tr>\n </thead>\n <tbody>\n {positions.length === 0 && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No open positions\n </td>\n </tr>\n )}\n {positions.map((p) => (\n <PositionRow\n key={`${p.chain}:${p.address}`}\n position={p}\n currency={currency}\n renderActions={renderActions}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction CurrencyToggle({\n value,\n nativeSymbol,\n onChange,\n}: {\n value: TokenPositionsListCurrency;\n nativeSymbol: string;\n onChange?: (value: TokenPositionsListCurrency) => void;\n}) {\n const options: Array<{ k: TokenPositionsListCurrency; label: string }> = [\n { k: \"usd\", label: \"USD\" },\n { k: \"native\", label: nativeSymbol },\n ];\n return (\n <div className=\"flex h-[24px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {options.map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onChange?.(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n value === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction PositionRow({\n position,\n currency,\n renderActions,\n}: {\n position: PortfolioPnl;\n currency: TokenPositionsListCurrency;\n renderActions?: (position: PortfolioPnl) => ReactNode;\n}) {\n const { bought, sold, remaining, pnl } = useMemo(\n () => computePositionFields(position, currency),\n [position, currency],\n );\n\n const tokenCell = (\n <div className=\"flex items-center gap-2\">\n <Avatar\n src={position.image ?? undefined}\n name={(position.symbol ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-foreground\">{position.symbol}</span>\n <span className=\"truncate text-[10px] text-default-400\">\n {position.name}\n </span>\n </div>\n </div>\n );\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{tokenCell}</td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {bought}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {sold}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {remaining}\n </td>\n <td\n className={cn(\n \"px-3 py-2 text-right align-middle font-medium\",\n pnl.isPositive === undefined\n ? \"text-default-400\"\n : pnl.isPositive\n ? \"text-bullish\"\n : \"text-bearish\",\n )}\n >\n <div className=\"flex flex-col items-end leading-tight\">\n <span>{pnl.amount}</span>\n {pnl.ratio ? <span className=\"text-[10px]\">{pnl.ratio}</span> : null}\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n {renderActions ? (\n renderActions(position)\n ) : (\n <span className=\"text-default-400\">--</span>\n )}\n </td>\n </tr>\n );\n}\n\ninterface PositionRowFields {\n bought: string;\n sold: string;\n remaining: string;\n pnl: {\n amount: string;\n ratio?: string;\n isPositive?: boolean;\n };\n}\n\nfunction computePositionFields(\n p: PortfolioPnl,\n currency: TokenPositionsListCurrency,\n): PositionRowFields {\n const buyRaw = currency === \"usd\" ? p.buyVolumesInUsd : p.buyVolumes;\n const sellRaw = currency === \"usd\" ? p.sellVolumesInUsd : p.sellVolumes;\n const remainingRaw = currency === \"usd\" ? p.amountInUsd : p.amount;\n const pnlRaw = currency === \"usd\" ? p.totalProfitInUsd : p.totalProfitInUsd;\n\n const bought =\n currency === \"usd\"\n ? formatAmountUSDCompact(buyRaw ?? 0)\n : formatAmount(buyRaw ?? 0);\n const sold =\n currency === \"usd\"\n ? formatAmountUSDCompact(sellRaw ?? 0)\n : formatAmount(sellRaw ?? 0);\n const remaining =\n currency === \"usd\"\n ? formatAmountUSDCompact(remainingRaw ?? 0)\n : formatAmount(remainingRaw ?? 0);\n\n const pnlBn = pnlRaw ? new SafeBigNumber(pnlRaw) : undefined;\n const isPositive = pnlBn ? pnlBn.gte(0) : undefined;\n const pnlAmount = pnlBn\n ? (isPositive ? \"+\" : \"\") + formatAmountUSDCompact(pnlBn.toString())\n : \"--\";\n const pnlRatio = p.totalProfitRatio\n ? formatPercent(p.totalProfitRatio, { showPlusGtThanZero: true })\n : undefined;\n\n return {\n bought,\n sold,\n remaining,\n pnl: { amount: pnlAmount, ratio: pnlRatio, isPositive },\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletTokenPositionsQuery } from \"@liberfi.io/react\";\nimport type {\n Chain,\n PortfolioPnl,\n WalletPortfolioPnls,\n} from \"@liberfi.io/types\";\n\nexport interface UseTokenPositionsListScriptParams {\n chain: Chain;\n /** Wallet address. When empty, the hook remains disabled. */\n wallet?: string;\n /** Page size; defaults to 50. */\n limit?: number;\n /** Initial show-hidden toggle value. */\n initialShowHidden?: boolean;\n}\n\nexport interface UseTokenPositionsListScriptResult {\n positions: Array<PortfolioPnl>;\n isLoading: boolean;\n hasMore: boolean;\n loadMore: () => void;\n showHidden: boolean;\n setShowHidden: (value: boolean) => void;\n}\n\n/**\n * Script for the positions list widget.\n *\n * Uses {@link useWalletTokenPositionsQuery} (bridge over\n * `getWalletPortfolioPnls` with `positionState=open`) and accumulates pages\n * in local state. Hidden-filter is a purely client-side toggle; the server\n * does not expose a `hidden` flag on positions so the widget always keeps\n * the full list and the parent can filter / persist as desired.\n *\n * Query stays disabled when `wallet` is empty so the positions tab\n * renders gracefully for logged-out users.\n */\nexport function useTokenPositionsListScript({\n chain,\n wallet,\n limit = 50,\n initialShowHidden = false,\n}: UseTokenPositionsListScriptParams): UseTokenPositionsListScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<WalletPortfolioPnls>>([]);\n const [showHidden, setShowHidden] = useState(initialShowHidden);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, wallet]);\n\n const queryParams = useMemo(\n () => ({\n chain,\n address: wallet ?? \"\",\n cursor,\n limit,\n positionState: \"open\" as const,\n }),\n [chain, wallet, cursor, limit],\n );\n\n const { data, isPending, isFetching } = useWalletTokenPositionsQuery(\n queryParams,\n { enabled: !!wallet },\n );\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const positions = useMemo(() => pages.flatMap((p) => p.portfolios), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n positions,\n isLoading: !!wallet && (isPending || isFetching),\n hasMore,\n loadMore,\n showHidden,\n setShowHidden,\n };\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport type { Chain, PortfolioPnl } from \"@liberfi.io/types\";\nimport { useTokenPositionsListScript } from \"./token-positions-list.script\";\nimport {\n TokenPositionsList,\n type TokenPositionsListCurrency,\n} from \"./token-positions-list.ui\";\n\nexport interface TokenPositionsListWidgetProps {\n chain: Chain;\n /** Wallet address. When empty, the list is empty and the query is disabled. */\n wallet?: string;\n limit?: number;\n /** Initial currency. Defaults to `usd`. */\n initialCurrency?: TokenPositionsListCurrency;\n /** Native chain symbol used in the currency toggle (e.g. `SOL`). */\n nativeSymbol?: string;\n /** Optional per-row action slot. */\n renderActions?: (position: PortfolioPnl) => ReactNode;\n className?: string;\n}\n\n/**\n * Positions tab widget.\n *\n * Fetches the caller wallet's open positions via\n * `getWalletPortfolioPnls({ positionState: 'open' })` and renders the\n * Axiom-style columns. Currency (USD / native) and show-hidden toggles\n * are kept in local state; consumers wanting persistence should wrap\n * the widget and lift these up.\n */\nexport function TokenPositionsListWidget({\n chain,\n wallet,\n limit,\n initialCurrency = \"usd\",\n nativeSymbol,\n renderActions,\n className,\n}: TokenPositionsListWidgetProps) {\n const [currency, setCurrency] =\n useState<TokenPositionsListCurrency>(initialCurrency);\n const { positions, isLoading, hasMore, loadMore, showHidden, setShowHidden } =\n useTokenPositionsListScript({ chain, wallet, limit });\n\n return (\n <TokenPositionsList\n className={className}\n positions={positions}\n isLoading={isLoading}\n hasMore={hasMore}\n onLoadMore={loadMore}\n currency={currency}\n onCurrencyChange={setCurrency}\n showHidden={showHidden}\n onShowHiddenChange={setShowHidden}\n nativeSymbol={nativeSymbol}\n renderActions={renderActions}\n />\n );\n}\n","\"use client\";\n\nimport { useMemo, type ReactNode } from \"react\";\nimport type { LimitOrder, LimitOrderState } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\n\nexport type TokenOrdersListState = Extract<\n LimitOrderState,\n \"active\" | \"filled\" | \"cancelled\" | \"expired\"\n>;\n\n/**\n * Segmented state filter. Axiom exposes `Active Orders / Order History`; we\n * mirror that with `active` vs `history` (any non-active).\n */\nexport type TokenOrdersListStateFilter = \"active\" | \"history\";\n\nexport type TokenOrdersListCurrency = \"usd\" | \"native\";\n\nexport interface TokenOrdersListProps {\n orders: Array<LimitOrder>;\n isLoading?: boolean;\n /** If true, render a \"coming soon\" empty state. Used when the backend endpoint is missing. */\n unavailable?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n stateFilter: TokenOrdersListStateFilter;\n onStateFilterChange: (filter: TokenOrdersListStateFilter) => void;\n /** Token-scope filter (\"Only {SYMBOL}\"). Parent owns state. */\n onlyThisToken?: boolean;\n onOnlyThisTokenChange?: (value: boolean) => void;\n tokenSymbol?: string;\n /** Currency toggle. */\n currency?: TokenOrdersListCurrency;\n onCurrencyChange?: (currency: TokenOrdersListCurrency) => void;\n nativeSymbol?: string;\n /** Cancel-all button click handler; hidden when unset. */\n onCancelAll?: () => void;\n /** Per-row action slot. */\n renderActions?: (order: LimitOrder) => ReactNode;\n className?: string;\n}\n\n/**\n * Presentational list of a wallet's limit orders — columns `Token / Type /\n * Amount / Current MC / Target MC / Settings / Action`.\n *\n * Gracefully renders a \"coming soon\" empty state when the server endpoint\n * is not yet implemented (pass `unavailable`).\n */\nexport function TokenOrdersList({\n orders,\n isLoading,\n unavailable,\n hasMore,\n onLoadMore,\n stateFilter,\n onStateFilterChange,\n onlyThisToken = false,\n onOnlyThisTokenChange,\n tokenSymbol,\n currency = \"usd\",\n onCurrencyChange,\n nativeSymbol = \"Native\",\n onCancelAll,\n renderActions,\n className,\n}: TokenOrdersListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-[24px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {(\n [\n { k: \"active\" as const, label: \"Active Orders\" },\n { k: \"history\" as const, label: \"Order History\" },\n ] satisfies Array<{\n k: TokenOrdersListStateFilter;\n label: string;\n }>\n ).map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onStateFilterChange(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n stateFilter === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n {tokenSymbol ? (\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={onlyThisToken}\n onChange={(e) => onOnlyThisTokenChange?.(e.target.checked)}\n />\n Only {tokenSymbol}\n </label>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {onCancelAll ? (\n <button\n type=\"button\"\n onClick={onCancelAll}\n className=\"rounded px-2 py-1 text-[11px] text-bearish transition-colors hover:bg-default-100\"\n >\n Cancel All\n </button>\n ) : null}\n <CurrencyToggle\n value={currency}\n nativeSymbol={nativeSymbol}\n onChange={onCurrencyChange}\n />\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[22%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[10%] px-3 py-2 text-left font-normal\">Type</th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Current MC\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Target MC\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Settings\n </th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n Action\n </th>\n </tr>\n </thead>\n <tbody>\n {unavailable ? (\n <tr>\n <td colSpan={7} className=\"py-10 text-center text-default-400\">\n Limit orders are coming soon.\n </td>\n </tr>\n ) : orders.length === 0 && !isLoading ? (\n <tr>\n <td colSpan={7} className=\"py-10 text-center text-default-400\">\n No {stateFilter === \"active\" ? \"active\" : \"historical\"} orders\n </td>\n </tr>\n ) : (\n orders.map((o) => (\n <OrderRow\n key={o.id}\n order={o}\n currency={currency}\n renderActions={renderActions}\n />\n ))\n )}\n {isLoading && !unavailable && (\n <tr>\n <td colSpan={7} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {!unavailable && hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction CurrencyToggle({\n value,\n nativeSymbol,\n onChange,\n}: {\n value: TokenOrdersListCurrency;\n nativeSymbol: string;\n onChange?: (value: TokenOrdersListCurrency) => void;\n}) {\n const options: Array<{ k: TokenOrdersListCurrency; label: string }> = [\n { k: \"usd\", label: \"USD\" },\n { k: \"native\", label: nativeSymbol },\n ];\n return (\n <div className=\"flex h-[24px] items-center rounded bg-default-100 p-[2px] text-[11px]\">\n {options.map((o) => (\n <button\n key={o.k}\n type=\"button\"\n onClick={() => onChange?.(o.k)}\n className={cn(\n \"rounded px-2 transition-colors\",\n value === o.k\n ? \"bg-default-200 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction OrderRow({\n order,\n currency,\n renderActions,\n}: {\n order: LimitOrder;\n currency: TokenOrdersListCurrency;\n renderActions?: (order: LimitOrder) => ReactNode;\n}) {\n const amountDisplay = useMemo(() => {\n if (currency === \"usd\" && order.amountInUsd) {\n return formatAmountUSDCompact(order.amountInUsd);\n }\n return formatAmount(order.amount);\n }, [currency, order.amount, order.amountInUsd]);\n\n const side = order.side === \"buy\" ? \"Buy\" : \"Sell\";\n const sideClass = order.side === \"buy\" ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex items-center gap-2\">\n <Avatar\n src={order.tokenImage ?? undefined}\n name={(order.tokenSymbol ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <span className=\"truncate text-foreground\">\n {order.tokenSymbol ?? \"--\"}\n </span>\n </div>\n </td>\n <td className={cn(\"px-3 py-2 align-middle font-medium\", sideClass)}>\n {side}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {amountDisplay}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {order.currentMarketCapInUsd\n ? formatAmountUSDCompact(order.currentMarketCapInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {order.targetMarketCapInUsd\n ? formatAmountUSDCompact(order.targetMarketCapInUsd)\n : order.targetPriceInUsd\n ? formatAmountUSDCompact(order.targetPriceInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {order.slippage != null ? `Slip ${order.slippage}%` : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n {renderActions ? (\n renderActions(order)\n ) : (\n <span className=\"text-default-400\">--</span>\n )}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletLimitOrdersQuery } from \"@liberfi.io/react\";\nimport type {\n API,\n Chain,\n LimitOrder,\n LimitOrderState,\n} from \"@liberfi.io/types\";\nimport type { TokenOrdersListStateFilter } from \"./token-orders-list.ui\";\n\n/**\n * Cross-package duplicate of `@liberfi.io/client#isNotImplementedError`.\n * We avoid a runtime dep on `@liberfi.io/client` from `ui-tokens`; the\n * stable `code === \"NotImplemented\"` discriminant makes the check safe\n * across realms.\n */\nfunction isNotImplementedError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error as { code?: string }).code === \"NotImplemented\"\n );\n}\n\nexport interface UseTokenOrdersListScriptParams {\n chain: Chain;\n wallet?: string;\n /** Token address to use when `onlyThisToken` is true. */\n tokenAddress: string;\n limit?: number;\n initialStateFilter?: TokenOrdersListStateFilter;\n initialOnlyThisToken?: boolean;\n}\n\nexport interface UseTokenOrdersListScriptResult {\n orders: Array<LimitOrder>;\n isLoading: boolean;\n /** true when the backend endpoint is not implemented yet. */\n unavailable: boolean;\n hasMore: boolean;\n loadMore: () => void;\n stateFilter: TokenOrdersListStateFilter;\n setStateFilter: (filter: TokenOrdersListStateFilter) => void;\n onlyThisToken: boolean;\n setOnlyThisToken: (value: boolean) => void;\n}\n\n/**\n * Map the UI state filter to a concrete `LimitOrderState`.\n * `active` → a single state; `history` → the server would typically accept\n * any of `filled | cancelled | expired`. Since the backend is not yet\n * implemented we simply forward `active` / `filled` as a best-effort.\n */\nfunction mapStateFilter(\n filter: TokenOrdersListStateFilter,\n): LimitOrderState | undefined {\n return filter === \"active\" ? \"active\" : \"filled\";\n}\n\n/**\n * Script for the orders list widget.\n *\n * Because `getWalletLimitOrders` throws `NotImplementedError`, this script\n * catches that specific error and reports `unavailable: true` so the UI can\n * render a \"coming soon\" state instead of a generic error.\n */\nexport function useTokenOrdersListScript({\n chain,\n wallet,\n tokenAddress,\n limit = 50,\n initialStateFilter = \"active\",\n initialOnlyThisToken = false,\n}: UseTokenOrdersListScriptParams): UseTokenOrdersListScriptResult {\n const [stateFilter, setStateFilterState] =\n useState<TokenOrdersListStateFilter>(initialStateFilter);\n const [onlyThisToken, setOnlyThisToken] = useState(initialOnlyThisToken);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<LimitOrder>>>([]);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, wallet, stateFilter, onlyThisToken, tokenAddress]);\n\n const setStateFilter = useCallback(\n (next: TokenOrdersListStateFilter) => {\n if (next === stateFilter) return;\n setStateFilterState(next);\n },\n [stateFilter],\n );\n\n const queryParams = useMemo(\n () => ({\n chain,\n address: wallet ?? \"\",\n cursor,\n limit,\n state: mapStateFilter(stateFilter),\n tokenAddress: onlyThisToken ? tokenAddress : undefined,\n }),\n [chain, wallet, cursor, limit, stateFilter, onlyThisToken, tokenAddress],\n );\n\n const { data, isPending, isFetching, error } = useWalletLimitOrdersQuery(\n queryParams,\n { enabled: !!wallet },\n );\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const unavailable = !!error && isNotImplementedError(error);\n const orders = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n orders,\n isLoading: !!wallet && !unavailable && (isPending || isFetching),\n unavailable,\n hasMore,\n loadMore,\n stateFilter,\n setStateFilter,\n onlyThisToken,\n setOnlyThisToken,\n };\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport type { Chain, LimitOrder } from \"@liberfi.io/types\";\nimport { useTokenOrdersListScript } from \"./token-orders-list.script\";\nimport {\n TokenOrdersList,\n type TokenOrdersListCurrency,\n type TokenOrdersListStateFilter,\n} from \"./token-orders-list.ui\";\n\nexport interface TokenOrdersListWidgetProps {\n chain: Chain;\n /** Wallet address. Empty → widget is rendered with a disabled data query. */\n wallet?: string;\n /** Token address used by the `Only <symbol>` filter when enabled. */\n tokenAddress: string;\n /** Optional token symbol used in the `Only <symbol>` checkbox label. */\n tokenSymbol?: string;\n limit?: number;\n initialStateFilter?: TokenOrdersListStateFilter;\n initialCurrency?: TokenOrdersListCurrency;\n nativeSymbol?: string;\n onCancelAll?: () => void;\n renderActions?: (order: LimitOrder) => ReactNode;\n className?: string;\n}\n\n/**\n * Orders tab widget.\n *\n * The backend limit-orders endpoint is not shipped yet, so the underlying\n * client method throws `NotImplementedError`. The script catches that\n * specific error and reports `unavailable` so the widget renders a\n * friendly \"coming soon\" state instead of a generic error.\n */\nexport function TokenOrdersListWidget({\n chain,\n wallet,\n tokenAddress,\n tokenSymbol,\n limit,\n initialStateFilter = \"active\",\n initialCurrency = \"usd\",\n nativeSymbol,\n onCancelAll,\n renderActions,\n className,\n}: TokenOrdersListWidgetProps) {\n const [currency, setCurrency] =\n useState<TokenOrdersListCurrency>(initialCurrency);\n const {\n orders,\n isLoading,\n unavailable,\n hasMore,\n loadMore,\n stateFilter,\n setStateFilter,\n onlyThisToken,\n setOnlyThisToken,\n } = useTokenOrdersListScript({\n chain,\n wallet,\n tokenAddress,\n limit,\n initialStateFilter,\n });\n\n return (\n <TokenOrdersList\n className={className}\n orders={orders}\n isLoading={isLoading}\n unavailable={unavailable}\n hasMore={hasMore}\n onLoadMore={loadMore}\n stateFilter={stateFilter}\n onStateFilterChange={setStateFilter}\n onlyThisToken={onlyThisToken}\n onOnlyThisTokenChange={setOnlyThisToken}\n tokenSymbol={tokenSymbol}\n currency={currency}\n onCurrencyChange={setCurrency}\n nativeSymbol={nativeSymbol}\n onCancelAll={unavailable ? undefined : onCancelAll}\n renderActions={renderActions}\n />\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { TokenHolder } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { HolderTagBadgeList } from \"../../shared\";\nimport { formatAgeShort, formatRatioFrom100, truncateMiddle } from \"../shared\";\n\nexport interface TokenTopTradersListProps {\n traders: Array<TokenHolder>;\n isLoading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n /** Only Tracked filter (client-side flag; parent owns state). */\n onlyTracked?: boolean;\n onOnlyTrackedChange?: (value: boolean) => void;\n now?: number;\n renderAddress?: (address: string) => React.ReactNode;\n className?: string;\n}\n\n/**\n * Presentational Top Traders list — visually parallel to\n * {@link TokenHoldersList} but with its own header + filters.\n *\n * The server currently returns the same row shape as holders, ranked by\n * realised PnL; the Realized PnL column stays blank (`—`) until the API\n * adds per-holder PnL fields. When that lands, extend\n * `TokenHolder` with the new fields and wire them into the cells here.\n */\nexport function TokenTopTradersList({\n traders,\n isLoading,\n hasMore,\n onLoadMore,\n onlyTracked = false,\n onOnlyTrackedChange,\n now = Date.now(),\n renderAddress,\n className,\n}: TokenTopTradersListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <span className=\"text-xs font-medium text-default-500\">\n Top Traders\n </span>\n <label className=\"flex cursor-pointer items-center gap-1 text-[11px] text-default-400\">\n <input\n type=\"checkbox\"\n className=\"size-3 accent-primary\"\n checked={onlyTracked}\n onChange={(e) => onOnlyTrackedChange?.(e.target.checked)}\n />\n Only Tracked\n </label>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[680px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[28%] px-3 py-2 text-left font-normal\">\n Wallet\n </th>\n <th className=\"w-[20%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Value\n </th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">%</th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Realized PnL\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Last active\n </th>\n </tr>\n </thead>\n <tbody>\n {traders.length === 0 && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No top traders yet\n </td>\n </tr>\n )}\n {traders.map((t) => (\n <TraderRow\n key={t.address}\n trader={t}\n now={now}\n renderAddress={renderAddress}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction TraderRow({\n trader,\n now,\n renderAddress,\n}: {\n trader: TokenHolder;\n now: number;\n renderAddress?: (address: string) => React.ReactNode;\n}) {\n const addressCell = useMemo(\n () =>\n renderAddress ? (\n renderAddress(trader.address)\n ) : (\n <span className=\"font-mono text-[11px] text-default-500\">\n {truncateMiddle(trader.address, 6, 6)}\n </span>\n ),\n [trader.address, renderAddress],\n );\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{addressCell}</td>\n <td className=\"px-3 py-2 align-middle\">\n <HolderTagBadgeList tags={trader.tags} max={3} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(trader.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatRatioFrom100(trader.ratio)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {/*\n Realized PnL is not yet part of the TokenHolder DTO; render an\n em-dash placeholder until the server adds the field. Extending\n `TokenHolder` with `realizedPnlUsd` (and similar) will automatically\n light this cell up — no UI changes required beyond swapping the\n placeholder for a formatted value here.\n */}\n —\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {trader.lastActiveAt ? formatAgeShort(trader.lastActiveAt, now) : \"--\"}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTokenTopTradersQuery } from \"@liberfi.io/react\";\nimport type { API, Chain, TokenHolder } from \"@liberfi.io/types\";\n\nexport interface UseTokenTopTradersListScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialOnlyTracked?: boolean;\n}\n\nexport interface UseTokenTopTradersListScriptResult {\n traders: Array<TokenHolder>;\n isLoading: boolean;\n hasMore: boolean;\n loadMore: () => void;\n onlyTracked: boolean;\n setOnlyTracked: (value: boolean) => void;\n}\n\n/**\n * Script for the top-traders list widget.\n *\n * Builds on {@link useTokenTopTradersQuery} (bridge over the holders\n * endpoint with `sortBy=realizedPnl`). `onlyTracked` is a client-side\n * filter retained for UI parity with Axiom — until the server flags\n * tracked wallets, the toggle narrows visible rows to those whose `tags`\n * list is non-empty (a reasonable proxy for \"tracked by someone\").\n */\nexport function useTokenTopTradersListScript({\n chain,\n address,\n limit = 50,\n initialOnlyTracked = false,\n}: UseTokenTopTradersListScriptParams): UseTokenTopTradersListScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<TokenHolder>>>([]);\n const [onlyTracked, setOnlyTracked] = useState(initialOnlyTracked);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, address]);\n\n const queryParams = useMemo(\n () => ({\n chain,\n address,\n cursor,\n limit,\n sortBy: \"realizedPnl\" as const,\n }),\n [chain, address, cursor, limit],\n );\n\n const { data, isPending, isFetching } = useTokenTopTradersQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const rawTraders = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const traders = useMemo(\n () =>\n onlyTracked\n ? rawTraders.filter((t) => t.tags && t.tags.length > 0)\n : rawTraders,\n [rawTraders, onlyTracked],\n );\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n traders,\n isLoading: isPending || isFetching,\n hasMore,\n loadMore,\n onlyTracked,\n setOnlyTracked,\n };\n}\n","\"use client\";\n\nimport type { Chain } from \"@liberfi.io/types\";\nimport { useTokenTopTradersListScript } from \"./token-top-traders-list.script\";\nimport { TokenTopTradersList } from \"./token-top-traders-list.ui\";\n\nexport interface TokenTopTradersListWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n className?: string;\n renderAddress?: (address: string) => React.ReactNode;\n}\n\n/**\n * Top Traders list widget.\n *\n * Bridges the holders endpoint (ranked by realized PnL) into the Axiom-style\n * Top Traders view; client-side `Only Tracked` toggle narrows to wallets\n * that carry at least one classification tag.\n */\nexport function TokenTopTradersListWidget({\n chain,\n address,\n limit,\n className,\n renderAddress,\n}: TokenTopTradersListWidgetProps) {\n const { traders, isLoading, hasMore, loadMore, onlyTracked, setOnlyTracked } =\n useTokenTopTradersListScript({ chain, address, limit });\n return (\n <TokenTopTradersList\n className={className}\n traders={traders}\n isLoading={isLoading}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onlyTracked={onlyTracked}\n onOnlyTrackedChange={setOnlyTracked}\n renderAddress={renderAddress}\n />\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact, SafeBigNumber } from \"@liberfi.io/utils\";\n\nexport interface TokenDevTokensListProps {\n tokens: Array<Token>;\n isLoading?: boolean;\n /** Server endpoint not yet shipped — renders a coming-soon state. */\n unavailable?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n /** Optional per-row link — pass to render token as a clickable element. */\n renderTokenLink?: (token: Token) => React.ReactNode;\n className?: string;\n}\n\n/**\n * Dev Tokens list — columns `Token / Migrated / Market Cap / ATH /\n * Liquidity / 1h Volume`. The \"Migrated\" column surfaces whether the\n * token has exited a bonding curve launchpad (renders `✓` when\n * `launchpad.migrated` is true).\n */\nexport function TokenDevTokensList({\n tokens,\n isLoading,\n unavailable,\n hasMore,\n onLoadMore,\n renderTokenLink,\n className,\n}: TokenDevTokensListProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-center justify-between gap-4 px-3 py-2\">\n <span className=\"text-xs font-medium text-default-500\">Dev Tokens</span>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[700px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[28%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[10%] px-3 py-2 text-center font-normal\">\n Migrated\n </th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n Market Cap\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">ATH</th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n Liquidity\n </th>\n <th className=\"w-[16%] px-3 py-2 text-right font-normal\">\n 1h Volume\n </th>\n </tr>\n </thead>\n <tbody>\n {unavailable ? (\n <tr>\n <td colSpan={6} className=\"py-10 text-center text-default-400\">\n Dev tokens index is coming soon.\n </td>\n </tr>\n ) : tokens.length === 0 && !isLoading ? (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No dev tokens\n </td>\n </tr>\n ) : (\n tokens.map((t) => (\n <DevTokenRow\n key={`${t.chain}:${t.address}`}\n token={t}\n renderTokenLink={renderTokenLink}\n />\n ))\n )}\n {!unavailable && isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {!unavailable && hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction DevTokenRow({\n token,\n renderTokenLink,\n}: {\n token: Token;\n renderTokenLink?: (token: Token) => React.ReactNode;\n}) {\n const marketCap =\n token.marketData?.marketCapInUsd ?? token.marketData?.marketCap;\n const liquidity = token.marketData?.tvlInUsd;\n // `ath` is not yet exposed by the server schema; render a placeholder\n // until the field lands (we preserve the Axiom column layout so the\n // switch is a one-line edit once available).\n const ath: string | undefined = undefined;\n const vol1h = token.stats?.[\"1h\"]?.volumesInUsd;\n\n const migrated = !!token.migratedTo;\n const tokenCell = renderTokenLink ? (\n renderTokenLink(token)\n ) : (\n <div className=\"flex items-center gap-2\">\n <Avatar\n src={token.image ?? undefined}\n name={(token.symbol ?? token.name ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-foreground\">{token.symbol}</span>\n <span className=\"truncate text-[10px] text-default-400\">\n {token.name}\n </span>\n </div>\n </div>\n );\n\n return (\n <tr className=\"border-b border-default-50 hover:bg-default-50/60\">\n <td className=\"px-3 py-2 align-middle\">{tokenCell}</td>\n <td className=\"px-3 py-2 text-center align-middle\">\n {migrated ? (\n <span className=\"text-bullish\">✓</span>\n ) : (\n <span className=\"text-default-400\">—</span>\n )}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {marketCap ? formatAmountUSDCompact(marketCap) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {ath ? formatAmountUSDCompact(ath) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {liquidity ? formatAmountUSDCompact(liquidity) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {vol1h ? formatAmountUSDCompact(vol1h) : \"--\"}\n </td>\n </tr>\n );\n}\n\n/** Summary block rendered next to the Dev Tokens list on desktop. */\nexport interface TokenDevTokensSummaryProps {\n tokens: Array<Token>;\n className?: string;\n}\n\n/**\n * Aggregated dev summary — total tokens, migrated count (with % donut-like\n * progress), total 1h volume. Pure presentational; caller supplies data.\n */\nexport function TokenDevTokensSummary({\n tokens,\n className,\n}: TokenDevTokensSummaryProps) {\n const total = tokens.length;\n const migratedCount = tokens.filter((t) => !!t.migratedTo).length;\n const migratedPct =\n total === 0 ? 0 : Math.round((migratedCount / total) * 100);\n const totalVol1h = tokens\n .map((t) => t.stats?.[\"1h\"]?.volumesInUsd ?? \"0\")\n .reduce((acc, v) => acc.plus(new SafeBigNumber(v)), new SafeBigNumber(0));\n const totalMarketCap = tokens\n .map((t) => t.marketData?.marketCapInUsd ?? t.marketData?.marketCap ?? \"0\")\n .reduce((acc, v) => acc.plus(new SafeBigNumber(v)), new SafeBigNumber(0));\n\n return (\n <div className={cn(\"flex flex-col gap-2 p-3\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-default-500\">\n Token Stats\n </span>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <SummaryCell label=\"Total\" value={String(total)} />\n <SummaryCell\n label=\"Migrated\"\n value={`${migratedCount} (${migratedPct}%)`}\n />\n <SummaryCell\n label=\"Total Market Cap\"\n value={formatAmountUSDCompact(totalMarketCap.toString())}\n />\n <SummaryCell\n label=\"Total 1h Volume\"\n value={formatAmountUSDCompact(totalVol1h.toString())}\n />\n </div>\n </div>\n );\n}\n\nfunction SummaryCell({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex flex-col gap-[2px]\">\n <span className=\"text-[10px] text-default-400\">{label}</span>\n <span className=\"text-[13px] font-medium text-foreground\">{value}</span>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTokensByCreatorQuery } from \"@liberfi.io/react\";\nimport type { API, Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseTokenDevTokensListScriptParams {\n chain: Chain;\n /** Creator wallet address. Empty → query disabled. */\n creator?: string;\n limit?: number;\n}\n\nexport interface UseTokenDevTokensListScriptResult {\n tokens: Array<Token>;\n isLoading: boolean;\n unavailable: boolean;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Cross-package duplicate of `@liberfi.io/client#isNotImplementedError`\n * (see token-orders-list.script.ts).\n */\nfunction isNotImplementedError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error as { code?: string }).code === \"NotImplemented\"\n );\n}\n\n/**\n * Script for the dev-tokens list widget.\n *\n * The backend endpoint for \"tokens created by wallet\" has not shipped; the\n * client method throws `NotImplementedError`. This script detects the\n * unavailable state so the UI can render a coming-soon message while the\n * endpoint is being built.\n */\nexport function useTokenDevTokensListScript({\n chain,\n creator,\n limit = 20,\n}: UseTokenDevTokensListScriptParams): UseTokenDevTokensListScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<Token>>>([]);\n\n useEffect(() => {\n setCursor(undefined);\n setPages([]);\n }, [chain, creator]);\n\n const queryParams = useMemo(\n () => ({ chain, creator: creator ?? \"\", cursor, limit }),\n [chain, creator, cursor, limit],\n );\n\n const { data, isPending, isFetching, error } = useTokensByCreatorQuery(\n queryParams,\n { enabled: !!creator },\n );\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const unavailable = !!error && isNotImplementedError(error);\n const tokens = useMemo(() => pages.flatMap((p) => p.data), [pages]);\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n tokens,\n isLoading: !!creator && !unavailable && (isPending || isFetching),\n unavailable,\n hasMore,\n loadMore,\n };\n}\n","\"use client\";\n\nimport type { Chain, Token } from \"@liberfi.io/types\";\nimport { useTokenDevTokensListScript } from \"./token-dev-tokens-list.script\";\nimport {\n TokenDevTokensList,\n TokenDevTokensSummary,\n} from \"./token-dev-tokens-list.ui\";\n\nexport interface TokenDevTokensListWidgetProps {\n chain: Chain;\n /** Creator wallet address (token's launch wallet). Empty → query disabled. */\n creator?: string;\n limit?: number;\n /** When true, also render the summary sub-widget beside the list. */\n showSummary?: boolean;\n renderTokenLink?: (token: Token) => React.ReactNode;\n className?: string;\n}\n\n/**\n * Dev Tokens tab widget.\n *\n * Backend endpoint not yet shipped → surfaces a friendly \"coming soon\"\n * empty state courtesy of `NotImplementedError` detection. When the\n * endpoint lands, no widget changes are required.\n */\nexport function TokenDevTokensListWidget({\n chain,\n creator,\n limit,\n showSummary = false,\n renderTokenLink,\n className,\n}: TokenDevTokensListWidgetProps) {\n const { tokens, isLoading, unavailable, hasMore, loadMore } =\n useTokenDevTokensListScript({ chain, creator, limit });\n\n return (\n <div className={className}>\n <TokenDevTokensList\n tokens={tokens}\n isLoading={isLoading}\n unavailable={unavailable}\n hasMore={hasMore}\n onLoadMore={loadMore}\n renderTokenLink={renderTokenLink}\n />\n {showSummary && !unavailable ? (\n <TokenDevTokensSummary tokens={tokens} />\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPriceUSD,\n} from \"@liberfi.io/utils\";\n\nexport interface TokenChartBannerProps {\n token?: Token;\n /**\n * Optional `ATH` market cap (USD). Not part of the current `TokenMarketData`\n * schema; consumers can plumb it from a separate source when available.\n */\n athInUsd?: string;\n /** Optional all-time-high timestamp for the ATH tooltip. */\n athAt?: Date;\n /** Optional global-fees-paid (USD) — renders when provided, skipped otherwise. */\n globalFeesPaidInUsd?: string;\n /** Optional rank within the chain (e.g. `42`). */\n rank?: number;\n /** Handler for the pin button. Passing nothing hides the button. */\n onTogglePin?: () => void;\n /** Whether the token is currently pinned (controls the icon state). */\n pinned?: boolean;\n className?: string;\n}\n\n/**\n * Compact horizontal banner mirroring Axiom's chart-top stats strip.\n * Presentational only — consumers (or `TokenChartBannerWidget`) provide\n * the data and wrap in a `CollapsibleSection` if they want Axiom's\n * expand/collapse affordance.\n */\nexport function TokenChartBanner({\n token,\n athInUsd,\n athAt,\n globalFeesPaidInUsd,\n rank,\n onTogglePin,\n pinned,\n className,\n}: TokenChartBannerProps) {\n const price = token?.marketData?.priceInUsd;\n const liquidity = token?.marketData?.tvlInUsd;\n const supply = token?.marketData?.totalSupply;\n\n return (\n <div\n className={cn(\n \"flex h-[48px] w-full flex-row items-center gap-4 overflow-x-auto px-3 text-[12px]\",\n className,\n )}\n >\n <Cell label=\"Price\" value={price ? formatPriceUSD(price) : \"--\"} />\n <Cell\n label=\"Liquidity\"\n value={liquidity ? formatAmountUSDCompact(liquidity) : \"--\"}\n />\n <Cell label=\"Supply\" value={supply ? formatAmount(supply) : \"--\"} />\n {globalFeesPaidInUsd ? (\n <Cell\n label=\"Fees Paid\"\n value={formatAmountUSDCompact(globalFeesPaidInUsd)}\n />\n ) : null}\n {athInUsd ? (\n <Cell\n label=\"ATH\"\n value={formatAmountUSDCompact(athInUsd)}\n title={\n athAt ? `All-time high at ${athAt.toLocaleDateString()}` : undefined\n }\n />\n ) : null}\n {rank !== undefined ? <Cell label=\"Rank\" value={`#${rank}`} /> : null}\n\n <div className=\"flex-1\" />\n\n {onTogglePin ? (\n <button\n type=\"button\"\n onClick={onTogglePin}\n aria-pressed={pinned}\n className={cn(\n \"flex size-[26px] items-center justify-center rounded text-default-400 transition-colors hover:bg-default-100 hover:text-foreground\",\n pinned && \"text-foreground\",\n )}\n title={pinned ? \"Unpin token\" : \"Pin token\"}\n >\n {pinned ? \"★\" : \"☆\"}\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction Cell({\n label,\n value,\n title,\n}: {\n label: string;\n value: string;\n title?: string;\n}) {\n return (\n <div\n className=\"flex flex-col items-start justify-center gap-[2px] whitespace-nowrap\"\n title={title}\n >\n <span className=\"text-[10px] leading-none text-default-400\">{label}</span>\n <span className=\"text-[13px] font-medium leading-none tabular-nums text-foreground\">\n {value}\n </span>\n </div>\n );\n}\n","import type { Chain, Token } from \"@liberfi.io/types\";\nimport { useLiveToken } from \"../shared\";\n\nexport interface UseTokenChartBannerScriptParams {\n chain: Chain;\n address: string;\n}\n\nexport interface UseTokenChartBannerScriptResult {\n token: Token | undefined;\n isLoading: boolean;\n}\n\n/**\n * Script for {@link TokenChartBannerWidget}. Reuses the shared\n * {@link useLiveToken} hook so the banner picks up WebSocket deltas\n * without an extra subscription registration.\n */\nexport function useTokenChartBannerScript({\n chain,\n address,\n}: UseTokenChartBannerScriptParams): UseTokenChartBannerScriptResult {\n return useLiveToken(chain, address);\n}\n","\"use client\";\n\nimport type { Chain } from \"@liberfi.io/types\";\nimport { useTokenChartBannerScript } from \"./token-chart-banner.script\";\nimport { TokenChartBanner } from \"./token-chart-banner.ui\";\n\nexport interface TokenChartBannerWidgetProps {\n chain: Chain;\n address: string;\n /** Optional ATH market cap; see the UI props for details. */\n athInUsd?: string;\n athAt?: Date;\n globalFeesPaidInUsd?: string;\n rank?: number;\n pinned?: boolean;\n onTogglePin?: () => void;\n className?: string;\n}\n\n/**\n * Live, presentational banner mirroring Axiom's chart-top stats strip.\n * Wraps {@link TokenChartBanner} with {@link useTokenChartBannerScript}\n * so the banner stays in sync with WebSocket pushes.\n */\nexport function TokenChartBannerWidget({\n chain,\n address,\n athInUsd,\n athAt,\n globalFeesPaidInUsd,\n rank,\n pinned,\n onTogglePin,\n className,\n}: TokenChartBannerWidgetProps) {\n const { token } = useTokenChartBannerScript({ chain, address });\n return (\n <TokenChartBanner\n className={className}\n token={token}\n athInUsd={athInUsd}\n athAt={athAt}\n globalFeesPaidInUsd={globalFeesPaidInUsd}\n rank={rank}\n pinned={pinned}\n onTogglePin={onTogglePin}\n />\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\n\nexport interface TokenSimilarTokensProps {\n tokens: Array<Token>;\n isLoading?: boolean;\n /** When the backend doesn't yet expose similarity, renders an empty-state hint. */\n unavailable?: boolean;\n /** Optional per-row click handler (open detail page, etc.). */\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Similar Tokens list — a lightweight preview list (image / symbol /\n * market-cap). Consumers compose this inside a `CollapsibleSection` on\n * the right column of the desktop token-detail page.\n */\nexport function TokenSimilarTokens({\n tokens,\n isLoading,\n unavailable,\n onTokenClick,\n className,\n}: TokenSimilarTokensProps) {\n if (unavailable) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n Similar tokens coming soon.\n </div>\n );\n }\n if (!isLoading && tokens.length === 0) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n No similar tokens found.\n </div>\n );\n }\n return (\n <ul className={cn(\"flex flex-col\", className)}>\n {tokens.map((t) => (\n <li\n key={`${t.chain}:${t.address}`}\n className={cn(\n \"flex cursor-pointer items-center gap-2 border-b border-default-50 px-3 py-2 last:border-0 hover:bg-default-50/60\",\n !onTokenClick && \"cursor-default\",\n )}\n onClick={onTokenClick ? () => onTokenClick(t) : undefined}\n >\n <Avatar\n src={t.image ?? undefined}\n name={(t.symbol ?? \"?\").slice(0, 1)}\n className=\"size-5 shrink-0 rounded-full bg-default-200 text-[10px]\"\n showFallback\n />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-[12px] text-foreground\">\n {t.symbol}\n </span>\n <span className=\"truncate text-[10px] text-default-400\">\n {t.name}\n </span>\n </div>\n <span className=\"text-[11px] tabular-nums text-default-500\">\n {t.marketData?.marketCapInUsd\n ? formatAmountUSDCompact(t.marketData.marketCapInUsd)\n : \"--\"}\n </span>\n </li>\n ))}\n {isLoading && (\n <li className=\"py-2 text-center text-[11px] text-default-400\">\n Loading…\n </li>\n )}\n </ul>\n );\n}\n","import { useMemo } from \"react\";\nimport { useSearchTokensQuery } from \"@liberfi.io/react\";\nimport type { Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseTokenSimilarTokensScriptParams {\n chain: Chain;\n address: string;\n /** Search keyword used to surface similar tokens. Usually the token symbol or a category. */\n keyword?: string;\n limit?: number;\n}\n\nexport interface UseTokenSimilarTokensScriptResult {\n tokens: Array<Token>;\n isLoading: boolean;\n unavailable: boolean;\n}\n\n/**\n * Script for {@link TokenSimilarTokensWidget}.\n *\n * There is no dedicated \"similar tokens\" endpoint yet, so we fall back to\n * a keyword search on the token's symbol, filter out the current token,\n * and cap the result count. When no keyword is given the script reports\n * `unavailable: true` so the UI surfaces a coming-soon state.\n */\nexport function useTokenSimilarTokensScript({\n chain,\n address,\n keyword,\n limit = 10,\n}: UseTokenSimilarTokensScriptParams): UseTokenSimilarTokensScriptResult {\n const enabled = !!keyword && keyword.length > 0;\n const { data, isPending, isFetching } = useSearchTokensQuery(\n { chains: [chain], keyword, limit: limit + 1 },\n { enabled },\n );\n const tokens = useMemo(() => {\n if (!data) return [];\n const normalised = address.toLowerCase();\n return (data.data ?? [])\n .filter((t) => t.address.toLowerCase() !== normalised)\n .slice(0, limit);\n }, [data, address, limit]);\n\n return {\n tokens,\n isLoading: enabled && (isPending || isFetching),\n unavailable: !enabled,\n };\n}\n","\"use client\";\n\nimport type { Chain, Token } from \"@liberfi.io/types\";\nimport { useTokenSimilarTokensScript } from \"./token-similar-tokens.script\";\nimport { TokenSimilarTokens } from \"./token-similar-tokens.ui\";\n\nexport interface TokenSimilarTokensWidgetProps {\n chain: Chain;\n address: string;\n /** Keyword used by the fallback similarity search (typically the token symbol). */\n keyword?: string;\n limit?: number;\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Similar Tokens widget. Uses a keyword-search fallback until a dedicated\n * similarity endpoint is exposed; renders a coming-soon state otherwise.\n */\nexport function TokenSimilarTokensWidget({\n chain,\n address,\n keyword,\n limit,\n onTokenClick,\n className,\n}: TokenSimilarTokensWidgetProps) {\n const { tokens, isLoading, unavailable } = useTokenSimilarTokensScript({\n chain,\n address,\n keyword,\n limit,\n });\n return (\n <TokenSimilarTokens\n className={className}\n tokens={tokens}\n isLoading={isLoading}\n unavailable={unavailable}\n onTokenClick={onTokenClick}\n />\n );\n}\n","\"use client\";\n\nimport type { Token } from \"@liberfi.io/types\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\n\nexport interface TokenReusedImageListProps {\n /**\n * List of tokens sharing the same image as the subject token. When\n * empty and {@link unavailable} is true, the component renders a\n * coming-soon empty state.\n */\n tokens?: Array<Token>;\n /** Whether the backend endpoint is unavailable. Defaults to true for now. */\n unavailable?: boolean;\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Reused Image Tokens — Axiom shows other tokens that reuse the same\n * image as this token. The backend endpoint has not shipped; the widget\n * exposes the surface shape so consumers can drop it into layouts\n * immediately and the implementation can fill in later.\n */\nexport function TokenReusedImageList({\n tokens = [],\n unavailable = true,\n onTokenClick,\n className,\n}: TokenReusedImageListProps) {\n if (unavailable) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n Image-similarity search is coming soon.\n </div>\n );\n }\n if (tokens.length === 0) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center p-4 text-center text-[11px] text-default-400\",\n className,\n )}\n >\n No reused-image tokens found.\n </div>\n );\n }\n return (\n <div className={cn(\"flex flex-row flex-wrap gap-2 p-3\", className)}>\n {tokens.map((t) => (\n <button\n key={`${t.chain}:${t.address}`}\n type=\"button\"\n onClick={onTokenClick ? () => onTokenClick(t) : undefined}\n className=\"flex size-10 items-center justify-center overflow-hidden rounded-full border border-default-100 transition-opacity hover:opacity-80\"\n title={t.symbol}\n >\n <Avatar\n src={t.image ?? undefined}\n name={(t.symbol ?? \"?\").slice(0, 1)}\n className=\"size-full bg-default-100 text-[10px] text-default-400\"\n showFallback\n />\n </button>\n ))}\n </div>\n );\n}\n","import type { Chain, Token } from \"@liberfi.io/types\";\n\nexport interface UseTokenReusedImageListScriptParams {\n chain: Chain;\n address: string;\n}\n\nexport interface UseTokenReusedImageListScriptResult {\n tokens: Array<Token>;\n isLoading: boolean;\n unavailable: boolean;\n}\n\n/**\n * Script for {@link TokenReusedImageListWidget}.\n *\n * The backend has no image-similarity endpoint yet, so this script\n * returns `unavailable: true` to surface a friendly coming-soon state.\n * Wire in the real implementation here once the API lands; no widget\n * changes will be required.\n */\nexport function useTokenReusedImageListScript(\n _params: UseTokenReusedImageListScriptParams,\n): UseTokenReusedImageListScriptResult {\n return { tokens: [], isLoading: false, unavailable: true };\n}\n","\"use client\";\n\nimport type { Chain, Token } from \"@liberfi.io/types\";\nimport { useTokenReusedImageListScript } from \"./token-reused-image-list.script\";\nimport { TokenReusedImageList } from \"./token-reused-image-list.ui\";\n\nexport interface TokenReusedImageListWidgetProps {\n chain: Chain;\n address: string;\n onTokenClick?: (token: Token) => void;\n className?: string;\n}\n\n/**\n * Reused Image Tokens widget. Currently renders a coming-soon state; the\n * surface is in place so the consuming shell can compose it unchanged\n * once the backend endpoint ships.\n */\nexport function TokenReusedImageListWidget({\n chain,\n address,\n onTokenClick,\n className,\n}: TokenReusedImageListWidgetProps) {\n const { tokens, unavailable } = useTokenReusedImageListScript({\n chain,\n address,\n });\n return (\n <TokenReusedImageList\n className={className}\n tokens={tokens}\n unavailable={unavailable}\n onTokenClick={onTokenClick}\n />\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, StyledInput } from \"@liberfi.io/ui\";\n\nexport interface TokenListKeywordsFilterProps {\n /** default keywords */\n keywords?: Array<string>;\n /** default exclude keywords */\n excludeKeywords?: Array<string>;\n /** callback when keywords change */\n onKeywordsChange?: (keywords?: Array<string>) => void;\n /** callback when exclude keywords change */\n onExcludeKeywordsChange?: (excludeKeywords?: Array<string>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListKeywordsFilter({\n keywords,\n excludeKeywords,\n onKeywordsChange,\n onExcludeKeywordsChange,\n className,\n}: TokenListKeywordsFilterProps) {\n const { t } = useTranslation();\n\n const [keywordsText, setKeywordsText] = useState(keywords?.join(\", \") ?? \"\");\n\n const [excludeKeywordsText, setExcludeKeywordsText] = useState(\n excludeKeywords?.join(\", \") ?? \"\",\n );\n\n useEffect(() => {\n setKeywordsText((prev) => {\n const prevKeywords = parseKeywords(prev);\n if (prevKeywords === undefined && keywords === undefined) {\n return prev;\n } else if (prevKeywords === undefined) {\n return keywords?.join(\", \") ?? \"\";\n } else if (keywords === undefined) {\n return \"\";\n } else if (prevKeywords.join(\"\") === keywords.join(\"\")) {\n return prev;\n } else {\n return keywords.join(\", \");\n }\n });\n }, [keywords]);\n\n useEffect(() => {\n setExcludeKeywordsText((prev) => {\n const prevExcludeKeywords = parseKeywords(prev);\n if (prevExcludeKeywords === undefined && excludeKeywords === undefined) {\n return prev;\n } else if (prevExcludeKeywords === undefined) {\n return excludeKeywords?.join(\", \") ?? \"\";\n } else if (excludeKeywords === undefined) {\n return \"\";\n } else if (prevExcludeKeywords.join(\"\") === excludeKeywords.join(\"\")) {\n return prev;\n } else {\n return excludeKeywords.join(\", \");\n }\n });\n }, [excludeKeywords]);\n\n const handleKeywordsValueChange = useCallback(\n (value: string) => {\n setKeywordsText(value);\n onKeywordsChange?.(parseKeywords(value));\n },\n [onKeywordsChange],\n );\n\n const handleExcludeKeywordsValueChange = useCallback(\n (value: string) => {\n setExcludeKeywordsText(value);\n onExcludeKeywordsChange?.(parseKeywords(value));\n },\n [onExcludeKeywordsChange],\n );\n\n return (\n <div className={cn(\"grid grid-cols-2 gap-3 px-4\", className)}>\n <div className=\"flex flex-col gap-3\">\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.keywords.title\")}\n </h3>\n <StyledInput\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.keywords.placeholder\")}\n value={keywordsText}\n onValueChange={handleKeywordsValueChange}\n />\n </div>\n <div className=\"flex flex-col gap-3\">\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.keywords.exclude.title\")}\n </h3>\n <StyledInput\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.keywords.placeholder\")}\n value={excludeKeywordsText}\n onValueChange={handleExcludeKeywordsValueChange}\n />\n </div>\n </div>\n );\n}\n\nfunction parseKeywords(keywords: string): Array<string> | undefined {\n const parsedKeywords = keywords\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean);\n return parsedKeywords.length > 0 ? parsedKeywords : undefined;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { TokenProtocol } from \"@liberfi.io/types\";\nimport { Button, cn, Image } from \"@liberfi.io/ui\";\nimport { formatTokenProtocolName } from \"@liberfi.io/utils\";\nimport { protocolClasses } from \"../../../utils/protocol-styles\";\n\nexport interface TokenListProtocolFilterProps {\n /** protocol filter options */\n protocols: Array<TokenProtocol>;\n /** selected protocols */\n selectedProtocols?: Array<TokenProtocol>;\n /** callback when selected protocols change */\n onSelectedProtocolsChange?: (protocols: Array<TokenProtocol>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListProtocolFilter({\n protocols,\n selectedProtocols = [],\n onSelectedProtocolsChange,\n className,\n}: TokenListProtocolFilterProps) {\n const { t } = useTranslation();\n\n // current selections\n const [selected, setSelected] =\n useState<Array<TokenProtocol>>(selectedProtocols);\n\n useEffect(() => {\n setSelected(selectedProtocols);\n }, [selectedProtocols]);\n\n const isAllSelected = useMemo(\n () => protocols.every((protocol) => selected.includes(protocol)),\n [protocols, selected],\n );\n\n const handleSelectAll = useCallback(() => {\n if (isAllSelected) {\n const selected = [] as Array<TokenProtocol>;\n setSelected(selected);\n onSelectedProtocolsChange?.(selected);\n } else {\n const selected = [...protocols];\n setSelected(selected);\n onSelectedProtocolsChange?.(selected);\n }\n }, [protocols, onSelectedProtocolsChange, isAllSelected]);\n\n const handleSelect = useCallback(\n (protocol: TokenProtocol) => () => {\n if (selected.includes(protocol)) {\n const newSelected = selected.filter((p) => p !== protocol);\n setSelected(newSelected);\n onSelectedProtocolsChange?.(newSelected);\n } else {\n const newSelected = [...selected, protocol];\n setSelected(newSelected);\n onSelectedProtocolsChange?.(newSelected);\n }\n },\n [selected, onSelectedProtocolsChange],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-3 px-4\", className)}>\n {/* header */}\n <div className=\"flex justify-between items-center\">\n {/* title */}\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.protocols.title\")}\n </h3>\n {/* select all */}\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleSelectAll}\n >\n {isAllSelected\n ? t(\"tokens.filters.protocols.unselectAll\")\n : t(\"tokens.filters.protocols.selectAll\")}\n </Button>\n </div>\n\n {/* options */}\n <div className=\"grid grid-cols-3 gap-3\">\n {protocols.map((protocol) => {\n const pc = protocolClasses(protocol);\n return (\n <Button\n key={protocol}\n variant=\"bordered\"\n size=\"sm\"\n radius=\"full\"\n className={cn(\n \"w-fit h-6 px-2.5\",\n pc.text,\n pc.bg5,\n \"border\",\n pc.border,\n {\n \"opacity-40 data-[hover=true]:!opacity-30\":\n !selected.includes(protocol),\n },\n )}\n startContent={\n <Image\n width={14}\n height={14}\n src={`/images/protocols/${protocol}.svg`}\n alt={formatTokenProtocolName(protocol)}\n />\n }\n onPress={handleSelect(protocol)}\n >\n {formatTokenProtocolName(protocol)}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { StyledNumberInput } from \"@liberfi.io/ui\";\n\nexport interface TokenListMinMaxFilterProps {\n field: API.TokenFieldOption;\n value?: API.TokenFilterOption;\n onChange?: (value?: API.TokenFilterOption) => void;\n title?: string;\n}\n\nexport function TokenListMinMaxFilter({\n title,\n field,\n value,\n onChange,\n}: TokenListMinMaxFilterProps) {\n const { t } = useTranslation();\n\n const [min, setMin] = useState<number>(value ? parseValue(value).min : NaN);\n\n const [max, setMax] = useState<number>(value ? parseValue(value).max : NaN);\n\n useEffect(() => {\n if (value === undefined) {\n setMin(NaN);\n setMax(NaN);\n } else {\n const { min, max } = parseValue(value);\n setMin(min);\n setMax(max);\n }\n }, [value]);\n\n const handleMinChange = useCallback(\n (value: number) => {\n setMin(value);\n onChange?.(formatValue(field, value, max));\n },\n [field, onChange, max],\n );\n\n const handleMaxChange = useCallback(\n (value: number) => {\n setMax(value);\n onChange?.(formatValue(field, min, value));\n },\n [field, onChange, min],\n );\n\n return (\n <div className=\"flex flex-col gap-1\">\n {title && <h3 className=\"text-xs text-neutral\">{title}</h3>}\n <div className=\"grid grid-cols-2 gap-3\">\n <StyledNumberInput\n value={min}\n onValueChange={handleMinChange}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.stats.min\")}\n aria-label={`${title} min`}\n />\n <StyledNumberInput\n value={max}\n onValueChange={handleMaxChange}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.stats.max\")}\n aria-label={`${title} max`}\n />\n </div>\n </div>\n );\n}\n\nfunction parseValue(value: API.TokenFilterOption) {\n if (value.operator === \"between\") {\n const [min, max] = value.value as [number, number];\n return { min, max };\n }\n if (value.operator === \"gte\") {\n const min = value.value as number;\n return { min, max: NaN };\n }\n if (value.operator === \"lte\") {\n const max = value.value as number;\n return { min: NaN, max };\n }\n return { min: NaN, max: NaN };\n}\n\nfunction formatValue(\n field: API.TokenFieldOption,\n min: number,\n max: number,\n): API.TokenFilterOption | undefined {\n if (isNaN(min) && isNaN(max)) {\n return undefined;\n }\n if (isNaN(min)) {\n return { field, operator: \"lte\", value: max };\n }\n if (isNaN(max)) {\n return { field, operator: \"gte\", value: min };\n }\n return { field, operator: \"between\", value: [min, max] };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { TokenListMinMaxFilter } from \"./token-list-minmax-filter.ui\";\n\nexport interface TokenListAuditsFilterProps {\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListAuditsFilter({\n values,\n onValuesChange,\n className,\n}: TokenListAuditsFilterProps) {\n const { t } = useTranslation();\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValueChange = useCallback(\n (field: API.TokenFieldOption) => (value?: API.TokenFilterOption) => {\n if (value === undefined) {\n // remove filter\n let newValues: Array<API.TokenFilterOption> | undefined = (\n currentValues ?? []\n ).filter((v) => v.field !== field);\n newValues = newValues.length > 0 ? newValues : undefined;\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n } else {\n // add or replace filter\n const newValues = [\n ...(currentValues ?? []).filter((v) => v.field !== field),\n value,\n ];\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n }\n },\n [currentValues, onValuesChange],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n <TokenListMinMaxFilter\n field=\"holders\"\n title={t(\"tokens.filters.stats.audits.holders\")}\n value={currentValues?.find((v) => v.field === \"holders\")}\n onChange={handleValueChange(\"holders\")}\n />\n <TokenListMinMaxFilter\n field=\"top10Ratio\"\n title={t(\"tokens.filters.stats.audits.top10HoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"top10Ratio\")}\n onChange={handleValueChange(\"top10Ratio\")}\n />\n <TokenListMinMaxFilter\n field=\"top100Ratio\"\n title={t(\"tokens.filters.stats.audits.top100HoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"top100Ratio\")}\n onChange={handleValueChange(\"top100Ratio\")}\n />\n <TokenListMinMaxFilter\n field=\"creatorsRatio\"\n title={t(\"tokens.filters.stats.audits.devHoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"creatorsRatio\")}\n onChange={handleValueChange(\"creatorsRatio\")}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { TokenListResolution } from \"../types\";\nimport { TokenListMinMaxFilter } from \"./token-list-minmax-filter.ui\";\n\nexport interface TokenListMetricsFilterProps {\n /** current resolution */\n resolution: TokenListResolution;\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListMetricsFilter({\n resolution,\n values,\n onValuesChange,\n className,\n}: TokenListMetricsFilterProps) {\n const { t } = useTranslation();\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValueChange = useCallback(\n (field: API.TokenFieldOption) => (value?: API.TokenFilterOption) => {\n if (value === undefined) {\n // remove filter\n let newValues: Array<API.TokenFilterOption> | undefined = (\n currentValues ?? []\n ).filter((v) => v.field !== field);\n newValues = newValues.length > 0 ? newValues : undefined;\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n } else {\n // add or replace filter\n const newValues = [\n ...(currentValues ?? []).filter((v) => v.field !== field),\n value,\n ];\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n }\n },\n [currentValues, onValuesChange],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n <TokenListMinMaxFilter\n field=\"marketCap\"\n title={t(\"tokens.filters.stats.metrics.marketCap\")}\n value={currentValues?.find((v) => v.field === \"marketCap\")}\n onChange={handleValueChange(\"marketCap\")}\n />\n <TokenListMinMaxFilter\n field=\"tvl\"\n title={t(\"tokens.filters.stats.metrics.liquidity\")}\n value={currentValues?.find((v) => v.field === \"tvl\")}\n onChange={handleValueChange(\"tvl\")}\n />\n <TokenListMinMaxFilter\n field={`volumes${resolution}`}\n title={t(\"tokens.filters.stats.metrics.volumes\", {\n resolution: t(`common.resolution.${resolution}`),\n })}\n value={currentValues?.find((v) => v.field === `volumes${resolution}`)}\n onChange={handleValueChange(`volumes${resolution}`)}\n />\n <TokenListMinMaxFilter\n field={`trades${resolution}`}\n title={t(\"tokens.filters.stats.metrics.txns\", {\n resolution: t(`common.resolution.${resolution}`),\n })}\n value={currentValues?.find((v) => v.field === `trades${resolution}`)}\n onChange={handleValueChange(`trades${resolution}`)}\n />\n </div>\n );\n}\n","import { Key, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { cn, StyledBadge, StyledLightTabs, Tab } from \"@liberfi.io/ui\";\nimport { TokenListResolution } from \"../types\";\nimport { TokenListAuditsFilter } from \"./token-list-audits-filter.ui\";\nimport { TokenListMetricsFilter } from \"./token-list-metrics-filter.ui\";\n\nexport interface TokenListStatsFilterProps {\n /** current resolution */\n resolution: TokenListResolution;\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListStatsFilter({\n resolution,\n values,\n onValuesChange,\n className,\n}: TokenListStatsFilterProps) {\n const { t } = useTranslation();\n\n const [curTab, setCurTab] = useState<\"audits\" | \"metrics\">(\"audits\");\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValuesChange = useCallback(\n (values?: Array<API.TokenFilterOption>) => {\n setCurrentValues(values);\n onValuesChange?.(values);\n },\n [onValuesChange],\n );\n\n const auditsFiltersCount = useMemo(() => {\n const fields = [\"holders\", \"top10Ratio\", \"top100Ratio\", \"creatorsRatio\"];\n return currentValues?.filter((v) => fields.includes(v.field))?.length ?? 0;\n }, [currentValues]);\n\n const metricsFiltersCount = useMemo(() => {\n const fields = [\n \"marketCap\",\n \"tvl\",\n `volumes${resolution}`,\n `trades${resolution}`,\n ];\n return currentValues?.filter((v) => fields.includes(v.field)).length ?? 0;\n }, [currentValues, resolution]);\n\n return (\n <div className={cn(\"flex flex-col gap-3 px-4\", className)}>\n <StyledLightTabs\n color=\"default\"\n radius=\"full\"\n size=\"sm\"\n selectedKey={curTab}\n onSelectionChange={setCurTab as (key: Key) => void}\n >\n <Tab\n key=\"audits\"\n title={\n auditsFiltersCount === 0 ? (\n t(\"tokens.filters.stats.audits\")\n ) : (\n <StyledBadge\n color=\"primary\"\n size=\"sm\"\n content={auditsFiltersCount}\n shape=\"circle\"\n >\n {t(\"tokens.filters.stats.audits\")}\n </StyledBadge>\n )\n }\n />\n <Tab\n key=\"metrics\"\n title={\n metricsFiltersCount === 0 ? (\n t(\"tokens.filters.stats.metrics\")\n ) : (\n <StyledBadge\n color=\"primary\"\n size=\"sm\"\n content={metricsFiltersCount}\n shape=\"circle\"\n >\n {t(\"tokens.filters.stats.metrics\")}\n </StyledBadge>\n )\n }\n />\n </StyledLightTabs>\n\n <TokenListAuditsFilter\n values={currentValues}\n onValuesChange={handleValuesChange}\n className={cn({ hidden: curTab !== \"audits\" })}\n />\n <TokenListMetricsFilter\n values={currentValues}\n onValuesChange={handleValuesChange}\n resolution={resolution}\n className={cn({ hidden: curTab !== \"metrics\" })}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { API, TokenProtocol } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n TokenListKeywordsFilter,\n TokenListProtocolFilter,\n TokenListStatsFilter,\n} from \"./filters\";\nimport { TokenListResolution } from \"./types\";\n\nexport type TokenListFiltersType = Pick<\n API.GetTokenListOptions,\n \"filters\" | \"keywords\" | \"excludeKeywords\"\n>;\n\nexport interface TokenListFilterProps {\n /** protocol filter options */\n protocols?: Array<TokenProtocol>;\n /** current resolution */\n resolution: TokenListResolution;\n /** filters */\n filters?: TokenListFiltersType;\n /** callback when filters change */\n onFiltersChange?: (filters?: TokenListFiltersType) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListFilter({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n className,\n}: TokenListFilterProps) {\n const [selectedProtocols, setSelectedProtocols] = useState<\n Array<TokenProtocol>\n >(parseSelectedProtocols(filters?.filters, protocols));\n\n useEffect(() => {\n setSelectedProtocols(parseSelectedProtocols(filters?.filters, protocols));\n }, [filters?.filters, protocols]);\n\n const [searchKeywords, setSearchKeywords] = useState<\n Array<string> | undefined\n >(filters?.keywords);\n\n useEffect(() => {\n setSearchKeywords(filters?.keywords);\n }, [filters?.keywords]);\n\n const [excludeSearchKeywords, setExcludeSearchKeywords] = useState<\n Array<string> | undefined\n >(filters?.excludeKeywords);\n\n useEffect(() => {\n setExcludeSearchKeywords(filters?.excludeKeywords);\n }, [filters?.excludeKeywords]);\n\n const [filterValues, setFilterValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(filters?.filters);\n\n useEffect(() => {\n setFilterValues(filters?.filters);\n }, [filters?.filters]);\n\n const handleProtocolsChange = useCallback(\n (values: Array<TokenProtocol>) => {\n setSelectedProtocols(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n values,\n searchKeywords,\n excludeSearchKeywords,\n filterValues,\n ),\n );\n },\n [\n protocols,\n searchKeywords,\n excludeSearchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleKeywordsChange = useCallback(\n (values?: Array<string>) => {\n setSearchKeywords(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n values,\n excludeSearchKeywords,\n filterValues,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n excludeSearchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleExcludeKeywordsChange = useCallback(\n (values?: Array<string>) => {\n setExcludeSearchKeywords(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n searchKeywords,\n values,\n filterValues,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n searchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleFilterValuesChange = useCallback(\n (values?: Array<API.TokenFilterOption>) => {\n setFilterValues(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n searchKeywords,\n excludeSearchKeywords,\n values,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n searchKeywords,\n excludeSearchKeywords,\n onFiltersChange,\n ],\n );\n\n return (\n <div className={cn(\"flex flex-col gap-4\", className)}>\n {/* filter by protocols */}\n {protocols && protocols.length > 0 && (\n <>\n <TokenListProtocolFilter\n protocols={protocols}\n selectedProtocols={selectedProtocols}\n onSelectedProtocolsChange={handleProtocolsChange}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,1)\" }} />\n </>\n )}\n\n {/* search keywords */}\n <TokenListKeywordsFilter\n keywords={searchKeywords}\n excludeKeywords={excludeSearchKeywords}\n onKeywordsChange={handleKeywordsChange}\n onExcludeKeywordsChange={handleExcludeKeywordsChange}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,1)\" }} />\n\n {/* filter by values */}\n <TokenListStatsFilter\n resolution={resolution}\n values={filterValues}\n onValuesChange={handleFilterValuesChange}\n />\n </div>\n );\n}\n\nfunction parseSelectedProtocols(\n filters?: Array<API.TokenFilterOption>,\n protocols?: Array<TokenProtocol>,\n): Array<TokenProtocol> {\n const filter = filters?.find(\n (it) => it.field === \"launchedFromProtocolFamily\",\n );\n if (!filter) {\n // select all protocols default\n return [...(protocols || [])];\n }\n if (filter.operator === \"in\") {\n return filter.value as Array<TokenProtocol>;\n }\n console.warn(\"invalid token protocols filter\", filter);\n return [...(protocols || [])];\n}\n\nfunction toFilters(\n protocols: Array<TokenProtocol> | undefined,\n selectedProtocols: Array<TokenProtocol>,\n keywords: Array<string> | undefined,\n excludeKeywords: Array<string> | undefined,\n filterValues: Array<API.TokenFilterOption> | undefined,\n): TokenListFiltersType | undefined {\n const filters = filterValues\n ? [\n ...filterValues.filter(\n (it) => it.field !== \"launchedFromProtocolFamily\",\n ),\n ]\n : [];\n\n if (protocols && protocols.length > 0) {\n const allProtocolsSelected = protocols.every((protocol) =>\n selectedProtocols.includes(protocol),\n );\n if (!allProtocolsSelected) {\n filters.push({\n field: \"launchedFromProtocolFamily\",\n operator: \"in\",\n value: selectedProtocols,\n });\n }\n }\n\n return keywords === undefined &&\n excludeKeywords === undefined &&\n filters.length === 0\n ? undefined\n : {\n keywords,\n excludeKeywords,\n filters: filters.length > 0 ? filters : undefined,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n FilterIcon,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n RefreshIcon,\n ScrollShadow,\n StyledModal,\n useDisclosure,\n} from \"@liberfi.io/ui\";\nimport {\n TokenListFilter,\n TokenListFilterProps,\n TokenListFiltersType,\n} from \"./token-list-filter.ui\";\n\nexport type TokenListFilterModalProps = Pick<\n TokenListFilterProps,\n \"protocols\" | \"resolution\" | \"filters\" | \"onFiltersChange\"\n>;\n\nexport function TokenListFilterModal({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n}: TokenListFilterModalProps) {\n const { t } = useTranslation();\n\n const { isOpen, onOpen, onClose, onOpenChange } = useDisclosure();\n\n const [editingFilters, setEditingFilters] = useState<\n TokenListFiltersType | undefined\n >(filters);\n\n const handleReset = useCallback(() => {\n setEditingFilters(undefined);\n }, []);\n\n const handleApply = useCallback(() => {\n onFiltersChange?.(editingFilters);\n onClose();\n }, [editingFilters, onFiltersChange, onClose]);\n\n useEffect(() => {\n setEditingFilters(filters);\n }, [isOpen, filters]);\n\n const isEmptyFilters = useMemo(() => {\n return Object.values(filters || {}).every((value) => value === undefined);\n }, [filters]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={onOpen}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 32,\n height: 32,\n minHeight: 32,\n cursor: \"pointer\",\n position: \"relative\",\n }}\n >\n <FilterIcon width={16} height={16} className=\"text-zinc-400\" />\n {!isEmptyFilters && (\n <span\n style={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 8,\n height: 8,\n borderRadius: 4,\n background: \"#c7ff2e\",\n }}\n />\n )}\n </button>\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size=\"md\"\n scrollBehavior=\"inside\"\n >\n <ModalContent className=\"w-full h-full\">\n <ModalHeader className=\"px-4 py-2\">\n <span className=\"text-base font-semibold\">\n {t(\"tokens.filters.modal.title\")}\n </span>\n </ModalHeader>\n <ModalBody className=\"px-0 pt-0 pb-4\">\n <ScrollShadow>\n <TokenListFilter\n protocols={protocols}\n resolution={resolution}\n filters={editingFilters}\n onFiltersChange={setEditingFilters}\n className=\"pb-4\"\n />\n </ScrollShadow>\n </ModalBody>\n <ModalFooter className=\"px-4\">\n <div className=\"w-full flex justify-between items-center\">\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"common.reset\")}\n </Button>\n <Button\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"common.apply\")}\n </Button>\n </div>\n </ModalFooter>\n </ModalContent>\n </StyledModal>\n </>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PopoverProps } from \"@liberfi.io/ui\";\nimport { Button, FilterIcon, RefreshIcon, ScrollShadow } from \"@liberfi.io/ui\";\nimport {\n TokenListFilter,\n TokenListFilterProps,\n TokenListFiltersType,\n} from \"./token-list-filter.ui\";\n\nexport type TokenListFilterPopoverProps = Pick<PopoverProps, \"placement\"> &\n Pick<\n TokenListFilterProps,\n \"protocols\" | \"resolution\" | \"filters\" | \"onFiltersChange\"\n >;\n\nconst triggerStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n fontSize: 14,\n fontWeight: 700,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n height: 32,\n};\n\nconst dropdownStyle: React.CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\nconst dividerStyle: React.CSSProperties = {\n height: 1,\n background: \"rgba(39,39,42,1)\",\n margin: 0,\n};\n\nexport function TokenListFilterPopover({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n}: TokenListFilterPopoverProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [editingFilters, setEditingFilters] = useState<\n TokenListFiltersType | undefined\n >(filters);\n\n const handleReset = useCallback(() => {\n setEditingFilters(undefined);\n }, []);\n\n const handleApply = useCallback(() => {\n onFiltersChange?.(editingFilters);\n setIsOpen(false);\n }, [editingFilters, onFiltersChange]);\n\n useEffect(() => {\n setEditingFilters(filters);\n }, [isOpen, filters]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", onEscape);\n return () => document.removeEventListener(\"keydown\", onEscape);\n }, [isOpen]);\n\n const isEmptyFilters = useMemo(() => {\n return Object.values(filters || {}).every((value) => value === undefined);\n }, [filters]);\n\n return (\n <div ref={containerRef} style={{ position: \"relative\" }}>\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n style={triggerStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => setIsOpen((v) => !v)}\n >\n <FilterIcon width={16} height={16} className=\"flex-none\" />\n <span className=\"hidden sm:block\">\n {t(\"tokens.listHeader.filter\")}\n </span>\n <ChevronDown open={isOpen} />\n </button>\n\n {!isEmptyFilters && (\n <span\n style={{\n position: \"absolute\",\n top: -4,\n right: -4,\n minWidth: 8,\n height: 8,\n borderRadius: 4,\n background: \"#c7ff2e\",\n }}\n />\n )}\n </div>\n\n {isOpen && (\n <div style={{ ...dropdownStyle, width: 420 }}>\n <div style={{ padding: \"16px 0\" }}>\n <ScrollShadow className=\"w-full max-h-120 px-4\">\n <TokenListFilter\n protocols={protocols}\n resolution={resolution}\n filters={editingFilters}\n onFiltersChange={setEditingFilters}\n />\n </ScrollShadow>\n </div>\n <div style={dividerStyle} />\n <div\n style={{\n padding: \"12px 16px\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <Button\n variant=\"light\"\n size=\"sm\"\n color=\"default\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"common.reset\")}\n </Button>\n <Button\n variant=\"solid\"\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"common.apply\")}\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","import { PopoverProps, useScreen } from \"@liberfi.io/ui\";\nimport {\n TokenListFilterModal,\n TokenListFilterModalProps,\n} from \"./token-list-filter-modal.ui\";\nimport { TokenListFilterPopover } from \"./token-list-filter-popover.ui\";\n\nexport type TokenListFilterWidgetProps = TokenListFilterModalProps & {\n /** Popover placement used on non-mobile screens. @default \"bottom-end\" */\n popoverPlacement?: PopoverProps[\"placement\"];\n};\n\nexport function TokenListFilterWidget({\n popoverPlacement = \"bottom-end\",\n ...filterProps\n}: TokenListFilterWidgetProps) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return <TokenListFilterModal {...filterProps} />;\n }\n\n return (\n <TokenListFilterPopover placement={popoverPlacement} {...filterProps} />\n );\n}\n","import { Key, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledPlainTabs, Tab } from \"@liberfi.io/ui\";\nimport { TokenListResolution, TokenListResolutionSelectorProps } from \"./types\";\n\nexport function TokenListResolutionSelectorDesktop({\n resolution,\n onResolutionChange,\n resolutionOptions = [\"1m\", \"5m\", \"1h\", \"4h\", \"24h\"],\n}: TokenListResolutionSelectorProps) {\n const { t } = useTranslation();\n\n const handleResolutionChange = useCallback(\n (key: Key) => {\n onResolutionChange?.(key as TokenListResolution);\n },\n [onResolutionChange],\n );\n\n return (\n <StyledPlainTabs\n color=\"primary\"\n radius=\"lg\"\n selectedKey={resolution}\n onSelectionChange={handleResolutionChange}\n aria-label=\"Select Resolution\"\n classNames={{\n tabList: \"gap-0\",\n tab: \"px-2\",\n tabContent:\n \"!text-zinc-500 group-data-[hover=true]:!text-foreground group-data-[selected=true]:!text-primary\",\n }}\n >\n {resolutionOptions.map((option) => (\n <Tab key={option} title={t(`common.resolution.${option}`)} />\n ))}\n </StyledPlainTabs>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChevronDownIcon, cn } from \"@liberfi.io/ui\";\nimport { TokenListResolution, TokenListResolutionSelectorProps } from \"./types\";\n\nconst triggerStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"0 10px\",\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n height: 32,\n minHeight: 32,\n};\n\nconst dropdownStyle: React.CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 6,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n padding: \"6px\",\n minWidth: \"100%\",\n};\n\nexport function TokenListResolutionSelectorMobile({\n resolution,\n onResolutionChange,\n resolutionOptions = [\"1m\", \"5m\", \"1h\", \"4h\", \"24h\"],\n}: TokenListResolutionSelectorProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleSelect = useCallback(\n (option: TokenListResolution) => {\n onResolutionChange?.(option);\n setIsOpen(false);\n },\n [onResolutionChange],\n );\n\n useEffect(() => {\n if (!isOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen]);\n\n return (\n <div ref={containerRef} style={{ position: \"relative\", zIndex: 50 }}>\n <button\n type=\"button\"\n style={triggerStyle}\n onClick={() => setIsOpen((v) => !v)}\n >\n <span>{resolution ? t(`common.resolution.${resolution}`) : \"—\"}</span>\n <ChevronDownIcon\n width={14}\n height={14}\n className=\"text-zinc-500\"\n style={{\n transition: \"transform 0.15s\",\n transform: isOpen ? \"rotate(180deg)\" : undefined,\n }}\n />\n </button>\n\n {isOpen && (\n <div style={dropdownStyle}>\n {resolutionOptions.map((option) => (\n <button\n key={option}\n type=\"button\"\n onClick={() => handleSelect(option)}\n className={cn(\n \"w-full text-left px-3 py-1.5 rounded-lg text-xs font-medium transition-colors cursor-pointer\",\n option === resolution\n ? \"text-primary bg-primary/10\"\n : \"text-zinc-400 hover:text-foreground hover:bg-zinc-800\",\n )}\n >\n {t(`common.resolution.${option}`)}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useScreen } from \"@liberfi.io/ui\";\nimport { TokenListResolutionSelectorDesktop } from \"./token-list-resolution-selector-desktop.ui\";\nimport { TokenListResolutionSelectorMobile } from \"./token-list-resolution-selector-mobile.ui\";\nimport { TokenListResolutionSelectorProps } from \"./types\";\n\nexport function TokenListResolutionSelectorWidget(\n props: TokenListResolutionSelectorProps,\n) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return <TokenListResolutionSelectorMobile {...props} />;\n }\n\n return <TokenListResolutionSelectorDesktop {...props} />;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n cn,\n HorsePowerHighIcon,\n HorsePowerIcon,\n HorsePowerLowIcon,\n StyledTooltip,\n} from \"@liberfi.io/ui\";\nimport { formatPercent } from \"@liberfi.io/utils\";\nimport { SafeBigNumber } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenBlueChipCell({ token }: TokenCellProps) {\n const { t } = useTranslation();\n\n const bluechipHoldingsRatio = useMemo(\n () => token.marketData?.bluechipHoldingsRatio,\n [token.marketData?.bluechipHoldingsRatio],\n );\n\n const ratioHigh = useMemo(\n () =>\n bluechipHoldingsRatio !== undefined &&\n new SafeBigNumber(bluechipHoldingsRatio).gte(0.1),\n [bluechipHoldingsRatio],\n );\n\n const ratioLow = useMemo(\n () =>\n bluechipHoldingsRatio === undefined ||\n new SafeBigNumber(bluechipHoldingsRatio).lt(0.05),\n [bluechipHoldingsRatio],\n );\n\n return (\n <StyledTooltip content={t(\"tokens.bluechip.explained\")}>\n <div className=\"flex items-center gap-2.5\">\n {ratioHigh && <HorsePowerHighIcon />}\n {ratioLow && <HorsePowerLowIcon />}\n {!ratioHigh && !ratioLow && <HorsePowerIcon />}\n\n <span\n className={cn(\n ratioHigh && \"text-bullish\",\n !ratioHigh && !ratioLow && \"text-bearish\",\n bluechipHoldingsRatio === undefined && \"text-neutral\",\n )}\n >\n {formatPercent(bluechipHoldingsRatio)}\n </span>\n </div>\n </StyledTooltip>\n );\n}\n","import { MouseEvent, useCallback } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n CopyIcon,\n DiscordIcon,\n Link,\n SearchIcon,\n TelegramIcon,\n TwitterIcon,\n WebsiteIcon,\n StyledTooltip,\n toast,\n useCopyToClipboard,\n} from \"@liberfi.io/ui\";\nimport { formatAge, searchTwitterUrl } from \"@liberfi.io/utils\";\nimport { TokenAvatar } from \"../../token-avatar\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenCell({ token }: TokenCellProps) {\n const copyToClipboard = useCopyToClipboard();\n\n const { t } = useTranslation();\n\n const handleCopyToClipboard = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n copyToClipboard(token.address, () =>\n toast.success(t(\"tokens.copied.address\")),\n );\n },\n [copyToClipboard, token.address, t],\n );\n\n const age = useTickAge(token.createdAt);\n\n return (\n <div className=\"w-full flex justify-start items-center gap-3\">\n {/* avatar */}\n <TokenAvatar\n token={token}\n className=\"w-10 h-10 sm:w-16 sm:h-16 flex-none\"\n />\n\n {/* symbol & name & social media ...etc */}\n <div className=\"flex-auto flex flex-col gap-1 min-w-0\">\n {/* symbol & name */}\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-none font-medium tracking-[-0.02em]\">\n {token.symbol}\n </span>\n <StyledTooltip content={token.name}>\n <div\n className=\"flex-initial flex items-center gap-1 min-w-0 text-neutral hover:text-primary-200 cursor-pointer\"\n onClick={handleCopyToClipboard}\n >\n <div className=\"flex-initial whitespace-nowrap truncate\">\n {token.name}\n </div>\n <CopyIcon className=\"flex-none w-3 h-3 sm:w-3.5 sm:h-3.5\" />\n </div>\n </StyledTooltip>\n </div>\n\n {/* social medias */}\n <div className=\"flex items-center gap-2\">\n {/* age */}\n <span className=\"text-primary text-xs sm:text-sm font-medium\">\n {formatAge(age)}\n </span>\n {/* website */}\n {token.socialMedias?.website && (\n <Link\n href={token.socialMedias.website}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <WebsiteIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* twitter */}\n {token.socialMedias?.twitter && (\n <Link\n href={token.socialMedias.twitter}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <TwitterIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* telegram */}\n {token.socialMedias?.telegram && (\n <Link\n href={token.socialMedias.telegram}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <TelegramIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* discord */}\n {token.socialMedias?.discord && (\n <Link\n href={token.socialMedias.discord}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <DiscordIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* search on twitter */}\n <Link\n href={searchTwitterUrl(`${token.symbol} OR ${token.address}`)}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <SearchIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n </div>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n BundlesIcon,\n cn,\n CookIcon,\n KlineCandlesIcon,\n PeopleIcon,\n RatIcon,\n SniperIcon,\n StarIcon,\n StyledTooltip,\n UserWithStarBadgeIcon,\n} from \"@liberfi.io/ui\";\nimport { formatAmount, formatPercent, SafeBigNumber } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\ntype InfoColor = \"neutral\" | \"bullish\" | \"bearish\";\n\nconst COLOR_CLASS: Record<InfoColor, string> = {\n neutral: \"text-zinc-400\",\n bullish: \"text-bullish\",\n bearish: \"text-bearish\",\n};\n\nfunction InfoItem({\n icon,\n value,\n tooltip,\n color = \"neutral\",\n}: {\n icon: React.ReactNode;\n value: string;\n tooltip: string;\n color?: InfoColor;\n}) {\n return (\n <StyledTooltip content={tooltip}>\n <span\n className=\"inline-flex items-center text-xs tabular-nums\"\n style={{ gap: 5 }}\n >\n <span className=\"flex-none\" style={{ color: \"#52525b\" }}>\n {icon}\n </span>\n <span className={cn(COLOR_CLASS[color])}>{value}</span>\n </span>\n </StyledTooltip>\n );\n}\n\nexport function TokenInfoCell({ token }: TokenCellProps) {\n const { t } = useTranslation();\n\n const md = token.marketData;\n\n const top10Warn = useMemo(\n () => new SafeBigNumber(md?.top10HoldingsRatio).gte(0.1),\n [md?.top10HoldingsRatio],\n );\n const devWarn = useMemo(\n () => new SafeBigNumber(md?.devHoldingsRatio).gte(0.1),\n [md?.devHoldingsRatio],\n );\n const sniperWarn = useMemo(\n () => new SafeBigNumber(md?.sniperHoldingsRatio).gte(0.1),\n [md?.sniperHoldingsRatio],\n );\n const insiderWarn = useMemo(\n () => new SafeBigNumber(md?.insiderHoldingsRatio).gte(0.1),\n [md?.insiderHoldingsRatio],\n );\n const bundleWarn = useMemo(\n () => new SafeBigNumber(md?.bundleHoldingsRatio).gte(0.1),\n [md?.bundleHoldingsRatio],\n );\n\n const ratioColor = (warn: boolean, raw: number | undefined): InfoColor => {\n if (raw === undefined) return \"neutral\";\n return warn ? \"bearish\" : \"bullish\";\n };\n\n return (\n <div className=\"w-full h-full flex gap-5 justify-start items-center\">\n <div className=\"flex flex-col gap-1\">\n <InfoItem\n icon={<PeopleIcon width={14} height={14} />}\n value={formatAmount(md?.holders)}\n tooltip={t(\"tokens.tokenInfo.holders\")}\n />\n <InfoItem\n icon={<KlineCandlesIcon width={14} height={14} />}\n value={formatAmount(md?.proHolders)}\n tooltip={t(\"tokens.tokenInfo.proHolders\")}\n />\n <InfoItem\n icon={<StarIcon width={14} height={14} />}\n value={formatAmount(md?.kolHolders)}\n tooltip={t(\"tokens.tokenInfo.kolHolders\")}\n />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <InfoItem\n icon={<UserWithStarBadgeIcon width={14} height={14} />}\n value={formatPercent(md?.top10HoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.top10HoldingsRatio\")}\n color={ratioColor(top10Warn, md?.top10HoldingsRatio)}\n />\n <InfoItem\n icon={<CookIcon width={14} height={14} />}\n value={formatPercent(md?.devHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.devHoldingsRatio\")}\n color={ratioColor(devWarn, md?.devHoldingsRatio)}\n />\n <InfoItem\n icon={<SniperIcon width={14} height={14} />}\n value={formatPercent(md?.sniperHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.sniperHoldingsRatio\")}\n color={ratioColor(sniperWarn, md?.sniperHoldingsRatio)}\n />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <InfoItem\n icon={<RatIcon width={14} height={14} />}\n value={formatPercent(md?.insiderHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.insiderHoldingsRatio\")}\n color={ratioColor(insiderWarn, md?.insiderHoldingsRatio)}\n />\n <InfoItem\n icon={<BundlesIcon width={14} height={14} />}\n value={formatPercent(md?.bundleHoldingsRatio)}\n tooltip={t(\"tokens.tokenInfo.bundleHoldingsRatio\")}\n color={ratioColor(bundleWarn, md?.bundleHoldingsRatio)}\n />\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenLiquidityCell({ token }: TokenCellProps) {\n const liquidity = useMemo(\n () => token.marketData?.tvlInUsd,\n [token.marketData?.tvlInUsd],\n );\n return <>{formatAmountUSD(liquidity)}</>;\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenMarketCapCell({ token }: TokenCellProps) {\n const marketCap = useMemo(\n () => token.marketData?.marketCapInUsd,\n [token.marketData?.marketCapInUsd],\n );\n return <>{formatAmountUSD(marketCap)}</>;\n}\n","import { useMemo } from \"react\";\nimport { cn, TriangleDownIcon, TriangleUpIcon } from \"@liberfi.io/ui\";\nimport {\n formatPercent,\n formatPriceUSD,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenPriceCell({ token, resolution }: TokenCellProps) {\n const price = useMemo(() => token.marketData?.priceInUsd, [token]);\n\n const priceChange = useMemo(\n () => token.stats?.[resolution]?.priceChange,\n [token, resolution],\n );\n\n const priceChangeAbs = useMemo(\n () =>\n priceChange ? new SafeBigNumber(priceChange).abs().toString() : undefined,\n [priceChange],\n );\n\n const bullish = useMemo(\n () => priceChange && new SafeBigNumber(priceChange).gte(0),\n [priceChange],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatPriceUSD(price)}</span>\n <span\n className={cn(\n \"inline-flex gap-1 items-center text-xs\",\n bullish ? \"text-bullish\" : \"text-bearish\",\n )}\n >\n {bullish ? (\n <TriangleUpIcon width={10} height={10} />\n ) : (\n <TriangleDownIcon width={10} height={10} />\n )}\n <span>{formatPercent(priceChangeAbs)}</span>\n </span>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenTradersCell({ token, resolution }: TokenCellProps) {\n const traders = useMemo(\n () => token.stats?.[resolution]?.traders,\n [token.stats?.[resolution]?.traders],\n );\n\n const buyers = useMemo(\n () => token.stats?.[resolution]?.buyers,\n [token.stats?.[resolution]?.buyers],\n );\n\n const sellers = useMemo(\n () => token.stats?.[resolution]?.sellers,\n [token.stats?.[resolution]?.sellers],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmount(traders)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmount(buyers)}</span>/\n <span className=\"text-bearish\">{formatAmount(sellers)}</span>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenTradesCell({ token, resolution }: TokenCellProps) {\n const txs = useMemo(\n () => token.stats?.[resolution]?.trades,\n [token.stats?.[resolution]?.trades],\n );\n\n const buys = useMemo(\n () => token.stats?.[resolution]?.buys,\n [token.stats?.[resolution]?.buys],\n );\n\n const sells = useMemo(\n () => token.stats?.[resolution]?.sells,\n [token.stats?.[resolution]?.sells],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmount(txs)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmount(buys)}</span>/\n <span className=\"text-bearish\">{formatAmount(sells)}</span>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenVolumesCell({ token, resolution }: TokenCellProps) {\n const volumes = useMemo(\n () => token.stats?.[resolution]?.volumesInUsd,\n [token.stats?.[resolution]?.volumesInUsd],\n );\n\n const buyVolumes = useMemo(\n () => token.stats?.[resolution]?.buyVolumesInUsd,\n [token.stats?.[resolution]?.buyVolumesInUsd],\n );\n\n const sellVolumes = useMemo(\n () => token.stats?.[resolution]?.sellVolumesInUsd,\n [token.stats?.[resolution]?.sellVolumesInUsd],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmountUSD(volumes)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmountUSD(buyVolumes)}</span>/\n <span className=\"text-bearish\">{formatAmountUSD(sellVolumes)}</span>\n </div>\n </div>\n );\n}\n","export interface TokenListSkeletonProps {\n rowHeight: number;\n hasActions: boolean;\n}\n\nconst SHIMMER_CSS = `\n@keyframes tklShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}\n`;\n\nconst shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"tklShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n};\n\nfunction bar(\n delay: number,\n w: number | string,\n h: number,\n extra?: React.CSSProperties,\n): React.CSSProperties {\n return {\n ...shimmer,\n animationDelay: `${delay}ms`,\n width: w,\n height: h,\n ...extra,\n };\n}\n\nconst ROW_COUNT = 10;\n\nexport function TokenListSkeleton({\n rowHeight,\n hasActions,\n}: TokenListSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n {Array.from({ length: ROW_COUNT }).map((_, i) => (\n <SkeletonRow\n key={i}\n index={i}\n rowHeight={rowHeight}\n hasActions={hasActions}\n isLast={i === ROW_COUNT - 1}\n />\n ))}\n </>\n );\n}\n\nfunction SkeletonRow({\n index,\n rowHeight,\n hasActions,\n isLast,\n}: {\n index: number;\n rowHeight: number;\n hasActions: boolean;\n isLast: boolean;\n}) {\n const d = index * 80;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: rowHeight,\n borderBottom: isLast ? undefined : \"1px solid rgba(39,39,42,0.3)\",\n }}\n >\n {/* Token — 320px: avatar 64x64 + name/subtitle */}\n <div\n style={{\n width: 320,\n padding: \"0 12px 0 24px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n flexShrink: 0,\n }}\n >\n <div style={bar(d, 64, 64, { borderRadius: 8, flexShrink: 0 })} />\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n flex: 1,\n }}\n >\n <div style={bar(d + 30, \"60%\", 20)} />\n <div style={bar(d + 60, \"80%\", 16)} />\n </div>\n </div>\n\n {/* Price/Change — 128px: price 20px + change 16px */}\n <div\n style={{\n width: 128,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 20, 72, 20)} />\n <div style={bar(d + 40, 52, 16)} />\n </div>\n\n {/* Market cap — 106px: single value 20px */}\n <div\n style={{\n width: 106,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div style={bar(d + 30, 64, 20)} />\n </div>\n\n {/* Liquidity — 106px: single value 20px */}\n <div\n style={{\n width: 106,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div style={bar(d + 40, 60, 20)} />\n </div>\n\n {/* Volumes — 138px: total 20px + buy/sell 16px */}\n <div\n style={{\n width: 138,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 50, 72, 20)} />\n <div style={bar(d + 70, 100, 16)} />\n </div>\n\n {/* Trades — 126px: total 20px + buy/sell 16px */}\n <div\n style={{\n width: 126,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 60, 48, 20)} />\n <div style={bar(d + 80, 80, 16)} />\n </div>\n\n {/* Traders — 126px: total 20px + buy/sell 16px */}\n <div\n style={{\n width: 126,\n padding: \"0 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: 4,\n }}\n >\n <div style={bar(d + 70, 40, 20)} />\n <div style={bar(d + 90, 72, 16)} />\n </div>\n\n {/* Bluechip — 128px: icon 20x20 + text 20px */}\n <div\n style={{\n width: 128,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n }}\n >\n <div style={bar(d + 80, 20, 20, { borderRadius: 4 })} />\n <div style={bar(d + 90, 52, 20)} />\n </div>\n\n {/* Token Info — 308px: 3 columns of icon+value pairs, each 16px tall */}\n <div\n style={{\n width: 308,\n padding: \"0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 20,\n }}\n >\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={bar(d + 80, 52, 16)} />\n <div style={bar(d + 100, 40, 16)} />\n <div style={bar(d + 120, 36, 16)} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={bar(d + 90, 48, 16)} />\n <div style={bar(d + 110, 40, 16)} />\n <div style={bar(d + 130, 40, 16)} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={bar(d + 100, 40, 16)} />\n <div style={bar(d + 120, 36, 16)} />\n </div>\n </div>\n\n {/* Actions — 124px: button 97x32 */}\n {hasActions && (\n <div\n style={{\n width: 124,\n padding: \"0 24px 0 12px\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div style={bar(d + 100, 97, 32, { borderRadius: 8 })} />\n </div>\n )}\n </div>\n );\n}\n","import {\n ComponentType,\n MouseEvent,\n ReactElement,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API, Token } from \"@liberfi.io/types\";\nimport {\n cn,\n EmptyIcon,\n Sortable,\n StyledTable,\n TableBody,\n TableCell,\n TableCellProps,\n TableColumn,\n TableColumnProps,\n TableHeader,\n TableRow,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport {\n TokenBlueChipCell,\n TokenCell,\n TokenInfoCell,\n TokenLiquidityCell,\n TokenMarketCapCell,\n TokenPriceCell,\n TokenTradersCell,\n TokenTradesCell,\n TokenVolumesCell,\n} from \"./cells\";\nimport { TokenListSkeleton } from \"./token-list-skeleton.ui\";\nimport { TokenListResolution } from \"./types\";\n\ntype SortDirection = \"asc\" | \"desc\" | undefined;\n\nexport type TokenListSortDirections = {\n [key in API.TokenFieldOption]?: SortDirection;\n};\n\nexport interface TokenListActionsProps {\n token: Token;\n resolution: TokenListResolution;\n}\n\nexport type TokenListActionsComponent = ComponentType<TokenListActionsProps>;\n\nexport interface TokenListProps {\n /** tokens to display */\n tokens: Array<Token>;\n /** resolution of the token prices */\n resolution?: TokenListResolution;\n /** whether the list is loading */\n isLoading?: boolean;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /** current sort directions */\n sortDirections?: TokenListSortDirections;\n /** callback function when sort direction changes */\n onSortChange?: (\n sortDirections: TokenListSortDirections,\n ) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n}\n\n/**\n * Token List UI Component\n */\nexport function TokenList({\n tokens,\n resolution = \"24h\",\n isLoading,\n ActionsComponent,\n onSelectToken,\n sortDirections,\n onSortChange,\n height = 600,\n itemHeight = 88,\n itemHeightMobile = 72,\n className,\n}: TokenListProps) {\n const { isMobile } = useScreen();\n\n const { t } = useTranslation();\n\n const handleRowClick = useCallback(\n (token: Token) => (e: MouseEvent<HTMLTableRowElement>) => {\n e.preventDefault();\n e.stopPropagation();\n onSelectToken?.(token);\n },\n [onSelectToken],\n );\n\n // latest sort directions\n const [sorts, setSorts] = useState<TokenListSortDirections>(\n sortDirections ?? {},\n );\n\n // update sort directions when they change\n useEffect(() => {\n setSorts(sortDirections ?? {});\n }, [sortDirections]);\n\n // only one field can be sorted at a time\n const handleSortChange = useCallback(\n (field: API.TokenFieldOption) => (sort: \"asc\" | \"desc\" | undefined) => {\n const sorts = { [field]: sort };\n setSorts(sorts);\n onSortChange?.(sorts);\n },\n [onSortChange],\n );\n\n return (\n <StyledTable\n isHeaderSticky\n isVirtualized\n radius=\"lg\"\n className={cn(\n \"h-full mx-auto\",\n className ??\n (ActionsComponent\n ? \"max-w-379 sm:max-w-403\"\n : \"max-w-348 sm:max-w-372\"),\n )}\n classNames={{\n loadingWrapper: \"flex-col justify-start items-start\",\n emptyWrapper: \"pt-30\",\n }}\n style={{\n background: \"rgba(24,24,27,0.4)\",\n borderColor: \"rgba(39,39,42,0.6)\",\n }}\n maxTableHeight={height}\n rowHeight={isMobile ? itemHeightMobile : itemHeight}\n aria-label=\"Tokens\"\n >\n <TableHeader>\n {\n [\n <TableColumn\n key=\"token\"\n textValue={t(\"tokens.listHeader.token\")}\n width={isMobile ? 224 : 320}\n >\n {t(\"tokens.listHeader.token\")}\n </TableColumn>,\n <TableColumn\n key=\"price\"\n textValue={t(\"tokens.listHeader.price\")}\n width={128}\n >\n <div className=\"flex items-center gap-1\">\n <Sortable\n sort={sorts.price}\n onSortChange={handleSortChange(\"price\")}\n >\n {t(\"tokens.listHeader.price\")}\n </Sortable>\n <span>/</span>\n <Sortable\n sort={sorts[`priceChange${resolution}`]}\n onSortChange={handleSortChange(`priceChange${resolution}`)}\n >\n {t(\"tokens.listHeader.priceChange\", { resolution })}\n </Sortable>\n </div>\n </TableColumn>,\n <TableColumn\n key=\"marketCap\"\n textValue={t(\"tokens.listHeader.marketCap\")}\n width={106}\n >\n <Sortable\n sort={sorts.marketCap}\n onSortChange={handleSortChange(\"marketCap\")}\n >\n {t(\"tokens.listHeader.marketCap\")}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"liquidity\"\n textValue={t(\"tokens.listHeader.liquidity\")}\n width={106}\n >\n <Sortable sort={sorts.tvl} onSortChange={handleSortChange(\"tvl\")}>\n {t(\"tokens.listHeader.liquidity\")}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"volumes\"\n textValue={t(\"tokens.listHeader.volumes\", { resolution })}\n width={138}\n >\n <Sortable\n sort={sorts[`volumes${resolution}`]}\n onSortChange={handleSortChange(`volumes${resolution}`)}\n >\n {t(\"tokens.listHeader.volumes\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"txs\"\n textValue={t(\"tokens.listHeader.txs\", { resolution })}\n width={126}\n >\n <Sortable\n sort={sorts[`trades${resolution}`]}\n onSortChange={handleSortChange(`trades${resolution}`)}\n >\n {t(\"tokens.listHeader.txs\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"traders\"\n textValue={t(\"tokens.listHeader.traders\", { resolution })}\n width={126}\n >\n <Sortable\n sort={sorts[`traders${resolution}`]}\n onSortChange={handleSortChange(`traders${resolution}`)}\n >\n {t(\"tokens.listHeader.traders\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"bluechip\"\n textValue={t(\"tokens.listHeader.bluechip\")}\n width={128}\n >\n {t(\"tokens.listHeader.bluechip\")}\n </TableColumn>,\n <TableColumn\n key=\"tokenInfo\"\n textValue={t(\"tokens.listHeader.tokenInfo\")}\n width={308}\n >\n {t(\"tokens.listHeader.tokenInfo\")}\n </TableColumn>,\n ActionsComponent ? (\n <TableColumn\n key=\"actions\"\n textValue={t(\"tokens.listHeader.actions\")}\n width={124}\n align=\"end\"\n >\n {t(\"tokens.listHeader.actions\")}\n </TableColumn>\n ) : undefined,\n ].filter(Boolean) as ReactElement<TableColumnProps<unknown>>[]\n }\n </TableHeader>\n\n <TableBody\n // don't show the loaded content when loading\n items={isLoading ? [] : tokens}\n isLoading={isLoading}\n loadingContent={\n <TokenListSkeleton\n rowHeight={isMobile ? itemHeightMobile : itemHeight}\n hasActions={!!ActionsComponent}\n />\n }\n emptyContent={\n <div>\n <EmptyIcon className=\"w-10 h-10 mx-auto text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral text-center\">\n {t(\"common.empty\")}\n </p>\n </div>\n }\n >\n {(token) => (\n <TableRow\n key={token.address}\n onClick={onSelectToken ? handleRowClick(token) : undefined}\n >\n {\n [\n <TableCell key=\"token\">\n <TokenCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"price\">\n <TokenPriceCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"marketCap\">\n <TokenMarketCapCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"liquidity\">\n <TokenLiquidityCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"volumes\">\n <TokenVolumesCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"trades\">\n <TokenTradesCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"traders\">\n <TokenTradersCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"bluechip\">\n <TokenBlueChipCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"tokenInfo\">\n <TokenInfoCell token={token} resolution={resolution} />\n </TableCell>,\n ActionsComponent ? (\n <TableCell key=\"actions\">\n <ActionsComponent token={token} resolution={resolution} />\n </TableCell>\n ) : undefined,\n ].filter(Boolean) as ReactElement<TableCellProps>[]\n }\n </TableRow>\n )}\n </TableBody>\n </StyledTable>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNewTokensQuery, useNewTokensSubscription } from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\nimport { TokenListResolution } from \"./types\";\n\nconst MAX_ITEMS = 80;\n\nexport type UseNewTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseNewTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nfunction tokenFromSubscribed(sub: API.TokenSubscribed): Token {\n return {\n chain: sub.chain,\n address: sub.address,\n name: sub.name ?? \"\",\n symbol: sub.symbol ?? \"\",\n decimals: sub.decimals ?? 0,\n image: sub.image,\n description: sub.description,\n socialMedias: sub.socialMedias,\n launchedFrom: sub.launchedFrom,\n migratedTo: sub.migratedTo,\n createdAt: sub.createdAt,\n };\n}\n\nfunction sortAndLimit(tokens: Token[]): Token[] {\n tokens.sort((a, b) => {\n const at = a.createdAt?.getTime() ?? 0;\n const bt = b.createdAt?.getTime() ?? 0;\n return bt - at;\n });\n return tokens.slice(0, MAX_ITEMS);\n}\n\nexport function useNewTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseNewTokensScriptParams): UseNewTokensScriptResult {\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n const prevParamsRef = useRef(queryParams);\n\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n setTokens([]);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useNewTokensQuery(queryParams, {\n refetchInterval,\n });\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const merged = [...prev];\n for (const token of fetchedTokens) {\n const idx = merged.findIndex((t) => t.address === token.address);\n if (idx >= 0) {\n merged[idx] = mergeToken(merged[idx], token);\n } else {\n merged.push(token);\n }\n }\n return sortAndLimit(merged);\n });\n setIsParamsChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates (new tokens, metadata, stats, etc.) ---\n const handleUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const sub of data) {\n const idx = merged.findIndex((t) => t.address === sub.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], sub);\n } else {\n changed = true;\n merged.push(tokenFromSubscribed(sub));\n }\n }\n return changed ? sortAndLimit(merged) : prev;\n });\n }, []);\n\n useNewTokensSubscription({ chain }, handleUpdate);\n\n const isLoading = useMemo(() => {\n if (isPending) return true;\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { useNewTokensScript } from \"./new-token-list.script\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { TokenListResolution } from \"./types\";\n\nexport type NewTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function NewTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: NewTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n useEffect(() => {\n setSortDirections(undefined);\n }, [chain]);\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useNewTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useStockTokensQuery,\n useStockTokensSubscription,\n} from \"@liberfi.io/react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../../utils/merge\";\nimport { TokenListResolution } from \"./types\";\n\nexport type UseStockTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseStockTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nexport function useStockTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseStockTokensScriptParams): UseStockTokensScriptResult {\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n const prevParamsRef = useRef(queryParams);\n\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n setTokens([]);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // --- HTTP query (periodic refetch) ---\n const { data: fetchedTokens, isPending } = useStockTokensQuery(queryParams, {\n refetchInterval,\n });\n\n useEffect(() => {\n if (!fetchedTokens) return;\n setTokens((prev) => {\n const merged: Array<Token> = [];\n for (const token of fetchedTokens) {\n const existing = prev.find((t) => t.address === token.address);\n merged.push(existing ? mergeToken(existing, token) : token);\n }\n return merged;\n });\n setIsParamsChanged(false);\n }, [fetchedTokens]);\n\n // --- WebSocket: real-time updates ---\n const handleDataUpdate = useCallback((data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n const merged = [...prev];\n let changed = false;\n for (const item of data) {\n const idx = merged.findIndex((t) => t.address === item.address);\n if (idx >= 0) {\n changed = true;\n merged[idx] = mergeToken(merged[idx], item);\n }\n }\n return changed ? merged : prev;\n });\n }, []);\n\n useStockTokensSubscription({ chain }, handleDataUpdate);\n\n const isLoading = useMemo(() => {\n if (isPending) return true;\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { useStockTokensScript } from \"./stock-token-list.script\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { TokenListResolution } from \"./types\";\n\nexport type StockTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function StockTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: StockTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n useEffect(() => {\n setSortDirections(undefined);\n }, [chain]);\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useStockTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { useTrendingTokensScript } from \"./trending-token-list.script\";\nimport { TokenListResolution } from \"./types\";\n\nexport type TrendingTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function TrendingTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: TrendingTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n useEffect(() => {\n setSortDirections(undefined);\n }, [chain]);\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useTrendingTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useDexClient, useTokensQuery } from \"@liberfi.io/react\";\nimport type { API, Chain, Token } from \"@liberfi.io/types\";\nimport { mergeToken } from \"../utils/merge\";\n\nconst DEFAULT_POLL_MS = 15_000;\n\nexport interface UseTokensParams {\n chain: Chain;\n /** Token addresses to track */\n addresses: string[];\n /** Polling interval in ms (default 15 000) */\n pollMs?: number;\n}\n\nexport function useTokens({\n chain,\n addresses,\n pollMs = DEFAULT_POLL_MS,\n}: UseTokensParams) {\n const active = addresses.length > 0;\n\n const [tokens, setTokens] = useState<Record<string, Token>>({});\n\n // ── Query (polling) ──────────────────────────────────────────────────────\n\n const query = useTokensQuery(\n { chain, addresses },\n { enabled: active, refetchInterval: pollMs },\n );\n\n // ── Sync query data → local state ──────────────────────────────────────\n\n useEffect(() => {\n if (!query.data) return;\n setTokens((prev) => {\n const next: Record<string, Token> = {};\n for (const token of query.data!) {\n const existing = prev[token.address];\n next[token.address] = existing ? mergeToken(existing, token) : token;\n }\n return next;\n });\n }, [query.data]);\n\n // ── Subscriptions (real-time) ──────────────────────────────────────────\n\n const { subscribeClient } = useDexClient();\n\n const addrKeyRef = useRef(\"\");\n const addrKey = addresses.slice().sort().join(\",\");\n if (addrKey !== addrKeyRef.current) {\n addrKeyRef.current = addrKey;\n }\n\n useEffect(() => {\n if (!active) return;\n\n const subs: Array<API.ISubscription> = [];\n\n for (const address of addresses) {\n subs.push(\n subscribeClient.subscribeToken(\n chain,\n address,\n (data: Array<API.TokenSubscribed>) => {\n setTokens((prev) => {\n let updated = prev;\n for (const incoming of data) {\n const existing = updated[incoming.address];\n if (!existing) continue;\n\n const merged = mergeToken(existing, incoming);\n if (merged === existing) continue;\n\n updated = updated === prev ? { ...prev } : updated;\n updated[incoming.address] = merged;\n }\n return updated;\n });\n },\n ),\n );\n }\n\n return () => {\n for (const sub of subs) {\n sub.unsubscribe();\n }\n };\n }, [subscribeClient, chain, addrKey, active]);\n\n // ── Refetch ────────────────────────────────────────────────────────────\n\n const refetch = useCallback(async () => {\n await query.refetch();\n }, [query.refetch]);\n\n // ── Return ─────────────────────────────────────────────────────────────\n\n return {\n tokens,\n\n isPending: query.isPending,\n isFetching: query.isFetching,\n isError: query.isError,\n isSuccess: query.isSuccess,\n error: query.error,\n\n refetch,\n };\n}\n"]}
|