Skip to content

THORChain - rapid swaps product decisioning #12196

@gomesalexandre

Description

@gomesalexandre

Overview

What it says on the box.

THORChain has docs / public repo work around Rapid Swaps, i.e. streaming_interval=0, but ShapeShift web currently does not expose any explicit configurability for this and our THOR swapper currently models THOR quotes as standard vs streaming only.

Tagging @shapeshift/product to decide what the intended user-facing behavior should be in web before engineering touches this:

  • should this be transparent / default behavior
  • should this be user-configurable
  • should this stay implicit under existing streaming behavior
  • should this have any user-facing copy at all

This issue is intentionally for product decisioning / requirements only, not implementation planning.

References and additional details

Relevant THORChain docs / public sources

ShapeShift web env context

Current web envs point THOR swap infra at ShapeShift-hosted THOR endpoints, not direct ninerealms:

  • VITE_THORCHAIN_NODE_URL=https://api.thorchain.shapeshift.com/lcd
  • VITE_THORCHAIN_MIDGARD_URL=https://api.thorchain.shapeshift.com/midgard/v2
  • VITE_UNCHAINED_THORCHAIN_HTTP_URL=https://api.thorchain.shapeshift.com
  • VITE_UNCHAINED_THORCHAIN_WS_URL=wss://api.thorchain.shapeshift.com
  • VITE_UNCHAINED_THORCHAIN_V1_HTTP_URL=https://api.thorchain-v1.shapeshift.com

Dev equivalents point at dev-api.thorchain.shapeshift.com.

Important app context

For THOR swap quotes today:

  • quotes/rates use VITE_THORCHAIN_NODE_URL
  • Midgard is not the quote-generation path
  • Midgard is more for status/history/LP/savers/pool-ish data

Relevant code:

  • packages/swapper/src/swappers/ThorchainSwapper/getTradeQuote/getTradeQuote.ts
  • packages/swapper/src/swappers/ThorchainSwapper/getTradeRate/getTradeRate.ts
  • packages/swapper/src/thorchain-utils/getQuote.ts
  • packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts
  • packages/swapper/src/thorchain-utils/getPoolDetails.ts

How THOR streaming works in ShapeShift web today

Current ShapeShift THOR quote behavior is:

  • standard quote:
    • no streaming_interval
  • streaming quote:
    • sends streaming_interval=<computed by app>
    • does not send streaming_quantity

So currently:

  • quantity is effectively auto / omitted
  • interval is not auto, ShapeShift computes it

Current interval selection logic in packages/swapper/src/thorchain-utils/getPoolDetails.ts:

  • lower pool health -> 10
  • medium pool health -> 5
  • healthy pool -> 1
  • fallback -> 10

So current ShapeShift THOR streaming is legacy intervaled streaming, not explicit rapid behavior.

Also important:

  • there is currently no user-facing configurability for THOR streaming_interval
  • there is currently no user-facing configurability for THOR streaming_quantity
  • app/domain model today is effectively standard vs streaming, driven by isStreaming: boolean

Useful curls

Using the app quote backend:

Standard:

curl "https://api.thorchain.shapeshift.com/lcd/thorchain/quote/swap?amount=10000000000000&from_asset=THOR.RUNE&to_asset=ETH.ETH&destination=0x1111111111111111111111111111111111111111"

Streaming with interval 1:

curl "https://api.thorchain.shapeshift.com/lcd/thorchain/quote/swap?amount=10000000000000&from_asset=THOR.RUNE&to_asset=ETH.ETH&destination=0x1111111111111111111111111111111111111111&streaming_interval=1"

Rapid candidate:

curl "https://api.thorchain.shapeshift.com/lcd/thorchain/quote/swap?amount=10000000000000&from_asset=THOR.RUNE&to_asset=ETH.ETH&destination=0x1111111111111111111111111111111111111111&streaming_interval=0"

Also useful to compare against public THOR infra:

curl "https://thornode.ninerealms.com/thorchain/quote/swap?amount=10000000000000&from_asset=THOR.RUNE&to_asset=ETH.ETH&destination=0x1111111111111111111111111111111111111111"
curl "https://thornode.ninerealms.com/thorchain/quote/swap?amount=10000000000000&from_asset=THOR.RUNE&to_asset=ETH.ETH&destination=0x1111111111111111111111111111111111111111&streaming_interval=1"
curl "https://thornode.ninerealms.com/thorchain/quote/swap?amount=10000000000000&from_asset=THOR.RUNE&to_asset=ETH.ETH&destination=0x1111111111111111111111111111111111111111&streaming_interval=0"

Observed behavior during audit

As of March 19, 2026, live curls showed:

  • standard quote -> standard memo / non-streaming behavior
  • streaming_interval=1 -> streaming memo / streaming fields
  • streaming_interval=0 -> in tested cases looked like standard / non-streaming behavior

So docs / merged THORNode work and observed live endpoint behavior were not cleanly aligned in this pass.

That mismatch is exactly why product should first decide the desired UX / requirements shape instead of engineering guessing.

More relevant local codepaths

  • THOR swapper entrypoints
    packages/swapper/src/swappers/ThorchainSwapper/endpoints.ts

  • THOR quote source labels / streaming labeling
    packages/swapper/src/swappers/ThorchainSwapper/constants.ts

  • App quote fetching / request construction
    src/components/MultiHopTrade/hooks/useGetTradeQuotes/getTradeQuoteOrRateInput.ts
    src/state/apis/swapper/swapperApi.ts
    src/state/apis/swapper/helpers/swapperApiHelpers.ts

  • Trade quote UX using isStreaming
    src/components/MultiHopTrade/components/TradeInput/components/TradeQuotes/components/TradeQuoteBadges.tsx
    src/components/MultiHopTrade/components/TradeInput/TradeInput.tsx
    src/components/MultiHopTrade/components/TradeConfirm/hooks/useThorStreamingProgress.tsx
    src/components/Layout/Header/ActionCenter/components/Details/StreamingSwapDetails.tsx

Acceptance Criteria

  • Product reviews the THORChain rapid swaps context above
  • Product decides the intended ShapeShift web behavior for THOR rapid swaps
  • Product explicitly answers:
    • whether this should be transparent or user-facing
    • whether users should have any configurability over it
    • whether existing THOR streaming UX/copy is sufficient or needs product-defined copy
  • Resulting product decision is documented on this issue for engineering follow-up

Need By Date

N/A

Screenshots/Mockups

N/A

Estimated effort

Half a day for product review / decisioning

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions