Skip to content

feat(swap-widget): thorchain support - #12318

Merged
kaladinlight merged 6 commits into
developfrom
feat/swap-widget-thorchain-support
May 9, 2026
Merged

feat(swap-widget): thorchain support#12318
kaladinlight merged 6 commits into
developfrom
feat/swap-widget-thorchain-support

Conversation

@kaladinlight

@kaladinlight kaladinlight commented May 7, 2026

Copy link
Copy Markdown
Member

Description

Enables THORChain as a routable swapper in the swap-widget end-to-end. Three layers:

1. swapper — populate step.thorchainTransactionMetadata at quote time

getL1RateOrQuote now stamps a thorchainTransactionMetadata: { to, data?, value?, memo? } on each step, for every chain namespace it handles (EVM, UTXO, cosmossdk, Solana, TRON). New cosmossdk/getThorTxData helper mirrors the existing evm/utxo/solana/tron helpers — handles the special case of native-asset deposits on the swapper's own chain (RUNE on THORChain, CACAO on MAYAChain) which use MsgDeposit and have no to address.

This makes the swapper the single source of truth for the deposit tx params. The field is additive and optional, so existing consumers (main web app, etc.) are unaffected.

2. public-api — read deposit tx data from the step

extractTransactionData now reads to/memo/value from step.thorchainTransactionMetadata for both UTXO (utxo_deposit) and cosmos (cosmos) tx types, and from EVM steps where the metadata carries router-call calldata.

Drops the runtime resolveDepositContext inbound-address fetch and the ThorLikeQuote / DepositExtractionContext plumbing — the swapper now provides this at quote time. Also drops the DEPOSIT_ADDRESS_UNAVAILABLE (503) failure mode that fired when THORNode was slow on the second fetch.

3. swap-widget — wire up THORChain + clean up useSwapExecution

  • Re-enable SwapperName.Thorchain and its icon/color so it shows up in the route selector and quotes modal.
  • Dispatch on transactionData.type ('evm' | 'utxo_deposit' | 'utxo_psbt' | 'solana' | 'cosmos') via a flat switch in useSwapExecution. Per-branch helpers (executeEvm, executeUtxoDeposit, executeSolana) own their own wallet-state preconditions. Deferred types (utxo_psbt, cosmos) throw a clear "not yet supported" error rather than silently falling through.
  • Type cleanup in packages/swap-widget/src/types/index.ts:
    • Drop relayTransactionMetadata, butterSwapTransactionMetadata, solanaTransactionMetadata from ApiQuoteStep (consolidated into transactionData).
    • Drop the deprecated nested quote.quote.steps escape hatch from QuoteResponse.
    • Drop the dead top-level QuoteResponse.transactionData field — public-api only emits it inside steps[i].
    • Add affiliateAddress?: string to match what public-api actually returns.
  • Shared getErrorMessage helper in packages/swap-widget/src/utils/errors.ts that prefers viem's shortMessage, handles plain RPC error objects ({ code: 4001, message: 'User rejected' }), and falls back gracefully. Replaces fragile JSON.stringify(error) paths.
  • User-facing error voice standardized: "Failed to execute swap — please try again" for transient failures, "This swap is not yet supported" / "This network is not yet supported" for capability gaps. Debug detail kept in console.error.
  • Selector cleanup: stop subscribing to s.context (which re-rendered on every input/asset/amount change). Pull machine context from actorRef.getSnapshot() at fire time.

End-user widget coverage in this PR: EVM sells (router contract call) and UTXO sells (utxo_deposit with memo as OP_RETURN). Cosmos sells (RUNE / ATOM via THORChain) are plumbed through the swapper + public-api, but the widget still throws "not yet supported" — landing cosmos signing requires a useCosmosSigning hook + AppKit cosmos adapter and is out of scope here.

Issue (if applicable)

closes #

Risk

What protocols, transaction types, wallets or contract interactions might be affected by this PR?

Cross-package: swapper, public-api, swap-widget.

  • swapper: additive optional field on TradeQuoteStep. No on-chain behavior change. Main web app picks up the new field but doesn't read it; existing THORChain integration there is unaffected.
  • public-api: changes the source of THORChain deposit tx data for all consumers of /v1/swap/quote (not just the widget). Same to/memo/value values — just pulled from the swapper at quote time rather than re-fetched. Removes the DEPOSIT_ADDRESS_UNAVAILABLE 503 path.
  • swap-widget: affects EVM, UTXO (Bitcoin), and Solana broadcast paths. No new on-chain transaction types.

Testing

Engineering

End-to-end against a local public-api at http://localhost:3005:

  1. Regression — NEAR Intents (e.g. ETH → SOL): get quote, execute, confirm tx broadcasts.
  2. Regression — Relay (e.g. ETH → ARB): get quote, execute, confirm tx broadcasts.
  3. THORChain ETH → BTC (EVM sell): connect EVM wallet, get quote → THORChain appears in the route selector, execute → txData.type === 'evm', router contract call broadcasts, txHash returned.
  4. THORChain BTC → ETH (UTXO sell): connect BTC wallet via AppKit, get quote → THORChain appears, execute → txData.type === 'utxo_deposit', bitcoin.sendTransfer broadcasts to vault with memo in OP_RETURN.
  5. Cosmos guard: attempt RUNE → ETH via THORChain. Quote should succeed (public-api returns valid cosmos transactionData); widget execution should show "This swap is not yet supported — please try a different route" rather than silent failure.
  6. Wallet rejection UX: cancel a tx in MetaMask → user sees the wallet's shortMessage (e.g. "User rejected the request") rather than a JSON-stringified error blob.
  7. Public-api smoke: POST /v1/swap/quote with a THORChain-routable pair → response carries steps[0].transactionData with the deposit address/memo/value populated, no DEPOSIT_ADDRESS_UNAVAILABLE 503.

Operations

  • 🏁 My feature is behind a flag and doesn't require operations testing (yet)

The widget itself is not yet shipped to end users.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Thorchain swapper is now available and active
    • Enhanced transaction metadata support for improved transaction handling
  • Bug Fixes

    • Improved error handling with user-friendly error messages
    • Added validation for missing approval spender data and invalid sell-asset addresses
    • Network/chain switching now properly based on asset requirements
  • Refactoring

    • Transaction execution optimized with specialized handlers for different blockchain types
    • Quote response structure simplified with cleaner field organization

… tx data

- Dispatch on transactionData.type discriminated union instead of stale chain-flag fallbacks
- Drop legacy relay/butter/solana metadata fields and nested quote.quote.steps escape hatch from ApiQuoteStep/QuoteResponse
- Drop dead top-level transactionData; add affiliateAddress to match public-api response
- Extract shared getErrorMessage helper that handles viem shortMessage and wallet RPC error objects
- Standardize user-facing error voice with debug context in console.error
- Tighten machine selector to avoid re-rendering on every input/asset/amount change

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@kaladinlight
kaladinlight requested a review from a team as a code owner May 7, 2026 22:03
@coderabbitai

coderabbitai Bot commented May 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Swap approval and execution hooks were refactored to use snapshot-based context reading, extract transaction execution into chain-specific helpers, add Thorchain transaction metadata propagation, and consolidate error handling across EVM, UTXO, and Solana flows.

Changes

Swap Execution and Approval Refactoring

Layer / File(s) Summary
Type and Contract Updates
packages/swapper/src/types.ts, packages/swap-widget/src/types/index.ts, packages/public-api/src/routes/quote/types.ts
Added thorchainTransactionMetadata to TradeQuoteStep; re-enabled SwapperName.Thorchain; ApiQuoteStep consolidated to use transactionData; QuoteResponse adds affiliateAddress and requires steps: ApiQuoteStep[].
Error Message Utility
packages/swap-widget/src/utils/errors.ts
New getErrorMessage normalizes unknown errors to user-facing strings with configurable fallback.
Approval Hook Refactoring
packages/swap-widget/src/hooks/useSwapApproval.ts
Approval execution reads quote/sellAsset/amount from actor snapshot at run time; validates spender and sell-asset address; switches chain using sellAsset.chainId; enforces non-zero sell amount; encodes ERC-20 approve calldata; normalizes errors via getErrorMessage; resets approving flag in finally.
Execution Hook Modularization
packages/swap-widget/src/hooks/useSwapExecution.ts
Extracted executeEvm, executeUtxoDeposit, and executeSolana helpers; effect triggers on executing state and dispatches by txData.type; consolidated generic execute error dispatch; success dispatches EXECUTE_SUCCESS with tx hash/signature.
Public API Quote Transform & Extract
packages/public-api/src/routes/quote/extractTransactionData.ts, packages/public-api/src/routes/quote/utils.ts, packages/public-api/src/routes/quote/getQuote.ts
Removed deposit-extraction context usage; extractTransactionData gains Thorchain branches for EVM/UTXO/Cosmos extraction; transformQuoteStep and getQuote now transform steps solely from step data.
Swapper Thorchain Utilities
packages/swapper/src/thorchain-utils/*, packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts
Added getThorTxData helper and re-export; getL1RateOrQuote injects thorchainTransactionMetadata (to/data/value/memo) for multiple chains and fetches vaults once per chain where applicable.
Swapper UI Constants
packages/swap-widget/src/constants/swappers.ts
Activated Thorchain icon and color entries in SWAPPER_ICONS and SWAPPER_COLORS.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • shapeshift/web#12289: Modifies public-api quote route and step transformation shape; related to removal of deposit context and quote metadata changes.

Suggested reviewers

  • gomesalexandre

Poem

A rabbit hops through the swap refactor,
Snapshot reads guide approvals neat and fast,
Helpers send EVM, UTXO, Solana blasts,
Thorchain vaults stitched into every step,
Errors now whisper one clear message at last. 🐰✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title 'feat(swap-widget): thorchain support' accurately reflects the main change—enabling THORChain as a routable swapper across the swap-widget and related packages, matching the comprehensive feature work described in the PR objectives.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/swap-widget-thorchain-support

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
packages/swap-widget/src/hooks/useSwapApproval.ts (1)

47-71: ⚡ Quick win

sellAmountBaseUnit guard fires after chain switch.

The validation at line 68 that aborts with APPROVAL_ERROR is evaluated only after the chain-switch at lines 50–53 has already executed. A missing or zero sellAmountBaseUnit therefore triggers a wallet chain-switch popup with no subsequent transaction.

♻️ Proposed fix — move the guard up, before the chain switch
+       if (!sellAmountBaseUnit || sellAmountBaseUnit === '0') {
+         actorRef.send({ type: 'APPROVAL_ERROR', error: 'No sell amount specified' })
+         return
+       }
+
        const requiredChainId = getEvmNetworkId(sellAsset.chainId)
        const client = walletClient as WalletClient

        const currentChainId = await client.getChainId()
        if (currentChainId !== requiredChainId) {
          await switchOrAddChain(client, requiredChainId)
        }
        // ... chain config setup ...

-       if (!sellAmountBaseUnit || sellAmountBaseUnit === '0') {
-         actorRef.send({ type: 'APPROVAL_ERROR', error: 'No sell amount specified' })
-         return
-       }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/swap-widget/src/hooks/useSwapApproval.ts` around lines 47 - 71, The
guard for sellAmountBaseUnit should run before any wallet chain switching to
avoid triggering a wallet popup when there's no amount; move the
sellAmountBaseUnit check (the block that sends actorRef.send({ type:
'APPROVAL_ERROR', ... })) above the code that derives
requiredChainId/getEvmNetworkId(sellAsset.chainId) and before creating/using
walletClient and calling client.getChainId()/switchOrAddChain; ensure functions
referenced (sellAmountBaseUnit, actorRef.send, getEvmNetworkId, walletClient,
client.getChainId, switchOrAddChain) remain unchanged otherwise.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/swap-widget/src/hooks/useSwapApproval.ts`:
- Around line 31-38: The destructuring from actorRef.getSnapshot().context pulls
sellAsset without checking it, then useSwapApproval accesses sellAsset.assetId
which can throw; fix by guarding sellAsset before using it (e.g., after
obtaining { quote, sellAsset, sellAmountBaseUnit } from
actorRef.getSnapshot().context, check if sellAsset is truthy and if not send
actorRef.send({ type: 'APPROVAL_ERROR', error: 'Missing sellAsset in context' })
and return), and only proceed to compute sellAssetAddress when sellAsset is
present; update references in useSwapApproval to use this guard so no property
access occurs on undefined.

---

Nitpick comments:
In `@packages/swap-widget/src/hooks/useSwapApproval.ts`:
- Around line 47-71: The guard for sellAmountBaseUnit should run before any
wallet chain switching to avoid triggering a wallet popup when there's no
amount; move the sellAmountBaseUnit check (the block that sends actorRef.send({
type: 'APPROVAL_ERROR', ... })) above the code that derives
requiredChainId/getEvmNetworkId(sellAsset.chainId) and before creating/using
walletClient and calling client.getChainId()/switchOrAddChain; ensure functions
referenced (sellAmountBaseUnit, actorRef.send, getEvmNetworkId, walletClient,
client.getChainId, switchOrAddChain) remain unchanged otherwise.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9083441a-3167-42fe-892c-1385c5f2f25b

📥 Commits

Reviewing files that changed from the base of the PR and between d94a5de and 0d912cb.

📒 Files selected for processing (4)
  • packages/swap-widget/src/hooks/useSwapApproval.ts
  • packages/swap-widget/src/hooks/useSwapExecution.ts
  • packages/swap-widget/src/types/index.ts
  • packages/swap-widget/src/utils/errors.ts

Comment thread packages/swap-widget/src/hooks/useSwapApproval.ts
kaladinlight and others added 3 commits May 8, 2026 16:56
Populate `step.thorchainTransactionMetadata` (to/data/value/memo) for
EVM, UTXO, cosmossdk, Solana, and TRON in `getL1RateOrQuote`, and add
a cosmossdk `getThorTxData` helper. Lets downstream consumers build
the deposit tx without re-fetching inbound address data.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Read deposit address/memo/value from the step's
`thorchainTransactionMetadata` instead of doing a runtime
`resolveDepositContext` inbound-address fetch. Drops the
`ThorLikeQuote`/`DepositExtractionContext` plumbing and the
DEPOSIT_ADDRESS_UNAVAILABLE failure mode now that the swapper
populates the metadata at quote time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Uncomment THORChain in the SwapperName enum and its icon/color in the
swapper constants so it shows up in the route selector.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@kaladinlight kaladinlight changed the title feat(swap-widget): clean up execution hook and pass through THORChain tx data feat: THORChain support in swap-widget May 8, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts (1)

450-477: 💤 Low value

Cosmos branch: no Promise.allSettled wrapping after hoisting vault fetch.

After the refactor, cosmossdk.getThorTxData and cosmosChainAdapter.getFeeData are awaited at the top of the case but not wrapped in try/catch (unlike EVM/UTXO/Solana/Tron which use Promise.allSettled per route). A throw here propagates out of getL1RateOrQuote rather than producing a TradeQuoteError.UnsupportedTradePair Err result. Since these failures are shared across all routes the practical impact is small (the cosmos sell flow is also deferred per the PR), but consider catching and returning Err(makeSwapErrorRight(...)) for symmetry with the other branches.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts` around lines 450 -
477, The CosmosSdk branch in getL1RateOrQuote currently awaits
cosmosChainAdapter.getFeeData and cosmossdk.getThorTxData at the top and will
throw out of getL1RateOrQuote on failure; wrap those awaits in a try/catch (or
use Promise.allSettled like the other branches) so failures produce an Err
result instead of throwing, and in the catch return Err(makeSwapErrorRight({
cause: error, code: TradeQuoteError.UnsupportedTradePair, details: 'cosmos
tx/fee fetch failed' })) so perRouteValues mapping still matches other chains
and errors are surfaced as a TradeQuoteError via makeSwapErrorRight.
packages/swapper/src/thorchain-utils/cosmossdk/getThorTxData.ts (2)

22-24: 💤 Low value

Native RUNE/CACAO returns { vault: '' }, which silently suppresses cosmos transactionData downstream.

The empty-string vault flows into getL1RateOrQuote.ts (line 463-467) as thorchainTransactionMetadata.to = '', and extractCosmosTransactionData in packages/public-api/src/routes/quote/extractTransactionData.ts checks if (step.thorchainTransactionMetadata?.to), which is falsy for ''. Net effect: native cosmos sells return transactionData: undefined. This is acceptable given the PR explicitly defers Cosmos sells pending useCosmosSigning, but consider either (a) returning a discriminated shape (e.g., { kind: 'msgDeposit' } | { kind: 'msgSend', vault: string }) so callers can branch explicitly, or (b) leaving a TODO referencing the deferred MsgDeposit support so this doesn't get lost.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/swapper/src/thorchain-utils/cosmossdk/getThorTxData.ts` around lines
22 - 24, getThorTxData currently returns { vault: '' } for native assets which
causes downstream checks (e.g., getL1RateOrQuote.ts and
extractCosmosTransactionData) to treat the value as falsy and drop
transactionData; change the return to an explicit discriminated shape (for
example return { kind: 'msgDeposit' } for native deposits and { kind: 'msgSend',
vault: string } for normal sends) and update the getThorTxData return
type/interface accordingly so callers (getL1RateOrQuote and
extractCosmosTransactionData) can branch on kind; alternatively, if you prefer
minimal change, add a clear TODO in getThorTxData referencing deferred
MsgDeposit support and ensure the returned shape is unambiguous (not an empty
string) so it isn't treated as falsy.

28-30: 💤 Low value

Throws unwrapErr() instead of returning Result.

Per coding guidelines, swapper code should use Result<T, E> from @sniptt/monads rather than throwing. The pattern matches sibling helpers (evm.getThorTxData etc.), so changing it in isolation isn't worth it, but worth noting for a future cleanup pass — especially because this helper is now awaited directly in getL1RateOrQuote.ts (line 454) without Promise.allSettled wrapping, so a throw propagates out of the whole quote function. As per coding guidelines, "Use Result<T, E> pattern for error handling in swappers and APIs; ALWAYS use Ok() and Err() from @sniptt/monads; AVOID throwing within swapper API implementations".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/swapper/src/thorchain-utils/cosmossdk/getThorTxData.ts` around lines
28 - 30, The current getThorTxData implementation throws on inbound lookup
failure (it calls res.unwrapErr()), violating the Result<T,E> pattern; change it
to return an Err(...) instead of throwing: after calling
getInboundAddressDataForChain(daemonUrl, sellAsset.assetId, true, swapperName)
check res.isErr() and return Err(res.unwrapErr()); otherwise continue and wrap
successful payloads with Ok(...). Update getThorTxData's Promise return type to
Promise<Result<..., ...>> if needed and ensure you import and use Ok/Err from
`@sniptt/monads` so callers (e.g., getL1RateOrQuote) receive a Result instead of
exceptions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@packages/swapper/src/thorchain-utils/cosmossdk/getThorTxData.ts`:
- Around line 22-24: getThorTxData currently returns { vault: '' } for native
assets which causes downstream checks (e.g., getL1RateOrQuote.ts and
extractCosmosTransactionData) to treat the value as falsy and drop
transactionData; change the return to an explicit discriminated shape (for
example return { kind: 'msgDeposit' } for native deposits and { kind: 'msgSend',
vault: string } for normal sends) and update the getThorTxData return
type/interface accordingly so callers (getL1RateOrQuote and
extractCosmosTransactionData) can branch on kind; alternatively, if you prefer
minimal change, add a clear TODO in getThorTxData referencing deferred
MsgDeposit support and ensure the returned shape is unambiguous (not an empty
string) so it isn't treated as falsy.
- Around line 28-30: The current getThorTxData implementation throws on inbound
lookup failure (it calls res.unwrapErr()), violating the Result<T,E> pattern;
change it to return an Err(...) instead of throwing: after calling
getInboundAddressDataForChain(daemonUrl, sellAsset.assetId, true, swapperName)
check res.isErr() and return Err(res.unwrapErr()); otherwise continue and wrap
successful payloads with Ok(...). Update getThorTxData's Promise return type to
Promise<Result<..., ...>> if needed and ensure you import and use Ok/Err from
`@sniptt/monads` so callers (e.g., getL1RateOrQuote) receive a Result instead of
exceptions.

In `@packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts`:
- Around line 450-477: The CosmosSdk branch in getL1RateOrQuote currently awaits
cosmosChainAdapter.getFeeData and cosmossdk.getThorTxData at the top and will
throw out of getL1RateOrQuote on failure; wrap those awaits in a try/catch (or
use Promise.allSettled like the other branches) so failures produce an Err
result instead of throwing, and in the catch return Err(makeSwapErrorRight({
cause: error, code: TradeQuoteError.UnsupportedTradePair, details: 'cosmos
tx/fee fetch failed' })) so perRouteValues mapping still matches other chains
and errors are surfaced as a TradeQuoteError via makeSwapErrorRight.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3d987e18-8216-4945-a1fb-8f1a68db475b

📥 Commits

Reviewing files that changed from the base of the PR and between 0d912cb and df1967f.

📒 Files selected for processing (10)
  • packages/public-api/src/routes/quote/extractTransactionData.ts
  • packages/public-api/src/routes/quote/getQuote.ts
  • packages/public-api/src/routes/quote/types.ts
  • packages/public-api/src/routes/quote/utils.ts
  • packages/swap-widget/src/constants/swappers.ts
  • packages/swap-widget/src/types/index.ts
  • packages/swapper/src/thorchain-utils/cosmossdk/getThorTxData.ts
  • packages/swapper/src/thorchain-utils/cosmossdk/index.ts
  • packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts
  • packages/swapper/src/types.ts
💤 Files with no reviewable changes (1)
  • packages/public-api/src/routes/quote/types.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/swap-widget/src/types/index.ts

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@kaladinlight kaladinlight changed the title feat: THORChain support in swap-widget feat(swap-widget): thorchain support May 9, 2026
@kaladinlight
kaladinlight merged commit afae072 into develop May 9, 2026
4 checks passed
@kaladinlight
kaladinlight deleted the feat/swap-widget-thorchain-support branch May 9, 2026 03:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant