830 lines
52 KiB
HTML
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>
|