Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

65 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Syscoin Hot Wallet Tracker

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.

Quick Start

python3 syscoin_tracker.py sync
python3 syscoin_tracker.py report --top 25 --csv destinations.csv
python3 syscoin_tracker.py serve

Then open:

http://127.0.0.1:8787

The dashboard has these pages:

  • / tracks Binance hot-wallet recipient flows.
  • /sentrynode tracks 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-wallets shows 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.json exposes the same prebuilt data.
  • /emissions shows indexed UTXO miner, sentry node, governance, NEVM miner reward, priority fee, and fee-burn data. /emissions.json exposes 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.

Vercel

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 --prod

On 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"

Watch Mode

Poll the official Blockbook endpoint and print JSON alerts for new outbound sends:

python3 syscoin_tracker.py watch --interval 60

Post alerts to a Discord, Slack, or custom webhook:

SYS_TRACKER_WEBHOOK_URL="https://example.com/webhook" python3 syscoin_tracker.py watch

The webhook payload includes the transaction id, block height, UTC time, external SYS amount, and destination outputs.

Useful Reports

Recent-only report from a block height:

python3 syscoin_tracker.py report --since-height 2238000 --top 50

Report 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 30

Export 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.csv

Exchange And Sentry Checks

Known 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.sh

If 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.sh

Cron 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 50

Follow large first-hop outputs one additional hop:

python3 syscoin_tracker.py follow --depth 2 --min-sys 1000 --limit 100

Custom Provider

Use another Blockbook instance:

python3 syscoin_tracker.py --blockbook-url "https://your-blockbook.example" sync

The default public endpoint is enough for tracking, but a private Blockbook instance is better for heavy polling or deeper multi-hop tracing.

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages