Cross-chain VCRED arbitrage keeper. Buys underpriced assets on Hemi, bridges to Ethereum, converts to USDC, bridges back, closes to VCRED.
VCRED → X (Hemi) → bridge → X (Eth) → USDC (Eth) → bridge → USDC (Hemi) → VCRED
Target tokens: WETH, WBTC, hemiBTC, cbBTC, XAUt, VUSD
# Create secrets
mkdir -p secrets
echo "0xYOUR_PRIVATE_KEY" > secrets/karb_pkey.txt
echo "your-dashboard-password" > secrets/karb_dashpass.txt
chmod 600 secrets/*.txt
# Run
docker compose up --buildDashboard at http://localhost:7120
| Secret | File | Description |
|---|---|---|
ARBITRAGE_PRIVATE_KEY |
secrets/karb_pkey.txt |
Wallet private key |
DASHBOARD_PASSWORD |
secrets/karb_dashpass.txt |
Dashboard basic auth |
| Variable | Required | Description |
|---|---|---|
HEMI_RPC_URL |
no | Hemi RPC (has default) |
ETH_RPC_URL |
no | Ethereum RPC (has default) |
WEBHOOK_URL |
no | Slack/Discord notifications |
| Command | Description |
|---|---|
npm run keeper |
Keeper + dashboard |
npm run dashboard |
Dashboard only |
npm run dev |
Dev mode (tsx watch) |
npm test |
Run tests |
npm run lint |
Lint |
Reconciliation model: Ansible-like steady-state loop. Reads DB + chain state, executes next action, repeats. All steps idempotent.
Persistence: SQLite. Survives restarts mid-bridge.
Single instance: Lock prevents concurrent execution.
DETECTED → HEMI_SWAP_DONE → BRIDGE_OUT_SENT → [prove/finalize] → ON_ETHEREUM
→ ETH_SWAP_DONE → USDC_BRIDGE_BACK_SENT → ON_HEMI_USDC → HEMI_CLOSE_SWAP_DONE → COMPLETED
| Chain | Swap Priority | Bridge |
|---|---|---|
| Hemi | 1delta → SushiSwap | Stargate (WETH, hemiBTC) or Hemi tunnel |
| Ethereum | CowSwap → Matcha → SushiSwap | Stargate (USDC back) |
Binary search finds max profitable VCRED input (min 100). End-to-end profit estimate includes gas + bridge fees.
logs/diag.log- diagnostic (JSONL)logs/money.log- swaps, bridges, P&L only (JSONL)
Password-protected web UI. Shows balances, active cycles, history, P&L.
Use Docker Compose (recommended):
docker compose up --buildOr build and run manually:
docker build -t keeper-arb .
docker run \
-v ./data:/app/data \
-v ./logs:/app/logs \
-v ./secrets/karb_pkey.txt:/run/secrets/ARBITRAGE_PRIVATE_KEY:ro \
-v ./secrets/karb_dashpass.txt:/run/secrets/DASHBOARD_PASSWORD:ro \
-p 7120:7120 \
keeper-arbRuns non-root. Secrets must be mounted to /run/secrets/.
- Hemi: 43111
- Ethereum: 1