Repository navigation
Releases: steemleo/openswap
Releases · steemleo/openswap
Release list
v0.2.0
Fixed
- An unverified success no longer renders as a frozen tracker. When a
reported completion fails corroboration, the timeline used to fall back to
the waiting view — someone who had just paid saw "Waiting for your deposit"
over a swap the backend called complete. The claim now sits at the end of
the timeline as an explicitly active step ("Complete — reported, not yet
verified"), and any progress this process actually observed keeps its
checkmarks. - A swap status the CLI cannot corroborate is no longer presented as a
completed swap. This CLI moves other people's money, so a reported
"success" is now validated against the swap's own receipt before it is
endorsed: is a destination transaction named, is the amount within range
of the quote, has enough time passed for a crosschain swap to settle. A
claim that fails those checks is reported as exactly that — a claim: the
timeline paints no unproven progress, the human output says "the CLI
could not verify that" with each reason, machine output keeps
state: "pending"with the claim underclaimed_stateand stable reason
codes underimplausibleplus envelope warnings, the receipt stays open
and resumable, and the watch keeps polling awhile instead of stopping on
the first uncorroborated answer. Test mode gained magic amount.62— a
status source that claims instant, unverifiable success — so the e2e gate
proves the CLI refuses to endorse it.
Added
- "No route" now suggests a pair that does route. A user asking to receive
Zcash was told the pair was unsupported and stopped there — while the same
coin quoted fine on Solana and BNB Chain, which nothing in the output
revealed.quoteandswapnow answer a dead end with alternatives, for
every pair rather than a curated list. Two distinct dead ends are covered: a
pair no provider quotes, and an asset named on a chain that does not carry it
(DOT.DOT→ "available on ETH, BSC"). Suggestions vary one side at a time so
they stay close to what was asked, keeping the user's own coin wherever
possible, and are offered only after being proven to quote — a suggestion
that also failed would be worse than none. Each carries a runnable command,
and machine consumers get the same list undererror.details.alternatives.
Where genuinely nothing routes the CLI still says so rather than inventing a
near-miss. The search is bounded and runs in parallel, so a failing quote is
no slower than before. - Asset dead ends recover instead of exiting. A
--from/--tonaming a
chain that does not carry the coin used to print an error and quit, even in a
terminal where the CLI already knew the answer. Interactive sessions now turn
that into a picker of the chains that do carry it; machine modes get the same
suggestions rewritten as complete, runnable commands (the user's own
invocation with the failed side swapped) instead of bare identifiers. - A connection blip no longer reads as "no routes". The streaming quote
path failed hard on a single transient network error, reporting a dead end
for a pair that quotes fine a second later — while the one-shot request path
already retried. The stream now silently retries once, but only before
anything has arrived (a second round mid-stream would swap the quote_id),
and the spinner says "Could not fetch routes" instead of "No routes" when
the failure was the connection, not the pair. - Typos find the coin anyway.
USCDreturned zero results everywhere.
Asset search now falls back to close misspellings of a symbol — swapped
letters count as one edit — but only when nothing real matched, so exact and
prefix matches keep their behaviour, and only against symbols, never long
contract identifiers where near-misses are noise.
v0.1.1
Fixed
- Relay fees were displayed at roughly double their real value. Some providers report a fee both as a subtotal and again as its components — Relay lists
relayer FeealongsiderelayerGas FeeandrelayerService Fee, which sum to it exactly. Adding every line counted the relayer fee twice: a funded swap showed $0.07 against the $0.031 actually charged. Component lines are now excluded from the total while staying visible, each labelled with the fee it belongs to.
Changed
- Named consistently as OpenSwap by LeoDex.
vitestmoved to 4.x, clearing five development-only advisories. No effect on the published package — it shipsdist/plus docs with zero runtime dependencies.
Added
- CI verifies commit authorship on every push and pull request.
npx openswap@latestPublished from GitHub Actions with npm provenance. Verify with npm audit signatures.
v0.1.0 — first public release
First public release of the OpenSwap CLI — open-source crosschain swaps from your terminal.
npx openswap@latestNoncustodial by design: it finds the route, mints a deposit address, and you pay from any wallet you already trust. No seed phrases, no private keys, no browser extension.
Highlights
- Route discovery across every provider — Chainflip, THORChain, Maya, NEAR, Relay, and more, streamed live so each gets its window.
- Honest fees. A fee we cannot price renders as "not provided", never as zero, and a route with unpriced components can never win the cheapest badge.
- Exact money math — decimal strings and BigInt only, never floats. Base-unit amounts above 2^53 (and above 1e21, where JSON switches to exponent notation) are handled exactly.
- Durable receipts. Close the terminal any time;
openswap resumepicks the swap back up. - Built for agents and bots — every command takes
--jsonwith a versioned envelope and frozen exit codes. SeeAGENT-CONTRACT.md. - Practice safely —
openswap tourwalks a complete swap in 2 minutes, andopenswap test onruns the whole CLI against a simulated backend.
Notes for this release
- Wallet-signed execution is off by default while its transaction validation is hardened. The noncustodial deposit lane — the default — is unaffected. Set
OPENSWAP_ENABLE_SIGNER=1to opt in knowingly. - Use
npx openswap@latestrather than barenpx openswap: npx caches by package name and never expires that cache, so the bare form keeps serving whichever build you first fetched.
Published from CI with Sigstore provenance. Node >= 20.19.