Track where SYS leaves the Binance hot wallet:
sys1qync7erear7cvpkysvv0a28mj45g2ps0kq9c6qs
The tracker uses the official Syscoin Native UTXO Blockbook explorer by default:
https://explorer-blockbook.syscoin.org/
It stores fetched transactions in SQLite, classifies hot-wallet outbound movements, aggregates first-hop destinations, and can optionally follow spent outputs to later hops.
python3 syscoin_tracker.py sync
python3 syscoin_tracker.py report --top 25 --csv destinations.csv
python3 syscoin_tracker.py serveThen open:
http://127.0.0.1:8787
The dashboard has these pages:
/tracks Binance hot-wallet recipient flows./sentrynodetracks the current network sentry node list from RPC, setup/takedown dates, moved collateral destination, and exchange label when the moved-to address is known./top-walletsshows the top 100 exact address balances from the local RPC-derived UTXO index and, when enabled, estimated holder clusters built from common-input and sentry-collateral history./top-wallets.jsonexposes the same prebuilt data./emissionsshows indexed UTXO miner, sentry node, governance, NEVM miner reward, priority fee, and fee-burn data./emissions.jsonexposes the same prebuilt data.
Manual top-wallet names can be added to wallet_labels.csv with
address,name,label; for example, use labels such as Exchange or
Private Wallet. Known exchange names still come from exchange_tags.csv.
This repo includes a Vercel Python function at api/index.py, so the same
dashboard can be deployed without running a local process forever.
For live deployments, follow DEPLOYMENT.md. The production site uses both
Vercel and the VPS-published static files on syscoin.dev; pushing GitHub or
deploying Vercel alone is not enough for a complete update.
npx vercel
npx vercel --prodOn Vercel, the dashboard syncs on page request and uses /tmp SQLite caching
while the function instance is warm. The page still refreshes every 60 seconds.
Use the local serve command or an external database/cron worker if you need a
fully persistent background indexer.
Useful Vercel environment variables:
SYS_TRACKER_SINCE_DATE="2026-04-14 12:30"
SYS_TRACKER_FROM_HEIGHT="2221358"
SYS_TRACKER_SYNC_INTERVAL="60"
SYS_TRACKER_NEXT_HOP_LIMIT="8"
SYS_TRACKER_NODE_SPEND_LIMIT="12"Poll the official Blockbook endpoint and print JSON alerts for new outbound sends:
python3 syscoin_tracker.py watch --interval 60Post alerts to a Discord, Slack, or custom webhook:
SYS_TRACKER_WEBHOOK_URL="https://example.com/webhook" python3 syscoin_tracker.py watchThe webhook payload includes the transaction id, block height, UTC time, external SYS amount, and destination outputs.
Recent-only report from a block height:
python3 syscoin_tracker.py report --since-height 2238000 --top 50Report from the monitoring announcement timestamp onward. Date/time values without
an explicit offset use Australia/Sydney by default:
python3 syscoin_tracker.py sync --since-date "2026-04-14 12:30"
python3 syscoin_tracker.py report --since-date "2026-04-14 12:30" --top 50 --csv destinations_since_monitoring.csv
python3 syscoin_tracker.py serve --since-date "2026-04-14 12:30"The dashboard auto-syncs from Blockbook and refreshes the browser every 60 seconds by default. Change that cadence with:
python3 syscoin_tracker.py serve --since-date "2026-04-14 12:30" --sync-interval 30Export every recipient address, ranked high to low by SYS amount:
python3 syscoin_tracker.py report --since-date "2026-04-14 12:30" --all-destinations --csv destinations_since_monitoring_all_ranked.csvKnown exchange end wallets live in exchange_hot_wallets.csv. These are the
endpoint wallets shown at the top of the dashboard; personal deposit addresses
or intermediate wallets should not be listed here.
| Exchange | End wallet | Note |
|---|---|---|
| Bitget | sys1qwhd5dz4mxkfwylg9jz4x56ggnc4z2d22u4l78w |
main hot/cold wallet |
| Gate | ScM7oHdCXXZistSxPr7YjxyZ8tUf3HG8c2 |
main hot wallet |
| MEXC | sys1qeyt05mxwlud4q66u8u2jtyq4markks4ru5ldk8 |
main candidate |
| MEXC | sys1q3ec7z8up0phw83t0rund94h0d577lfls9eel38 |
large downstream wallet |
| Ex(Unknown) | sys1qna83egqpe3yj3nnl8puqwv8tqwguy96zhg9tvh |
repeated downstream cluster |
| Ex(Unknown) | sys1qexf95pzlun27jr0vuyt55emtxvrlxa44ddk859 |
repeated downstream cluster |
| Ex(Unknown) | sys1qkah23xlfjs0hx66u48q639e72k3fyhwecsn4py |
repeated downstream cluster |
| Ex(Unknown) | sys1qe5vdffvlpyvkj3z3fqw8kc639s2dykp7smun9w |
repeated downstream cluster |
| Ex(Unknown) | sys1qcfz9dne8ffk5at79p3et76fzgvwxlxymsc6lje |
repeated downstream cluster |
Known cold wallets live in exchange_cold_wallets.csv and are shown separately
on the dashboard.
| Exchange | Cold wallet | Note |
|---|---|---|
| Binance | SUBbe8vb7ng9CxZE9J3hma2CCkBh5VBHrv |
confirmed cold wallet |
Direct end-wallet labels are mirrored in exchange_tags.csv. Proven deposit or
intermediate routes can live in exchange_routes.csv; for example, your
sys1qs05... Bitget deposit address is kept as a route to the Bitget end wallet,
not as a direct exchange wallet.
To use Syscoin Core RPC without storing credentials in the repo:
export SYS_RPC_HOST="127.0.0.1"
export SYS_RPC_USER="your-user"
export SYS_RPC_PASSWORD="your-password"
python3 syscoin_tracker.py rpc-check
python3 syscoin_tracker.py sync-masternodes --csv network_masternodes.csv
python3 syscoin_tracker.py sync-top-wallets --max-blocks 1000 --batch-size 50 --json top-wallets.json
python3 syscoin_tracker.py sync-emissions --max-blocks 1000 --batch-size 50 --json emissions.json
python3 syscoin_tracker.py --nevm-rpc-url http://127.0.0.1:8545/ sync-nevm-emissions --max-blocks 1000 --batch-size 50 --json emissions.json
python3 syscoin_tracker.py verify-sentries --since-date "2026-04-14 12:30"For always-on sentry node monitoring, run the watcher from the VPS that has
local RPC access. The installer clones or updates the repo at
$HOME/sysWalletTracker, writes a private .env, runs one sync, then installs a
once-per-minute cron job:
SYS_RPC_USER="your-user" \
SYS_RPC_PASSWORD="your-password" \
SYS_RPC_URL="http://127.0.0.1:8370/" \
bash <(curl -fsSL https://raw.githubusercontent.com/bigpoppa-sys/sysWalletTracker/main/scripts/install_vps_cron.sh)If the repo is private, clone it on the VPS with your GitHub auth first, then run the installer from that checkout:
git clone https://github.com/bigpoppa-sys/sysWalletTracker.git ~/sysWalletTracker
cd ~/sysWalletTracker
SYS_RPC_USER="your-user" \
SYS_RPC_PASSWORD="your-password" \
SYS_RPC_URL="http://127.0.0.1:8370/" \
./scripts/install_vps_cron.shIf the VPS cannot authenticate to GitHub, install from the public Vercel bundle instead:
mkdir -p ~/sysWalletTracker
curl -fsSL https://syswallettracker.vercel.app/sysWalletTracker-vps.tgz -o /tmp/sysWalletTracker-vps.tgz
tar -xzf /tmp/sysWalletTracker-vps.tgz -C ~/sysWalletTracker
cd ~/sysWalletTracker
SYS_RPC_USER="your-user" \
SYS_RPC_PASSWORD="your-password" \
SYS_RPC_URL="http://127.0.0.1:8370/" \
./scripts/install_vps_cron.shCron logs go to $HOME/sysWalletTracker/logs/static_snapshot_cron.log. The cron job
uses a lock so a slow RPC check cannot overlap the next minute's run.
Set SYS_TOP_WALLET_MAX_BLOCKS in $HOME/sysWalletTracker/.env to index top-wallet
blocks during each cron run; leave it at 0 to only publish the latest existing
top-wallet snapshot. SYS_TOP_WALLET_BATCH_SIZE controls how many blocks are
fetched per RPC batch.
Set SYS_TOP_WALLET_CLUSTER_MAX_BLOCKS to backfill estimated holder clusters in
chunks during the same cron run. This builds common-input links from historical
transactions and links known 100,000 SYS sentry collateral outputs to their
funding inputs. It does not reset the exact address-balance index.
Set SYS_EMISSIONS_MAX_BLOCKS to backfill the Network Emissions index in chunks
during the static cron run. The index reads each block's coinbase transaction,
separates miner, sentry, and governance payouts, and subtracts RPC-reported
transaction fees for the estimated issuance rate.
Set SYS_NEVM_EMISSIONS_MAX_BLOCKS and SYS_NEVM_RPC_URL to backfill the NEVM
side of Network Emissions. The NEVM index records the static miner reward,
priority fees, and EIP-1559 base-fee burns, then folds the net supply impact
into the same /emissions view.
verify-sentries compares exact 100,000 SYS candidates against
Syscoin Core masternode_list outpoints. If RPC is only bound locally on a remote node, use an
SSH tunnel or adjust rpcbind / rpcallowip carefully.
Ignore small outputs:
python3 syscoin_tracker.py report --min-sys 1000 --top 50Follow large first-hop outputs one additional hop:
python3 syscoin_tracker.py follow --depth 2 --min-sys 1000 --limit 100Use another Blockbook instance:
python3 syscoin_tracker.py --blockbook-url "https://your-blockbook.example" syncThe default public endpoint is enough for tracking, but a private Blockbook instance is better for heavy polling or deeper multi-hop tracing.