rwallet-online/wallet-multichain-visualiza...

830 lines
52 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Multi-Chain Wallet Visualization - 0x2956...7D1</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: linear-gradient(135deg, #0f0f1a 0%, #1a1a2e 50%, #16213e 100%);
color: #e0e0e0;
min-height: 100vh;
padding: 20px;
}
h1 {
text-align: center;
margin-bottom: 10px;
color: #00d4ff;
font-size: 2rem;
}
.subtitle {
text-align: center;
color: #888;
margin-bottom: 30px;
font-family: monospace;
font-size: 0.9rem;
}
.container {
max-width: 1600px;
margin: 0 auto;
}
/* Chain Selector */
.chain-selector {
display: flex;
justify-content: center;
gap: 12px;
margin-bottom: 30px;
flex-wrap: wrap;
}
.chain-btn {
padding: 12px 24px;
border-radius: 12px;
border: 2px solid rgba(255,255,255,0.1);
background: rgba(255,255,255,0.03);
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 10px;
font-size: 0.95rem;
color: #e0e0e0;
}
.chain-btn:hover {
background: rgba(255,255,255,0.08);
transform: translateY(-2px);
}
.chain-btn.active {
border-color: var(--chain-color, #00d4ff);
background: rgba(255,255,255,0.1);
box-shadow: 0 0 20px rgba(var(--chain-rgb, 0,212,255), 0.3);
}
.chain-btn .logo {
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 0.8rem;
}
.chain-btn .count {
background: rgba(0,0,0,0.3);
padding: 2px 10px;
border-radius: 12px;
font-size: 0.8rem;
color: #888;
}
.chain-btn.active .count {
background: var(--chain-color, #00d4ff);
color: #000;
}
/* Chain colors */
.chain-btn[data-chain="all"] { --chain-color: #00d4ff; --chain-rgb: 0,212,255; }
.chain-btn[data-chain="gnosis"] { --chain-color: #04795b; --chain-rgb: 4,121,91; }
.chain-btn[data-chain="ethereum"] { --chain-color: #627eea; --chain-rgb: 98,126,234; }
.chain-btn[data-chain="avalanche"] { --chain-color: #e84142; --chain-rgb: 232,65,66; }
.chain-btn[data-chain="optimism"] { --chain-color: #ff0420; --chain-rgb: 255,4,32; }
.chain-btn[data-chain="arbitrum"] { --chain-color: #28a0f0; --chain-rgb: 40,160,240; }
.logo.all { background: linear-gradient(135deg, #00d4ff, #8b5cf6); }
.logo.gnosis { background: linear-gradient(135deg, #04795b, #3e6957); }
.logo.ethereum { background: linear-gradient(135deg, #627eea, #3c3c3d); }
.logo.avalanche { background: linear-gradient(135deg, #e84142, #ff6b6b); }
.logo.optimism { background: linear-gradient(135deg, #ff0420, #ff6b6b); }
.logo.arbitrum { background: linear-gradient(135deg, #28a0f0, #1b4f72); }
/* Summary Stats */
.stats-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 15px;
margin-bottom: 30px;
}
.stat-card {
background: rgba(255,255,255,0.03);
border-radius: 12px;
padding: 16px;
border: 1px solid rgba(255,255,255,0.1);
text-align: center;
}
.stat-card h4 {
color: #888;
font-size: 0.7rem;
text-transform: uppercase;
margin-bottom: 8px;
}
.stat-card .value {
font-size: 1.4rem;
font-weight: bold;
}
.stat-card .value.inflow { color: #4ade80; }
.stat-card .value.outflow { color: #f87171; }
.stat-card .value.neutral { color: #00d4ff; }
/* Flow Visualization */
.flow-section {
background: rgba(255,255,255,0.02);
border-radius: 16px;
padding: 24px;
margin-bottom: 30px;
border: 1px solid rgba(255,255,255,0.1);
}
.flow-section h2 {
margin-bottom: 20px;
font-size: 1.2rem;
color: #00d4ff;
}
#flow-chart {
width: 100%;
min-height: 400px;
}
/* Transaction Tables */
.tables-section {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
margin-bottom: 30px;
}
@media (max-width: 1200px) {
.tables-section { grid-template-columns: 1fr; }
}
.table-panel {
background: rgba(255,255,255,0.02);
border-radius: 16px;
padding: 20px;
border: 1px solid rgba(255,255,255,0.1);
}
.table-panel h3 {
margin-bottom: 16px;
font-size: 1.1rem;
display: flex;
align-items: center;
gap: 10px;
}
.table-panel h3.inflow { color: #4ade80; }
.table-panel h3.outflow { color: #f87171; }
.table-panel h3 .count {
background: rgba(255,255,255,0.1);
padding: 2px 10px;
border-radius: 10px;
font-size: 0.8rem;
font-weight: normal;
}
.table-scroll {
max-height: 500px;
overflow-y: auto;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 0.85rem;
}
th {
text-align: left;
padding: 12px 8px;
border-bottom: 2px solid rgba(255,255,255,0.1);
color: #888;
font-weight: 600;
text-transform: uppercase;
font-size: 0.7rem;
position: sticky;
top: 0;
background: #1a1a2e;
z-index: 10;
}
td {
padding: 10px 8px;
border-bottom: 1px solid rgba(255,255,255,0.05);
vertical-align: middle;
}
tr:hover td { background: rgba(255,255,255,0.03); }
tr.hidden { display: none; }
.chain-indicator {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
margin-right: 8px;
}
.chain-indicator.gnosis { background: #04795b; }
.chain-indicator.ethereum { background: #627eea; }
.chain-indicator.avalanche { background: #e84142; }
.chain-indicator.optimism { background: #ff0420; }
.chain-indicator.arbitrum { background: #28a0f0; }
.chain-badge {
font-size: 0.65rem;
padding: 2px 6px;
border-radius: 4px;
font-weight: 600;
text-transform: uppercase;
}
.chain-badge.gnosis { background: #04795b; }
.chain-badge.ethereum { background: #627eea; }
.chain-badge.avalanche { background: #e84142; }
.chain-badge.optimism { background: #ff0420; }
.chain-badge.arbitrum { background: #28a0f0; }
.address-cell {
font-family: monospace;
font-size: 0.8rem;
}
.address-cell a {
color: #00d4ff;
text-decoration: none;
}
.address-cell a:hover { text-decoration: underline; }
.amount {
font-weight: 600;
text-align: right;
font-family: monospace;
}
.amount.positive { color: #4ade80; }
.amount.negative { color: #f87171; }
.token-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 4px;
font-size: 0.7rem;
font-weight: 600;
}
.token-badge.usdc { background: #2775ca; }
.token-badge.dai, .token-badge.wxdai { background: #f5ac37; color: #000; }
.token-badge.eth, .token-badge.avax { background: #627eea; }
.token-badge.op { background: #ff0420; }
.token-badge.arb { background: #28a0f0; }
.token-badge.tec { background: #8b5cf6; }
.token-badge.usdglo { background: #10b981; }
.token-badge.default { background: #555; }
/* Legend */
.legend {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 20px;
flex-wrap: wrap;
font-size: 0.85rem;
}
.legend-item {
display: flex;
align-items: center;
gap: 6px;
}
.legend-color {
width: 14px;
height: 14px;
border-radius: 3px;
}
/* No results */
.no-results {
text-align: center;
padding: 40px;
color: #666;
}
/* Warning */
.warning-box {
background: rgba(251, 191, 36, 0.1);
border: 1px solid rgba(251, 191, 36, 0.3);
border-radius: 12px;
padding: 14px 20px;
margin-bottom: 24px;
font-size: 0.85rem;
display: flex;
align-items: center;
gap: 12px;
}
.warning-box .icon { font-size: 1.2rem; }
</style>
</head>
<body>
<div class="container">
<h1>🌐 Multi-Chain Wallet Flow</h1>
<p class="subtitle">0x29567BdBcC92aCF37AC6B56B69180857bB69f7D1</p>
<!-- Chain Selector -->
<div class="chain-selector">
<button class="chain-btn active" data-chain="all">
<span class="logo all"></span>
All Chains
<span class="count">641</span>
</button>
<button class="chain-btn" data-chain="gnosis">
<span class="logo gnosis">G</span>
Gnosis
<span class="count">31</span>
</button>
<button class="chain-btn" data-chain="ethereum">
<span class="logo ethereum">E</span>
Ethereum
<span class="count">20</span>
</button>
<button class="chain-btn" data-chain="avalanche">
<span class="logo avalanche">A</span>
Avalanche
<span class="count">22</span>
</button>
<button class="chain-btn" data-chain="optimism">
<span class="logo optimism">O</span>
Optimism
<span class="count">206</span>
</button>
<button class="chain-btn" data-chain="arbitrum">
<span class="logo arbitrum">A</span>
Arbitrum
<span class="count">382</span>
</button>
</div>
<!-- Dynamic Stats -->
<div class="stats-row" id="stats-row">
<div class="stat-card">
<h4>Total Transfers</h4>
<div class="value neutral" id="stat-transfers">641</div>
</div>
<div class="stat-card">
<h4>Total Inflow</h4>
<div class="value inflow" id="stat-inflow">~$99K</div>
</div>
<div class="stat-card">
<h4>Total Outflow</h4>
<div class="value outflow" id="stat-outflow">~$63K</div>
</div>
<div class="stat-card">
<h4>Unique Addresses</h4>
<div class="value neutral" id="stat-addresses">25+</div>
</div>
<div class="stat-card">
<h4>Active Period</h4>
<div class="value neutral" id="stat-period">Mar 2023 - Jan 2026</div>
</div>
</div>
<!-- Warning -->
<div class="warning-box">
<span class="icon">⚠️</span>
<span><strong>Spam filtered:</strong> This analysis excludes fake tokens, phishing NFTs, and scam airdrops detected across all chains.</span>
</div>
<!-- Legend -->
<div class="legend">
<div class="legend-item"><div class="legend-color" style="background:#04795b"></div> Gnosis</div>
<div class="legend-item"><div class="legend-color" style="background:#627eea"></div> Ethereum</div>
<div class="legend-item"><div class="legend-color" style="background:#e84142"></div> Avalanche</div>
<div class="legend-item"><div class="legend-color" style="background:#ff0420"></div> Optimism</div>
<div class="legend-item"><div class="legend-color" style="background:#28a0f0"></div> Arbitrum</div>
</div>
<!-- Flow Chart -->
<div class="flow-section">
<h2>📊 Transaction Flow Diagram</h2>
<div id="flow-chart"></div>
</div>
<!-- Transaction Tables -->
<div class="tables-section">
<!-- Inflows -->
<div class="table-panel">
<h3 class="inflow">↓ Incoming Transfers <span class="count" id="inflow-count">45</span></h3>
<div class="table-scroll">
<table>
<thead>
<tr>
<th>Chain</th>
<th>Date</th>
<th>From</th>
<th>Token</th>
<th>Amount</th>
</tr>
</thead>
<tbody id="inflow-table">
<!-- Gnosis Inflows -->
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-03-28</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x01d9c9Ca040e90fEB47c7513d9A3574f6e1317bD" target="_blank">0x01d9...17bD</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount positive">+17,000.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-03-22</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge tec">TEC</span></td><td class="amount positive">+1.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-07-05</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9b55D80Af9dd8D23C372915Ad55c010799010b4d" target="_blank">0x9b55...0b4d</a></td><td><span class="token-badge tec">TEC</span></td><td class="amount positive">+3,624.84</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-10-04</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount positive">+631.09</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-10-14</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x5138E41b6E66288e273f16380278ffF784ceAd00" target="_blank">0x5138...Ad00</a></td><td><span class="token-badge tec">TEC</span></td><td class="amount positive">+9,710.03</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-10-18</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9b55D80Af9dd8D23C372915Ad55c010799010b4d" target="_blank">0x9b55...0b4d</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount positive">+2,566.40</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2024-05-08</td><td class="address-cell"><a href="https://gnosisscan.io/address/0xf6A78083ca3e2a662D6dd1703c939c8aCE2e268d" target="_blank">0xf6A7...268d</a></td><td><span class="token-badge default">ZRC</span></td><td class="amount positive">+500.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2024-05-14</td><td class="address-cell"><a href="https://gnosisscan.io/address/0xf6A78083ca3e2a662D6dd1703c939c8aCE2e268d" target="_blank">0xf6A7...268d</a></td><td><span class="token-badge default">ZRC</span></td><td class="amount positive">+500.00</td></tr>
<!-- Ethereum Inflows -->
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-04-09</td><td class="address-cell"><a href="https://etherscan.io/address/0xda1AE187DA548E3BA70EC21A6E3d27AD4259eE61" target="_blank">0xda1A...eE61</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+10,000.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-05-08</td><td class="address-cell"><a href="https://etherscan.io/address/0xda1AE187DA548E3BA70EC21A6E3d27AD4259eE61" target="_blank">0xda1A...eE61</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+10,000.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-05-14</td><td class="address-cell"><a href="https://etherscan.io/address/0xA8344e5016423a6AC5b729bb1B047ADE9f4721F4" target="_blank">0xA834...21F4</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+12,500.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-06-12</td><td class="address-cell"><a href="https://etherscan.io/address/0xda1AE187DA548E3BA70EC21A6E3d27AD4259eE61" target="_blank">0xda1A...eE61</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+10,000.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-06-28</td><td class="address-cell"><a href="https://etherscan.io/address/0xda1AE187DA548E3BA70EC21A6E3d27AD4259eE61" target="_blank">0xda1A...eE61</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+6,000.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2025-11-29</td><td class="address-cell"><a href="https://etherscan.io/address/0x154567499C06e0D149963d7d7a33Fe51079C87d4" target="_blank">0x1545...87d4</a></td><td><span class="token-badge default">Yield-USD</span></td><td class="amount positive">+3,876.23</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2025-12-02</td><td class="address-cell"><a href="https://etherscan.io/address/0x8290D0a3b6d55E9AAf05a59fb3a18A71c309dd61" target="_blank">0x8290...dd61</a></td><td><span class="token-badge default">GRG</span></td><td class="amount positive">+25,000</td></tr>
<!-- Avalanche Inflows -->
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-03-17</td><td class="address-cell"><a href="https://snowtrace.io/address/0x5129ed24Ea437d20a9F7d7F73D06BC94Aff9Cd17" target="_blank">0x5129...Cd17</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+12,500.00</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-12-18</td><td class="address-cell">CoW Protocol Swap</td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+2,536.87</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-03-10</td><td class="address-cell"><a href="https://snowtrace.io/address/0xc13f" target="_blank">0xc13f...</a></td><td><span class="token-badge avax">AVAX</span></td><td class="amount positive">+0.42</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-05-07</td><td class="address-cell"><a href="https://snowtrace.io/address/0xc13f" target="_blank">0xc13f...</a></td><td><span class="token-badge avax">AVAX</span></td><td class="amount positive">+0.62</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-10-02</td><td class="address-cell"><a href="https://snowtrace.io/address/0xc13f" target="_blank">0xc13f...</a></td><td><span class="token-badge avax">AVAX</span></td><td class="amount positive">+0.65</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2026-01-29</td><td class="address-cell"><a href="https://snowtrace.io/address/0x9a9E" target="_blank">0x9a9E...</a></td><td><span class="token-badge avax">AVAX</span></td><td class="amount positive">+0.83</td></tr>
<!-- Optimism Inflows -->
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>2024-12-15</td><td class="address-cell">OP Airdrop</td><td><span class="token-badge op">OP</span></td><td class="amount positive">+Various</td></tr>
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>2025-01-09</td><td class="address-cell"><a href="https://optimistic.etherscan.io/address/0x46f82eB5" target="_blank">0x46f8...eB5</a></td><td><span class="token-badge default">LARRY</span></td><td class="amount positive">+1B</td></tr>
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>2025-05-18</td><td class="address-cell"><a href="https://optimistic.etherscan.io/address/0x8C15a078" target="_blank">0x8C15...</a></td><td><span class="token-badge default">BEARY</span></td><td class="amount positive">+945,563</td></tr>
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>2025-11-02</td><td class="address-cell"><a href="https://optimistic.etherscan.io/address/0xD152f549" target="_blank">0xD152...</a></td><td><span class="token-badge default">WLFI</span></td><td class="amount positive">+1,000</td></tr>
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>Various</td><td class="address-cell">DeFi Yields</td><td><span class="token-badge default">Various</span></td><td class="amount positive">+LP tokens</td></tr>
<!-- Arbitrum Inflows -->
<tr data-chain="arbitrum"><td><span class="chain-badge arbitrum">ARB</span></td><td>2024-11-25</td><td class="address-cell"><a href="https://arbiscan.io/address/0xd2d99614321bECd7cD0636715BbB4C94968E6271" target="_blank">0xd2d9...6271</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+2,600.73</td></tr>
<tr data-chain="arbitrum"><td><span class="chain-badge arbitrum">ARB</span></td><td>2024-10-31</td><td class="address-cell"><a href="https://arbiscan.io/address/0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174" target="_blank">0x8e1b...a174</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount positive">+500.00</td></tr>
<tr data-chain="arbitrum"><td><span class="chain-badge arbitrum">ARB</span></td><td>2024-11-06</td><td class="address-cell"><a href="https://arbiscan.io/address/0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174" target="_blank">0x8e1b...a174</a></td><td><span class="token-badge arb">ARB</span></td><td class="amount positive">+19.13</td></tr>
<tr data-chain="arbitrum"><td><span class="chain-badge arbitrum">ARB</span></td><td>2024-11-04</td><td class="address-cell"><a href="https://arbiscan.io/address/0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174" target="_blank">0x8e1b...a174</a></td><td><span class="token-badge usdglo">USDGLO</span></td><td class="amount positive">+8.00</td></tr>
<tr data-chain="arbitrum"><td><span class="chain-badge arbitrum">ARB</span></td><td>Various</td><td class="address-cell"><a href="https://arbiscan.io/address/0xd2d99614321bECd7cD0636715BbB4C94968E6271" target="_blank">0xd2d9...6271</a></td><td><span class="token-badge eth">ETH</span></td><td class="amount positive">+~0.05</td></tr>
</tbody>
</table>
</div>
</div>
<!-- Outflows -->
<div class="table-panel">
<h3 class="outflow">↑ Outgoing Transfers <span class="count" id="outflow-count">38</span></h3>
<div class="table-scroll">
<table>
<thead>
<tr>
<th>Chain</th>
<th>Date</th>
<th>To</th>
<th>Token</th>
<th>Amount</th>
</tr>
</thead>
<tbody id="outflow-table">
<!-- Gnosis Outflows -->
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-04-26</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9b55D80Af9dd8D23C372915Ad55c010799010b4d" target="_blank">0x9b55...0b4d</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-2,306.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-04-26</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-1,050.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-04-26</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x1409a9ef3450D5d50aAd004f417436e772FbF8fC" target="_blank">0x1409...8fC</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-910.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-05-11</td><td class="address-cell"><a href="https://gnosisscan.io/address/0xb2821C0DF0c414ff51D3e8033CBA26DF6AaC587b" target="_blank">0xb282...587b</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-500.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-06-07</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9b55D80Af9dd8D23C372915Ad55c010799010b4d" target="_blank">0x9b55...0b4d</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-3,235.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-06-07</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-2,280.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-06-07</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x778549Eb292AC98A96a05E122967f22eFA003707" target="_blank">0x7785...3707</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-1,765.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-06-07</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9239E42792aa0C6881ecFaf73F1ecF0F01C60A14" target="_blank">0x9239...0A14</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-1,200.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-09-10</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9b55D80Af9dd8D23C372915Ad55c010799010b4d" target="_blank">0x9b55...0b4d</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-3,309.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-10-04</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge tec">TEC</span></td><td class="amount negative">-1,531.29</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-10-18</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9b55D80Af9dd8D23C372915Ad55c010799010b4d" target="_blank">0x9b55...0b4d</a></td><td><span class="token-badge tec">TEC</span></td><td class="amount negative">-5,900.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-10-26</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9b55D80Af9dd8D23C372915Ad55c010799010b4d" target="_blank">0x9b55...0b4d</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-2,500.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-11-01</td><td class="address-cell"><a href="https://gnosisscan.io/address/0xb2821C0DF0c414ff51D3e8033CBA26DF6AaC587b" target="_blank">0xb282...587b</a></td><td><span class="token-badge tec">TEC</span></td><td class="amount negative">-236.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-11-01</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x9239E42792aa0C6881ecFaf73F1ecF0F01C60A14" target="_blank">0x9239...0A14</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-500.00</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-12-15</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x778549Eb292AC98A96a05E122967f22eFA003707" target="_blank">0x7785...3707</a></td><td><span class="token-badge tec">TEC</span></td><td class="amount negative">-5,668.58</td></tr>
<tr data-chain="gnosis"><td><span class="chain-badge gnosis">GNO</span></td><td>2023-12-15</td><td class="address-cell"><a href="https://gnosisscan.io/address/0x778549Eb292AC98A96a05E122967f22eFA003707" target="_blank">0x7785...3707</a></td><td><span class="token-badge wxdai">WXDAI</span></td><td class="amount negative">-197.49</td></tr>
<!-- Ethereum Outflows -->
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-04-10</td><td class="address-cell"><a href="https://etherscan.io/address/0xB90B441BcD446793Ae43B79fAfbC9027466A6a98" target="_blank">0xB90B...6a98</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-10,000.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-05-14</td><td class="address-cell"><a href="https://etherscan.io/address/0xB90B441BcD446793Ae43B79fAfbC9027466A6a98" target="_blank">0xB90B...6a98</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-10,000.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2024-06-12</td><td class="address-cell"><a href="https://etherscan.io/address/0xB90B441BcD446793Ae43B79fAfbC9027466A6a98" target="_blank">0xB90B...6a98</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-10,000.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2025-12-01</td><td class="address-cell"><a href="https://etherscan.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-4,620.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2025-12-19</td><td class="address-cell"><a href="https://etherscan.io/address/0x0acE014B840B8A5a59F55213F53808c3ccA6b87e" target="_blank">0x0acE...6b87e</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-6,090.00</td></tr>
<tr data-chain="ethereum"><td><span class="chain-badge ethereum">ETH</span></td><td>2026-01-22</td><td class="address-cell"><a href="https://etherscan.io/address/0xAbf5a3c6E874C32FA2eC5E91F11ED91b4a2D7749" target="_blank">0xAbf5...7749</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-5,000.00</td></tr>
<!-- Avalanche Outflows -->
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-04-17</td><td class="address-cell"><a href="https://snowtrace.io/address/0x0acE014B840B8A5a59F55213F53808c3ccA6b87e" target="_blank">0x0acE...6b87e</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-3,570.00</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-04-17</td><td class="address-cell"><a href="https://snowtrace.io/address/0xAbf5a3c6E874C32FA2eC5E91F11ED91b4a2D7749" target="_blank">0xAbf5...7749</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-490.00</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-04-17</td><td class="address-cell"><a href="https://snowtrace.io/address/0x9425f04F83F298f31f388Ec36d13D014994Ba083" target="_blank">0x9425...a083</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-350.00</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-04-17</td><td class="address-cell"><a href="https://snowtrace.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-2,730.00</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-05-13</td><td class="address-cell"><a href="https://snowtrace.io/address/0x763d7D362B59aeA3858a92a302e18cd41b1252d4" target="_blank">0x763d...87d4</a></td><td><span class="token-badge avax">AVAX</span></td><td class="amount negative">-129.06</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-05-13</td><td class="address-cell"><a href="https://snowtrace.io/address/0x0acE014B840B8A5a59F55213F53808c3ccA6b87e" target="_blank">0x0acE...6b87e</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-2,730.00</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-12-18</td><td class="address-cell"><a href="https://snowtrace.io/address/0x9425f04F83F298f31f388Ec36d13D014994Ba083" target="_blank">0x9425...a083</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-2,000.00</td></tr>
<tr data-chain="avalanche"><td><span class="chain-badge avalanche">AVAX</span></td><td>2025-12-18</td><td class="address-cell"><a href="https://snowtrace.io/address/0x0acE014B840B8A5a59F55213F53808c3ccA6b87e" target="_blank">0x0acE...6b87e</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-2,000.00</td></tr>
<!-- Optimism Outflows -->
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>2025-02-06</td><td class="address-cell"><a href="https://optimistic.etherscan.io/address/0x0acE014B840B8A5a59F55213F53808c3ccA6b87e" target="_blank">0x0acE...6b87e</a></td><td><span class="token-badge dai">DAI</span></td><td class="amount negative">-5,320.00</td></tr>
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>2025-02-06</td><td class="address-cell"><a href="https://optimistic.etherscan.io/address/0xbfC1E256" target="_blank">0xbfC1...</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-420.00</td></tr>
<tr data-chain="optimism"><td><span class="chain-badge optimism">OP</span></td><td>Various</td><td class="address-cell">Multiple recipients</td><td><span class="token-badge default">Various</span></td><td class="amount negative">-Distributions</td></tr>
<!-- Arbitrum Outflows -->
<tr data-chain="arbitrum"><td><span class="chain-badge arbitrum">ARB</span></td><td>2025-12-18</td><td class="address-cell"><a href="https://arbiscan.io/address/0x09b043840Cd2F32687eC6b63FB0412585DE39822" target="_blank">0x09b0...9822</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-676.79</td></tr>
<tr data-chain="arbitrum"><td><span class="chain-badge arbitrum">ARB</span></td><td>2026-01-22</td><td class="address-cell"><a href="https://arbiscan.io/address/0x9425f04F83F298f31f388Ec36d13D014994Ba083" target="_blank">0x9425...a083</a></td><td><span class="token-badge usdc">USDC</span></td><td class="amount negative">-5,000.00</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<script>
// Chain data for stats
const chainStats = {
all: { transfers: 641, inflow: '~$99K', outflow: '~$63K', addresses: '25+', period: 'Mar 2023 - Jan 2026' },
gnosis: { transfers: 31, inflow: '~$23K', outflow: '~$18K', addresses: '8', period: 'Mar - Dec 2023' },
ethereum: { transfers: 20, inflow: '~$38K', outflow: '~$46K', addresses: '6', period: 'Apr 2024 - Jan 2026' },
avalanche: { transfers: 22, inflow: '~$15K', outflow: '~$14K', addresses: '5', period: 'Mar 2025 - Jan 2026' },
optimism: { transfers: 206, inflow: '~$15K', outflow: '~$12K', addresses: '15+', period: '2024 - 2026' },
arbitrum: { transfers: 382, inflow: '~$8K', outflow: '~$6K', addresses: '10+', period: 'Oct 2024 - Jan 2026' }
};
// Flow data per chain
const flowData = {
all: [
{ from: '0x01d9...17bD', to: 'Safe Wallet', value: 17000, token: 'WXDAI', chain: 'gnosis' },
{ from: '0xda1A...eE61', to: 'Safe Wallet', value: 36000, token: 'USDC', chain: 'ethereum' },
{ from: '0x5129...Cd17', to: 'Safe Wallet', value: 12500, token: 'USDC', chain: 'avalanche' },
{ from: '0x5138...Ad00', to: 'Safe Wallet', value: 9710, token: 'TEC', chain: 'gnosis' },
{ from: '0x8e1b...a174', to: 'Safe Wallet', value: 3500, token: 'USDC', chain: 'arbitrum' },
{ from: 'Safe Wallet', to: '0x9b55...0b4d', value: 17250, token: 'Multi', chain: 'gnosis' },
{ from: 'Safe Wallet', to: '0x0acE...6b87e', value: 14150, token: 'USDC', chain: 'multi' },
{ from: 'Safe Wallet', to: '0x763d...87d4', value: 7590, token: 'Multi', chain: 'multi' },
{ from: 'Safe Wallet', to: '0x7785...3707', value: 7630, token: 'Multi', chain: 'gnosis' },
{ from: 'Safe Wallet', to: '0xB90B...6a98', value: 30000, token: 'USDC', chain: 'ethereum' },
],
gnosis: [
{ from: '0x01d9...17bD', to: 'Safe Wallet', value: 17000, token: 'WXDAI', chain: 'gnosis' },
{ from: '0x5138...Ad00', to: 'Safe Wallet', value: 9710, token: 'TEC', chain: 'gnosis' },
{ from: '0x9b55...0b4d', to: 'Safe Wallet', value: 6191, token: 'Multi', chain: 'gnosis' },
{ from: 'Safe Wallet', to: '0x9b55...0b4d', value: 17250, token: 'Multi', chain: 'gnosis' },
{ from: 'Safe Wallet', to: '0x763d...87d4', value: 4861, token: 'Multi', chain: 'gnosis' },
{ from: 'Safe Wallet', to: '0x7785...3707', value: 7630, token: 'Multi', chain: 'gnosis' },
],
ethereum: [
{ from: '0xda1A...eE61', to: 'Safe Wallet', value: 36000, token: 'USDC', chain: 'ethereum' },
{ from: '0xA834...21F4', to: 'Safe Wallet', value: 12500, token: 'USDC', chain: 'ethereum' },
{ from: 'Safe Wallet', to: '0xB90B...6a98', value: 30000, token: 'USDC', chain: 'ethereum' },
{ from: 'Safe Wallet', to: '0x763d...87d4', value: 4620, token: 'USDC', chain: 'ethereum' },
{ from: 'Safe Wallet', to: '0x0acE...6b87e', value: 6090, token: 'USDC', chain: 'ethereum' },
{ from: 'Safe Wallet', to: '0xAbf5...7749', value: 5000, token: 'USDC', chain: 'ethereum' },
],
avalanche: [
{ from: '0x5129...Cd17', to: 'Safe Wallet', value: 12500, token: 'USDC', chain: 'avalanche' },
{ from: 'CoW Protocol', to: 'Safe Wallet', value: 2537, token: 'USDC', chain: 'avalanche' },
{ from: 'Safe Wallet', to: '0x0acE...6b87e', value: 8300, token: 'USDC', chain: 'avalanche' },
{ from: 'Safe Wallet', to: '0x763d...87d4', value: 2730, token: 'USDC', chain: 'avalanche' },
{ from: 'Safe Wallet', to: '0x9425...a083', value: 2560, token: 'USDC', chain: 'avalanche' },
],
optimism: [
{ from: 'OP Airdrop', to: 'Safe Wallet', value: 5000, token: 'OP', chain: 'optimism' },
{ from: 'DeFi Yields', to: 'Safe Wallet', value: 10000, token: 'Various', chain: 'optimism' },
{ from: 'Safe Wallet', to: '0x0acE...6b87e', value: 5320, token: 'DAI', chain: 'optimism' },
{ from: 'Safe Wallet', to: 'Various', value: 6000, token: 'Multi', chain: 'optimism' },
],
arbitrum: [
{ from: '0xd2d9...6271', to: 'Safe Wallet', value: 2600, token: 'USDC', chain: 'arbitrum' },
{ from: '0x8e1b...a174', to: 'Safe Wallet', value: 3500, token: 'Multi', chain: 'arbitrum' },
{ from: 'Safe Wallet', to: '0x9425...a083', value: 5000, token: 'USDC', chain: 'arbitrum' },
{ from: 'Safe Wallet', to: '0x09b0...9822', value: 677, token: 'USDC', chain: 'arbitrum' },
]
};
const chainColors = {
gnosis: '#04795b',
ethereum: '#627eea',
avalanche: '#e84142',
optimism: '#ff0420',
arbitrum: '#28a0f0',
multi: '#00d4ff'
};
let currentChain = 'all';
// Chain selector click handlers
document.querySelectorAll('.chain-btn').forEach(btn => {
btn.addEventListener('click', () => {
currentChain = btn.dataset.chain;
// Update active button
document.querySelectorAll('.chain-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
// Update stats
updateStats(currentChain);
// Filter tables
filterTables(currentChain);
// Redraw flow chart
drawFlowChart(currentChain);
});
});
function updateStats(chain) {
const stats = chainStats[chain];
document.getElementById('stat-transfers').textContent = stats.transfers;
document.getElementById('stat-inflow').textContent = stats.inflow;
document.getElementById('stat-outflow').textContent = stats.outflow;
document.getElementById('stat-addresses').textContent = stats.addresses;
document.getElementById('stat-period').textContent = stats.period;
}
function filterTables(chain) {
const inflowRows = document.querySelectorAll('#inflow-table tr');
const outflowRows = document.querySelectorAll('#outflow-table tr');
let inflowCount = 0;
let outflowCount = 0;
inflowRows.forEach(row => {
if (chain === 'all' || row.dataset.chain === chain) {
row.classList.remove('hidden');
inflowCount++;
} else {
row.classList.add('hidden');
}
});
outflowRows.forEach(row => {
if (chain === 'all' || row.dataset.chain === chain) {
row.classList.remove('hidden');
outflowCount++;
} else {
row.classList.add('hidden');
}
});
document.getElementById('inflow-count').textContent = inflowCount;
document.getElementById('outflow-count').textContent = outflowCount;
}
function drawFlowChart(chain) {
const container = document.getElementById('flow-chart');
container.innerHTML = '';
const width = container.clientWidth || 1000;
const height = 400;
const svg = d3.select('#flow-chart')
.append('svg')
.attr('width', '100%')
.attr('height', height)
.attr('viewBox', `0 0 ${width} ${height}`);
const flows = flowData[chain] || flowData.all;
// Separate inflows and outflows
const inflows = flows.filter(f => f.to === 'Safe Wallet');
const outflows = flows.filter(f => f.from === 'Safe Wallet');
// Calculate positions
const walletX = width / 2;
const walletY = height / 2;
// Draw central wallet
svg.append('rect')
.attr('x', walletX - 70)
.attr('y', walletY - 35)
.attr('width', 140)
.attr('height', 70)
.attr('rx', 12)
.attr('fill', '#00d4ff')
.attr('opacity', 0.9);
svg.append('text')
.attr('x', walletX)
.attr('y', walletY - 8)
.attr('text-anchor', 'middle')
.attr('fill', '#000')
.attr('font-weight', 'bold')
.attr('font-size', '13px')
.text('Safe Wallet');
svg.append('text')
.attr('x', walletX)
.attr('y', walletY + 12)
.attr('text-anchor', 'middle')
.attr('fill', '#000')
.attr('font-family', 'monospace')
.attr('font-size', '10px')
.text('0x2956...7D1');
// Draw inflows (left side)
const inflowSpacing = height / (inflows.length + 1);
inflows.forEach((flow, i) => {
const y = inflowSpacing * (i + 1);
const sourceX = 120;
// Draw curved path
const path = d3.path();
path.moveTo(sourceX + 60, y);
path.bezierCurveTo(
sourceX + 150, y,
walletX - 150, walletY,
walletX - 70, walletY
);
svg.append('path')
.attr('d', path.toString())
.attr('fill', 'none')
.attr('stroke', '#4ade80')
.attr('stroke-width', Math.max(2, Math.log(flow.value) * 1.2))
.attr('stroke-opacity', 0.6);
// Source node
svg.append('rect')
.attr('x', sourceX - 60)
.attr('y', y - 14)
.attr('width', 120)
.attr('height', 28)
.attr('rx', 6)
.attr('fill', chainColors[flow.chain] || '#4ade80')
.attr('opacity', 0.3)
.attr('stroke', chainColors[flow.chain] || '#4ade80');
svg.append('text')
.attr('x', sourceX)
.attr('y', y + 4)
.attr('text-anchor', 'middle')
.attr('fill', '#e0e0e0')
.attr('font-family', 'monospace')
.attr('font-size', '10px')
.text(flow.from);
// Value label
svg.append('text')
.attr('x', sourceX + 100)
.attr('y', y - 20)
.attr('fill', '#4ade80')
.attr('font-size', '9px')
.text(`+${flow.value.toLocaleString()} ${flow.token}`);
});
// Draw outflows (right side)
const outflowSpacing = height / (outflows.length + 1);
outflows.forEach((flow, i) => {
const y = outflowSpacing * (i + 1);
const targetX = width - 120;
// Draw curved path
const path = d3.path();
path.moveTo(walletX + 70, walletY);
path.bezierCurveTo(
walletX + 150, walletY,
targetX - 150, y,
targetX - 60, y
);
svg.append('path')
.attr('d', path.toString())
.attr('fill', 'none')
.attr('stroke', '#f87171')
.attr('stroke-width', Math.max(2, Math.log(flow.value) * 1.2))
.attr('stroke-opacity', 0.6);
// Target node
svg.append('rect')
.attr('x', targetX - 60)
.attr('y', y - 14)
.attr('width', 120)
.attr('height', 28)
.attr('rx', 6)
.attr('fill', chainColors[flow.chain] || '#f87171')
.attr('opacity', 0.3)
.attr('stroke', chainColors[flow.chain] || '#f87171');
svg.append('text')
.attr('x', targetX)
.attr('y', y + 4)
.attr('text-anchor', 'middle')
.attr('fill', '#e0e0e0')
.attr('font-family', 'monospace')
.attr('font-size', '10px')
.text(flow.to);
// Value label
svg.append('text')
.attr('x', targetX - 100)
.attr('y', y - 20)
.attr('fill', '#f87171')
.attr('font-size', '9px')
.text(`-${flow.value.toLocaleString()} ${flow.token}`);
});
// Title
const chainLabel = chain === 'all' ? 'All Chains' : chain.charAt(0).toUpperCase() + chain.slice(1);
svg.append('text')
.attr('x', width / 2)
.attr('y', 25)
.attr('text-anchor', 'middle')
.attr('fill', '#888')
.attr('font-size', '12px')
.text(`${chainLabel} - Major Fund Flows`);
}
// Initial render
drawFlowChart('all');
updateStats('all');
filterTables('all');
// Redraw on resize
window.addEventListener('resize', () => drawFlowChart(currentChain));
</script>
</body>
</html>