Spaces:
Running
Running
import React, { useState, useEffect } from 'react'; | |
import './ChainlinkDemo.css'; | |
// Mock data for demonstration purposes | |
const mockTokenData = { | |
networkStats: { | |
totalTokens: 1000000, | |
circulatingSupply: 350000, | |
reservedPool: 650000, | |
tokenPrice: 2.75, | |
marketCap: 962500, | |
stakeholders: 1250, | |
chargingHubs: 36, | |
totalTransactions: 15782 | |
}, | |
userWallet: { | |
balance: 45, | |
stakingRewards: 3.2, | |
acquisitionHistory: [ | |
{ date: "Apr 1, 2025", amount: 15, source: "Monthly Subscription", price: 2.65 }, | |
{ date: "Mar 1, 2025", amount: 15, source: "Monthly Subscription", price: 2.58 }, | |
{ date: "Feb 1, 2025", amount: 15, source: "Monthly Subscription", price: 2.42 } | |
], | |
transactionHistory: [ | |
{ date: "Mar 15, 2025", type: "Staking", amount: 20, status: "Active" }, | |
{ date: "Mar 10, 2025", type: "Charging Credit", amount: 5, status: "Completed" }, | |
{ date: "Feb 22, 2025", type: "Governance Vote", amount: 0, status: "Completed" } | |
] | |
}, | |
assetOwnership: { | |
totalOwnership: 0.0045, // percentage of network | |
hubs: [ | |
{ id: 101, name: "Springfield Downtown", ownership: 0.0012, status: "Operational", monthlyRevenue: 0.32 }, | |
{ id: 102, name: "Champaign-Urbana Hub", ownership: 0.0018, status: "Construction", monthlyRevenue: 0 }, | |
{ id: 103, name: "Bloomington-Normal", ownership: 0.0015, status: "Planning", monthlyRevenue: 0 } | |
], | |
projectedReturns: [ | |
{ year: 2025, quarter: 2, returns: 0.45 }, | |
{ year: 2025, quarter: 3, returns: 0.68 }, | |
{ year: 2025, quarter: 4, returns: 0.92 }, | |
{ year: 2026, quarter: 1, returns: 1.25 } | |
] | |
}, | |
tokenomics: { | |
distribution: [ | |
{ category: "Subscriber Rewards", percentage: 35, color: "#00E0FF" }, | |
{ category: "Infrastructure Development", percentage: 25, color: "#35F2DB" }, | |
{ category: "Operations", percentage: 15, color: "#FFC107" }, | |
{ category: "Community Governance", percentage: 10, color: "#FF5555" }, | |
{ category: "Partnerships", percentage: 10, color: "#9C27B0" }, | |
{ category: "Reserve", percentage: 5, color: "#607D8B" } | |
], | |
utilityFunctions: [ | |
{ function: "Charging Credits", description: "Redeem tokens for charging credits at The Link hubs" }, | |
{ function: "Subscription Discounts", description: "Apply tokens toward Unity Fleet subscription fees" }, | |
{ function: "Governance Rights", description: "Vote on network expansion and feature development" }, | |
{ function: "Revenue Sharing", description: "Earn a portion of network revenue based on token holdings" }, | |
{ function: "Asset Ownership", description: "Tokens represent fractional ownership in physical infrastructure" } | |
], | |
valueDrivers: [ | |
{ driver: "Network Expansion", impact: "High", description: "Each new charging hub increases token utility and demand" }, | |
{ driver: "EV Adoption Rate", impact: "High", description: "Accelerating EV adoption drives charging demand and token usage" }, | |
{ driver: "Subscription Growth", impact: "Medium", description: "New subscribers receive tokens, increasing distribution and usage" }, | |
{ driver: "Energy Efficiency", impact: "Medium", description: "Optimized energy usage improves hub profitability and token value" }, | |
{ driver: "Governance Decisions", impact: "Low", description: "Community governance ensures alignment with token holder interests" } | |
] | |
}, | |
marketData: { | |
priceHistory: [ | |
{ month: "Jan", price: 2.25 }, | |
{ month: "Feb", price: 2.42 }, | |
{ month: "Mar", price: 2.58 }, | |
{ month: "Apr", price: 2.75 } | |
], | |
volumeHistory: [ | |
{ month: "Jan", volume: 15000 }, | |
{ month: "Feb", volume: 22500 }, | |
{ month: "Mar", volume: 28000 }, | |
{ month: "Apr", volume: 35000 } | |
], | |
projections: [ | |
{ quarter: "Q2 2025", lowEstimate: 2.85, highEstimate: 3.25 }, | |
{ quarter: "Q3 2025", lowEstimate: 3.10, highEstimate: 3.75 }, | |
{ quarter: "Q4 2025", lowEstimate: 3.50, highEstimate: 4.50 }, | |
{ quarter: "Q1 2026", lowEstimate: 4.00, highEstimate: 5.25 } | |
] | |
} | |
}; | |
function ChainlinkDemo() { | |
const [activeTab, setActiveTab] = useState('overview'); | |
const [loading, setLoading] = useState(true); | |
const [selectedAsset, setSelectedAsset] = useState(null); | |
const [tokenAction, setTokenAction] = useState(null); | |
const [tokenAmount, setTokenAmount] = useState(1); | |
const [showConfirmation, setShowConfirmation] = useState(false); | |
const [animateTokenFlow, setAnimateTokenFlow] = useState(false); | |
useEffect(() => { | |
// Simulate loading | |
const timer = setTimeout(() => { | |
setLoading(false); | |
}, 1500); | |
return () => clearTimeout(timer); | |
}, []); | |
const handleAssetSelect = (asset) => { | |
setSelectedAsset(asset); | |
}; | |
const handleTokenActionSelect = (action) => { | |
setTokenAction(action); | |
setShowConfirmation(false); | |
}; | |
const handleTokenAmountChange = (amount) => { | |
setTokenAmount(Math.max(1, Math.min(mockTokenData.userWallet.balance, amount))); | |
}; | |
const handleActionConfirm = () => { | |
setShowConfirmation(true); | |
}; | |
const handleTokenFlowDemo = () => { | |
setAnimateTokenFlow(true); | |
setTimeout(() => { | |
setAnimateTokenFlow(false); | |
}, 5000); | |
}; | |
// Helper function to render the network overview | |
const renderOverview = () => { | |
const { networkStats, tokenomics } = mockTokenData; | |
return ( | |
<div className="overview-tab"> | |
<div className="network-stats"> | |
<div className="stats-card token-supply"> | |
<h3>Token Supply & Distribution</h3> | |
<div className="token-supply-chart"> | |
<div className="supply-chart-container"> | |
<div className="supply-chart"> | |
<div | |
className="supply-segment circulating" | |
style={{ | |
transform: `rotate(0deg) skew(${90 - (networkStats.circulatingSupply / networkStats.totalTokens) * 360}deg)` | |
}} | |
></div> | |
<div | |
className="supply-segment reserved" | |
style={{ | |
transform: `rotate(${(networkStats.circulatingSupply / networkStats.totalTokens) * 360}deg) skew(${90 - (networkStats.reservedPool / networkStats.totalTokens) * 360}deg)` | |
}} | |
></div> | |
<div className="supply-inner"> | |
<div className="supply-value">{networkStats.totalTokens.toLocaleString()}</div> | |
<div className="supply-label">Total Tokens</div> | |
</div> | |
</div> | |
</div> | |
<div className="supply-legend"> | |
<div className="legend-item"> | |
<div className="legend-color circulating"></div> | |
<div className="legend-label">Circulating Supply</div> | |
<div className="legend-value">{networkStats.circulatingSupply.toLocaleString()} tokens</div> | |
</div> | |
<div className="legend-item"> | |
<div className="legend-color reserved"></div> | |
<div className="legend-label">Reserved Pool</div> | |
<div className="legend-value">{networkStats.reservedPool.toLocaleString()} tokens</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div className="stats-card network-metrics"> | |
<h3>Network Metrics</h3> | |
<div className="metrics-grid"> | |
<div className="metric-item"> | |
<div className="metric-icon">💰</div> | |
<div className="metric-value">${networkStats.tokenPrice.toFixed(2)}</div> | |
<div className="metric-label">Token Price</div> | |
</div> | |
<div className="metric-item"> | |
<div className="metric-icon">📊</div> | |
<div className="metric-value">${networkStats.marketCap.toLocaleString()}</div> | |
<div className="metric-label">Market Cap</div> | |
</div> | |
<div className="metric-item"> | |
<div className="metric-icon">👥</div> | |
<div className="metric-value">{networkStats.stakeholders.toLocaleString()}</div> | |
<div className="metric-label">Stakeholders</div> | |
</div> | |
<div className="metric-item"> | |
<div className="metric-icon">🔌</div> | |
<div className="metric-value">{networkStats.chargingHubs}</div> | |
<div className="metric-label">Charging Hubs</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div className="token-distribution"> | |
<h3>Token Distribution</h3> | |
<div className="distribution-chart"> | |
<div className="pie-chart-container"> | |
<div className="pie-chart"> | |
{tokenomics.distribution.map((segment, index) => { | |
const previousSegments = tokenomics.distribution | |
.slice(0, index) | |
.reduce((sum, item) => sum + item.percentage, 0); | |
return ( | |
<div | |
key={index} | |
className="pie-segment" | |
style={{ | |
transform: `rotate(${previousSegments * 3.6}deg) skew(${90 - segment.percentage * 3.6}deg)`, | |
background: segment.color | |
}} | |
></div> | |
); | |
})} | |
<div className="pie-inner"> | |
<div className="pie-icon">⬡</div> | |
</div> | |
</div> | |
</div> | |
<div className="distribution-legend"> | |
{tokenomics.distribution.map((segment, index) => ( | |
<div key={index} className="legend-item"> | |
<div className="legend-color" style={{ backgroundColor: segment.color }}></div> | |
<div className="legend-label">{segment.category}</div> | |
<div className="legend-value">{segment.percentage}%</div> | |
</div> | |
))} | |
</div> | |
</div> | |
</div> | |
<div className="token-utility"> | |
<h3>Token Utility Functions</h3> | |
<div className="utility-grid"> | |
{tokenomics.utilityFunctions.map((utility, index) => ( | |
<div key={index} className="utility-card"> | |
<div className="utility-header"> | |
<div className="utility-icon">⬡</div> | |
<h4>{utility.function}</h4> | |
</div> | |
<p>{utility.description}</p> | |
</div> | |
))} | |
</div> | |
</div> | |
<div className="value-drivers"> | |
<h3>Value Drivers</h3> | |
<div className="drivers-table"> | |
<div className="table-header"> | |
<div className="driver-column">Driver</div> | |
<div className="impact-column">Impact</div> | |
<div className="description-column">Description</div> | |
</div> | |
{tokenomics.valueDrivers.map((driver, index) => ( | |
<div key={index} className="table-row"> | |
<div className="driver-column">{driver.driver}</div> | |
<div className={`impact-column impact-${driver.impact.toLowerCase()}`}>{driver.impact}</div> | |
<div className="description-column">{driver.description}</div> | |
</div> | |
))} | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
// Helper function to render the wallet tab | |
const renderWallet = () => { | |
const { userWallet } = mockTokenData; | |
return ( | |
<div className="wallet-tab"> | |
<div className="wallet-overview"> | |
<div className="wallet-card balance"> | |
<div className="wallet-icon">⬡</div> | |
<div className="wallet-balance">{userWallet.balance}</div> | |
<div className="wallet-label">Available Tokens</div> | |
<div className="wallet-value">${(userWallet.balance * mockTokenData.networkStats.tokenPrice).toFixed(2)}</div> | |
</div> | |
<div className="wallet-card staking"> | |
<div className="staking-header"> | |
<h3>Staking Rewards</h3> | |
<div className="staking-apy">8.5% APY</div> | |
</div> | |
<div className="staking-metrics"> | |
<div className="staking-metric"> | |
<div className="metric-label">Monthly Rewards</div> | |
<div className="metric-value">{userWallet.stakingRewards} tokens</div> | |
<div className="metric-value-usd">${(userWallet.stakingRewards * mockTokenData.networkStats.tokenPrice).toFixed(2)}</div> | |
</div> | |
<div className="staking-metric"> | |
<div className="metric-label">Staked Amount</div> | |
<div className="metric-value">20 tokens</div> | |
<div className="metric-value-usd">${(20 * mockTokenData.networkStats.tokenPrice).toFixed(2)}</div> | |
</div> | |
</div> | |
<button className="staking-button">Manage Staking</button> | |
</div> | |
<div className="wallet-card actions"> | |
<h3>Token Actions</h3> | |
<div className="action-buttons"> | |
<button | |
className={`action-button ${tokenAction === 'redeem' ? 'active' : ''}`} | |
onClick={() => handleTokenActionSelect('redeem')} | |
> | |
Redeem for Credits | |
</button> | |
<button | |
className={`action-button ${tokenAction === 'stake' ? 'active' : ''}`} | |
onClick={() => handleTokenActionSelect('stake')} | |
> | |
Stake Tokens | |
</button> | |
<button | |
className={`action-button ${tokenAction === 'vote' ? 'active' : ''}`} | |
onClick={() => handleTokenActionSelect('vote')} | |
> | |
Governance Vote | |
</button> | |
</div> | |
{tokenAction && ( | |
<div className="token-action-form"> | |
<div className="form-header"> | |
<h4> | |
{tokenAction === 'redeem' ? 'Redeem Tokens for Credits' : | |
tokenAction === 'stake' ? 'Stake Tokens for Rewards' : | |
'Use Tokens for Governance Vote'} | |
</h4> | |
</div> | |
<div className="form-content"> | |
<div className="amount-selector"> | |
<label>Token Amount</label> | |
<div className="amount-controls"> | |
<button | |
className="amount-button decrease" | |
onClick={() => handleTokenAmountChange(tokenAmount - 1)} | |
disabled={tokenAmount <= 1} | |
> | |
- | |
</button> | |
<input | |
type="number" | |
value={tokenAmount} | |
onChange={(e) => handleTokenAmountChange(parseInt(e.target.value) || 1)} | |
min="1" | |
max={userWallet.balance} | |
/> | |
<button | |
className="amount-button increase" | |
onClick={() => handleTokenAmountChange(tokenAmount + 1)} | |
disabled={tokenAmount >= userWallet.balance} | |
> | |
+ | |
</button> | |
</div> | |
</div> | |
<div className="conversion-preview"> | |
{tokenAction === 'redeem' && ( | |
<div className="conversion-detail"> | |
<span className="detail-label">Charging Credits:</span> | |
<span className="detail-value">{tokenAmount * 10} credits</span> | |
</div> | |
)} | |
{tokenAction === 'stake' && ( | |
<div className="conversion-detail"> | |
<span className="detail-label">Monthly Rewards:</span> | |
<span className="detail-value">{(tokenAmount * 0.085 / 12).toFixed(2)} tokens</span> | |
</div> | |
)} | |
{tokenAction === 'vote' && ( | |
<div className="conversion-detail"> | |
<span className="detail-label">Voting Power:</span> | |
<span className="detail-value">{tokenAmount} votes</span> | |
</div> | |
)} | |
<div className="conversion-detail"> | |
<span className="detail-label">Token Value:</span> | |
<span className="detail-value">${(tokenAmount * mockTokenData.networkStats.tokenPrice).toFixed(2)}</span> | |
</div> | |
</div> | |
<button | |
className="confirm-action-button" | |
onClick={handleActionConfirm} | |
> | |
Confirm {tokenAction === 'redeem' ? 'Redemption' : tokenAction === 'stake' ? 'Staking' : 'Vote'} | |
</button> | |
</div> | |
</div> | |
)} | |
</div> | |
</div> | |
<div className="transaction-history"> | |
<h3>Transaction History</h3> | |
<div className="history-tabs"> | |
<button | |
className={`history-tab ${!selectedAsset ? 'active' : ''}`} | |
onClick={() => setSelectedAsset(null)} | |
> | |
All Transactions | |
</button> | |
<button | |
className={`history-tab ${selectedAsset === 'acquisition' ? 'active' : ''}`} | |
onClick={() => handleAssetSelect('acquisition')} | |
> | |
Token Acquisition | |
</button> | |
<button | |
className={`history-tab ${selectedAsset === 'usage' ? 'active' : ''}`} | |
onClick={() => handleAssetSelect('usage')} | |
> | |
Token Usage | |
</button> | |
</div> | |
<div className="history-table"> | |
<div className="table-header"> | |
<div className="date-column">Date</div> | |
<div className="type-column">Type</div> | |
<div className="amount-column">Amount</div> | |
<div className="status-column">Status</div> | |
</div> | |
{!selectedAsset && ( | |
<> | |
{userWallet.acquisitionHistory.map((transaction, index) => ( | |
<div key={`acq-${index}`} className="table-row acquisition"> | |
<div className="date-column">{transaction.date}</div> | |
<div className="type-column">{transaction.source}</div> | |
<div className="amount-column">+{transaction.amount} tokens</div> | |
<div className="status-column">Completed</div> | |
</div> | |
))} | |
{userWallet.transactionHistory.map((transaction, index) => ( | |
<div key={`tx-${index}`} className="table-row usage"> | |
<div className="date-column">{transaction.date}</div> | |
<div className="type-column">{transaction.type}</div> | |
<div className="amount-column">{transaction.amount > 0 ? `-${transaction.amount} tokens` : 'N/A'}</div> | |
<div className="status-column">{transaction.status}</div> | |
</div> | |
))} | |
</> | |
)} | |
{selectedAsset === 'acquisition' && ( | |
<> | |
{userWallet.acquisitionHistory.map((transaction, index) => ( | |
<div key={index} className="table-row acquisition"> | |
<div className="date-column">{transaction.date}</div> | |
<div className="type-column">{transaction.source}</div> | |
<div className="amount-column">+{transaction.amount} tokens</div> | |
<div className="status-column">Completed</div> | |
</div> | |
))} | |
</> | |
)} | |
{selectedAsset === 'usage' && ( | |
<> | |
{userWallet.transactionHistory.map((transaction, index) => ( | |
<div key={index} className="table-row usage"> | |
<div className="date-column">{transaction.date}</div> | |
<div className="type-column">{transaction.type}</div> | |
<div className="amount-column">{transaction.amount > 0 ? `-${transaction.amount} tokens` : 'N/A'}</div> | |
<div className="status-column">{transaction.status}</div> | |
</div> | |
))} | |
</> | |
)} | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
// Helper function to render the asset ownership tab | |
const renderAssetOwnership = () => { | |
const { assetOwnership } = mockTokenData; | |
return ( | |
<div className="ownership-tab"> | |
<div className="ownership-overview"> | |
<div className="ownership-card summary"> | |
<h3>Your Network Ownership</h3> | |
<div className="ownership-percentage"> | |
<div className="percentage-value">{(assetOwnership.totalOwnership * 100).toFixed(4)}%</div> | |
<div className="percentage-label">of The Link Network</div> | |
</div> | |
<div className="ownership-details"> | |
<div className="detail-item"> | |
<div className="detail-label">Token Holdings</div> | |
<div className="detail-value">{mockTokenData.userWallet.balance} tokens</div> | |
</div> | |
<div className="detail-item"> | |
<div className="detail-label">Network Value</div> | |
<div className="detail-value">${(mockTokenData.networkStats.marketCap).toLocaleString()}</div> | |
</div> | |
<div className="detail-item"> | |
<div className="detail-label">Your Share Value</div> | |
<div className="detail-value"> | |
${(mockTokenData.networkStats.marketCap * assetOwnership.totalOwnership).toFixed(2)} | |
</div> | |
</div> | |
</div> | |
</div> | |
<div className="ownership-card projections"> | |
<h3>Projected Returns</h3> | |
<div className="returns-chart"> | |
<div className="chart-bars"> | |
{assetOwnership.projectedReturns.map((quarter, index) => ( | |
<div key={index} className="chart-bar-container"> | |
<div className="bar-label">{`Q${quarter.quarter} ${quarter.year}`}</div> | |
<div className="bar-wrapper"> | |
<div | |
className="bar" | |
style={{ height: `${quarter.returns * 50}%` }} | |
></div> | |
</div> | |
<div className="bar-value">${quarter.returns.toFixed(2)}</div> | |
</div> | |
))} | |
</div> | |
</div> | |
<div className="returns-note"> | |
Projected returns based on current token holdings and network growth forecasts. | |
</div> | |
</div> | |
</div> | |
<div className="asset-holdings"> | |
<h3>Your Infrastructure Holdings</h3> | |
<div className="holdings-grid"> | |
{assetOwnership.hubs.map((hub, index) => ( | |
<div key={index} className={`holding-card ${hub.status.toLowerCase()}`}> | |
<div className="holding-header"> | |
<h4>{hub.name}</h4> | |
<div className={`holding-status ${hub.status.toLowerCase()}`}> | |
{hub.status} | |
</div> | |
</div> | |
<div className="holding-details"> | |
<div className="holding-item"> | |
<div className="item-label">Ownership Stake</div> | |
<div className="item-value">{(hub.ownership * 100).toFixed(4)}%</div> | |
</div> | |
<div className="holding-item"> | |
<div className="item-label">Monthly Revenue</div> | |
<div className="item-value"> | |
{hub.monthlyRevenue > 0 ? `$${hub.monthlyRevenue.toFixed(2)}` : 'Pending'} | |
</div> | |
</div> | |
<div className="holding-item"> | |
<div className="item-label">Token Allocation</div> | |
<div className="item-value"> | |
{Math.round(mockTokenData.userWallet.balance * (hub.ownership / assetOwnership.totalOwnership))} tokens | |
</div> | |
</div> | |
</div> | |
<div className="holding-actions"> | |
<button className="view-details-button">View Details</button> | |
</div> | |
</div> | |
))} | |
</div> | |
</div> | |
<div className="network-growth"> | |
<h3>Network Growth Opportunities</h3> | |
<div className="opportunities-grid"> | |
<div className="opportunity-card"> | |
<div className="opportunity-icon">🏙️</div> | |
<h4>Urban Hub Expansion</h4> | |
<p>New charging hubs planned for Chicago metro area in Q3 2025.</p> | |
<div className="opportunity-metrics"> | |
<div className="metric"> | |
<div className="metric-label">Projected ROI</div> | |
<div className="metric-value">12.5%</div> | |
</div> | |
<div className="metric"> | |
<div className="metric-label">Min. Investment</div> | |
<div className="metric-value">50 tokens</div> | |
</div> | |
</div> | |
<button className="opportunity-button">Express Interest</button> | |
</div> | |
<div className="opportunity-card"> | |
<div className="opportunity-icon">🛣️</div> | |
<h4>I-55 Corridor</h4> | |
<p>Strategic corridor deployment connecting Chicago to St. Louis.</p> | |
<div className="opportunity-metrics"> | |
<div className="metric"> | |
<div className="metric-label">Projected ROI</div> | |
<div className="metric-value">9.8%</div> | |
</div> | |
<div className="metric"> | |
<div className="metric-label">Min. Investment</div> | |
<div className="metric-value">25 tokens</div> | |
</div> | |
</div> | |
<button className="opportunity-button">Express Interest</button> | |
</div> | |
<div className="opportunity-card"> | |
<div className="opportunity-icon">🔋</div> | |
<h4>Battery Storage Upgrade</h4> | |
<p>Technology upgrade for existing hubs to increase capacity.</p> | |
<div className="opportunity-metrics"> | |
<div className="metric"> | |
<div className="metric-label">Projected ROI</div> | |
<div className="metric-value">7.2%</div> | |
</div> | |
<div className="metric"> | |
<div className="metric-label">Min. Investment</div> | |
<div className="metric-value">10 tokens</div> | |
</div> | |
</div> | |
<button className="opportunity-button">Express Interest</button> | |
</div> | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
// Helper function to render the market data tab | |
const renderMarketData = () => { | |
const { marketData } = mockTokenData; | |
return ( | |
<div className="market-tab"> | |
<div className="market-overview"> | |
<div className="market-card price"> | |
<h3>Token Price</h3> | |
<div className="current-price"> | |
<div className="price-value">${mockTokenData.networkStats.tokenPrice.toFixed(2)}</div> | |
<div className="price-change positive">+6.6% (30d)</div> | |
</div> | |
<div className="price-chart"> | |
<div className="chart-lines"> | |
{marketData.priceHistory.map((month, index) => ( | |
<div key={index} className="chart-point" style={{ left: `${index * 33}%`, bottom: `${(month.price / 3) * 100}%` }}> | |
<div className="point-dot"></div> | |
{index > 0 && ( | |
<div | |
className="point-line" | |
style={{ | |
width: `33%`, | |
transform: `rotate(${Math.atan2( | |
(month.price - marketData.priceHistory[index - 1].price) / 3, | |
0.33 | |
) * (180 / Math.PI)}deg)`, | |
transformOrigin: 'left center' | |
}} | |
></div> | |
)} | |
</div> | |
))} | |
</div> | |
<div className="chart-labels"> | |
{marketData.priceHistory.map((month, index) => ( | |
<div key={index} className="chart-label" style={{ left: `${index * 33}%` }}> | |
{month.month} | |
</div> | |
))} | |
</div> | |
</div> | |
</div> | |
<div className="market-card volume"> | |
<h3>Trading Volume</h3> | |
<div className="volume-chart"> | |
{marketData.volumeHistory.map((month, index) => ( | |
<div key={index} className="volume-bar-container"> | |
<div className="bar-label">{month.month}</div> | |
<div className="bar-wrapper"> | |
<div | |
className="volume-bar" | |
style={{ height: `${(month.volume / 40000) * 100}%` }} | |
></div> | |
</div> | |
<div className="bar-value">{month.volume.toLocaleString()}</div> | |
</div> | |
))} | |
</div> | |
</div> | |
</div> | |
<div className="price-projections"> | |
<h3>Price Projections</h3> | |
<div className="projections-chart"> | |
<div className="chart-bars"> | |
{marketData.projections.map((quarter, index) => ( | |
<div key={index} className="projection-bar-container"> | |
<div className="bar-label">{quarter.quarter}</div> | |
<div className="bar-wrapper"> | |
<div | |
className="projection-range" | |
style={{ | |
height: `${(quarter.highEstimate / 6) * 100}%`, | |
bottom: `${(quarter.lowEstimate / 6) * 100}%` | |
}} | |
></div> | |
<div | |
className="projection-line" | |
style={{ | |
bottom: `${((quarter.highEstimate + quarter.lowEstimate) / 2 / 6) * 100}%` | |
}} | |
></div> | |
</div> | |
<div className="range-values"> | |
<div className="high-value">${quarter.highEstimate.toFixed(2)}</div> | |
<div className="low-value">${quarter.lowEstimate.toFixed(2)}</div> | |
</div> | |
</div> | |
))} | |
</div> | |
</div> | |
<div className="projections-note"> | |
Projections based on network growth, EV adoption rates, and infrastructure expansion plans. | |
Actual results may vary. | |
</div> | |
</div> | |
<div className="market-insights"> | |
<h3>Market Insights</h3> | |
<div className="insights-grid"> | |
<div className="insight-card"> | |
<div className="insight-header"> | |
<div className="insight-icon">📈</div> | |
<h4>Growth Drivers</h4> | |
</div> | |
<ul className="insight-list"> | |
<li>Illinois EV adoption projected to reach 7.8% by end of 2025</li> | |
<li>State incentives for charging infrastructure increasing by 25%</li> | |
<li>Phase 2 expansion adding 8 new charging hubs in Q3 2025</li> | |
<li>Corporate fleet partnerships expected to drive token demand</li> | |
</ul> | |
</div> | |
<div className="insight-card"> | |
<div className="insight-header"> | |
<div className="insight-icon">⚖️</div> | |
<h4>Risk Factors</h4> | |
</div> | |
<ul className="insight-list"> | |
<li>Regulatory changes in tokenized asset classification</li> | |
<li>Competition from other charging networks</li> | |
<li>Supply chain constraints for charging equipment</li> | |
<li>Potential delays in infrastructure deployment timeline</li> | |
</ul> | |
</div> | |
<div className="insight-card"> | |
<div className="insight-header"> | |
<div className="insight-icon">🔮</div> | |
<h4>Future Developments</h4> | |
</div> | |
<ul className="insight-list"> | |
<li>Token governance system launching in Q3 2025</li> | |
<li>Secondary market for token trading in development</li> | |
<li>Enhanced staking rewards program planned for Q4 2025</li> | |
<li>Cross-network partnerships with other mobility tokens</li> | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
// Helper function to render the token flow visualization | |
const renderTokenFlow = () => { | |
return ( | |
<div className="token-flow-tab"> | |
<div className="flow-visualization"> | |
<h3>Token Flow Visualization</h3> | |
<div className="flow-container"> | |
<div className={`flow-diagram ${animateTokenFlow ? 'animate' : ''}`}> | |
<div className="flow-node subscribers"> | |
<div className="node-icon">👤</div> | |
<div className="node-label">Subscribers</div> | |
<div className="node-value">1,250 users</div> | |
</div> | |
<div className="flow-node network"> | |
<div className="node-icon">⬡</div> | |
<div className="node-label">Token Network</div> | |
<div className="node-value">1M tokens</div> | |
</div> | |
<div className="flow-node infrastructure"> | |
<div className="node-icon">🔌</div> | |
<div className="node-label">Charging Hubs</div> | |
<div className="node-value">36 locations</div> | |
</div> | |
<div className="flow-node revenue"> | |
<div className="node-icon">💰</div> | |
<div className="node-label">Revenue Pool</div> | |
<div className="node-value">$125K monthly</div> | |
</div> | |
<div className="flow-path subscription"> | |
<div className="path-label">Monthly Subscription</div> | |
<div className="token-particle"></div> | |
<div className="token-particle"></div> | |
<div className="token-particle"></div> | |
</div> | |
<div className="flow-path redemption"> | |
<div className="path-label">Token Redemption</div> | |
<div className="token-particle"></div> | |
<div className="token-particle"></div> | |
</div> | |
<div className="flow-path investment"> | |
<div className="path-label">Infrastructure Investment</div> | |
<div className="token-particle"></div> | |
<div className="token-particle"></div> | |
<div className="token-particle"></div> | |
</div> | |
<div className="flow-path returns"> | |
<div className="path-label">Revenue Distribution</div> | |
<div className="token-particle"></div> | |
<div className="token-particle"></div> | |
</div> | |
</div> | |
</div> | |
<div className="flow-controls"> | |
<button className="animate-flow-button" onClick={handleTokenFlowDemo}> | |
Animate Token Flow | |
</button> | |
</div> | |
</div> | |
<div className="flow-explanation"> | |
<h3>How ChainLink Tokens Work</h3> | |
<div className="explanation-steps"> | |
<div className="step"> | |
<div className="step-number">1</div> | |
<div className="step-content"> | |
<h4>Token Distribution</h4> | |
<p> | |
Unity Fleet subscribers earn ChainLink tokens monthly as part of their subscription. | |
These tokens represent fractional ownership in The Link charging infrastructure. | |
</p> | |
</div> | |
</div> | |
<div className="step"> | |
<div className="step-number">2</div> | |
<div className="step-content"> | |
<h4>Token Utility</h4> | |
<p> | |
Tokens can be redeemed for charging credits, applied to subscription discounts, | |
or held as an investment in the growing charging network. | |
</p> | |
</div> | |
</div> | |
<div className="step"> | |
<div className="step-number">3</div> | |
<div className="step-content"> | |
<h4>Infrastructure Expansion</h4> | |
<p> | |
Token value is backed by physical charging infrastructure. As the network grows, | |
token holders benefit from increased utility and potential value appreciation. | |
</p> | |
</div> | |
</div> | |
<div className="step"> | |
<div className="step-number">4</div> | |
<div className="step-content"> | |
<h4>Revenue Sharing</h4> | |
<p> | |
Charging revenue is distributed to token holders proportional to their ownership stake, | |
creating a sustainable economic model that aligns all stakeholders. | |
</p> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div className="token-benefits"> | |
<h3>Benefits of Tokenization</h3> | |
<div className="benefits-grid"> | |
<div className="benefit-card"> | |
<div className="benefit-icon">🔄</div> | |
<h4>Circular Economy</h4> | |
<p> | |
Creates a closed-loop system where subscribers become stakeholders, | |
aligning incentives across the ecosystem. | |
</p> | |
</div> | |
<div className="benefit-card"> | |
<div className="benefit-icon">📊</div> | |
<h4>Transparent Ownership</h4> | |
<p> | |
Blockchain-based tokens provide clear, verifiable ownership records | |
and automated distribution of benefits. | |
</p> | |
</div> | |
<div className="benefit-card"> | |
<div className="benefit-icon">🌱</div> | |
<h4>Sustainable Funding</h4> | |
<p> | |
Tokenization creates a sustainable funding model for infrastructure | |
development without relying solely on external investment. | |
</p> | |
</div> | |
<div className="benefit-card"> | |
<div className="benefit-icon">🔐</div> | |
<h4>Community Governance</h4> | |
<p> | |
Token holders can participate in network decisions, ensuring | |
the system evolves to meet community needs. | |
</p> | |
</div> | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
if (loading) { | |
return ( | |
<div className="chainlink-demo loading"> | |
<div className="loading-logo"> | |
<img src="/images/unity_fleet_logo.png" alt="Unity Fleet" /> | |
<div className="loading-pulse"></div> | |
</div> | |
<p>Loading ChainLink Tokenization Demo...</p> | |
</div> | |
); | |
} | |
return ( | |
<div className="chainlink-demo"> | |
<header className="demo-header"> | |
<div className="demo-title"> | |
<h1>ChainLink Tokenization</h1> | |
<span className="demo-subtitle">Unity Fleet Ownership Model</span> | |
</div> | |
<div className="token-stats"> | |
<div className="token-price"> | |
<span className="price-label">Token Price:</span> | |
<span className="price-value">${mockTokenData.networkStats.tokenPrice.toFixed(2)}</span> | |
<span className="price-change positive">+6.6%</span> | |
</div> | |
<div className="token-market-cap"> | |
<span className="cap-label">Market Cap:</span> | |
<span className="cap-value">${mockTokenData.networkStats.marketCap.toLocaleString()}</span> | |
</div> | |
</div> | |
</header> | |
<div className="demo-navigation"> | |
<button | |
className={`nav-button ${activeTab === 'overview' ? 'active' : ''}`} | |
onClick={() => setActiveTab('overview')} | |
> | |
Network Overview | |
</button> | |
<button | |
className={`nav-button ${activeTab === 'wallet' ? 'active' : ''}`} | |
onClick={() => setActiveTab('wallet')} | |
> | |
Token Wallet | |
</button> | |
<button | |
className={`nav-button ${activeTab === 'ownership' ? 'active' : ''}`} | |
onClick={() => setActiveTab('ownership')} | |
> | |
Asset Ownership | |
</button> | |
<button | |
className={`nav-button ${activeTab === 'market' ? 'active' : ''}`} | |
onClick={() => setActiveTab('market')} | |
> | |
Market Data | |
</button> | |
<button | |
className={`nav-button ${activeTab === 'flow' ? 'active' : ''}`} | |
onClick={() => setActiveTab('flow')} | |
> | |
Token Flow | |
</button> | |
</div> | |
<main className="demo-content"> | |
{activeTab === 'overview' && renderOverview()} | |
{activeTab === 'wallet' && renderWallet()} | |
{activeTab === 'ownership' && renderAssetOwnership()} | |
{activeTab === 'market' && renderMarketData()} | |
{activeTab === 'flow' && renderTokenFlow()} | |
</main> | |
{showConfirmation && ( | |
<div className="token-confirmation-modal"> | |
<div className="modal-content"> | |
<h3>Confirm Token Action</h3> | |
<div className="confirmation-details"> | |
<div className="confirmation-item"> | |
<span className="item-label">Action:</span> | |
<span className="item-value"> | |
{tokenAction === 'redeem' ? 'Redeem Tokens for Credits' : | |
tokenAction === 'stake' ? 'Stake Tokens for Rewards' : | |
'Use Tokens for Governance Vote'} | |
</span> | |
</div> | |
<div className="confirmation-item"> | |
<span className="item-label">Amount:</span> | |
<span className="item-value">{tokenAmount} tokens</span> | |
</div> | |
<div className="confirmation-item"> | |
<span className="item-label">Value:</span> | |
<span className="item-value">${(tokenAmount * mockTokenData.networkStats.tokenPrice).toFixed(2)}</span> | |
</div> | |
{tokenAction === 'redeem' && ( | |
<div className="confirmation-item"> | |
<span className="item-label">Credits:</span> | |
<span className="item-value">{tokenAmount * 10} charging credits</span> | |
</div> | |
)} | |
{tokenAction === 'stake' && ( | |
<div className="confirmation-item"> | |
<span className="item-label">Monthly Reward:</span> | |
<span className="item-value">{(tokenAmount * 0.085 / 12).toFixed(2)} tokens</span> | |
</div> | |
)} | |
</div> | |
<div className="confirmation-actions"> | |
<button className="cancel-button" onClick={() => setShowConfirmation(false)}>Cancel</button> | |
<button className="confirm-button">Confirm</button> | |
</div> | |
</div> | |
</div> | |
)} | |
<footer className="demo-footer"> | |
<div className="footer-info"> | |
<span>ChainLink Tokenization Demo</span> | |
<span>Powered by Atlas Intelligence</span> | |
</div> | |
<div className="footer-links"> | |
<a href="#" className="footer-link">Token Whitepaper</a> | |
<a href="#" className="footer-link">Legal Disclosure</a> | |
<a href="#" className="footer-link">FAQ</a> | |
</div> | |
</footer> | |
</div> | |
); | |
} | |
export default ChainlinkDemo; | |