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.
solverdrefuses 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
- Binary
- Docker
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:
- Binary
- Docker
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:- Binary (systemd)
- Docker (restart policy)
/etc/systemd/system/solverd.service:/etc/solverd.env with mode 0600 —
it holds the wallet seed in plaintext. solverd shuts down cleanly on
SIGTERM.Keep the Daemon Private
- Never expose
7170or7171to 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 …againstlocalhost, ordocker 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 openhttp://localhost:7171. - There is no rate limiting on password attempts, so a reachable port is a brute-force target.
Connect the CLI
- Binary
- Docker
http://localhost:7171 by default; set SOLVER_SERVER
only if you changed SOLVER_HTTP_PORT.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
--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
solver trades, but the failure reason is only in
solver --json trades. Three more things worth knowing:
solver market updatemerges 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 removehas 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.