From ace42ed0daf111bbeb9e57034a48e4617be6f565 Mon Sep 17 00:00:00 2001 From: therealwolf42 <76-therealwolf42@users.noreply.gitlab.syncad.com> Date: Tue, 25 Nov 2025 19:56:38 +0100 Subject: [PATCH 1/2] milestones --- apps/web/public/images/circle_hive_red.png | Bin 0 -> 154617 bytes apps/web/src/app/[locale]/page.tsx | 321 ++++++++---- apps/web/src/components/LayoutContent.tsx | 15 +- apps/web/src/components/cards/TokenCard.tsx | 153 ++++++ .../src/components/charts/TokenDonutChart.tsx | 118 +++++ apps/web/src/components/footer/Footer.tsx | 28 +- .../components/footer/FooterNavigation.tsx | 2 +- apps/web/src/components/hero/DynamicHero.tsx | 464 +++++++++++------- apps/web/src/components/root/LogoMarquee.tsx | 126 +++++ apps/web/src/components/root/RootDPoS.tsx | 168 +++++++ apps/web/src/components/root/RootEco.tsx | 99 ++-- apps/web/src/components/root/RootHistory.tsx | 89 ++++ apps/web/src/hooks/defaultActivities.ts | 6 +- apps/web/src/hooks/useBlockProducers.ts | 121 +++++ apps/web/src/hooks/useBlockchainActivity.ts | 38 +- apps/web/src/hooks/useTVL.ts | 168 +++++++ apps/web/src/hooks/useTotalAccounts.ts | 71 +++ apps/web/src/hooks/useTransactionStats.ts | 132 +++++ apps/web/src/lib/data/socialmedias.ts | 28 +- apps/web/src/lib/fontawesome.ts | 10 +- packages/hive-lib/src/activity.ts | 142 +++--- 21 files changed, 1839 insertions(+), 460 deletions(-) create mode 100644 apps/web/public/images/circle_hive_red.png create mode 100644 apps/web/src/components/cards/TokenCard.tsx create mode 100644 apps/web/src/components/charts/TokenDonutChart.tsx create mode 100644 apps/web/src/components/root/LogoMarquee.tsx create mode 100644 apps/web/src/components/root/RootDPoS.tsx create mode 100644 apps/web/src/components/root/RootHistory.tsx create mode 100644 apps/web/src/hooks/useBlockProducers.ts create mode 100644 apps/web/src/hooks/useTVL.ts create mode 100644 apps/web/src/hooks/useTotalAccounts.ts create mode 100644 apps/web/src/hooks/useTransactionStats.ts diff --git a/apps/web/public/images/circle_hive_red.png b/apps/web/public/images/circle_hive_red.png new file mode 100644 index 0000000000000000000000000000000000000000..818e3f3a7e36ef587a91265bd5e63e534d37dfa7 GIT binary patch literal 154617 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

ES<@eZ_y!JD9hNM@c$2QNR?zA=|^GQw& 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⪚7omPBK~9@180Ca#v5u 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[]); - const defiCardRef = useRef(null); + const [particles, setParticles] = useState([]); + const hiveCardRef = useRef(null); + const hbdCardRef = useRef(null); const particleIdRef = useRef(0); const animationFrameRef = useRef(null); - const isHoveringRef = useRef(false); - const lastParticleTimeRef = useRef(0); + const dposRef = useRef(null); + const hasTriggeredRef = useRef<{ hive: boolean; hbd: boolean }>({ hive: false, hbd: false }); + const [globalProps, setGlobalProps] = useState(null); + + // Fetch TVL data for locked amounts + const { tvl } = useTVL({ updateInterval: 60000 }); + + // Callback to pass new block info from DynamicHero to RootDPoS + const handleNewBlock = useCallback((blockNum: number, witness: string) => { + dposRef.current?.addBlock(blockNum, witness); + }, []); + + // Callback to receive global props from DynamicHero + const handleGlobalProps = useCallback((props: DynamicGlobalProperties) => { + setGlobalProps(props); + }, []); + + // Parse supply values from global props (format: "123.456 HIVE" or {amount, nai, precision}) + const parseSupply = (supply: unknown): number => { + if (!supply) return 0; + // Handle string format: "123.456 HIVE" + if (typeof supply === 'string') { + return parseFloat(supply.split(' ')[0]) || 0; + } + // Handle object format: { amount: "123456", nai: "@@000000021", precision: 3 } + if (typeof supply === 'object' && supply !== null && 'amount' in supply) { + const obj = supply as { amount: string; precision?: number }; + const amount = parseInt(obj.amount, 10); + const precision = obj.precision ?? 3; + return amount / Math.pow(10, precision); + } + return 0; + }; + + // Calculate token supply data + const hiveSupply = parseSupply(globalProps?.current_supply); + const hbdSupply = parseSupply(globalProps?.current_hbd_supply); + const hiveLocked = tvl ? tvl.hpAmount + tvl.hiveSavings : 0; + const hbdLocked = tvl?.hbdSavings || 0; const go = (link: string) => { window.open(link, '_blank'); @@ -42,22 +87,20 @@ export default function HomePage() { return getImage(`exchanges/${image}`); }; - // Particle animation loop for DeFi card + // Particle animation loop useEffect(() => { const animate = () => { - const updateParticles = (prev: MoneyParticle[]) => { - return prev + setParticles((prev) => + prev .map((p) => ({ ...p, x: p.x + p.vx, y: p.y + p.vy, - vy: p.vy + 0.5, // gravity + vy: p.vy + 0.4, rotation: p.rotation + p.rotationSpeed, })) - .filter((p) => p.y < window.innerHeight + 100); // remove off-screen particles - }; - - setParticles(updateParticles); + .filter((p) => p.y < window.innerHeight + 100) + ); animationFrameRef.current = requestAnimationFrame(animate); }; @@ -70,105 +113,184 @@ export default function HomePage() { }; }, []); - // Mouse move handler for DeFi card (HBD particles) - const handleMouseMove = (e: React.MouseEvent) => { - if (!isHoveringRef.current || !defiCardRef.current) return; - - // Throttle particle creation - only create one every 50ms - const now = Date.now(); - if (now - lastParticleTimeRef.current < 50) return; - lastParticleTimeRef.current = now; - - // Create particle at cursor position - const newParticle: MoneyParticle = { - id: particleIdRef.current++, - x: e.clientX, - y: e.clientY, - vx: (Math.random() - 0.5) * 4, - vy: -Math.random() * 3 - 2, - rotation: Math.random() * 360, - rotationSpeed: (Math.random() - 0.5) * 10, - }; + // Spawn particles from random positions along the edges of the card (once per page view) + const spawnParticleBurst = ( + cardRef: React.RefObject, + type: 'hive' | 'hbd' + ) => { + if (!cardRef.current || hasTriggeredRef.current[type]) return; + hasTriggeredRef.current[type] = true; + + const rect = cardRef.current.getBoundingClientRect(); + const newParticles: TokenParticle[] = []; + const count = 5 + Math.floor(Math.random() * 3); // 5-7 particles - setParticles((prev) => [...prev, newParticle]); + for (let i = 0; i < count; i++) { + // Pick a random edge (0: top, 1: right, 2: bottom, 3: left) + const edge = Math.floor(Math.random() * 4); + let x: number, y: number, vx: number, vy: number; - // Limit particles - if (particles.length > 40) { - setParticles((prev) => prev.slice(-40)); + switch (edge) { + case 0: // top edge + x = rect.left + Math.random() * rect.width; + y = rect.top; + vx = (Math.random() - 0.5) * 3; + vy = -2 - Math.random() * 2; + break; + case 1: // right edge + x = rect.right; + y = rect.top + Math.random() * rect.height; + vx = 2 + Math.random() * 2; + vy = (Math.random() - 0.5) * 3; + break; + case 2: // bottom edge + x = rect.left + Math.random() * rect.width; + y = rect.bottom; + vx = (Math.random() - 0.5) * 3; + vy = 1 + Math.random() * 2; + break; + default: // left edge + x = rect.left; + y = rect.top + Math.random() * rect.height; + vx = -2 - Math.random() * 2; + vy = (Math.random() - 0.5) * 3; + break; + } + + newParticles.push({ + id: particleIdRef.current++, + x, + y, + vx, + vy, + rotation: Math.random() * 360, + rotationSpeed: (Math.random() - 0.5) * 12, + type, + }); } + + setParticles((prev) => [...prev, ...newParticles].slice(-30)); }; return (

{/* Dynamic Hero with Live Block Number and Activities */} - +
- {/* Ecosystem */} - - - {/* Core Features Section */} -
-
-

- Why Hive? + {/* Token Showcase Section */} +
+
+

+ Our Tokens.

- {/* Features Grid */} -
- {/* Feature 1: Fast & Free */} -
-
- No fees -
-

{t('root.feeTitle')}

-

- {t('root.feeText')} -

-

- {t('root.feeText2')} -

-
- - {/* Feature 2: Decentralized */} -
-
- Decentralized -
-

{t('root.decTitle')}

-

- {t('root.decText')} -

-

- {t('root.decText2')} -

-
- - {/* Feature 3: DeFi Made Simple */} -
{ isHoveringRef.current = true; }} - onMouseLeave={() => { isHoveringRef.current = false; }} - onMouseMove={handleMouseMove} - > -
- HBD DeFi -
-

DeFi Made Simple

-

- Earn up to 15% APR on HBD, our decentralized stablecoin pegged to USD. -

-
+
+ {/* HIVE Token Card */} + + + + ), + text: 'Powers all transactions', + }, + { + icon: ( + + + + ), + text: 'Stake to vote for witnesses', + }, + { + icon: ( + + + + ), + text: 'Earn curation rewards', + }, + ]} + totalSupply={hiveSupply} + lockedAmount={hiveLocked} + chartLabel="Staked" + onMouseEnter={() => spawnParticleBurst(hiveCardRef, 'hive')} + /> + + {/* HBD Token Card */} + + + + ), + text: 'Algorithmic peg to USD', + }, + { + icon: ( + + + + ), + text: 'Backed by HIVE', + }, + { + icon: ( + + + + ), + text: ( + + Earn 15% APR + + ), + }, + ]} + totalSupply={hbdSupply} + lockedAmount={hbdLocked} + chartLabel="In Savings" + onMouseEnter={() => spawnParticleBurst(hbdCardRef, 'hbd')} + buyUrl="https://hivedex.io/" + />
+ {/* Ecosystem */} + + + {/* DPoS Visualization */} + + + {/* History Section */} + + + {/* Community Section */} + + {/* Exchanges */} -
-
+
+

{t('root.exchanges.title')} @@ -200,7 +322,7 @@ export default function HomePage() {

- {/* HBD Money Fountain Particles */} + {/* Token Particles */} {particles.map((particle) => (
HBD
))} -
+
); } diff --git a/apps/web/src/components/LayoutContent.tsx b/apps/web/src/components/LayoutContent.tsx index c37c987..8a0a23f 100644 --- a/apps/web/src/components/LayoutContent.tsx +++ b/apps/web/src/components/LayoutContent.tsx @@ -4,8 +4,7 @@ import { useEffect } from 'react'; import '@/lib/fontawesome'; import { Header } from '@/components/header/Header'; import { Footer } from '@/components/footer/Footer'; -import { Icon } from '@/components/Icon'; -import { NAVIGATION_HEADER_DROPDOWN, NAVIGATION_FOOTER, SOCIAL_MEDIAS } from '@/lib/data/var'; +import { NAVIGATION_HEADER_DROPDOWN, NAVIGATION_FOOTER } from '@/lib/data/var'; import { useMainStore } from '@/store/useMainStore'; export function LayoutContent({ children }: { children: React.ReactNode }) { @@ -21,18 +20,6 @@ export function LayoutContent({ children }: { children: React.ReactNode }) {
{children}
-
- {SOCIAL_MEDIAS.map(({ icon, link }) => ( - - ))} -
); diff --git a/apps/web/src/components/cards/TokenCard.tsx b/apps/web/src/components/cards/TokenCard.tsx new file mode 100644 index 0000000..f2205dc --- /dev/null +++ b/apps/web/src/components/cards/TokenCard.tsx @@ -0,0 +1,153 @@ +'use client'; + +import React, { forwardRef } from 'react'; +import { TokenDonutChart } from '@/components/charts/TokenDonutChart'; + +interface TokenFeature { + icon: React.ReactNode; + text: React.ReactNode; +} + +interface TokenCardProps { + name: string; + subtitle: string; + iconSrc: string; + color: string; + colorRgb: string; // For shadow: "227,19,55" or "16,185,129" + features: TokenFeature[]; + totalSupply: number; + lockedAmount: number; + chartLabel: string; + onMouseEnter?: () => void; + buyUrl?: string; // If provided, opens this URL in new tab instead of scrolling to exchanges +} + +export const TokenCard = forwardRef( + ( + { + name, + subtitle, + iconSrc, + color, + colorRgb, + features, + totalSupply, + lockedAmount, + chartLabel, + onMouseEnter, + buyUrl, + }, + ref + ) => { + return ( +
{ + const target = e.currentTarget; + target.style.borderColor = `${color}80`; + target.style.boxShadow = `0 0 60px -15px rgba(${colorRgb},0.3)`; + }} + onMouseLeave={(e) => { + const target = e.currentTarget; + target.style.borderColor = `${color}4d`; + target.style.boxShadow = 'none'; + }} + > + {/* Animated background glow */} +
+ +
+ {/* Left side - Token info */} +
+ {/* Token icon and name */} +
+
+
+ {name} +
+
+
+

{name}

+ +
+
+ + {subtitle} + +
+
+
+ + {/* Visual attributes */} +
+ {features.map((feature, index) => ( +
+
+
{feature.icon}
+
+ {feature.text} +
+ ))} +
+
+ + {/* Right side - Donut chart */} + {totalSupply > 0 && ( +
+ +
+ )} +
+
+ ); + } +); + +TokenCard.displayName = 'TokenCard'; diff --git a/apps/web/src/components/charts/TokenDonutChart.tsx b/apps/web/src/components/charts/TokenDonutChart.tsx new file mode 100644 index 0000000..7e00630 --- /dev/null +++ b/apps/web/src/components/charts/TokenDonutChart.tsx @@ -0,0 +1,118 @@ +'use client'; + +import React from 'react'; + +interface TokenDonutChartProps { + total: number; + locked: number; + size?: number; + primaryColor: string; + secondaryColor: string; + label?: string; +} + +export const TokenDonutChart: React.FC = ({ + total, + locked, + size = 160, + primaryColor, + secondaryColor, + label, +}) => { + const strokeWidth = 16; + const radius = (size - strokeWidth) / 2; + const innerRadius = radius - strokeWidth / 2 - 8; + const circumference = 2 * Math.PI * radius; + const lockedPercentage = total > 0 ? (locked / total) * 100 : 0; + const lockedOffset = circumference - (lockedPercentage / 100) * circumference; + + const formatNumber = (num: number) => { + if (num >= 1000000000) return `${(num / 1000000000).toFixed(1)}B`; + if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`; + if (num >= 1000) return `${(num / 1000).toFixed(1)}K`; + return num.toFixed(0); + }; + + return ( +
+
+ + + + + + + + + {/* Filled center circle */} + + + {/* Background track */} + + + {/* Progress arc (locked portion) */} + + + + {/* Center content */} +
+ + {lockedPercentage.toFixed(0)}% + + {label || 'Locked'} +
+
+ + {/* Legend */} +
+
+
+
+ {label || 'Locked'} + {formatNumber(locked)} +
+
+
+
+
+ Liquid + {formatNumber(total - locked)} +
+
+
+
+ ); +}; diff --git a/apps/web/src/components/footer/Footer.tsx b/apps/web/src/components/footer/Footer.tsx index bad2128..79d2c70 100644 --- a/apps/web/src/components/footer/Footer.tsx +++ b/apps/web/src/components/footer/Footer.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { Logo } from '@/components/logo/Logo'; import { FooterNavigation } from './FooterNavigation'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { SOCIAL_MEDIAS } from '@/lib/data/socialmedias'; interface FooterProps extends React.HTMLAttributes { items?: any[][]; @@ -8,9 +10,31 @@ interface FooterProps extends React.HTMLAttributes { export const Footer: React.FC = ({ items = [], className, ...props }) => { return ( -
+
- +
+ +
+ {SOCIAL_MEDIAS.map((social, index) => ( + + + + + {index < SOCIAL_MEDIAS.length - 1 && ( +
+ )} + + ))} +
+
{items.map((subItems, index) => ( = ({ items = [], return (
diff --git a/apps/web/src/components/hero/DynamicHero.tsx b/apps/web/src/components/hero/DynamicHero.tsx index 011efb4..1a9dff3 100644 --- a/apps/web/src/components/hero/DynamicHero.tsx +++ b/apps/web/src/components/hero/DynamicHero.tsx @@ -1,8 +1,17 @@ 'use client'; import { useBlockchainActivity } from '@/hooks/useBlockchainActivity'; +import { useTotalAccounts } from '@/hooks/useTotalAccounts'; +import { useTransactionStats } from '@/hooks/useTransactionStats'; +import { useTVL } from '@/hooks/useTVL'; import { Link } from '@/i18n/routing'; import { useCallback, useEffect, useRef, useState } from 'react'; +import type { DynamicGlobalProperties } from '@hiveio/hive-lib'; + +interface DynamicHeroProps { + onNewBlock?: (blockNum: number, witness: string) => void; + onGlobalProps?: (props: DynamicGlobalProperties) => void; +} // Calculate max activities based on screen dimensions function calculateMaxActivities(): number { @@ -15,10 +24,10 @@ function calculateMaxActivities(): number { const availableHeight = height - headerSpace; const calculated = Math.floor(availableHeight / 90); - return Math.max(4, Math.min(calculated, 6)); + return Math.max(4, Math.min(calculated, 4)); } -export function DynamicHero() { +export function DynamicHero({ onNewBlock, onGlobalProps }: DynamicHeroProps) { const [isVisible, setIsVisible] = useState(true); const containerRef = useRef(null); const [maxActivities, setMaxActivities] = useState(() => calculateMaxActivities()); @@ -36,13 +45,33 @@ export function DynamicHero() { const [shouldStopPolling, setShouldStopPolling] = useState(false); const [isHoveringFeed, setIsHoveringFeed] = useState(false); - const { activities: hookActivities, currentBlock } = useBlockchainActivity({ + const { activities: hookActivities, currentBlock, globalProps } = useBlockchainActivity({ maxActivities, updateInterval: 3000, enabled: true, paused: isHoveringFeed, + onNewBlock, }); + // Pass global props to parent when updated + useEffect(() => { + if (globalProps && onGlobalProps) { + onGlobalProps(globalProps); + } + }, [globalProps, onGlobalProps]); + + // Fetch transaction statistics + const { displayedTransactions } = useTransactionStats({ + updateInterval: 3000, + enabled: true, + }); + + // Fetch total accounts (runs once on mount) + const { totalAccounts } = useTotalAccounts(); + + // Fetch TVL data with live prices + const { tvl } = useTVL({ updateInterval: 60000 }); + const activities = LIMIT_TOTAL_ACTIVITIES > 0 ? hookActivities.filter(activity => { if (seenActivitiesRef.current.has(activity.id)) { @@ -259,204 +288,259 @@ export function DynamicHero() { }, [queuedIds, animatingIds, displayedActivities, finishedAnimatingIds, activities, isHoveringFeed]); return ( -
- {/* Main Headlines */} - - - {/* Live Block Number - Subtle */} -
-
- {/* Live Indicator - Left side */} -
-
- - -
- Live -
- - {/* Block Number - Right side */} -
+
+ {/* Two column layout */} +
+ {/* Main Headlines - Left side on desktop */} +
+

+ Fast & Scalable. +

+

+ The Blockchain For You. +

+

+ Battle-tested since 2016. Zero Downtime. Zero Gas Fees. Experience the power of Hive, the + decentralized blockchain that puts you in control. +

+ + {/* CTA Buttons */} +
-
- {/* Live Activities Feed */} - {/* Height: min 4 activities (360px) on mobile, up to 6 (540px) on desktop based on viewport */} -
setIsHoveringFeed(false)} - > - -
- {displayedActivities.map((activity) => { - const isAnimating = animatingIds.has(activity.id); - const hasFinishedAnimating = finishedAnimatingIds.has(activity.id); - const isFadingOut = fadingOutIds.has(activity.id); - - // Calculate position based on index in displayedActivities - // Fading out items move to the bottom (maxActivities position) - const currentIndex = displayedActivities.findIndex((a) => a.id === activity.id); - const actualIndex = isAnimating ? 0 : currentIndex; - const yPosition = actualIndex * 90; // 80px height + 10px gap - - // Set opacity and transform for animations - const baseTransform = `translateY(${yPosition}px)`; - - // Determine style based on state - // - Animating: use CSS animation (no inline transition) - // - Fading out: opacity 0, same position animation - // - Finished animating: opacity 1, position animation - // - Not yet animated: hidden (opacity 0, offset) - const style = isAnimating - ? { '--y-pos': `${yPosition}px`, top: 0, left: 0, right: 0, transition: 'none' } as React.CSSProperties - : hasFinishedAnimating || isFadingOut - ? { opacity: isFadingOut ? 0 : 1, transform: baseTransform, top: 0, left: 0, right: 0 } - : { opacity: 0, transform: `${baseTransform} translateX(50px)`, top: 0, left: 0, right: 0 }; - - // Log position changes - const prevPosition = prevPositionsRef.current.get(activity.id); - if (prevPosition !== yPosition) { - console.log(`📐 ${activity.id.substring(0, 10)}:`, { - prevPos: prevPosition ?? 'new', - newPos: yPosition, - actualIndex, - isAnimating, - hasFinishedAnimating, - isFadingOut, - displayedArray: displayedActivities.map(a => a.id.substring(0, 10)), - transform: isAnimating ? `var(--y-pos: ${yPosition}px)` : style.transform - }); - prevPositionsRef.current.set(activity.id, yPosition); - } - - // Activities are clickable if they have a txId AND are not hardcoded defaults - // Hardcoded defaults have IDs starting with "default-" - const isClickable = !!activity.txId && !activity.id.startsWith('default-'); - - // For posts, comments, and votes, link to peakd; otherwise link to hivehub transaction - let activityUrl: string | undefined; - if (isClickable) { - if ((activity.type === 'post' || activity.type === 'comment' || activity.type === 'vote') && activity.author && activity.permlink) { - activityUrl = `https://peakd.com/@${activity.author}/${activity.permlink}`; - } else { - activityUrl = `https://hivehub.dev/tx/${activity.txId}`; - } - } - - const cardContent = ( -
- {activity.user { - e.currentTarget.src = 'https://images.hive.blog/u/null/avatar/small'; - }} - /> -
-

- {activity.message} -

-
- {activity.txId && ( - - {activity.txId.substring(0, 4)}...{activity.txId.substring(activity.txId.length - 4)} - + {/* Live Feed - Right side on desktop */} +
+ + {/* Live Activities Feed */} + {/* Height: min 4 activities (360px) on mobile, up to 6 (540px) on desktop based on viewport */} +
setIsHoveringFeed(false)} + > + {/* Title and Live Indicator */} +
+
+

Activity

+ {currentBlock > 0 ? ( + + #{currentBlock.toLocaleString()} + + ) : ( + --- )}
- ); - - const animationClass = isAnimating && !isHoveringFeed ? 'animate-fade-in' : ''; - const pausedClass = isHoveringFeed ? 'animation-paused' : ''; - - // Track hovered activity - pause immediately if not animating, - // otherwise pause will trigger when animation completes - const handleCardMouseEnter = () => { - // Don't allow pausing on fading out activities - if (isFadingOut) return; - - setHoveredActivityId(activity.id); - if (!isAnimating) { - setIsHoveringFeed(true); - } - // If animating, pause will be triggered in handleAnimationEnd - }; - - const handleCardMouseLeave = () => { - setHoveredActivityId(null); - }; - - return isClickable ? ( - handleAnimationEnd(activity.id, e)} - onTransitionEnd={(e) => handleTransitionEnd(activity.id, e)} - onMouseEnter={handleCardMouseEnter} - onMouseLeave={handleCardMouseLeave} - > - {cardContent} - - ) : ( -
handleAnimationEnd(activity.id, e)} - onTransitionEnd={(e) => handleTransitionEnd(activity.id, e)} - onMouseEnter={handleCardMouseEnter} - onMouseLeave={handleCardMouseLeave} - > - {cardContent} +
+
+ + +
+ Live
- ); - })} +
+ +
+ {displayedActivities.map((activity) => { + const isAnimating = animatingIds.has(activity.id); + const hasFinishedAnimating = finishedAnimatingIds.has(activity.id); + const isFadingOut = fadingOutIds.has(activity.id); + + // Calculate position based on index in displayedActivities + // Fading out items move to the bottom (maxActivities position) + const currentIndex = displayedActivities.findIndex((a) => a.id === activity.id); + const actualIndex = isAnimating ? 0 : currentIndex; + const yPosition = actualIndex * 90; // 80px height + 10px gap + + // Set opacity and transform for animations + const baseTransform = `translateY(${yPosition}px)`; + + // Determine style based on state + // - Animating: use CSS animation (no inline transition) + // - Fading out: opacity 0, same position animation + // - Finished animating: opacity 1, position animation + // - Not yet animated: hidden (opacity 0, offset) + const style = isAnimating + ? { '--y-pos': `${yPosition}px`, top: 0, left: 0, right: 0, transition: 'none' } as React.CSSProperties + : hasFinishedAnimating || isFadingOut + ? { opacity: isFadingOut ? 0 : 1, transform: baseTransform, top: 0, left: 0, right: 0 } + : { opacity: 0, transform: `${baseTransform} translateX(50px)`, top: 0, left: 0, right: 0 }; + + // Log position changes + const prevPosition = prevPositionsRef.current.get(activity.id); + if (prevPosition !== yPosition) { + console.log(`📐 ${activity.id.substring(0, 10)}:`, { + prevPos: prevPosition ?? 'new', + newPos: yPosition, + actualIndex, + isAnimating, + hasFinishedAnimating, + isFadingOut, + displayedArray: displayedActivities.map(a => a.id.substring(0, 10)), + transform: isAnimating ? `var(--y-pos: ${yPosition}px)` : style.transform + }); + prevPositionsRef.current.set(activity.id, yPosition); + } + + // Activities are clickable if they have a txId AND are not hardcoded defaults + // Hardcoded defaults have IDs starting with "default-" + const isClickable = !!activity.txId && !activity.id.startsWith('default-'); + + // For posts, comments, and votes, link to peakd; otherwise link to hivehub transaction + let activityUrl: string | undefined; + if (isClickable) { + if ((activity.type === 'post' || activity.type === 'comment' || activity.type === 'vote') && activity.author && activity.permlink) { + activityUrl = `https://peakd.com/@${activity.author}/${activity.permlink}`; + } else { + activityUrl = `https://hivehub.dev/tx/${activity.txId}`; + } + } + + const cardContent = ( +
+ {activity.user { + e.currentTarget.src = 'https://images.hive.blog/u/null/avatar/small'; + }} + /> +
+

+ {activity.message} +

+
+ {activity.txId && ( + + {activity.txId.substring(0, 4)}...{activity.txId.substring(activity.txId.length - 4)} + + )} +
+ ); + + const animationClass = isAnimating && !isHoveringFeed ? 'animate-fade-in' : ''; + const pausedClass = isHoveringFeed ? 'animation-paused' : ''; + + // Track hovered activity - pause immediately if not animating, + // otherwise pause will trigger when animation completes + const handleCardMouseEnter = () => { + // Don't allow pausing on fading out activities + if (isFadingOut) return; + + setHoveredActivityId(activity.id); + if (!isAnimating) { + setIsHoveringFeed(true); + } + // If animating, pause will be triggered in handleAnimationEnd + }; + + const handleCardMouseLeave = () => { + setHoveredActivityId(null); + }; + + return isClickable ? ( + handleAnimationEnd(activity.id, e)} + onTransitionEnd={(e) => handleTransitionEnd(activity.id, e)} + onMouseEnter={handleCardMouseEnter} + onMouseLeave={handleCardMouseLeave} + > + {cardContent} + + ) : ( +
handleAnimationEnd(activity.id, e)} + onTransitionEnd={(e) => handleTransitionEnd(activity.id, e)} + onMouseEnter={handleCardMouseEnter} + onMouseLeave={handleCardMouseLeave} + > + {cardContent} +
+ ); + })} +
+
+
+
+ + {/* Stats Bar - Full width below both columns */} +
+
+
+ + + + Uptime (Years) +
+
8+
+
+ +
+
+ + + + Total Value Locked +
+
+ {tvl ? `$${(tvl.totalUSD / 1_000_000).toFixed(2)}M` : '---'} +
+
+ +
+
+ + + + Accounts +
+
0 ? 'text-gray-900' : 'text-gray-300'}`}> + {totalAccounts > 0 ? `${(totalAccounts / 1_000_000).toFixed(1)}M` : '---'} +
+
+ +
+
+ + + + Transactions +
+
0 ? 'text-gray-900' : 'text-gray-300'}`}> + {displayedTransactions > 0 ? displayedTransactions.toLocaleString() : '---'} +
diff --git a/apps/web/src/components/root/LogoMarquee.tsx b/apps/web/src/components/root/LogoMarquee.tsx new file mode 100644 index 0000000..242f8fb --- /dev/null +++ b/apps/web/src/components/root/LogoMarquee.tsx @@ -0,0 +1,126 @@ +'use client'; + +import React from 'react'; +import { useTotalAccounts } from '@/hooks/useTotalAccounts'; + +interface LogoMarqueeProps { + className?: string; +} + +// Placeholder community images - replace with actual Hive community photos +const COMMUNITY_IMAGES = [ + '/images/community/hive-meetup-1.jpg', + '/images/community/hive-meetup-2.jpg', + '/images/community/hive-meetup-3.jpg', + '/images/community/hive-meetup-4.jpg', + '/images/community/hive-meetup-5.jpg', + '/images/community/hive-meetup-6.jpg', +]; + +interface MarqueeItemProps { + src: string; + alt: string; + tall?: boolean; +} + +const MarqueeImage: React.FC = ({ src, alt, tall }) => ( +
+ {alt} +
+); + +interface StatCardProps { + value: string; + label: string; +} + +const StatCard: React.FC = ({ value, label }) => ( +
+ + {value} + + {label} +
+); + +export const LogoMarquee: React.FC = ({ className }) => { + const { totalAccounts } = useTotalAccounts(); + + const formatNumber = (num: number) => { + if (num === 0) return '---'; + if (num >= 1000000000) return `${(num / 1000000000).toFixed(1)}B`; + if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`; + if (num >= 1000) return num.toLocaleString(); + return num.toString(); + }; + + // Items for the marquee - mix of images and stats + const marqueeItems = [ + { type: 'image', src: COMMUNITY_IMAGES[0], tall: true }, + { type: 'image', src: COMMUNITY_IMAGES[1], tall: false }, + { type: 'stat', value: formatNumber(totalAccounts), label: 'Total accounts' }, + { type: 'image', src: COMMUNITY_IMAGES[2], tall: true }, + { type: 'image', src: COMMUNITY_IMAGES[3], tall: false }, + { type: 'image', src: COMMUNITY_IMAGES[4], tall: false }, + { type: 'image', src: COMMUNITY_IMAGES[5], tall: true }, + ]; + + // Duplicate for seamless loop + const duplicatedItems = [...marqueeItems, ...marqueeItems]; + + return ( +
+
+

+ A Thriving Community. +

+
+ + {/* Animated Marquee */} +
+
+ {duplicatedItems.map((item, index) => + item.type === 'stat' ? ( + + ) : ( + + ) + )} +
+
+ + +
+ ); +}; diff --git a/apps/web/src/components/root/RootDPoS.tsx b/apps/web/src/components/root/RootDPoS.tsx new file mode 100644 index 0000000..4a04f8d --- /dev/null +++ b/apps/web/src/components/root/RootDPoS.tsx @@ -0,0 +1,168 @@ +'use client'; + +import React, { useImperativeHandle, forwardRef } from 'react'; +import { useBlockProducers } from '@/hooks/useBlockProducers'; + +const WITNESS_COUNT = 10; + +interface RootDPoSProps extends React.HTMLAttributes { } + +export interface RootDPoSHandle { + addBlock: (blockNum: number, producer: string) => void; +} + +export const RootDPoS = forwardRef(({ className, ...props }, ref) => { + // Fetch initial block producers once - no polling needed + const { producers, latestProducer, isLoading, addBlock } = useBlockProducers({ + initialCount: WITNESS_COUNT, + enabled: true, + }); + + // Expose addBlock to parent via ref + useImperativeHandle(ref, () => ({ + addBlock, + }), [addBlock]); + + // Get recent producers, excluding the latest (shown separately at top) + const recentProducers = React.useMemo(() => { + return producers + .filter(p => !(latestProducer && p.producer === latestProducer.producer && p.block_num === latestProducer.block_num)) + .slice(0, WITNESS_COUNT); + }, [producers, latestProducer]); + + return ( +
+
+ {/* Title */} +
+

+ Governance. +

+

+ Hive is decentralized by design. Secured through Delegated Proof of Stake. Over 100 stakeholder-elected witnesses produce blocks every 3s. +

+
+ + {/* Main visualization */} +
+ {/* Central block indicator */} +
+ {/* Latest block producer highlight */} + {latestProducer ? ( +
+ {/* Pulsing glow */} +
+ + {/* Producer avatar */} +
+
+
+ {latestProducer.producer} { + e.currentTarget.src = 'https://images.hive.blog/u/null/avatar'; + }} + /> + {/* Live indicator */} +
+
+ + +
+ LIVE +
+
+ + {/* Producer info */} + + @{latestProducer.producer} + + +
+
+ ) : ( + // Loading placeholder +
+
+
+ {/* Live indicator placeholder */} +
+
+ + +
+ LIVE +
+
+ --- +
+ Block + --- +
+
+ )} +
+ + {/* Witness grid */} +
+ {/* Recent block producers */} +
+ {isLoading ? ( + // Loading skeletons + Array.from({ length: WITNESS_COUNT }).map((_, i) => ( + +
+
+
+ ); +}); + +RootDPoS.displayName = 'RootDPoS'; diff --git a/apps/web/src/components/root/RootEco.tsx b/apps/web/src/components/root/RootEco.tsx index 66ef2ae..3294fcb 100644 --- a/apps/web/src/components/root/RootEco.tsx +++ b/apps/web/src/components/root/RootEco.tsx @@ -30,53 +30,62 @@ export const RootEco: React.FC = ({ full = true, className, ...pro }, []); return ( -
+
-
-
-

{t('root.ecoTitle')}

-

- {t('root.ecoText')} -

- -
-
- {favs.map((app, index) => { - const getSizeForIndex = (idx: number) => { - const sizes = [110, 80, 85, 65, 80, 55, 60, 77]; - return sizes[idx] || 110; - }; +
+
+ {/* Left side - Title and Text */} +
+

+ {t('root.ecoTitle')}. +

+

+ {t('root.ecoText')} +

+ +
+ + {/* Right side - Icons */} +
+
+ {favs.map((app, index) => { + const getSizeForIndex = (idx: number) => { + const sizes = [110, 80, 85, 65, 80, 55, 60, 77]; + return sizes[idx] || 110; + }; - return ( -
- -
- ); - })} + return ( +
+ +
+ ); + })} +
+
diff --git a/apps/web/src/components/root/RootHistory.tsx b/apps/web/src/components/root/RootHistory.tsx new file mode 100644 index 0000000..aee8deb --- /dev/null +++ b/apps/web/src/components/root/RootHistory.tsx @@ -0,0 +1,89 @@ +'use client'; + +import React from 'react'; + +interface RootHistoryProps extends React.HTMLAttributes {} + +export const RootHistory: React.FC = ({ className, ...props }) => { + return ( +
+
+
+ {/* Left side - Bold statement */} +
+

+ Forged in Fire. +

+

+ In March 2020, a hostile takeover threatened to centralize a blockchain. + The community refused. They forked, taking their code, their content, + and their principles with them. +

+

+ Hive was born—a + chain owned by no one and governed by everyone. +

+
+ + {/* Right side - Articles */} + +
+
+
+ ); +}; diff --git a/apps/web/src/hooks/defaultActivities.ts b/apps/web/src/hooks/defaultActivities.ts index 45c8390..b17b47a 100644 --- a/apps/web/src/hooks/defaultActivities.ts +++ b/apps/web/src/hooks/defaultActivities.ts @@ -87,6 +87,6 @@ export function getDefaultActivities(count: number = 2): ActivityItem[] { return generateRandomActivities(count) } -// Default block data -export const DEFAULT_BLOCK = 100000000 -export const DEFAULT_TX_COUNT = 24 +// Default block data - set to 0 so UI shows loading state +export const DEFAULT_BLOCK = 0 +export const DEFAULT_TX_COUNT = 0 diff --git a/apps/web/src/hooks/useBlockProducers.ts b/apps/web/src/hooks/useBlockProducers.ts new file mode 100644 index 0000000..01ace53 --- /dev/null +++ b/apps/web/src/hooks/useBlockProducers.ts @@ -0,0 +1,121 @@ +'use client' + +import {useState, useEffect, useCallback, useRef} from 'react' + +export interface BlockProducer { + block_num: number + producer: string + timestamp: string +} + +interface UseBlockProducersOptions { + initialCount?: number + enabled?: boolean +} + +interface UseBlockProducersResult { + producers: BlockProducer[] + latestProducer: BlockProducer | null + isLoading: boolean + error: string | null + addBlock: (blockNum: number, producer: string) => void +} + +/** + * Hook to fetch and track block producers for DPoS visualization + * Fetches initial producers once, then use addBlock to add new ones + */ +export function useBlockProducers( + options: UseBlockProducersOptions = {}, +): UseBlockProducersResult { + const {initialCount = 20, enabled = true} = options + + const [producers, setProducers] = useState([]) + const [latestProducer, setLatestProducer] = useState( + null, + ) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + + const lastBlockRef = useRef(0) + const hasInitializedRef = useRef(false) + const initialCountRef = useRef(initialCount) + + /** + * Fetch initial block producers (runs once) + */ + const fetchInitialProducers = useCallback(async () => { + try { + const response = await fetch( + `https://api.hive.blog/hafbe-api/operation-type-counts?result-limit=${initialCountRef.current}`, + ) + + if (!response.ok) { + throw new Error('Failed to fetch block producers') + } + + const data = await response.json() + + if (Array.isArray(data)) { + const blockProducers: BlockProducer[] = data.map( + (block: {block_num: number; witness: string}) => ({ + block_num: block.block_num, + producer: block.witness, + timestamp: new Date().toISOString(), + }), + ) + + setProducers(blockProducers) + + if (blockProducers.length > 0) { + setLatestProducer(blockProducers[0]) + lastBlockRef.current = blockProducers[0].block_num + } + } + + setIsLoading(false) + setError(null) + } catch (err) { + console.error('Failed to fetch block producers:', err) + setError(err instanceof Error ? err.message : 'Unknown error') + setIsLoading(false) + } + }, []) + + /** + * Add a new block from external source + * Call this when a new block is produced + */ + const addBlock = useCallback((blockNum: number, producer: string) => { + // Only add if it's a newer block + if (blockNum <= lastBlockRef.current) return + + const newProducer: BlockProducer = { + block_num: blockNum, + producer, + timestamp: new Date().toISOString(), + } + + lastBlockRef.current = blockNum + setLatestProducer(newProducer) + setProducers((prev) => + [newProducer, ...prev].slice(0, initialCountRef.current), + ) + }, []) + + // Initial fetch only - runs once + useEffect(() => { + if (!enabled || hasInitializedRef.current) return + + hasInitializedRef.current = true + void fetchInitialProducers() + }, [enabled, fetchInitialProducers]) + + return { + producers, + latestProducer, + isLoading, + error, + addBlock, + } +} diff --git a/apps/web/src/hooks/useBlockchainActivity.ts b/apps/web/src/hooks/useBlockchainActivity.ts index 612467b..cba79a3 100644 --- a/apps/web/src/hooks/useBlockchainActivity.ts +++ b/apps/web/src/hooks/useBlockchainActivity.ts @@ -5,6 +5,8 @@ import { fetchBlockchainActivity, filterOptimalActivities, type ActivityItem, + type BlockWitness, + type DynamicGlobalProperties, } from '@hiveio/hive-lib' import { getDefaultActivities, @@ -17,6 +19,7 @@ interface UseBlockchainActivityOptions { updateInterval: number enabled: boolean paused?: boolean + onNewBlock?: (blockNum: number, witness: string) => void } interface UseBlockchainActivityResult { @@ -26,6 +29,7 @@ interface UseBlockchainActivityResult { currentBlock: number blockTimestamp: string transactionCount: number + globalProps: DynamicGlobalProperties | null reset: () => void } @@ -41,6 +45,7 @@ export function useBlockchainActivity( updateInterval, enabled, paused = false, + onNewBlock, } = options const [activities, setActivities] = useState([]) @@ -49,6 +54,7 @@ export function useBlockchainActivity( const [currentBlock, setCurrentBlock] = useState(DEFAULT_BLOCK) const [blockTimestamp, setBlockTimestamp] = useState('') const [transactionCount, setTransactionCount] = useState(DEFAULT_TX_COUNT) + const [globalProps, setGlobalProps] = useState(null) const lastBlockRef = useRef(0) const activitiesPoolRef = useRef([]) @@ -58,10 +64,13 @@ export function useBlockchainActivity( const animationIntervalRef = useRef(null) const hasInitializedRef = useRef(false) const hasLoadedDefaultsRef = useRef(false) + const isFirstFetchRef = useRef(true) const pausedRef = useRef(paused) + const onNewBlockRef = useRef(onNewBlock) - // Keep pausedRef in sync + // Keep refs in sync pausedRef.current = paused + onNewBlockRef.current = onNewBlock /** * Preload an image to ensure it's cached before display @@ -156,20 +165,35 @@ export function useBlockchainActivity( latestBlock, shouldSpeedUp, transactionCount, + witnesses, + globalProps: fetchedGlobalProps, } = await fetchBlockchainActivity( lastBlockRef.current, 3, // max 3 blocks per fetch ) + // Update global props if we received new ones + if (fetchedGlobalProps) { + setGlobalProps(fetchedGlobalProps) + } + // On first fetch from default block, show latestBlock - 1 for display const displayBlock = - currentBlock === DEFAULT_BLOCK ? latestBlock - 1 : latestBlock + isFirstFetchRef.current ? latestBlock - 1 : latestBlock + isFirstFetchRef.current = false setCurrentBlock(displayBlock) setBlockTimestamp(new Date().toLocaleTimeString()) setTransactionCount(transactionCount) lastBlockRef.current = latestBlock + // Notify about new blocks/witnesses + if (onNewBlockRef.current && witnesses.length > 0) { + witnesses.forEach((w) => { + onNewBlockRef.current?.(w.blockNum, w.witness) + }) + } + // Update activities pool if (newActivities.length > 0) { // Add new activities to pool @@ -209,7 +233,7 @@ export function useBlockchainActivity( setError(err instanceof Error ? err.message : 'Unknown error') setIsLoading(false) } - }, [enabled, maxActivities, updateInterval, queueActivities]) + }, [enabled, maxActivities, queueActivities]) /** * Fetch initial block number immediately on mount @@ -219,13 +243,16 @@ export function useBlockchainActivity( hasInitializedRef.current = true - // Fetch block number immediately to avoid showing default block for too long + // Fetch block number and global props immediately const fetchInitialBlock = async () => { try { - const {latestBlock} = await fetchBlockchainActivity(0, 1) + const {latestBlock, globalProps: initialGlobalProps} = await fetchBlockchainActivity(0, 1) setCurrentBlock(latestBlock - 1) setBlockTimestamp(new Date().toLocaleTimeString()) lastBlockRef.current = latestBlock + if (initialGlobalProps) { + setGlobalProps(initialGlobalProps) + } } catch (err) { console.error('Failed to fetch initial block:', err) } @@ -361,6 +388,7 @@ export function useBlockchainActivity( currentBlock, blockTimestamp, transactionCount, + globalProps, reset, } } diff --git a/apps/web/src/hooks/useTVL.ts b/apps/web/src/hooks/useTVL.ts new file mode 100644 index 0000000..10cef7f --- /dev/null +++ b/apps/web/src/hooks/useTVL.ts @@ -0,0 +1,168 @@ +'use client'; + +import { useState, useEffect, useRef, useCallback } from 'react'; + +// Placeholder data - TODO: Replace with actual API call +const PLACEHOLDER_LOCKED = { + hive_savings: 2320515.702, + hbd_savings: 8383879.033, + hp: 197821486.215, +}; + +interface PriceData { + hive: { + usd: number; + usd_24h_change: number; + }; + hive_dollar: { + usd: number; + usd_24h_change: number; + }; +} + +interface TVLData { + totalUSD: number; + hiveSavingsUSD: number; + hbdSavingsUSD: number; + hpUSD: number; + hivePrice: number; + hbdPrice: number; + hive24hChange: number; + hbd24hChange: number; + // Raw token amounts + hiveSavings: number; + hbdSavings: number; + hpAmount: number; +} + +interface UseTVLOptions { + updateInterval?: number; + enabled?: boolean; +} + +interface UseTVLResult { + tvl: TVLData | null; + isLoading: boolean; + error: string | null; + refetch: () => void; +} + +const COINGECKO_API = 'https://api.coingecko.com/api/v3/simple/price?ids=hive,hive_dollar&vs_currencies=usd&include_24hr_change=true'; + +// Fallback prices when API fails +const FALLBACK_PRICES = { + hive: 0.1, + hbd: 1.0, +}; + +/** + * Hook to fetch Total Value Locked (TVL) data + * Uses placeholder locked amounts and fetches prices from CoinGecko + */ +export function useTVL(options: UseTVLOptions = {}): UseTVLResult { + const { updateInterval = 60000, enabled = true } = options; + + const [tvl, setTVL] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const intervalIdRef = useRef(null); + + const fetchTVL = useCallback(async () => { + if (!enabled) return; + + try { + const response = await fetch(COINGECKO_API); + + if (!response.ok) { + throw new Error('Failed to fetch price data from CoinGecko'); + } + + const priceData: PriceData = await response.json(); + + const hivePrice = priceData.hive.usd; + const hbdPrice = priceData.hive_dollar.usd; + + // Calculate USD values + const hiveSavingsUSD = PLACEHOLDER_LOCKED.hive_savings * hivePrice; + const hbdSavingsUSD = PLACEHOLDER_LOCKED.hbd_savings * hbdPrice; + const hpUSD = PLACEHOLDER_LOCKED.hp * hivePrice; // HP uses HIVE price + + const totalUSD = hiveSavingsUSD + hbdSavingsUSD + hpUSD; + + setTVL({ + totalUSD, + hiveSavingsUSD, + hbdSavingsUSD, + hpUSD, + hivePrice, + hbdPrice, + hive24hChange: priceData.hive.usd_24h_change, + hbd24hChange: priceData.hive_dollar.usd_24h_change, + // Raw token amounts + hiveSavings: PLACEHOLDER_LOCKED.hive_savings, + hbdSavings: PLACEHOLDER_LOCKED.hbd_savings, + hpAmount: PLACEHOLDER_LOCKED.hp, + }); + setIsLoading(false); + setError(null); + } catch (err) { + console.error('Failed to fetch TVL data, using fallback prices:', err); + + // Use fallback prices + const hivePrice = FALLBACK_PRICES.hive; + const hbdPrice = FALLBACK_PRICES.hbd; + + const hiveSavingsUSD = PLACEHOLDER_LOCKED.hive_savings * hivePrice; + const hbdSavingsUSD = PLACEHOLDER_LOCKED.hbd_savings * hbdPrice; + const hpUSD = PLACEHOLDER_LOCKED.hp * hivePrice; + + const totalUSD = hiveSavingsUSD + hbdSavingsUSD + hpUSD; + + setTVL({ + totalUSD, + hiveSavingsUSD, + hbdSavingsUSD, + hpUSD, + hivePrice, + hbdPrice, + hive24hChange: 0, + hbd24hChange: 0, + hiveSavings: PLACEHOLDER_LOCKED.hive_savings, + hbdSavings: PLACEHOLDER_LOCKED.hbd_savings, + hpAmount: PLACEHOLDER_LOCKED.hp, + }); + setError(null); + setIsLoading(false); + } + }, [enabled]); + + // Fetch immediately on mount + useEffect(() => { + if (!enabled) return; + + void fetchTVL(); + }, [enabled, fetchTVL]); + + // Set up polling interval + useEffect(() => { + if (!enabled) return; + + intervalIdRef.current = setInterval(() => { + void fetchTVL(); + }, updateInterval); + + return () => { + if (intervalIdRef.current) { + clearInterval(intervalIdRef.current); + intervalIdRef.current = null; + } + }; + }, [enabled, updateInterval, fetchTVL]); + + return { + tvl, + isLoading, + error, + refetch: fetchTVL, + }; +} diff --git a/apps/web/src/hooks/useTotalAccounts.ts b/apps/web/src/hooks/useTotalAccounts.ts new file mode 100644 index 0000000..9b14413 --- /dev/null +++ b/apps/web/src/hooks/useTotalAccounts.ts @@ -0,0 +1,71 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +interface AccountDetails { + id: number; + name: string; + recovery_account: string; + created: string; + post_count: number; + reputation: number; + json_metadata: string; + posting_json_metadata: string; +} + +interface UseTotalAccountsResult { + totalAccounts: number; + isLoading: boolean; + error: string | null; +} + +export function useTotalAccounts(): UseTotalAccountsResult { + const [totalAccounts, setTotalAccounts] = useState(0); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchTotalAccounts = async () => { + try { + // Step 1: Get the last account name + const accountsResponse = await fetch('https://rpc.mahdiyari.info/hafsql/accounts?limit=-1'); + if (!accountsResponse.ok) { + throw new Error('Failed to fetch accounts list'); + } + const accountNames: string[] = await accountsResponse.json(); + + if (!accountNames || accountNames.length === 0) { + throw new Error('No accounts returned'); + } + + // The last account name in the list + const lastAccountName = accountNames[accountNames.length - 1]; + + // Step 2: Get the account details to retrieve the ID (which is the total count) + const detailsResponse = await fetch( + `https://rpc.mahdiyari.info/hafsql/accounts/by-names?names=${lastAccountName}` + ); + if (!detailsResponse.ok) { + throw new Error('Failed to fetch account details'); + } + const accountDetails: AccountDetails[] = await detailsResponse.json(); + + if (!accountDetails || accountDetails.length === 0) { + throw new Error('No account details returned'); + } + + // The ID of the last account represents the total number of accounts + setTotalAccounts(accountDetails[0].id); + setIsLoading(false); + } catch (err) { + console.error('Error fetching total accounts:', err); + setError(err instanceof Error ? err.message : 'Unknown error'); + setIsLoading(false); + } + }; + + fetchTotalAccounts(); + }, []); + + return { totalAccounts, isLoading, error }; +} diff --git a/apps/web/src/hooks/useTransactionStats.ts b/apps/web/src/hooks/useTransactionStats.ts new file mode 100644 index 0000000..8e61214 --- /dev/null +++ b/apps/web/src/hooks/useTransactionStats.ts @@ -0,0 +1,132 @@ +'use client'; + +import { useState, useEffect, useRef } from 'react'; + +interface TransactionStatsOptions { + updateInterval: number; + enabled: boolean; +} + +interface TransactionStatsResult { + displayedTransactions: number; + isAnimating: boolean; +} + +/** + * Hook to fetch total transaction count from Hive API + * Updates at the same interval as blockchain activity + * Animates the count up smoothly when new data arrives + */ +export function useTransactionStats( + options: TransactionStatsOptions, +): TransactionStatsResult { + const { updateInterval, enabled } = options; + + const [displayedTransactions, setDisplayedTransactions] = useState(0); + const [targetTransactions, setTargetTransactions] = useState(0); + const [isAnimating, setIsAnimating] = useState(false); + const intervalIdRef = useRef(null); + const animationFrameRef = useRef(null); + + const fetchTransactionStats = async () => { + if (!enabled) return; + + try { + const response = await fetch( + 'https://api.hive.blog/hafbe-api/transaction-statistics?granularity=yearly' + ); + + if (!response.ok) { + throw new Error('Failed to fetch transaction statistics'); + } + + const data = await response.json(); + + // Sum up all transaction counts from all years + const total = data.reduce((sum: number, year: any) => sum + year.trx_count, 0); + + // Set new target (will trigger animation in useEffect) + setTargetTransactions(total); + } catch (err) { + console.error('Failed to fetch transaction statistics:', err); + } + }; + + // Animate counting up to target + useEffect(() => { + if (targetTransactions === 0 || displayedTransactions === targetTransactions) { + return; + } + + // If this is the first load, set immediately + if (displayedTransactions === 0) { + setDisplayedTransactions(targetTransactions); + return; + } + + // Start animation + setIsAnimating(true); + + const startValue = displayedTransactions; + const endValue = targetTransactions; + const duration = 2500; // 2.5 seconds for smooth counting + const startTime = Date.now(); + + const animate = () => { + const now = Date.now(); + const elapsed = now - startTime; + const progress = Math.min(elapsed / duration, 1); + + // Easing function for smooth animation (ease-out) + const easeOut = 1 - Math.pow(1 - progress, 3); + + const currentValue = Math.floor(startValue + (endValue - startValue) * easeOut); + setDisplayedTransactions(currentValue); + + if (progress < 1) { + animationFrameRef.current = requestAnimationFrame(animate); + } else { + setDisplayedTransactions(endValue); + setIsAnimating(false); + animationFrameRef.current = null; + } + }; + + animationFrameRef.current = requestAnimationFrame(animate); + + return () => { + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + animationFrameRef.current = null; + } + }; + }, [targetTransactions, displayedTransactions]); + + // Fetch immediately on mount + useEffect(() => { + if (!enabled) return; + + void fetchTransactionStats(); + }, [enabled]); + + // Set up polling interval + useEffect(() => { + if (!enabled) return; + + intervalIdRef.current = setInterval(() => { + void fetchTransactionStats(); + }, updateInterval); + + return () => { + if (intervalIdRef.current) { + clearInterval(intervalIdRef.current); + intervalIdRef.current = null; + } + }; + }, [enabled, updateInterval]); + + return { + displayedTransactions, + isAnimating, + }; +} diff --git a/apps/web/src/lib/data/socialmedias.ts b/apps/web/src/lib/data/socialmedias.ts index 6f7853f..92bab2a 100644 --- a/apps/web/src/lib/data/socialmedias.ts +++ b/apps/web/src/lib/data/socialmedias.ts @@ -6,6 +6,14 @@ export const SOCIAL_MEDIAS = [ icon: 'hive', link: 'https://hive.blog/@hiveio', }, + { + icon: 'x-twitter', + link: 'https://x.com/hiveblocks', + }, + { + icon: 'discord', + link: 'https://myhive.li/discord', + }, { icon: 'github', link: 'https://github.com/openhive-network/hive', @@ -14,39 +22,19 @@ export const SOCIAL_MEDIAS = [ icon: 'gitlab', link: 'https://gitlab.hive.io', }, - { - icon: 'twitter', - link: 'https://twitter.com/hiveblocks', - }, { icon: 'youtube', link: 'https://www.youtube.com/channel/UCwM89V7NzVIHizgWT3GxhwA', }, - { - icon: 'medium', - link: 'https://medium.com/@hiveblocks', - }, { icon: 'telegram', link: 'https://t.me/hiveblockchain', }, - { - icon: 'reddit', - link: 'https://reddit.com/r/hivenetwork', - }, - { - icon: 'discord', - link: 'https://myhive.li/discord', - }, { icon: 'facebook', link: 'https://www.facebook.com/hiveblocks/', }, { - icon: 'quora', - link: 'https://www.quora.com/q/hive', - }, - { icon: 'instagram', link: 'https://www.instagram.com/hiveblocks', }, diff --git a/apps/web/src/lib/fontawesome.ts b/apps/web/src/lib/fontawesome.ts index 0342100..514d989 100644 --- a/apps/web/src/lib/fontawesome.ts +++ b/apps/web/src/lib/fontawesome.ts @@ -10,18 +10,15 @@ import { import { faHive, faYoutube, - faTwitter, + faXTwitter, faFacebook, - faQuora, faGitlab, faGithub, - faMedium, faChrome, faSafari, faFirefox, faTelegram, faDiscord, - faReddit, faAndroid, faLinux, faAppStoreIos, @@ -58,18 +55,15 @@ library.add( faWallet, faHive, faYoutube, - faTwitter, + faXTwitter, faFacebook, - faQuora, faGitlab, faGithub, - faMedium, faChrome, faSafari, faFirefox, faTelegram, faDiscord, - faReddit, faAndroid, faLinux, faAppStoreIos, diff --git a/packages/hive-lib/src/activity.ts b/packages/hive-lib/src/activity.ts index 8a128b3..705d35e 100644 --- a/packages/hive-lib/src/activity.ts +++ b/packages/hive-lib/src/activity.ts @@ -434,79 +434,68 @@ export function filterOptimalActivities( // Track block sync state let blockCheckCounter = 0 let assumedHeadBlock = 0 - -/** - * Fetch initial activities for default display - * Fetches from multiple recent blocks and randomizes selection - */ -export async function fetchInitialActivities(count: number = 4): Promise<{ - activities: ActivityItem[] - currentBlock: number - transactionCount: number -}> { - const hive = await getHiveChain() - - // Get current head block - const props = await hive.api.database_api.get_dynamic_global_properties({}) - const headBlock = props.head_block_number - - // Fetch last 10 blocks to get a good pool of activities - const allActivities: ActivityItem[] = [] - let latestTransactionCount = 0 - - for (let i = 0; i < 10; i++) { - const blockNum = headBlock - i - - try { - const result = await hive.api.block_api.get_block({block_num: blockNum}) - - if (!result?.block?.transactions) continue - - const block = result.block - - // Store transaction count from the latest block - if (i === 0) { - latestTransactionCount = block.transactions.length - } - - // Parse all transactions in the block - block.transactions.forEach((tx, txIndex: number) => { - const operations = tx.operations || [] - // Get transaction ID from block.transaction_ids array (same order as transactions) - const txId = (block as any).transaction_ids?.[txIndex] - - const interestingOps = filterInterestingOperations(operations) - - interestingOps.forEach((op) => { - const activity = parseOperation(hive, op, blockNum, txIndex, txId) - if (activity) { - allActivities.push(activity) - } - }) - }) - } catch (error) { - console.error(`Failed to fetch block ${blockNum}:`, error) - } - } - - // Filter and get optimal activities - const optimalActivities = filterOptimalActivities(allActivities, count * 3) - - // Shuffle and take the requested count - const shuffled = shuffleArray(optimalActivities) - const selected = shuffled.slice(0, count) - - return { - activities: selected, - currentBlock: headBlock, - transactionCount: latestTransactionCount, - } +let cachedGlobalProps: DynamicGlobalProperties | null = null + +// Asset can be either string format "123.456 HIVE" or object format +export type HiveAsset = string | { amount: string; nai: string; precision: number } + +export interface DynamicGlobalProperties { + head_block_number: number + head_block_id: string + time: string + current_witness: string + total_pow: number + num_pow_witnesses: number + virtual_supply: HiveAsset + current_supply: HiveAsset + init_hbd_supply: HiveAsset + current_hbd_supply: HiveAsset + total_vesting_fund_hive: HiveAsset + total_vesting_shares: HiveAsset + total_reward_fund_hive: HiveAsset + total_reward_shares2: string + pending_rewarded_vesting_shares: HiveAsset + pending_rewarded_vesting_hive: HiveAsset + hbd_interest_rate: number + hbd_print_rate: number + maximum_block_size: number + required_actions_partition_percent: number + current_aslot: number + recent_slots_filled: string + participation_count: number + last_irreversible_block_num: number + vote_power_reserve_rate: number + delegation_return_period: number + reverse_auction_seconds: number + available_account_subsidies: number + hbd_stop_percent: number + hbd_start_percent: number + next_maintenance_time: string + last_budget_time: string + next_daily_maintenance_time: string + content_reward_percent: number + vesting_reward_percent: number + proposal_fund_percent: number + dhf_interval_ledger: string + downvote_pool_percent: number + current_remove_threshold: number + early_voting_seconds: number + mid_voting_seconds: number + max_consecutive_recurrent_transfer_failures: number + max_recurrent_transfer_end_date: number + min_recurrent_transfers_recurrence: number + max_open_recurrent_transfers: number } /** * Fetch blockchain activities from recent blocks * Optimized to avoid unnecessary dynamic_global_properties calls */ +export interface BlockWitness { + blockNum: number + witness: string +} + export async function fetchBlockchainActivity( lastBlock: number, maxBlocks: number = 3, @@ -515,12 +504,15 @@ export async function fetchBlockchainActivity( latestBlock: number shouldSpeedUp: boolean transactionCount: number + witnesses: BlockWitness[] + globalProps: DynamicGlobalProperties | null }> { const hive = await getHiveChain() // Only check dynamic props on first call or every 10 blocks if (lastBlock === 0 || blockCheckCounter % 10 === 0) { const props = await hive.api.database_api.get_dynamic_global_properties({}) + cachedGlobalProps = props as unknown as DynamicGlobalProperties assumedHeadBlock = props.head_block_number // If this is the first fetch, set lastBlock to fetch recent blocks @@ -548,6 +540,7 @@ export async function fetchBlockchainActivity( } const newActivities: ActivityItem[] = [] + const witnesses: BlockWitness[] = [] let actualLatestBlock = lastBlock let latestTransactionCount = 0 @@ -568,14 +561,17 @@ export async function fetchBlockchainActivity( const block = result.block - // console.log( - // `Fetched block ${blockNum} with ${block.transactions.length} transactions.`, - // block, - // ) - actualLatestBlock = blockNum latestTransactionCount = block.transactions.length + // Track the witness/producer for this block + if (block.witness) { + witnesses.push({ + blockNum, + witness: block.witness, + }) + } + // Parse all transactions in the block block.transactions.forEach((tx, txIndex: number) => { const operations = tx.operations || [] @@ -608,5 +604,7 @@ export async function fetchBlockchainActivity( latestBlock: actualLatestBlock, shouldSpeedUp, transactionCount: latestTransactionCount, + witnesses, + globalProps: cachedGlobalProps, } } -- GitLab From ef41962daec512fd7fcd79f9c901fbeeb0823771 Mon Sep 17 00:00:00 2001 From: therealwolf42 <76-therealwolf42@users.noreply.gitlab.syncad.com> Date: Tue, 25 Nov 2025 21:42:17 +0100 Subject: [PATCH 2/2] milestone --- apps/web/src/app/[locale]/page.tsx | 4 +- apps/web/src/components/hero/DynamicHero.tsx | 39 ++++-- apps/web/src/components/root/LogoMarquee.tsx | 88 +++++++----- apps/web/src/components/root/RootDPoS.tsx | 137 ++++++++++++++----- apps/web/src/components/root/RootEco.tsx | 41 +++++- apps/web/src/components/root/RootHistory.tsx | 12 +- 6 files changed, 225 insertions(+), 96 deletions(-) diff --git a/apps/web/src/app/[locale]/page.tsx b/apps/web/src/app/[locale]/page.tsx index bd1b414..9fcd81b 100644 --- a/apps/web/src/app/[locale]/page.tsx +++ b/apps/web/src/app/[locale]/page.tsx @@ -182,10 +182,10 @@ export default function HomePage() {
{/* Token Showcase Section */} -
+

- Our Tokens. + Our Coins.

{/* HIVE Token Card */} diff --git a/apps/web/src/components/hero/DynamicHero.tsx b/apps/web/src/components/hero/DynamicHero.tsx index 1a9dff3..b03a29b 100644 --- a/apps/web/src/components/hero/DynamicHero.tsx +++ b/apps/web/src/components/hero/DynamicHero.tsx @@ -333,19 +333,19 @@ export function DynamicHero({ onNewBlock, onGlobalProps }: DynamicHeroProps) { {/* Height: min 4 activities (360px) on mobile, up to 6 (540px) on desktop based on viewport */}
setIsHoveringFeed(false)} > {/* Title and Live Indicator */}
-

Activity

+

Activity

{currentBlock > 0 ? ( #{currentBlock.toLocaleString()} @@ -418,6 +418,11 @@ export function DynamicHero({ onNewBlock, onGlobalProps }: DynamicHeroProps) { } } + // Extract action text by removing username prefix from message + const actionText = activity.user && activity.message.startsWith(activity.user) + ? activity.message.slice(activity.user.length).trim() + : activity.message; + const cardContent = (
-
-

- {activity.message} -

+
+ + {activity.user || 'Unknown'} + + + {actionText} +
- {activity.txId && ( - - {activity.txId.substring(0, 4)}...{activity.txId.substring(activity.txId.length - 4)} +
+ + ↗ - )} + {activity.txId && ( + + {activity.txId.substring(0, 4)}...{activity.txId.substring(activity.txId.length - 4)} + + )} +
); @@ -468,7 +481,7 @@ export function DynamicHero({ onNewBlock, onGlobalProps }: DynamicHeroProps) { target="_blank" rel="noopener noreferrer" style={style} - className={`group absolute bg-white/70 backdrop-blur-sm border border-gray-200 rounded-xl px-5 py-4 transition-all duration-400 hover:bg-white/90 hover:border-gray-300 cursor-pointer ${animationClass} ${pausedClass}`} + className={`group absolute bg-gray-200 backdrop-blur-sm border border-gray-200 rounded-xl px-5 py-4 transition-all duration-400 hover:bg-white/90 hover:border-gray-300 cursor-pointer ${animationClass} ${pausedClass}`} onAnimationEnd={(e) => handleAnimationEnd(activity.id, e)} onTransitionEnd={(e) => handleTransitionEnd(activity.id, e)} onMouseEnter={handleCardMouseEnter} @@ -480,7 +493,7 @@ export function DynamicHero({ onNewBlock, onGlobalProps }: DynamicHeroProps) {
handleAnimationEnd(activity.id, e)} onTransitionEnd={(e) => handleTransitionEnd(activity.id, e)} onMouseEnter={handleCardMouseEnter} diff --git a/apps/web/src/components/root/LogoMarquee.tsx b/apps/web/src/components/root/LogoMarquee.tsx index 242f8fb..d58a5e6 100644 --- a/apps/web/src/components/root/LogoMarquee.tsx +++ b/apps/web/src/components/root/LogoMarquee.tsx @@ -25,9 +25,8 @@ interface MarqueeItemProps { const MarqueeImage: React.FC = ({ src, alt, tall }) => (
= ({ value, label }) => ( -
+
{value} @@ -52,6 +51,17 @@ const StatCard: React.FC = ({ value, label }) => (
); +// A column that contains either 1 tall item or 2 stacked small items +interface MarqueeColumnProps { + children: React.ReactNode; +} + +const MarqueeColumn: React.FC = ({ children }) => ( +
+ {children} +
+); + export const LogoMarquee: React.FC = ({ className }) => { const { totalAccounts } = useTotalAccounts(); @@ -63,47 +73,57 @@ export const LogoMarquee: React.FC = ({ className }) => { return num.toString(); }; - // Items for the marquee - mix of images and stats - const marqueeItems = [ - { type: 'image', src: COMMUNITY_IMAGES[0], tall: true }, - { type: 'image', src: COMMUNITY_IMAGES[1], tall: false }, - { type: 'stat', value: formatNumber(totalAccounts), label: 'Total accounts' }, - { type: 'image', src: COMMUNITY_IMAGES[2], tall: true }, - { type: 'image', src: COMMUNITY_IMAGES[3], tall: false }, - { type: 'image', src: COMMUNITY_IMAGES[4], tall: false }, - { type: 'image', src: COMMUNITY_IMAGES[5], tall: true }, - ]; + // Tetris-like columns: either 1 tall image OR 2 stacked small items + const renderColumns = (keyPrefix: string) => ( + <> + {/* Column 1: Tall image */} + + + - // Duplicate for seamless loop - const duplicatedItems = [...marqueeItems, ...marqueeItems]; + {/* Column 2: Two stacked small images */} + + + + + + {/* Column 3: Tall image */} + + + + + {/* Column 4: Stat + small image stacked */} + + + + + + {/* Column 5: Tall image */} + + + + + {/* Column 6: Two stacked small images */} + + + + + + ); return (

- A Thriving Community. + Join a Thriving Community.

{/* Animated Marquee */} -
+
- {duplicatedItems.map((item, index) => - item.type === 'stat' ? ( - - ) : ( - - ) - )} + {renderColumns('first')} + {renderColumns('second')}
diff --git a/apps/web/src/components/root/RootDPoS.tsx b/apps/web/src/components/root/RootDPoS.tsx index 4a04f8d..0cf1201 100644 --- a/apps/web/src/components/root/RootDPoS.tsx +++ b/apps/web/src/components/root/RootDPoS.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { useImperativeHandle, forwardRef } from 'react'; +import React, { useImperativeHandle, forwardRef, useState, useEffect, useRef } from 'react'; import { useBlockProducers } from '@/hooks/useBlockProducers'; const WITNESS_COUNT = 10; @@ -18,6 +18,44 @@ export const RootDPoS = forwardRef(({ className, enabled: true, }); + // Track both current and outgoing producer for crossfade + const [currentProducer, setCurrentProducer] = useState(latestProducer); + const [outgoingProducer, setOutgoingProducer] = useState(null); + const [isFadingOut, setIsFadingOut] = useState(false); + const prevProducerRef = useRef(latestProducer?.producer); + + // Crossfade when producer changes + useEffect(() => { + if (latestProducer && latestProducer.producer !== prevProducerRef.current) { + // Set the old producer as outgoing (starts visible) + if (currentProducer) { + setOutgoingProducer(currentProducer); + setIsFadingOut(false); + // Trigger fade-out on next frame + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setIsFadingOut(true); + }); + }); + } + // Set new producer as current + setCurrentProducer(latestProducer); + prevProducerRef.current = latestProducer.producer; + + // Clear outgoing after transition completes + const timeout = setTimeout(() => { + setOutgoingProducer(null); + setIsFadingOut(false); + }, 400); + + return () => clearTimeout(timeout); + } else if (latestProducer && !currentProducer) { + // Initial load + setCurrentProducer(latestProducer); + prevProducerRef.current = latestProducer.producer; + } + }, [latestProducer, currentProducer]); + // Expose addBlock to parent via ref useImperativeHandle(ref, () => ({ addBlock, @@ -48,52 +86,81 @@ export const RootDPoS = forwardRef(({ className, {/* Central block indicator */}
{/* Latest block producer highlight */} - {latestProducer ? ( + {currentProducer ? (
{/* Pulsing glow */}
- {/* Producer avatar */} -
-
-
- {latestProducer.producer} { - e.currentTarget.src = 'https://images.hive.blog/u/null/avatar'; - }} - /> - {/* Live indicator */} -
-
- - + {/* Container for crossfade */} +
+ {/* Outgoing producer (fading out) */} + {outgoingProducer && ( +
+
+
+ {outgoingProducer.producer} +
+
+ + +
+ LIVE +
+
+ @{outgoingProducer.producer} +
+ Block + #{outgoingProducer.block_num.toLocaleString()}
- LIVE
-
+ )} - {/* Producer info */} - - @{latestProducer.producer} - -
- Block + {/* Current producer (fading in) */} +
+
+
+ {currentProducer.producer} { + e.currentTarget.src = 'https://images.hive.blog/u/null/avatar'; + }} + /> + {/* Live indicator */} +
+
+ + +
+ LIVE +
+
+ + {/* Producer info */} - #{latestProducer.block_num.toLocaleString()} + @{currentProducer.producer} +
diff --git a/apps/web/src/components/root/RootEco.tsx b/apps/web/src/components/root/RootEco.tsx index 3294fcb..587e1cd 100644 --- a/apps/web/src/components/root/RootEco.tsx +++ b/apps/web/src/components/root/RootEco.tsx @@ -39,15 +39,42 @@ export const RootEco: React.FC = ({ full = true, className, ...pro

{t('root.ecoTitle')}.

-

+ +

{t('root.ecoText')}

- + + {/* Button and Stats row */} +
+ + + {/* Stats - styled like hero */} +
+
+
+ + + + Apps +
+
158
+
+
+
+ + + + Communities +
+
248
+
+
+
{/* Right side - Icons */} diff --git a/apps/web/src/components/root/RootHistory.tsx b/apps/web/src/components/root/RootHistory.tsx index aee8deb..ab927cb 100644 --- a/apps/web/src/components/root/RootHistory.tsx +++ b/apps/web/src/components/root/RootHistory.tsx @@ -2,17 +2,17 @@ import React from 'react'; -interface RootHistoryProps extends React.HTMLAttributes {} +interface RootHistoryProps extends React.HTMLAttributes { } export const RootHistory: React.FC = ({ className, ...props }) => { return (
-
+
{/* Left side - Bold statement */}

- Forged in Fire. + We forked.

In March 2020, a hostile takeover threatened to centralize a blockchain. @@ -46,8 +46,9 @@ export const RootHistory: React.FC = ({ className, ...props }) Aug 2020

-

+

The Great Steem Wars +

Inside Crypto's Biggest Hostile Takeover @@ -73,8 +74,9 @@ export const RootHistory: React.FC = ({ className, ...props }) Mar 2020

-

+

The Fork That Won +

How Hive Outperformed Steemit -- GitLab