Skip to main content
solverd watches the Arkade transaction stream for funded swaps and fills the ones your markets and prices accept. solver is its management CLI, a thin HTTP client that holds no keys. Both ship from arkade-os/solver.
This solver supports Arkade Asset swaps only. Lightning corridors are in development — Provide Liquidity has the status and the application path.

Before You Start

  • An arkd gRPC endpoint for your network — mainnet is https://arkade.computer
  • The matching Emulator endpoint — contact [email protected] for access. solverd refuses to start without both
  • A 32-byte hex wallet seed: openssl rand -hex 32. The solver spends from it unattended, so treat it like a hot-wallet key
  • BTC for fees and carrier amounts, plus the asset inventory each enabled direction pays out
  • A JSON price feed for each cross-asset market — any JSON endpoint works (see Add a Market)

Install

Each release ships solverd and solver for Linux and macOS, amd64 and arm64. Install both to a directory on PATH:

Run the Daemon

solverd takes no flags and no config file — configuration is entirely SOLVER_-prefixed environment variables:
Always set SOLVER_WALLET_PASSWORD. If unset it defaults to the empty string, and anyone who can reach the HTTP port can export the seed with an empty-password request.
The two ports must differ. First run initializes the wallet from the seed; later runs unlock and resume. Back up the data directory — it holds the wallet alongside your markets and trade history.

Keep It Running

In production, supervise the daemon so it restarts on failure and comes back with the host:
/etc/systemd/system/solverd.service:
Put the environment variables in /etc/solverd.env with mode 0600 — it holds the wallet seed in plaintext. solverd shuts down cleanly on SIGTERM.

Keep the Daemon Private

solverd has no authentication and no TLS on either listener, and both bind all interfaces — there is no bind-address setting. Everything except send, exit, settle, and seed export is completely unauthenticated, including adding and removing markets. The web UI on the HTTP port can export the wallet seed. Treat port 7171 as equivalent to the seed file.
  • Never expose 7170 or 7171 to the incoming internet. Firewall them; on Docker, publish to loopback only or not at all.
  • Use the CLI over SSH: shell into the host and run solver … against localhost, or docker exec solverd solver market list.
  • Reach the web UI over a VPN or cloud security groups restricted to your own addresses — or tunnel it: ssh -N -L 7171:127.0.0.1:7171 user@host, then open http://localhost:7171.
  • There is no rate limiting on password attempts, so a reachable port is a brute-force target.

Connect the CLI

The CLI targets http://localhost:7171 by default; set SOLVER_SERVER only if you changed SOLVER_HTTP_PORT.
Every solver … command on the rest of this page now works verbatim in either setup. solver status is a liveness ping, not a health check of the trading loop. For machine output, global flags come before the subcommand: solver --json market list — the other order fails.

Fund the Wallet

Fund the offchain address directly from a supported wallet such as arkade.money — no settle step needed. Or send mainnet BTC to the boarding address and pull it into Arkade:
Funding is wallet-level; markets carry no balance of their own. Commands that move funds take --password, read SOLVER_PASSWORD, or prompt on a TTY. Later: solver send --to ark1… --amount <n> [--asset <id>] and solver exit --to bc1… --amount <sats> (BTC only).

Add a Market

Any JSON feed works. The price is located by the --price-path pointer; it is auto-derived only for URLs containing binance (pointer /price) and URLs carrying both ids= and vs_currencies= parameters. Every other feed requires --price-path, or the market fails to quote. Prices are fetched when an offer arrives — not on a schedule — and cached for the TTL; if the feed errors, the cache serves until it is six TTLs old, then quoting stops. A fill in that window executes at the cached price: at the default 15-second TTL that is at most 90 seconds stale, at the 3600 cap up to six hours. Set --price-ttl to the staleness you can afford. Asset decimals resolve from the indexer automatically. Set --min-base and --min-quote explicitly on every enabled direction. They default to 0, which the daemon accepts but the public registry rejects. With a funded wallet and one market enabled, the solver is live.

Verify and Operate

Failed fills appear in solver trades, but the failure reason is only in solver --json trades. Three more things worth knowing:
  • solver market update merges client-side with no version check — don’t edit the same market from the CLI and web UI at once, the second write silently wins.
  • solver market remove has no confirmation prompt. It stops future acceptance and leaves published offers unchanged.

Automate It

solver --json <command> is the supported automation interface: raw JSON on stdout, error: on stderr with exit code 1. The one documented HTTP endpoint is the liveness probe, GET /v1/status{"running":true}. The rest of the HTTP and gRPC surface exists to serve the bundled CLI and web UI. It is unauthenticated, unversioned, and not a public API — keep it off the network and do not build against it. If you need a real integration surface, write to [email protected].

Get Discovered

A funded market does not make you findable. Wallets learn about you from a solver card — hand it out privately, publish your own registry, or list in the public one.

Get Discovered

Generate your solver card and choose how wallets find you.

Protocol Reference

The index of the focused Intents reference pages.