Skip to content

Releases: steemleo/openswap

v0.2.0

Choose a tag to compare

@steemleo steemleo released this 15 Aug 15:04

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 under claimed_state and stable reason
    codes under implausible plus 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. quote and swap now 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 under error.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/--to naming 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. USCD returned 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

Choose a tag to compare

@steemleo steemleo released this 27 Jul 17:03

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 Fee alongside relayerGas Fee and relayerService 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.
  • vitest moved to 4.x, clearing five development-only advisories. No effect on the published package — it ships dist/ plus docs with zero runtime dependencies.

Added

  • CI verifies commit authorship on every push and pull request.

npx openswap@latest

Published from GitHub Actions with npm provenance. Verify with npm audit signatures.

v0.1.0 — first public release

Choose a tag to compare

@steemleo steemleo released this 26 Jul 16:17

First public release of the OpenSwap CLI — open-source crosschain swaps from your terminal.

npx openswap@latest

Noncustodial 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 resume picks the swap back up.
  • Built for agents and bots — every command takes --json with a versioned envelope and frozen exit codes. See AGENT-CONTRACT.md.
  • Practice safely — openswap tour walks a complete swap in 2 minutes, and openswap test on runs 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=1 to opt in knowingly.
  • Use npx openswap@latest rather than bare npx 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.